| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 | 
							- // Package api implements REST API for sftpgo.
 
- // REST API allows to manage users and quota and to get real time reports for the active connections
 
- // with possibility of forcibly closing a connection.
 
- // The OpenAPI 3 schema for the exposed API can be found inside the source tree:
 
- // https://github.com/drakkan/sftpgo/tree/master/api/schema/openapi.yaml
 
- package api
 
- import (
 
- 	"net/http"
 
- 	"github.com/drakkan/sftpgo/dataprovider"
 
- 	"github.com/go-chi/chi"
 
- 	"github.com/go-chi/render"
 
- )
 
- const (
 
- 	logSender             = "api"
 
- 	activeConnectionsPath = "/api/v1/sftp_connection"
 
- 	quotaScanPath         = "/api/v1/quota_scan"
 
- 	userPath              = "/api/v1/user"
 
- 	versionPath           = "/api/v1/version"
 
- )
 
- var (
 
- 	router       *chi.Mux
 
- 	dataProvider dataprovider.Provider
 
- )
 
- // HTTPDConf httpd daemon configuration
 
- type HTTPDConf struct {
 
- 	// The port used for serving HTTP requests. 0 disable the HTTP server. Default: 8080
 
- 	BindPort int `json:"bind_port" mapstructure:"bind_port"`
 
- 	// The address to listen on. A blank value means listen on all available network interfaces. Default: "127.0.0.1"
 
- 	BindAddress string `json:"bind_address" mapstructure:"bind_address"`
 
- }
 
- type apiResponse struct {
 
- 	Error      string `json:"error"`
 
- 	Message    string `json:"message"`
 
- 	HTTPStatus int    `json:"status"`
 
- }
 
- func init() {
 
- 	initializeRouter()
 
- }
 
- // SetDataProvider sets the data provider to use to fetch the data about users
 
- func SetDataProvider(provider dataprovider.Provider) {
 
- 	dataProvider = provider
 
- }
 
- func sendAPIResponse(w http.ResponseWriter, r *http.Request, err error, message string, code int) {
 
- 	var errorString string
 
- 	if err != nil {
 
- 		errorString = err.Error()
 
- 	}
 
- 	resp := apiResponse{
 
- 		Error:      errorString,
 
- 		Message:    message,
 
- 		HTTPStatus: code,
 
- 	}
 
- 	if code != http.StatusOK {
 
- 		w.Header().Set("Content-Type", "application/json; charset=utf-8")
 
- 		w.WriteHeader(code)
 
- 	}
 
- 	render.JSON(w, r, resp)
 
- }
 
- func getRespStatus(err error) int {
 
- 	if _, ok := err.(*dataprovider.ValidationError); ok {
 
- 		return http.StatusBadRequest
 
- 	}
 
- 	if _, ok := err.(*dataprovider.MethodDisabledError); ok {
 
- 		return http.StatusForbidden
 
- 	}
 
- 	return http.StatusInternalServerError
 
- }
 
 
  |