github.com/haalcala/mattermost-server-change-repo@v0.0.0-20210713015153-16753fbeee5f/plugin/helpers_plugin.go (about)

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