sftpgo/openapi/httpfs.yaml

603 lines
16 KiB
YAML
Raw Normal View History

openapi: 3.0.3
tags:
- name: fs
info:
title: SFTPGo HTTPFs
description: |
SFTPGo can use custom storage backend implementations compliant with the API defined here.
HTTPFs is a work in progress and makes no API stability promises.
version: 0.1.0
servers:
- url: /v1
security:
- ApiKeyAuth: []
- BasicAuth: []
paths:
/stat/{name}:
parameters:
- name: name
in: path
description: object name
required: true
schema:
type: string
get:
tags:
- fs
summary: Describes the named object
operationId: stat
responses:
200:
description: successful operation
content:
application/json:
schema:
$ref: '#/components/schemas/FileInfo'
401:
$ref: '#/components/responses/Unauthorized'
403:
$ref: '#/components/responses/Forbidden'
404:
$ref: '#/components/responses/NotFound'
500:
$ref: '#/components/responses/InternalServerError'
default:
$ref: '#/components/responses/DefaultResponse'
/open/{name}:
parameters:
- name: name
in: path
description: object name
required: true
schema:
type: string
- name: offset
in: query
description: 'offset, in bytes, from the start. If not specified 0 must be assumed'
required: false
schema:
type: integer
format: int64
get:
tags:
- fs
summary: Opens the named file for reading
operationId: open
responses:
'200':
description: successful operation
content:
'*/*':
schema:
type: string
format: binary
401:
$ref: '#/components/responses/Unauthorized'
403:
$ref: '#/components/responses/Forbidden'
404:
$ref: '#/components/responses/NotFound'
500:
$ref: '#/components/responses/InternalServerError'
501:
$ref: '#/components/responses/NotImplemented'
default:
$ref: '#/components/responses/DefaultResponse'
/create/{name}:
parameters:
- name: name
in: path
description: object name
required: true
schema:
type: string
- name: flags
in: query
description: 'flags to use for opening the file, if omitted O_RDWR|O_CREATE|O_TRUNC must be assumed. Supported flags: https://pkg.go.dev/os#pkg-constants'
required: false
schema:
type: integer
format: int32
post:
tags:
- fs
summary: Creates or opens the named file for writing
operationId: create
requestBody:
content:
'*/*':
schema:
type: string
format: binary
required: true
responses:
201:
$ref: '#/components/responses/OKResponse'
401:
$ref: '#/components/responses/Unauthorized'
403:
$ref: '#/components/responses/Forbidden'
404:
$ref: '#/components/responses/NotFound'
500:
$ref: '#/components/responses/InternalServerError'
501:
$ref: '#/components/responses/NotImplemented'
default:
$ref: '#/components/responses/DefaultResponse'
/rename/{name}:
parameters:
- name: name
in: path
description: object name
required: true
schema:
type: string
- name: target
in: query
description: target name
required: true
schema:
type: string
patch:
tags:
- fs
summary: Renames (moves) source to target
operationId: rename
responses:
200:
$ref: '#/components/responses/OKResponse'
401:
$ref: '#/components/responses/Unauthorized'
403:
$ref: '#/components/responses/Forbidden'
404:
$ref: '#/components/responses/NotFound'
500:
$ref: '#/components/responses/InternalServerError'
501:
$ref: '#/components/responses/NotImplemented'
default:
$ref: '#/components/responses/DefaultResponse'
/remove/{name}:
parameters:
- name: name
in: path
description: object name
required: true
schema:
type: string
delete:
tags:
- fs
summary: Removes the named file or (empty) directory.
operationId: delete
responses:
200:
$ref: '#/components/responses/OKResponse'
401:
$ref: '#/components/responses/Unauthorized'
403:
$ref: '#/components/responses/Forbidden'
404:
$ref: '#/components/responses/NotFound'
500:
$ref: '#/components/responses/InternalServerError'
501:
$ref: '#/components/responses/NotImplemented'
default:
$ref: '#/components/responses/DefaultResponse'
/mkdir/{name}:
parameters:
- name: name
in: path
description: object name
required: true
schema:
type: string
post:
tags:
- fs
summary: Creates a new directory with the specified name
operationId: mkdir
responses:
200:
$ref: '#/components/responses/OKResponse'
401:
$ref: '#/components/responses/Unauthorized'
403:
$ref: '#/components/responses/Forbidden'
404:
$ref: '#/components/responses/NotFound'
500:
$ref: '#/components/responses/InternalServerError'
501:
$ref: '#/components/responses/NotImplemented'
default:
$ref: '#/components/responses/DefaultResponse'
/chmod/{name}:
parameters:
- name: name
in: path
description: object name
required: true
schema:
type: string
- name: mode
in: query
required: true
schema:
type: integer
patch:
tags:
- fs
summary: Changes the mode of the named file
operationId: chmod
responses:
200:
$ref: '#/components/responses/OKResponse'
401:
$ref: '#/components/responses/Unauthorized'
403:
$ref: '#/components/responses/Forbidden'
404:
$ref: '#/components/responses/NotFound'
500:
$ref: '#/components/responses/InternalServerError'
501:
$ref: '#/components/responses/NotImplemented'
default:
$ref: '#/components/responses/DefaultResponse'
/chtimes/{name}:
parameters:
- name: name
in: path
description: object name
required: true
schema:
type: string
- name: access_time
in: query
required: true
schema:
type: string
format: date-time
- name: modification_time
in: query
required: true
schema:
type: string
format: date-time
patch:
tags:
- fs
summary: Changes the access and modification time of the named file
operationId: chtimes
responses:
200:
$ref: '#/components/responses/OKResponse'
401:
$ref: '#/components/responses/Unauthorized'
403:
$ref: '#/components/responses/Forbidden'
404:
$ref: '#/components/responses/NotFound'
500:
$ref: '#/components/responses/InternalServerError'
501:
$ref: '#/components/responses/NotImplemented'
default:
$ref: '#/components/responses/DefaultResponse'
/truncate/{name}:
parameters:
- name: name
in: path
description: object name
required: true
schema:
type: string
- name: size
in: query
required: true
description: 'new file size in bytes'
schema:
type: integer
format: int64
patch:
tags:
- fs
summary: Changes the size of the named file
operationId: truncate
responses:
200:
$ref: '#/components/responses/OKResponse'
401:
$ref: '#/components/responses/Unauthorized'
403:
$ref: '#/components/responses/Forbidden'
404:
$ref: '#/components/responses/NotFound'
500:
$ref: '#/components/responses/InternalServerError'
501:
$ref: '#/components/responses/NotImplemented'
default:
$ref: '#/components/responses/DefaultResponse'
/readdir/{name}:
parameters:
- name: name
in: path
description: object name
required: true
schema:
type: string
get:
tags:
- fs
summary: Reads the named directory and returns the contents
operationId: readdir
responses:
200:
description: successful operation
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/FileInfo'
401:
$ref: '#/components/responses/Unauthorized'
403:
$ref: '#/components/responses/Forbidden'
404:
$ref: '#/components/responses/NotFound'
500:
$ref: '#/components/responses/InternalServerError'
501:
$ref: '#/components/responses/NotImplemented'
default:
$ref: '#/components/responses/DefaultResponse'
/dirsize/{name}:
parameters:
- name: name
in: path
description: object name
required: true
schema:
type: string
get:
tags:
- fs
summary: Returns the number of files and the size for the named directory including any sub-directory
operationId: dirsize
responses:
200:
description: successful operation
content:
application/json:
schema:
type: object
properties:
files:
type: integer
description: 'Total number of files'
size:
type: integer
format: int64
description: 'Total size of files'
401:
$ref: '#/components/responses/Unauthorized'
403:
$ref: '#/components/responses/Forbidden'
404:
$ref: '#/components/responses/NotFound'
500:
$ref: '#/components/responses/InternalServerError'
501:
$ref: '#/components/responses/NotImplemented'
default:
$ref: '#/components/responses/DefaultResponse'
/mimetype/{name}:
parameters:
- name: name
in: path
description: object name
required: true
schema:
type: string
get:
tags:
- fs
summary: Returns the mime type for the named file
operationId: mimetype
responses:
200:
description: successful operation
content:
application/json:
schema:
type: object
properties:
mime:
type: string
401:
$ref: '#/components/responses/Unauthorized'
403:
$ref: '#/components/responses/Forbidden'
404:
$ref: '#/components/responses/NotFound'
500:
$ref: '#/components/responses/InternalServerError'
501:
$ref: '#/components/responses/NotImplemented'
default:
$ref: '#/components/responses/DefaultResponse'
/statvfs/{name}:
parameters:
- name: name
in: path
description: object name
required: true
schema:
type: string
get:
tags:
- fs
summary: Returns the VFS stats for the specified path
operationId: statvfs
responses:
200:
description: successful operation
content:
application/json:
schema:
$ref: '#/components/schemas/StatVFS'
401:
$ref: '#/components/responses/Unauthorized'
403:
$ref: '#/components/responses/Forbidden'
404:
$ref: '#/components/responses/NotFound'
500:
$ref: '#/components/responses/InternalServerError'
501:
$ref: '#/components/responses/NotImplemented'
default:
$ref: '#/components/responses/DefaultResponse'
components:
responses:
OKResponse:
description: successful operation
content:
application/json:
schema:
$ref: '#/components/schemas/ApiResponse'
BadRequest:
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/ApiResponse'
Unauthorized:
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/ApiResponse'
Forbidden:
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/ApiResponse'
NotFound:
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/ApiResponse'
NotImplemented:
description: Not Implemented
content:
application/json:
schema:
$ref: '#/components/schemas/ApiResponse'
Conflict:
description: Conflict
content:
application/json:
schema:
$ref: '#/components/schemas/ApiResponse'
RequestEntityTooLarge:
description: Request Entity Too Large, max allowed size exceeded
content:
application/json:
schema:
$ref: '#/components/schemas/ApiResponse'
InternalServerError:
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/ApiResponse'
DefaultResponse:
description: Unexpected Error
content:
application/json:
schema:
$ref: '#/components/schemas/ApiResponse'
schemas:
ApiResponse:
type: object
properties:
message:
type: string
description: 'message, can be empty'
error:
type: string
description: error description if any
FileInfo:
type: object
properties:
name:
type: string
description: base name of the file
size:
type: integer
format: int64
description: length in bytes for regular files; system-dependent for others
mode:
type: integer
description: |
File mode and permission bits. More details here: https://golang.org/pkg/io/fs/#FileMode.
Let's see some examples:
- for a directory mode&2147483648 != 0
- for a symlink mode&134217728 != 0
- for a regular file mode&2401763328 == 0
last_modified:
type: string
format: date-time
StatVFS:
type: object
properties:
bsize:
type: integer
description: file system block size
frsize:
type: integer
description: fundamental fs block size
blocks:
type: integer
description: number of blocks
bfree:
type: integer
description: free blocks in file system
bavail:
type: integer
description: free blocks for non-root
files:
type: integer
description: total file inodes
ffree:
type: integer
description: free file inodes
favail:
type: integer
description: free file inodes for non-root
fsid:
type: integer
description: file system id
flag:
type: integer
description: bit mask of f_flag values
namemax:
type: integer
description: maximum filename length
securitySchemes:
BasicAuth:
type: http
scheme: basic
ApiKeyAuth:
type: apiKey
in: header
name: X-API-KEY