Skip to content
Snippets Groups Projects
Select Git revision
  • b35c5f632b801efce7486aea534cb600059eb478
  • release default protected
  • 11-22-implement-kv-interface-defined-in-collectiveversionedkvgo
  • hotfix/TestHostPool_UpdateNdf_AddFilter
  • XX-4719/announcementChannels
  • xx-4717/logLevel
  • jonah/noob-channel
  • master protected
  • XX-4707/tagDiskJson
  • xx-4698/notification-retry
  • hotfix/notifylockup
  • syncNodes
  • hotfix/localCB
  • XX-4677/NewChanManagerMobile
  • XX-4689/DmSync
  • duplicatePrefix
  • XX-4601/HavenInvites
  • finalizedUICallbacks
  • XX-4673/AdminKeySync
  • debugNotifID
  • anne/test
  • v4.7.5
  • v4.7.4
  • v4.7.3
  • v4.7.2
  • v4.7.1
  • v4.6.3
  • v4.6.1
  • v4.5.0
  • v4.4.4
  • v4.3.11
  • v4.3.8
  • v4.3.7
  • v4.3.6
  • v4.3.5
  • v4.2.0
  • v4.3.0
  • v4.3.4
  • v4.3.3
  • v4.3.2
  • v4.3.1
41 results

receiveNew.go

  • receiveNew.go 3.47 KiB
    ////////////////////////////////////////////////////////////////////////////////
    // Copyright © 2020 xx network SEZC                                           //
    //                                                                            //
    // Use of this source code is governed by a license that can be found in the  //
    // LICENSE file                                                               //
    ////////////////////////////////////////////////////////////////////////////////
    
    package fileTransfer
    
    import (
    	"github.com/golang/protobuf/proto"
    	"github.com/pkg/errors"
    	jww "github.com/spf13/jwalterweatherman"
    	"gitlab.com/elixxir/client/interfaces/message"
    	"gitlab.com/elixxir/client/stoppable"
    	ftCrypto "gitlab.com/elixxir/crypto/fileTransfer"
    	"gitlab.com/xx_network/primitives/id"
    )
    
    // Error messages.
    const (
    	receiveMessageTypeErr = "received message is not of type NewFileTransfer"
    	protoUnmarshalErr     = "failed to unmarshal request: %+v"
    )
    
    // receiveNewFileTransfer starts a thread that waits for new file transfer
    // messages.
    func (m *Manager) receiveNewFileTransfer(rawMsgs chan message.Receive,
    	stop *stoppable.Single) {
    	jww.DEBUG.Print("[FT] Starting new file transfer message reception thread.")
    
    	for {
    		select {
    		case <-stop.Quit():
    			jww.DEBUG.Print("[FT] Stopping new file transfer message " +
    				"reception thread: stoppable triggered")
    			stop.ToStopped()
    			return
    		case receivedMsg := <-rawMsgs:
    			jww.TRACE.Print(
    				"[FT] New file transfer message thread received message.")
    
    			tid, fileName, fileType, sender, size, preview, err :=
    				m.readNewFileTransferMessage(receivedMsg)
    			if err != nil {
    				if err.Error() == receiveMessageTypeErr {
    					jww.DEBUG.Printf("[FT] Failed to read message as new file "+
    						"transfer message: %+v", err)
    				} else {
    					jww.WARN.Printf("[FT] Failed to read message as new file "+
    						"transfer message: %+v", err)
    				}
    				continue
    			}
    
    			// Call the reception callback
    			go m.receiveCB(tid, fileName, fileType, sender, size, preview)
    
    			// Trigger a resend of all garbled messages
    			m.net.CheckGarbledMessages()
    		}
    	}
    }
    
    // readNewFileTransferMessage reads the received message and adds it to the
    // received transfer list. Returns the transfer ID, sender ID, file size, and
    // file preview.
    func (m *Manager) readNewFileTransferMessage(msg message.Receive) (
    	tid ftCrypto.TransferID, fileName, fileType string, sender *id.ID,
    	fileSize uint32, preview []byte, err error) {
    
    	// Return an error if the message is not a NewFileTransfer
    	if msg.MessageType != message.NewFileTransfer {
    		err = errors.New(receiveMessageTypeErr)
    		return
    	}
    
    	// Unmarshal the request message
    	newFT := &NewFileTransfer{}
    	err = proto.Unmarshal(msg.Payload, newFT)
    	if err != nil {
    		err = errors.Errorf(protoUnmarshalErr, err)
    		return
    	}
    
    	// Get RNG from stream
    	rng := m.rng.GetStream()
    	defer rng.Close()
    
    	// Add the transfer to the list of receiving transfers
    	key := ftCrypto.UnmarshalTransferKey(newFT.TransferKey)
    	numParts := uint16(newFT.NumParts)
    	numFps := calcNumberOfFingerprints(numParts, newFT.Retry)
    	tid, err = m.received.AddTransfer(
    		key, newFT.TransferMac, newFT.Size, numParts, numFps, rng)
    	if err != nil {
    		return
    	}
    
    	jww.DEBUG.Printf("[FT] Received new file transfer %s from %s {name: %q, "+
    		"type: %q, size: %d, parts: %d, numFps: %d, retry: %f}", tid, msg.Sender,
    		newFT.FileName, newFT.FileType, newFT.Size, numParts, numFps, newFT.Retry)
    
    	return tid, newFT.FileName, newFT.FileType, msg.Sender, newFT.Size,
    		newFT.Preview, nil
    }