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  }