From 602041d1c224f278e7fedd5cd5effdbabd8af482 Mon Sep 17 00:00:00 2001 From: Sarah Jamie Lewis Date: Mon, 28 Aug 2023 09:44:19 -0700 Subject: [PATCH] Allow force restarting of file shares regardless of timestamp. Move RestartFileShare to FileSharingFunctionality where it belongs. --- .../filesharing/filesharing_functionality.go | 26 ++++++++++++------- functionality/filesharing/image_previews.go | 5 ++-- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/functionality/filesharing/filesharing_functionality.go b/functionality/filesharing/filesharing_functionality.go index 22986cc..7c29d25 100644 --- a/functionality/filesharing/filesharing_functionality.go +++ b/functionality/filesharing/filesharing_functionality.go @@ -45,6 +45,8 @@ func (f *Functionality) ExperimentsToRegister() []string { func (f *Functionality) OnEvent(ev event.Event, profile peer.CwtchPeer) { if profile.IsFeatureEnabled(constants.FileSharingExperiment) { switch ev.EventType { + case event.ProtocolEngineCreated: + f.ReShareFiles(profile) case event.ManifestReceived: log.Debugf("Manifest Received Event!: %v", ev) handle := ev.Data[event.Handle] @@ -294,9 +296,10 @@ func (f *Functionality) DownloadFile(profile peer.CwtchPeer, conversationID int, } // startFileShare is a private method used to finalize a file share and publish it to the protocol engine for processing. -func (f *Functionality) startFileShare(profile peer.CwtchPeer, filekey string, manifest string) error { +// if force is set to true, this function will ignore timestamp checks... +func (f *Functionality) startFileShare(profile peer.CwtchPeer, filekey string, manifest string, force bool) error { tsStr, exists := profile.GetScopedZonedAttribute(attr.LocalScope, attr.FilesharingZone, fmt.Sprintf("%s.ts", filekey)) - if exists { + if exists && !force { ts, err := strconv.ParseInt(tsStr, 10, 64) if err != nil || ts < time.Now().Unix()-2592000 { log.Errorf("ignoring request to download a file offered more than 30 days ago") @@ -311,7 +314,14 @@ func (f *Functionality) startFileShare(profile peer.CwtchPeer, filekey string, m } // RestartFileShare takes in an existing filekey and, assuming the manifest exists, restarts sharing of the manifest +// by default this function always forces a file share, even if the file has timed out. func (f *Functionality) RestartFileShare(profile peer.CwtchPeer, filekey string) error { + return f.restartFileShareAdvanced(profile, filekey, true) +} + +// RestartFileShareAdvanced takes in an existing filekey and, assuming the manifest exists, restarts sharing of the manifest in addition +// to a set of parameters +func (f *Functionality) restartFileShareAdvanced(profile peer.CwtchPeer, filekey string, force bool) error { // assert that we are allowed to restart filesharing if !profile.IsFeatureEnabled(constants.FileSharingExperiment) { @@ -323,7 +333,7 @@ func (f *Functionality) RestartFileShare(profile peer.CwtchPeer, filekey string) if manifestExists { // everything is in order, so reshare this file with the engine log.Debugf("restarting file share: %v", filekey) - return f.startFileShare(profile, filekey, manifest) + return f.startFileShare(profile, filekey, manifest, force) } return fmt.Errorf("manifest does not exist for filekey: %v", filekey) } @@ -357,12 +367,10 @@ func (f *Functionality) ReShareFiles(profile peer.CwtchPeer) error { filekey := strings.Join(keyparts[:2], ".") sharedFile, err := f.GetFileShareInfo(profile, filekey) - // If we haven't explicitly stopped sharing the file AND - // If fewer than 30 days have passed since we originally shared this file, - // Then attempt to share this file again... - // TODO: In the future this would be the point to change the timestamp and reshare the file... + // If we haven't explicitly stopped sharing the file then attempt a reshare if err == nil && sharedFile.Active { - err := f.RestartFileShare(profile, filekey) + // this reshare can fail because we don't force sharing of files older than 30 days... + err := f.restartFileShareAdvanced(profile, filekey, false) if err != nil { log.Debugf("could not reshare file: %v", err) } @@ -456,7 +464,7 @@ func (f *Functionality) ShareFile(filepath string, profile peer.CwtchPeer) (stri profile.SetScopedZonedAttribute(attr.ConversationScope, attr.FilesharingZone, fmt.Sprintf("%s.manifest", key), string(serializedManifest)) profile.SetScopedZonedAttribute(attr.ConversationScope, attr.FilesharingZone, fmt.Sprintf("%s.manifest.size", key), strconv.Itoa(int(math.Ceil(float64(len(serializedManifest)-lenDiff)/float64(files.DefaultChunkSize))))) - err = f.startFileShare(profile, key, string(serializedManifest)) + err = f.startFileShare(profile, key, string(serializedManifest), false) return key, string(wrapperJSON), err } diff --git a/functionality/filesharing/image_previews.go b/functionality/filesharing/image_previews.go index ad509a2..6bbc794 100644 --- a/functionality/filesharing/image_previews.go +++ b/functionality/filesharing/image_previews.go @@ -75,10 +75,9 @@ func (i *ImagePreviewsFunctionality) OnEvent(ev event.Event, profile peer.CwtchP // we reset the profile image here so that it is always available. profile.SetScopedZonedAttribute(attr.LocalScope, attr.FilesharingZone, fmt.Sprintf("%s.ts", key), strconv.FormatInt(time.Now().Unix(), 10)) log.Debugf("Custom Profile Image: %v %s", key, serializedManifest) + f := Functionality{} + f.RestartFileShare(profile, key) } - // If file sharing is enabled then reshare all active files... - fsf := FunctionalityGate() - _ = fsf.ReShareFiles(profile) } } }