diff --git a/cors.go b/cors.go new file mode 100644 index 0000000..a05e6d5 --- /dev/null +++ b/cors.go @@ -0,0 +1,30 @@ +package main + +import ( + "net/http" +) + +type CorsAllowAllOrigins struct { + AndThen http.Handler +} + +func (c CorsAllowAllOrigins) ServeHTTP(w http.ResponseWriter, r *http.Request) { + w.Header().Add("Access-Control-Allow-Origin", "*") + w.Header().Add("Access-Control-Allow-Methods", "*") + w.Header().Add("Access-Control-Allow-Headers", "*") + c.AndThen.ServeHTTP(w, r) +} + +type OptionsNoError struct { + Error ErrorHandler +} + +func (c OptionsNoError) WithError(err error) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method == "OPTIONS" { + w.WriteHeader(200) + } else { + c.Error.WithError(err).ServeHTTP(w, r) + } + }) +} diff --git a/main.go b/main.go index 5895b12..cf7e8a1 100644 --- a/main.go +++ b/main.go @@ -3,17 +3,18 @@ package main import ( "context" "fmt" - "git.deuxfleurs.fr/Deuxfleurs/bagage/s3" - "git.deuxfleurs.fr/Deuxfleurs/bagage/sftp" - "github.com/minio/minio-go/v7" - "github.com/minio/minio-go/v7/pkg/credentials" - "golang.org/x/crypto/ssh" "io" "io/ioutil" "log" "net" "net/http" "os" + + "git.deuxfleurs.fr/Deuxfleurs/bagage/s3" + "git.deuxfleurs.fr/Deuxfleurs/bagage/sftp" + "github.com/minio/minio-go/v7" + "github.com/minio/minio-go/v7/pkg/credentials" + "golang.org/x/crypto/ssh" ) func main() { @@ -176,17 +177,23 @@ func handleSSHConn(nConn net.Conn, dconfig *Config, config *ssh.ServerConfig) { func httpServer(config *Config, done chan error) { // Assemble components to handle WebDAV requests http.Handle(config.DavPath+"/", - BasicAuthExtract{ - OnNotFound: NotAuthorized{}, - OnCreds: LdapPreAuth{ - WithConfig: config, - OnWrongPassword: NotAuthorized{}, - OnFailure: InternalError{}, - OnCreds: S3Auth{ + CorsAllowAllOrigins{ + AndThen: BasicAuthExtract{ + OnNotFound: OptionsNoError{ + NotAuthorized{}, + }, + OnCreds: LdapPreAuth{ WithConfig: config, - OnFailure: InternalError{}, - OnMinioClient: WebDav{ + OnWrongPassword: OptionsNoError{ + Error: NotAuthorized{}, + }, + OnFailure: InternalError{}, + OnCreds: S3Auth{ WithConfig: config, + OnFailure: InternalError{}, + OnMinioClient: WebDav{ + WithConfig: config, + }, }, }, },