diff --git a/internal/integrations/integrations.go b/internal/integrations/integrations.go index 42423f71..e850c629 100644 --- a/internal/integrations/integrations.go +++ b/internal/integrations/integrations.go @@ -13,11 +13,11 @@ import ( ) const ( - ftpProvider = "ftp" - webdavProvider = "webdav" - dropboxProvider = "dropbox" - googleProvider = "google" - localfsProvider = "localfs" + FtpProvider = "ftp" + WebdavProvider = "webdav" + DropboxProvider = "dropbox" + GoogleProvider = "google" + LocalfsProvider = "localfs" ) // IntegrationProvider abstracts 3rd party integrations @@ -39,13 +39,13 @@ func GetIntegrationProvider(storer storage.UserStorer, uid, integrationid string continue } switch intg.Provider { - case dropboxProvider: + case DropboxProvider: return newDropbox(intg), nil - case ftpProvider: + case FtpProvider: return newFTP(intg), nil - case localfsProvider: + case LocalfsProvider: return newLocalFS(intg), nil - case webdavProvider: + case WebdavProvider: return newWebDav(intg), nil } } @@ -56,13 +56,13 @@ func GetIntegrationProvider(storer storage.UserStorer, uid, integrationid string // fix the name func fixProviderName(n string) string { switch n { - case ftpProvider: + case FtpProvider: fallthrough - case dropboxProvider: + case DropboxProvider: return "Dropbox" - case googleProvider: + case GoogleProvider: fallthrough - case webdavProvider: + case WebdavProvider: return "GoogleDrive" default: return n diff --git a/internal/ui/handlers.go b/internal/ui/handlers.go index 5d752386..bfc72e9f 100644 --- a/internal/ui/handlers.go +++ b/internal/ui/handlers.go @@ -14,6 +14,7 @@ import ( "github.com/golang-jwt/jwt/v4" "github.com/google/uuid" log "github.com/sirupsen/logrus" + "gopkg.in/yaml.v3" ) const ( @@ -529,6 +530,16 @@ func (app *ReactAppWrapper) listIntegrations(c *gin.Context) { c.JSON(http.StatusOK, user.Integrations) } +func warnLocalfsEdition(c *gin.Context, int *model.IntegrationConfig) { + s, err := yaml.Marshal(gin.H{"integrations": []*model.IntegrationConfig{int}}) + if err != nil { + log.Error("error updating user", err) + c.AbortWithStatus(http.StatusInternalServerError) + return + } + c.AbortWithStatusJSON(http.StatusForbidden, gin.H{"error": "To avoid security issues with local directory integration, you have to manually edit your .userprofile file:\n\n" + string(s)}) +} + func (app *ReactAppWrapper) createIntegration(c *gin.Context) { int := model.IntegrationConfig{} if err := c.ShouldBindJSON(&int); err != nil { @@ -537,6 +548,12 @@ func (app *ReactAppWrapper) createIntegration(c *gin.Context) { return } + if int.Provider == integrations.LocalfsProvider { + int.ID = uuid.NewString() + warnLocalfsEdition(c, &int) + return + } + uid := c.GetString(userIDContextKey) user, err := app.userStorer.GetUser(uid) @@ -590,6 +607,11 @@ func (app *ReactAppWrapper) updateIntegration(c *gin.Context) { return } + if int.Provider == integrations.LocalfsProvider { + warnLocalfsEdition(c, &int) + return + } + uid := c.GetString(userIDContextKey) intid := common.ParamS(intIDParam, c) diff --git a/ui/src/pages/Integrations/IntegrationModal.js b/ui/src/pages/Integrations/IntegrationModal.js index e4c89843..ac6cbfc4 100644 --- a/ui/src/pages/Integrations/IntegrationModal.js +++ b/ui/src/pages/Integrations/IntegrationModal.js @@ -71,7 +71,9 @@ export default function IntegrationModal(params) {