server

package
v1.4.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 30, 2026 License: MIT Imports: 49 Imported by: 64

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func GetCacheMetrics added in v1.0.7

func GetCacheMetrics(options *Options) *storage.CacheMetrics

Types

type Capabilities added in v1.4.0

type Capabilities struct {
	Upload            bool  `json:"upload"`
	UploadMaxFileSize int64 `json:"upload-max-file-size,omitempty"`
	UploadMaxFiles    int   `json:"upload-max-files,omitempty"`
	FTP               bool  `json:"ftp"`
}

Capabilities advertises optional server features to clients at registration. Clients use it to decide whether to attempt an upload at all, and which URLs are worth printing.

type CpuStats added in v1.0.7

type CpuStats struct {
	User   uint64 `json:"user"`
	System uint64 `json:"system"`
	Idle   uint64 `json:"idle"`
	Nice   uint64 `json:"nice"`
	Total  uint64 `json:"total"`
}

func GetCpuMetrics added in v1.0.7

func GetCpuMetrics() (cpuStats *CpuStats)

type CustomRecordConfig added in v1.3.1

type CustomRecordConfig struct {
	Type     string `yaml:"type"`
	Value    string `yaml:"value"`
	TTL      uint32 `yaml:"ttl,omitempty"`
	Priority uint16 `yaml:"priority,omitempty"` // for MX records
}

CustomRecordConfig represents a custom DNS record configuration

type DNSRecordsConfig added in v1.3.1

type DNSRecordsConfig map[string][]CustomRecordConfig

DNSRecordsConfig represents the structured DNS records configuration (YAML format)

type DNSServer

type DNSServer struct {
	TxtRecord string // used for ACME verification
	// contains filtered or unexported fields
}

DNSServer is a DNS server instance that listens on port 53.

func NewDNSServer

func NewDNSServer(network string, options *Options) *DNSServer

NewDNSServer returns a new DNS server.

func (*DNSServer) ListenAndServe

func (h *DNSServer) ListenAndServe(dnsAlive chan bool)

ListenAndServe listens on dns ports for the server.

func (*DNSServer) ServeDNS

func (h *DNSServer) ServeDNS(w dns.ResponseWriter, r *dns.Msg)

ServeDNS is the default handler for DNS queries.

type DeregisterRequest

type DeregisterRequest struct {
	// CorrelationID is an ID for correlation with requests.
	CorrelationID string `json:"correlation-id"`
	// SecretKey is the secretKey for the interactsh client.
	SecretKey string `json:"secret-key"`
}

DeregisterRequest is a request for client deregistration to interactsh server.

type FTPServer added in v1.0.0

type FTPServer struct {
	// contains filtered or unexported fields
}

FTPServer is a ftp server instance

func NewFTPServer added in v1.0.0

func NewFTPServer(options *Options) (*FTPServer, error)

NewFTPServer returns a new TLS & Non-TLS FTP server.

func (*FTPServer) AfterCurDirChanged added in v1.0.0

func (h *FTPServer) AfterCurDirChanged(ctx *ftpserver.Context, oldCurDir, newCurDir string, err error)

func (*FTPServer) AfterDirCreated added in v1.0.0

func (h *FTPServer) AfterDirCreated(ctx *ftpserver.Context, dstPath string, err error)

func (*FTPServer) AfterDirDeleted added in v1.0.0

func (h *FTPServer) AfterDirDeleted(ctx *ftpserver.Context, dstPath string, err error)

func (*FTPServer) AfterFileDeleted added in v1.0.0

func (h *FTPServer) AfterFileDeleted(ctx *ftpserver.Context, dstPath string, err error)

func (*FTPServer) AfterFileDownloaded added in v1.0.0

func (h *FTPServer) AfterFileDownloaded(ctx *ftpserver.Context, dstPath string, size int64, err error)

func (*FTPServer) AfterFilePut added in v1.0.0

func (h *FTPServer) AfterFilePut(ctx *ftpserver.Context, dstPath string, size int64, err error)

func (*FTPServer) AfterUserLogin added in v1.0.0

func (h *FTPServer) AfterUserLogin(ctx *ftpserver.Context, userName, password string, passMatched bool, err error)

func (*FTPServer) BeforeChangeCurDir added in v1.0.0

func (h *FTPServer) BeforeChangeCurDir(ctx *ftpserver.Context, oldCurDir, newCurDir string)

func (*FTPServer) BeforeCreateDir added in v1.0.0

func (h *FTPServer) BeforeCreateDir(ctx *ftpserver.Context, dstPath string)

func (*FTPServer) BeforeDeleteDir added in v1.0.0

func (h *FTPServer) BeforeDeleteDir(ctx *ftpserver.Context, dstPath string)

func (*FTPServer) BeforeDeleteFile added in v1.0.0

func (h *FTPServer) BeforeDeleteFile(ctx *ftpserver.Context, dstPath string)

func (*FTPServer) BeforeDownloadFile added in v1.0.0

func (h *FTPServer) BeforeDownloadFile(ctx *ftpserver.Context, dstPath string)

func (*FTPServer) BeforeLoginUser added in v1.0.0

func (h *FTPServer) BeforeLoginUser(ctx *ftpserver.Context, userName string)

func (*FTPServer) BeforePutFile added in v1.0.0

func (h *FTPServer) BeforePutFile(ctx *ftpserver.Context, dstPath string)

func (*FTPServer) Close added in v1.0.0

func (h *FTPServer) Close()

func (*FTPServer) ListenAndServe added in v1.0.0

func (h *FTPServer) ListenAndServe(tlsConfig *tls.Config, ftpAlive chan bool, ftpsAlive chan bool)

ListenAndServe listens on smtp and/or smtps ports for the server.

func (*FTPServer) Print added in v1.0.0

func (h *FTPServer) Print(sessionID string, message interface{})

func (*FTPServer) PrintCommand added in v1.0.0

func (h *FTPServer) PrintCommand(sessionID string, command string, params string)

func (*FTPServer) PrintResponse added in v1.0.0

func (h *FTPServer) PrintResponse(sessionID string, code int, message string)

func (*FTPServer) Printf added in v1.0.0

func (h *FTPServer) Printf(sessionID string, format string, v ...interface{})

type HTTPServer

type HTTPServer struct {
	// contains filtered or unexported fields
}

HTTPServer is a http server instance that listens both TLS and Non-TLS based servers.

func NewHTTPServer

func NewHTTPServer(options *Options) (*HTTPServer, error)

NewHTTPServer returns a new TLS & Non-TLS HTTP server.

func (*HTTPServer) ListenAndServe

func (h *HTTPServer) ListenAndServe(tlsConfig *tls.Config, httpAlive, httpsAlive chan bool)

ListenAndServe listens on http and/or https ports for the server.

type Interaction

type Interaction struct {
	// Protocol for interaction, can contains HTTP/DNS/SMTP,etc.
	Protocol string `json:"protocol"`
	// UniqueID is the uniqueID for the subdomain receiving the interaction.
	UniqueID string `json:"unique-id"`
	// FullId is the full path for the subdomain receiving the interaction.
	FullId string `json:"full-id"`
	// QType is the question type for the interaction
	QType string `json:"q-type,omitempty"`
	// RawRequest is the raw request received by the interactsh server.
	RawRequest string `json:"raw-request,omitempty"`
	// RawResponse is the raw response sent by the interactsh server.
	RawResponse string `json:"raw-response,omitempty"`
	// SMTPFrom is the mail form field
	SMTPFrom string `json:"smtp-from,omitempty"`
	// RemoteAddress is the remote address for interaction
	RemoteAddress string `json:"remote-address"`
	// Timestamp is the timestamp for the interaction
	Timestamp time.Time           `json:"timestamp"`
	AsnInfo   []map[string]string `json:"asninfo,omitempty"`
}

Interaction is an interaction received to the server.

type LDAPServer added in v1.0.0

type LDAPServer struct {
	WithLogger bool
	// contains filtered or unexported fields
}

LDAPServer is a ldap server instance

func NewLDAPServer added in v1.0.0

func NewLDAPServer(options *Options, withLogger bool) (*LDAPServer, error)

NewLDAPServer returns a new LDAP server.

func (*LDAPServer) Close added in v1.0.0

func (ldapServer *LDAPServer) Close() error

func (*LDAPServer) ListenAndServe added in v1.0.0

func (ldapServer *LDAPServer) ListenAndServe(tlsConfig *tls.Config, ldapAlive chan bool)

ListenAndServe listens on ldap ports for the server.

type MemoryMetrics added in v1.0.7

type MemoryMetrics struct {
	Alloc        string `json:"alloc"`
	TotalAlloc   string `json:"total_alloc"`
	Sys          string `json:"sys"`
	Lookups      uint64 `json:"lookups"`
	Mallocs      uint64 `json:"mallocs"`
	Frees        uint64 `json:"frees"`
	HeapAlloc    string `json:"heap_allo"`
	HeapSys      string `json:"heap_sys"`
	HeapIdle     string `json:"head_idle"`
	HeapInuse    string `json:"heap_in_use"`
	HeapReleased string `json:"heap_released"`
	HeapObjects  uint64 `json:"heap_objects"`
	StackInuse   string `json:"stack_in_use"`
	StackSys     string `json:"stack_sys"`
	MSpanInuse   string `json:"mspan_in_use"`
	MSpanSys     string `json:"mspan_sys"`
	MCacheInuse  string `json:"mcache_in_use"`
	MCacheSys    string `json:"mcache_sys"`
}

func GetMemoryMetrics added in v1.0.7

func GetMemoryMetrics() *MemoryMetrics

type Metrics added in v1.0.7

type Metrics struct {
	Dns           uint64                `json:"dns"`
	Ftp           uint64                `json:"ftp"`
	Http          uint64                `json:"http"`
	Ldap          uint64                `json:"ldap"`
	Smb           uint64                `json:"smb"`
	Smtp          uint64                `json:"smtp"`
	Sessions      int64                 `json:"sessions"`
	SessionsTotal int64                 `json:"sessions_total"`
	Cache         *storage.CacheMetrics `json:"cache"`
	Memory        *MemoryMetrics        `json:"memory"`
	Cpu           *CpuStats             `json:"cpu"`
	Network       *NetworkStats         `json:"network"`
}

type NetworkStats added in v1.0.7

type NetworkStats struct {
	Rx string `json:"received"`

	Tx string `json:"transmitted"`
	// contains filtered or unexported fields
}

func GetNetworkMetrics added in v1.0.7

func GetNetworkMetrics() *NetworkStats

type NopAuth added in v1.0.0

type NopAuth struct{}

func (*NopAuth) CheckPasswd added in v1.0.0

func (a *NopAuth) CheckPasswd(ctx *ftpserver.Context, name, pass string) (bool, error)

type NopDriver added in v1.0.0

type NopDriver struct {
	// contains filtered or unexported fields
}

func NewNopDriver added in v1.0.0

func NewNopDriver(driver ftpserver.Driver) *NopDriver

func (*NopDriver) DeleteDir added in v1.0.0

func (n *NopDriver) DeleteDir(c *ftpserver.Context, s string) error

func (*NopDriver) DeleteFile added in v1.0.0

func (n *NopDriver) DeleteFile(c *ftpserver.Context, s string) error

func (*NopDriver) GetFile added in v1.0.0

func (n *NopDriver) GetFile(c *ftpserver.Context, s1 string, k int64) (int64, io.ReadCloser, error)

func (*NopDriver) ListDir added in v1.0.0

func (n *NopDriver) ListDir(c *ftpserver.Context, s string, f func(os.FileInfo) error) error

ListDir hides interactsh's own upload storage, and nothing else.

NopAuth accepts any credentials, so an anonymous client must not be able to read off every correlation id that currently has uploaded files and then walk into each one. Two rules close that off: the uploads directory never lists its own contents, and it is filtered out of the root listing so that it cannot be discovered in the first place. A client that already knows its own correlation id can still list and RETR inside it.

Only those two rules, deliberately: the root itself lists normally, because -ftp-dir is documented as serving the operator's own directory and a blanket refusal there would silently break that.

func (*NopDriver) MakeDir added in v1.0.0

func (n *NopDriver) MakeDir(c *ftpserver.Context, s string) error

func (*NopDriver) PutFile added in v1.0.0

func (n *NopDriver) PutFile(c *ftpserver.Context, s string, r io.Reader, k int64) (int64, error)

func (*NopDriver) Rename added in v1.0.0

func (n *NopDriver) Rename(c *ftpserver.Context, s1 string, s2 string) error

func (*NopDriver) Stat added in v1.0.0

func (n *NopDriver) Stat(c *ftpserver.Context, s string) (os.FileInfo, error)

type OnResultCallback added in v1.1.0

type OnResultCallback func(out interface{})

type Options

type Options struct {
	// Domains is the list domains for the instance.
	Domains []string
	// IPAddresses contains the IP addresses (IPv4 and/or IPv6) for the server
	IPAddresses []net.IP
	// ListenIP is the IP address to listen servers on
	ListenIP string
	// DomainPort is the port to listen DNS servers on
	DnsPort int
	// HttpPort is the port to listen HTTP server on
	HttpPort int
	// HttpsPort is the port to listen HTTPS server on
	HttpsPort int
	// SmbPort is the port to listen Smb server on
	SmbPort int
	// SmtpPort is the port to listen Smtp server on
	SmtpPort int
	// SmtpsPort is the port to listen Smtps server on
	SmtpsPort int
	// SmtpAutoTLSPort is the port to listen Smtp autoTLS server on
	SmtpAutoTLSPort int
	// FtpPort is the port to listen Ftp server on
	FtpPort int
	// FtpsPort is the port to listen Ftps server on
	FtpsPort int
	// FtpPort is the port to listen Ftp server on
	LdapPort int
	// Hostmaster is the hostmaster email for the server.
	Hostmasters []string
	// Storage is a storage for interaction data storage
	Storage storage.Storage
	// Auth requires client to authenticate
	Auth bool
	// HTTPIndex is the http index file for server
	HTTPIndex string
	// HTTPDirectory is the directory for interact server
	HTTPDirectory string
	// Token required to retrieve interactions
	Token string
	// Enable root tld interactions
	RootTLD bool
	// OriginURL for the HTTP Server
	OriginURL string
	// FTPDirectory or temporary one
	FTPDirectory string
	// ScanEverywhere for potential correlation id
	ScanEverywhere bool
	// CorrelationIdLength of preamble
	CorrelationIdLength int
	// CorrelationIdNonceLength of the unique identifier
	CorrelationIdNonceLength int
	// Certificate Path
	CertificatePath string
	// Private Key Path
	PrivateKeyPath string
	// CustomRecords is a file containing custom DNS records
	CustomRecords string
	// HTTP header containing origin IP
	OriginIPHeader string
	// Version is the version of interactsh server
	Version string
	// DiskStorage enables storing interactions on disk
	DiskStorage bool
	// DiskStoragePath defines the disk storage location
	DiskStoragePath string
	// DynamicResp enables dynamic HTTP response
	DynamicResp bool
	// EnableMetrics enables metrics endpoint
	EnableMetrics bool
	// ServerToken hide server version in HTTP response X-Interactsh-Version header
	NoVersionHeader bool
	// HeaderServer use custom string in HTTP response Server header instead of domain
	HeaderServer string
	// DefaultHTTPResponseFile is a file to serve for all HTTP requests (takes priority over other options)
	DefaultHTTPResponseFile string

	// Ftp indicates the FTP server is enabled, so uploaded files are also
	// reachable over ftp://
	Ftp bool
	// Upload enables the client file upload endpoint and file hosting
	Upload bool
	// UploadDirectory is the root directory uploaded files are stored under
	UploadDirectory string
	// UploadMaxFileSize is the maximum size in bytes of a single uploaded file
	UploadMaxFileSize int64
	// UploadMaxFiles is the maximum number of files a single session may upload
	UploadMaxFiles int
	// UploadMaxTotalSize is the maximum total size in bytes of all uploaded files
	UploadMaxTotalSize int64
	// UploadTTL is the maximum lifetime of uploaded files on disk
	UploadTTL time.Duration
	// UploadStore serves and stores uploaded files. Nil when uploads are disabled.
	UploadStore *UploadStore
	// FTPServesUploads reports whether the FTP root and the upload root resolve
	// to the same directory, which is what makes hosted files reachable over
	// ftp://. Derived at startup from the resolved paths, never from the flags
	// as written, so that two spellings of one directory are not mistaken for
	// two directories.
	FTPServesUploads bool

	ACMEStore *acme.Provider
	Stats     *Metrics
	OnResult  OnResultCallback

	Certificates []tls.Certificate
	CertFiles    []acme.CertificateFiles
}

Options contains configuration options for the servers

func (*Options) GetIdLength added in v1.0.2

func (options *Options) GetIdLength() int

func (*Options) URLReflection added in v1.0.2

func (options *Options) URLReflection(URL string) string

URLReflection returns a reversed part of the URL payload which is checked in the response.

func (*Options) UploadStorage added in v1.4.0

func (options *Options) UploadStorage() storage.UploadStorage

UploadStorage returns the configured storage backend's upload-tracking capability, or nil when the backend does not implement it. Only instance-local backends do, since hosted bytes live on the local filesystem; see storage.UploadStorage.

type PollResponse

type PollResponse struct {
	Data    []string `json:"data"`
	Extra   []string `json:"extra"`
	AESKey  string   `json:"aes_key"`
	TLDData []string `json:"tlddata,omitempty"`
}

PollResponse is the response for a polling request

type RegisterRequest

type RegisterRequest struct {
	// PublicKey is the public RSA Key of the client.
	PublicKey string `json:"public-key"`
	// SecretKey is the secret-key for correlation ID registered for the client.
	SecretKey string `json:"secret-key"`
	// CorrelationID is an ID for correlation with requests.
	CorrelationID string `json:"correlation-id"`
}

RegisterRequest is a request for client registration to interactsh server.

type RegisterResponse added in v1.4.0

type RegisterResponse struct {
	Message      string        `json:"message"`
	Capabilities *Capabilities `json:"capabilities,omitempty"`
}

RegisterResponse is the response to a client registration. The bare {"message": ...} shape older clients expect is preserved, so an old client against a new server simply ignores the extra key, and a new client against an old server sees a nil Capabilities.

type ResponderServer added in v0.0.5

type ResponderServer struct {
	// contains filtered or unexported fields
}

ResponderServer is a Responder-equivalent NTLMv2 hash capture wrapper backed by goimpacket. It replaces the previous dockerized Responder process, and now binds multiple SMB-compatible ports to maximise the chance of catching coerced authentications.

func NewResponderServer added in v0.0.5

func NewResponderServer(options *Options) (*ResponderServer, error)

NewResponderServer returns a new Responder-equivalent server.

func (*ResponderServer) Close added in v0.0.5

func (h *ResponderServer) Close()

Close stops every Responder capture listener.

func (*ResponderServer) ListenAndServe added in v0.0.5

func (h *ResponderServer) ListenAndServe(responderAlive chan bool) error

ListenAndServe spins up an SMB capture listener on each of responderListenPorts. The provided channel is signalled true once at least one listener is ready and false on shutdown.

type SMBServer added in v0.0.5

type SMBServer struct {
	// contains filtered or unexported fields
}

SMBServer is an in-process SMB2 NTLM hash capture server backed by goimpacket. It replaces the previous Python/impacket smbserver wrapper.

func NewSMBServer added in v0.0.5

func NewSMBServer(options *Options) (*SMBServer, error)

NewSMBServer returns a new SMB server.

func (*SMBServer) Close added in v0.0.5

func (h *SMBServer) Close()

Close stops the SMB capture server.

func (*SMBServer) ListenAndServe added in v0.0.5

func (h *SMBServer) ListenAndServe(smbAlive chan bool) error

ListenAndServe listens on the configured SMB port and forwards captured NetNTLMv2 hashes into the interactsh storage.

type SMTPServer

type SMTPServer struct {
	// contains filtered or unexported fields
}

SMTPServer is a smtp server instance that listens both TLS and Non-TLS based servers.

func NewSMTPServer

func NewSMTPServer(options *Options) (*SMTPServer, error)

NewSMTPServer returns a new TLS & Non-TLS SMTP server.

func (*SMTPServer) ListenAndServe

func (h *SMTPServer) ListenAndServe(tlsConfig *tls.Config, smtpAlive, smtpsAlive chan bool)

ListenAndServe listens on smtp and/or smtps ports for the server.

type UploadError added in v1.4.0

type UploadError struct {
	Kind UploadErrorKind
	Err  error
}

UploadError is a failure attributable to the uploaded content or to server capacity, as opposed to an internal error.

func (*UploadError) Error added in v1.4.0

func (e *UploadError) Error() string

func (*UploadError) Unwrap added in v1.4.0

func (e *UploadError) Unwrap() error

type UploadErrorKind added in v1.4.0

type UploadErrorKind int

UploadErrorKind classifies upload failures so the HTTP layer can map them to status codes without matching on error strings.

const (
	UploadErrOther UploadErrorKind = iota
	UploadErrBadName
	UploadErrTooLarge
	UploadErrTooManyFiles
	UploadErrOutOfSpace
)

type UploadFileRequest added in v1.4.0

type UploadFileRequest struct {
	Name string `json:"name"`
	Data string `json:"data"` // base64
}

UploadFileRequest is a single file within an upload request.

type UploadRequest added in v1.4.0

type UploadRequest struct {
	CorrelationID string              `json:"correlation-id"`
	SecretKey     string              `json:"secret-key"`
	Files         []UploadFileRequest `json:"files"`
}

UploadRequest is a request to host files against a correlation ID.

type UploadResponse added in v1.4.0

type UploadResponse struct {
	Message string                 `json:"message"`
	Files   []UploadedFileResponse `json:"files"`
}

UploadResponse is the response to a successful upload.

type UploadStore added in v1.4.0

type UploadStore struct {
	// contains filtered or unexported fields
}

UploadStore owns the on-disk lifecycle of client-uploaded files.

Layout is <root>/<uploadsDirName>/<correlationID>/<filename>. The session directory is named by correlation ID because FTP has no Host header, so the identifier has to be carried in the path for the FTP view to work. The uploadsDirName level exists so that the root may be shared with -ftp-dir without this store ever touching an operator's files.

func NewUploadStore added in v1.4.0

func NewUploadStore(options *Options) (*UploadStore, error)

NewUploadStore prepares the upload root and returns a store. It does not start the background goroutines; call Start for that.

func (*UploadStore) Abort added in v1.4.0

func (s *UploadStore) Abort(st *stagedUpload)

Abort discards a staged file and releases its reservation.

A file that was never committed is only a temp file, so it goes without question. A committed one is a narrower case -- a later rename in the same batch failed -- and is only removed when it did not overwrite anything: the previous content of an overwritten name is already gone, so deleting it would turn a leaked file into lost data. Everything Abort touches resolves to <sessionsRoot>/<correlationID>/<validated name>, so it can never reach another session's files.

func (*UploadStore) Close added in v1.4.0

func (s *UploadStore) Close() error

Close stops the background goroutines and releases the rooted handle.

func (*UploadStore) Commit added in v1.4.0

func (s *UploadStore) Commit(st *stagedUpload) error

Commit renames a staged file into place, making it reachable. Writing to a temporary name and renaming is also what stops a reader -- the HTTP handler or the FTP file driver -- from ever observing a partially written file.

func (*UploadStore) MaxFileSize added in v1.4.0

func (s *UploadStore) MaxFileSize() int64

MaxFileSize returns the per-file byte limit.

func (*UploadStore) MaxFiles added in v1.4.0

func (s *UploadStore) MaxFiles() int

MaxFiles returns the per-session file count limit.

func (*UploadStore) Open added in v1.4.0

func (s *UploadStore) Open(correlationID, name string) (*os.File, os.FileInfo, error)

Open returns a readable handle to an uploaded file. The name is re-validated here rather than trusted from the caller.

func (*UploadStore) RemoveSession added in v1.4.0

func (s *UploadStore) RemoveSession(correlationID string)

RemoveSession queues a session's directory for deletion. It is safe to call from the storage cache's event goroutine: the send is non-blocking, so filesystem latency can never back-pressure cache maintenance. A dropped request is collected by the janitor instead.

func (*UploadStore) Root added in v1.4.0

func (s *UploadStore) Root() string

Root returns the directory uploaded files are stored under.

func (*UploadStore) Save added in v1.4.0

func (s *UploadStore) Save(correlationID, name string, data []byte, existingSize int64) (int64, string, error)

Save stages and immediately commits one file, for callers handling a single file with nothing to unwind.

func (*UploadStore) Stage added in v1.4.0

func (s *UploadStore) Stage(correlationID, name string, data []byte, existingSize int64) (*stagedUpload, error)

Stage validates one file, reserves its quota and writes it under a temporary name in its session directory. Nothing is reachable until Commit.

It is called from inside Storage.UpdateUploads, i.e. under the correlation ID's lock, so the caller's quota check and this write are atomic with respect to other uploads for the same session.

func (*UploadStore) Start added in v1.4.0

func (s *UploadStore) Start()

Start launches the deleter and janitor goroutines.

type UploadedFileResponse added in v1.4.0

type UploadedFileResponse struct {
	Name     string `json:"name"`
	Size     int64  `json:"size"`
	SHA256   string `json:"sha256"`
	HTTPPath string `json:"http-path"`
	FTPPath  string `json:"ftp-path"`
}

UploadedFileResponse describes one hosted file. Paths rather than URLs: the server does not know which of its domains, or which scheme, the client will use to reference the file.

Directories

Path Synopsis
Taken from https://github.com/chinzhiweiblank/coredns-acme/blob/e0cdfbdd78adfcc6c2d098255902f64ec60daecb/provider.go Copyright @chinzhiweiblank under Apache License 2.0
Taken from https://github.com/chinzhiweiblank/coredns-acme/blob/e0cdfbdd78adfcc6c2d098255902f64ec60daecb/provider.go Copyright @chinzhiweiblank under Apache License 2.0

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL