helpers_plugin.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
  2. // See LICENSE.txt for license information.
  3. package plugin
  4. import (
  5. "net/http"
  6. "net/url"
  7. "path"
  8. "time"
  9. "github.com/blang/semver"
  10. "github.com/mattermost/mattermost-server/v5/model"
  11. "github.com/pkg/errors"
  12. )
  13. // InstallPluginFromURL implements Helpers.InstallPluginFromURL.
  14. func (p *HelpersImpl) InstallPluginFromURL(downloadURL string, replace bool) (*model.Manifest, error) {
  15. err := p.ensureServerVersion("5.18.0")
  16. if err != nil {
  17. return nil, err
  18. }
  19. parsedURL, err := url.Parse(downloadURL)
  20. if err != nil {
  21. return nil, errors.Wrap(err, "error while parsing url")
  22. }
  23. client := &http.Client{Timeout: time.Hour}
  24. response, err := client.Get(parsedURL.String())
  25. if err != nil {
  26. return nil, errors.Wrap(err, "unable to download the plugin")
  27. }
  28. defer response.Body.Close()
  29. if response.StatusCode != http.StatusOK {
  30. return nil, errors.Errorf("received %d status code while downloading plugin from server", response.StatusCode)
  31. }
  32. manifest, installError := p.API.InstallPlugin(response.Body, replace)
  33. if installError != nil {
  34. return nil, errors.Wrap(err, "unable to install plugin on server")
  35. }
  36. return manifest, nil
  37. }
  38. func (p *HelpersImpl) ensureServerVersion(required string) error {
  39. serverVersion := p.API.GetServerVersion()
  40. currentVersion := semver.MustParse(serverVersion)
  41. requiredVersion := semver.MustParse(required)
  42. if currentVersion.LT(requiredVersion) {
  43. return errors.Errorf("incompatible server version for plugin, minimum required version: %s, current version: %s", required, serverVersion)
  44. }
  45. return nil
  46. }
  47. // GetPluginAssetURL implements GetPluginAssetURL.
  48. func (p *HelpersImpl) GetPluginAssetURL(pluginID, asset string) (string, error) {
  49. if len(pluginID) == 0 {
  50. return "", errors.New("empty pluginID provided")
  51. }
  52. if len(asset) == 0 {
  53. return "", errors.New("empty asset name provided")
  54. }
  55. siteURL := *p.API.GetConfig().ServiceSettings.SiteURL
  56. if siteURL == "" {
  57. return "", errors.New("no SiteURL configured by the server")
  58. }
  59. u, err := url.Parse(siteURL + path.Join("/", pluginID, asset))
  60. if err != nil {
  61. return "", err
  62. }
  63. return u.String(), nil
  64. }