github.com/mattermosttest/mattermost-server/v5@v5.0.0-20200917143240-9dfa12e121f9/model/marketplace_plugin.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See LICENSE.txt for license information. 3 4 package model 5 6 import ( 7 "bytes" 8 "encoding/base64" 9 "encoding/json" 10 "io" 11 "net/url" 12 "strconv" 13 14 "github.com/pkg/errors" 15 ) 16 17 // BaseMarketplacePlugin is a Mattermost plugin received from the Marketplace server. 18 type BaseMarketplacePlugin struct { 19 HomepageURL string `json:"homepage_url"` 20 IconData string `json:"icon_data"` 21 DownloadURL string `json:"download_url"` 22 ReleaseNotesURL string `json:"release_notes_url"` 23 Labels []MarketplaceLabel `json:"labels"` 24 Signature string `json:"signature"` // Signature represents a signature of a plugin saved in base64 encoding. 25 Manifest *Manifest `json:"manifest"` 26 } 27 28 // MarketplaceLabel represents a label shown in the Marketplace UI. 29 type MarketplaceLabel struct { 30 Name string `json:"name"` 31 Description string `json:"description"` 32 URL string `json:"url"` 33 Color string `json:"color"` 34 } 35 36 // MarketplacePlugin is a state aware Marketplace plugin. 37 type MarketplacePlugin struct { 38 *BaseMarketplacePlugin 39 InstalledVersion string `json:"installed_version"` 40 } 41 42 // BaseMarketplacePluginsFromReader decodes a json-encoded list of plugins from the given io.Reader. 43 func BaseMarketplacePluginsFromReader(reader io.Reader) ([]*BaseMarketplacePlugin, error) { 44 plugins := []*BaseMarketplacePlugin{} 45 decoder := json.NewDecoder(reader) 46 47 if err := decoder.Decode(&plugins); err != nil && err != io.EOF { 48 return nil, err 49 } 50 51 return plugins, nil 52 } 53 54 // MarketplacePluginsFromReader decodes a json-encoded list of plugins from the given io.Reader. 55 func MarketplacePluginsFromReader(reader io.Reader) ([]*MarketplacePlugin, error) { 56 plugins := []*MarketplacePlugin{} 57 decoder := json.NewDecoder(reader) 58 59 if err := decoder.Decode(&plugins); err != nil && err != io.EOF { 60 return nil, err 61 } 62 63 return plugins, nil 64 } 65 66 // DecodeSignature Decodes signature and returns ReadSeeker. 67 func (plugin *BaseMarketplacePlugin) DecodeSignature() (io.ReadSeeker, error) { 68 signatureBytes, err := base64.StdEncoding.DecodeString(plugin.Signature) 69 if err != nil { 70 return nil, errors.Wrap(err, "Unable to decode base64 signature.") 71 } 72 return bytes.NewReader(signatureBytes), nil 73 } 74 75 // MarketplacePluginFilter describes the parameters to request a list of plugins. 76 type MarketplacePluginFilter struct { 77 Page int 78 PerPage int 79 Filter string 80 ServerVersion string 81 BuildEnterpriseReady bool 82 EnterprisePlugins bool 83 LocalOnly bool 84 } 85 86 // ApplyToURL modifies the given url to include query string parameters for the request. 87 func (filter *MarketplacePluginFilter) ApplyToURL(u *url.URL) { 88 q := u.Query() 89 q.Add("page", strconv.Itoa(filter.Page)) 90 if filter.PerPage > 0 { 91 q.Add("per_page", strconv.Itoa(filter.PerPage)) 92 } 93 q.Add("filter", filter.Filter) 94 q.Add("server_version", filter.ServerVersion) 95 q.Add("build_enterprise_ready", strconv.FormatBool(filter.BuildEnterpriseReady)) 96 q.Add("enterprise_plugins", strconv.FormatBool(filter.EnterprisePlugins)) 97 q.Add("local_only", strconv.FormatBool(filter.LocalOnly)) 98 u.RawQuery = q.Encode() 99 } 100 101 // InstallMarketplacePluginRequest struct describes parameters of the requested plugin. 102 type InstallMarketplacePluginRequest struct { 103 Id string `json:"id"` 104 Version string `json:"version"` 105 } 106 107 // PluginRequestFromReader decodes a json-encoded plugin request from the given io.Reader. 108 func PluginRequestFromReader(reader io.Reader) (*InstallMarketplacePluginRequest, error) { 109 var r *InstallMarketplacePluginRequest 110 err := json.NewDecoder(reader).Decode(&r) 111 if err != nil { 112 return nil, err 113 } 114 return r, nil 115 } 116 117 // ToJson method will return json from plugin request. 118 func (r *InstallMarketplacePluginRequest) ToJson() (string, error) { 119 b, err := json.Marshal(r) 120 if err != nil { 121 return "", err 122 } 123 return string(b), nil 124 }