123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
- // See LICENSE.txt for license information.
- package plugin
- import (
- "net/http"
- "net/url"
- "path"
- "time"
- "github.com/blang/semver"
- "github.com/mattermost/mattermost-server/v5/model"
- "github.com/pkg/errors"
- )
- // InstallPluginFromURL implements Helpers.InstallPluginFromURL.
- func (p *HelpersImpl) InstallPluginFromURL(downloadURL string, replace bool) (*model.Manifest, error) {
- err := p.ensureServerVersion("5.18.0")
- if err != nil {
- return nil, err
- }
- parsedURL, err := url.Parse(downloadURL)
- if err != nil {
- return nil, errors.Wrap(err, "error while parsing url")
- }
- client := &http.Client{Timeout: time.Hour}
- response, err := client.Get(parsedURL.String())
- if err != nil {
- return nil, errors.Wrap(err, "unable to download the plugin")
- }
- defer response.Body.Close()
- if response.StatusCode != http.StatusOK {
- return nil, errors.Errorf("received %d status code while downloading plugin from server", response.StatusCode)
- }
- manifest, installError := p.API.InstallPlugin(response.Body, replace)
- if installError != nil {
- return nil, errors.Wrap(err, "unable to install plugin on server")
- }
- return manifest, nil
- }
- func (p *HelpersImpl) ensureServerVersion(required string) error {
- serverVersion := p.API.GetServerVersion()
- currentVersion := semver.MustParse(serverVersion)
- requiredVersion := semver.MustParse(required)
- if currentVersion.LT(requiredVersion) {
- return errors.Errorf("incompatible server version for plugin, minimum required version: %s, current version: %s", required, serverVersion)
- }
- return nil
- }
- // GetPluginAssetURL implements GetPluginAssetURL.
- func (p *HelpersImpl) GetPluginAssetURL(pluginID, asset string) (string, error) {
- if len(pluginID) == 0 {
- return "", errors.New("empty pluginID provided")
- }
- if len(asset) == 0 {
- return "", errors.New("empty asset name provided")
- }
- siteURL := *p.API.GetConfig().ServiceSettings.SiteURL
- if siteURL == "" {
- return "", errors.New("no SiteURL configured by the server")
- }
- u, err := url.Parse(siteURL + path.Join("/", pluginID, asset))
- if err != nil {
- return "", err
- }
- return u.String(), nil
- }
|