github.com/stolowski/snapd@v0.0.0-20210407085831-115137ce5a22/store/details.go (about)

     1  // -*- Mode: Go; indent-tabs-mode: t -*-
     2  
     3  /*
     4   * Copyright (C) 2014-2016 Canonical Ltd
     5   *
     6   * This program is free software: you can redistribute it and/or modify
     7   * it under the terms of the GNU General Public License version 3 as
     8   * published by the Free Software Foundation.
     9   *
    10   * This program is distributed in the hope that it will be useful,
    11   * but WITHOUT ANY WARRANTY; without even the implied warranty of
    12   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    13   * GNU General Public License for more details.
    14   *
    15   * You should have received a copy of the GNU General Public License
    16   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
    17   *
    18   */
    19  
    20  package store
    21  
    22  import (
    23  	"github.com/snapcore/snapd/jsonutil/safejson"
    24  	"github.com/snapcore/snapd/snap"
    25  	"github.com/snapcore/snapd/strutil"
    26  )
    27  
    28  // snapDetails encapsulates the data sent to us from the store as JSON.
    29  type snapDetails struct {
    30  	AnonDownloadURL  string             `json:"anon_download_url,omitempty"`
    31  	Architectures    []string           `json:"architecture"`
    32  	Channel          string             `json:"channel,omitempty"`
    33  	DownloadSha3_384 string             `json:"download_sha3_384,omitempty"`
    34  	Summary          safejson.String    `json:"summary,omitempty"`
    35  	Description      safejson.Paragraph `json:"description,omitempty"`
    36  	DownloadSize     int64              `json:"binary_filesize,omitempty"`
    37  	DownloadURL      string             `json:"download_url,omitempty"`
    38  	LastUpdated      string             `json:"last_updated,omitempty"`
    39  	Name             string             `json:"package_name"`
    40  	Prices           map[string]float64 `json:"prices,omitempty"`
    41  	// Note that the publisher is really the "display name" of the
    42  	// publisher
    43  	Publisher      string           `json:"publisher,omitempty"`
    44  	RatingsAverage float64          `json:"ratings_average,omitempty"`
    45  	Revision       int              `json:"revision"` // store revisions are ints starting at 1
    46  	SnapID         string           `json:"snap_id"`
    47  	License        string           `json:"license,omitempty"`
    48  	Base           string           `json:"base,omitempty"`
    49  	Media          []storeSnapMedia `json:"media,omitempty"`
    50  
    51  	// FIXME: the store should send "contact" here, once it does we
    52  	//        can remove support_url
    53  	SupportURL string `json:"support_url"`
    54  	Contact    string `json:"contact"`
    55  
    56  	Title   safejson.String `json:"title"`
    57  	Type    snap.Type       `json:"content,omitempty"`
    58  	Version string          `json:"version"`
    59  
    60  	Developer           string `json:"origin"`
    61  	DeveloperID         string `json:"developer_id"`
    62  	DeveloperName       string `json:"developer_name"`
    63  	DeveloperValidation string `json:"developer_validation"`
    64  
    65  	Private     bool   `json:"private"`
    66  	Confinement string `json:"confinement"`
    67  
    68  	CommonIDs []string `json:"common_ids,omitempty"`
    69  }
    70  
    71  func infoFromRemote(d *snapDetails) *snap.Info {
    72  	info := &snap.Info{}
    73  	info.Architectures = d.Architectures
    74  	info.SnapType = d.Type
    75  	info.Version = d.Version
    76  	info.RealName = d.Name
    77  	info.SnapID = d.SnapID
    78  	info.Revision = snap.R(d.Revision)
    79  
    80  	// https://forum.snapcraft.io/t/title-length-in-snapcraft-yaml-snap-yaml/8625/10
    81  	info.EditedTitle = strutil.ElliptRight(d.Title.Clean(), 40)
    82  
    83  	info.EditedSummary = d.Summary.Clean()
    84  	info.EditedDescription = d.Description.Clean()
    85  	// Note that the store side is using confusing terminology here.
    86  	// What the store calls "developer" is actually the publisher
    87  	// username.
    88  	//
    89  	// It also sends "publisher" and "developer_name" which are
    90  	// the "publisher display name" which we cannot use currently
    91  	// because it is not validated (i.e. the publisher could put
    92  	// anything in there and mislead the users this way).
    93  	info.Publisher = snap.StoreAccount{
    94  		ID:          d.DeveloperID,
    95  		Username:    d.Developer,
    96  		DisplayName: d.DeveloperName,
    97  		Validation:  d.DeveloperValidation,
    98  	}
    99  	info.Channel = d.Channel
   100  	info.Sha3_384 = d.DownloadSha3_384
   101  	info.Size = d.DownloadSize
   102  	info.AnonDownloadURL = d.AnonDownloadURL
   103  	info.DownloadURL = d.DownloadURL
   104  	info.Prices = d.Prices
   105  	info.Private = d.Private
   106  	info.Paid = len(info.Prices) > 0
   107  	info.Confinement = snap.ConfinementType(d.Confinement)
   108  	info.Contact = d.Contact
   109  	info.License = d.License
   110  	info.Base = d.Base
   111  	info.CommonIDs = d.CommonIDs
   112  
   113  	addMedia(info, d.Media)
   114  
   115  	// FIXME: once the store sends "contact" for everything, remove
   116  	//        the "SupportURL" part of the if
   117  	if info.Contact == "" {
   118  		info.Contact = d.SupportURL
   119  	}
   120  
   121  	return info
   122  }