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 }