package loader import ( "errors" "fmt" "galaxy/connector" "galaxy/util" ) func (l *loader) checkAndDownloadPluginVersion() error { versions, err := l.connector.CheckVersion() if err != nil { return err } else if latest, ok, err := latestVersion(versions); err != nil { return err } else if ok { return l.preparePluginVersion(latest) } else { return errors.New("Server did not respond with a suitable client version") } } // preparePluginVersion fetches and stores given version of plugin artifact, if newer to the current known version. func (l *loader) preparePluginVersion(v connector.VersionInfo) error { s, exists, err := l.loadCurrentState() if err != nil { return err } version, err := util.ParseSemver(v.Version) if err != nil { return err } if exists { currentVersion, err := util.ParseSemver(s.ClientCurrentVersion) if err != nil { return err } if util.CompareSemver(currentVersion, version) > 0 { return nil } } err = l.downloadPlugin(v.URL, v.Version, v.Checksum) if err != nil { return err } return nil } // downloadPlugin downloads and stores at the App's local storage with a pre-defined name with semver suffix. func (l *loader) downloadPlugin(url, version string, checksum [32]byte) error { data, err := l.connector.DownloadVersion(url) if err != nil { return fmt.Errorf("Plugin v%s download error: %w", version, err) } dataChecksum := SumSHA256(data) if !EqualSHA256(checksum, dataChecksum) { return errors.New("Downloaded pligin checksum incorrect") } versionFileName := resolvePluginFile(version) versionFileExists, _, err := l.storage.FileExists(versionFileName) if err != nil { return fmt.Errorf("Check plugin v%s exists error: %w", version, err) } if versionFileExists { storedData, err := l.storage.ReadFile(versionFileName) if err != nil { return err } if EqualSHA256(dataChecksum, SumSHA256(storedData)) { return nil } if err := l.storage.DeleteFile(versionFileName); err != nil { return fmt.Errorf("Plugin v%s delete error: %w", version, err) } } err = l.storage.WriteFile(versionFileName, data) if err != nil { return fmt.Errorf("Plugin file write error: %w", err) } if err := l.setNextVersion(&version); err != nil { return err } return nil }