diff --git a/pkg/api/datasources.go b/pkg/api/datasources.go index 2b9964f7a71..87c743c9ce6 100644 --- a/pkg/api/datasources.go +++ b/pkg/api/datasources.go @@ -104,17 +104,56 @@ func AddDataSource(c *middleware.Context, cmd m.AddDataSourceCommand) { c.JSON(200, util.DynMap{"message": "Datasource added", "id": cmd.Result.Id}) } -func UpdateDataSource(c *middleware.Context, cmd m.UpdateDataSourceCommand) { +func UpdateDataSource(c *middleware.Context, cmd m.UpdateDataSourceCommand) Response { cmd.OrgId = c.OrgId cmd.Id = c.ParamsInt64(":id") - err := bus.Dispatch(&cmd) + err := fillWithSecureJsonData(&cmd) if err != nil { - c.JsonApiErr(500, "Failed to update datasource", err) - return + return ApiError(500, "Failed to update datasource", err) } - c.JsonOK("Datasource updated") + err = bus.Dispatch(&cmd) + if err != nil { + return ApiError(500, "Failed to update datasource", err) + } + + return Json(200, "Datasource updated") +} + +func fillWithSecureJsonData(cmd *m.UpdateDataSourceCommand) error { + if len(cmd.SecureJsonData) == 0 { + return nil + } + + ds, err := getRawDataSourceById(cmd.Id, cmd.OrgId) + + if err != nil { + return err + } + secureJsonData := ds.SecureJsonData.Decrypt() + + for k, v := range secureJsonData { + + if _, ok := cmd.SecureJsonData[k]; !ok { + cmd.SecureJsonData[k] = v + } + } + + return nil +} + +func getRawDataSourceById(id int64, orgId int64) (*m.DataSource, error) { + query := m.GetDataSourceByIdQuery{ + Id: id, + OrgId: orgId, + } + + if err := bus.Dispatch(&query); err != nil { + return nil, err + } + + return query.Result, nil } // Get /api/datasources/name/:name @@ -152,7 +191,7 @@ func GetDataSourceIdByName(c *middleware.Context) Response { } func convertModelToDtos(ds *m.DataSource) dtos.DataSource { - return dtos.DataSource{ + dto := dtos.DataSource{ Id: ds.Id, OrgId: ds.OrgId, Name: ds.Name, @@ -169,4 +208,12 @@ func convertModelToDtos(ds *m.DataSource) dtos.DataSource { IsDefault: ds.IsDefault, JsonData: ds.JsonData, } + + if len(ds.SecureJsonData) > 0 { + dto.TLSAuth.CACertSet = len(ds.SecureJsonData["tlsCACert"]) > 0 + dto.TLSAuth.ClientCertSet = len(ds.SecureJsonData["tlsClientCert"]) > 0 + dto.TLSAuth.ClientKeySet = len(ds.SecureJsonData["tlsClientKey"]) > 0 + } + + return dto } diff --git a/pkg/api/dtos/models.go b/pkg/api/dtos/models.go index 153468c582c..9f8ae329fec 100644 --- a/pkg/api/dtos/models.go +++ b/pkg/api/dtos/models.go @@ -81,6 +81,14 @@ type DataSource struct { IsDefault bool `json:"isDefault"` JsonData *simplejson.Json `json:"jsonData,omitempty"` SecureJsonData map[string]string `json:"secureJsonData,omitempty"` + TLSAuth TLSAuth `json:"tlsAuth,omitempty"` +} + +// TLSAuth is used to show if TLS certs have been uploaded already +type TLSAuth struct { + CACertSet bool `json:"tlsCACertSet"` + ClientCertSet bool `json:"tlsClientCertSet"` + ClientKeySet bool `json:"tlsClientKeySet"` } type DataSourceList []DataSource