in src/datachannel/streaming.go [434:491]
func (dataChannel *DataChannel) handleHandshakeRequest(log log.T, clientMessage message.ClientMessage) error {
handshakeRequest, err := clientMessage.DeserializeHandshakeRequest(log)
if err != nil {
log.Errorf("Deserialize Handshake Request failed: %s", err)
return err
}
dataChannel.agentVersion = handshakeRequest.AgentVersion
var errorList []error
var handshakeResponse message.HandshakeResponsePayload
handshakeResponse.ClientVersion = version.Version
handshakeResponse.ProcessedClientActions = []message.ProcessedClientAction{}
for _, action := range handshakeRequest.RequestedClientActions {
processedAction := message.ProcessedClientAction{}
switch action.ActionType {
case message.KMSEncryption:
processedAction.ActionType = action.ActionType
err := dataChannel.ProcessKMSEncryptionHandshakeAction(log, action.ActionParameters)
if err != nil {
processedAction.ActionStatus = message.Failed
processedAction.Error = fmt.Sprintf("Failed to process action %s: %s",
message.KMSEncryption, err)
errorList = append(errorList, err)
} else {
processedAction.ActionStatus = message.Success
processedAction.ActionResult = message.KMSEncryptionResponse{
KMSCipherTextKey: dataChannel.encryption.GetEncryptedDataKey(),
}
dataChannel.encryptionEnabled = true
}
case message.SessionType:
processedAction.ActionType = action.ActionType
err := dataChannel.ProcessSessionTypeHandshakeAction(action.ActionParameters)
if err != nil {
processedAction.ActionStatus = message.Failed
processedAction.Error = fmt.Sprintf("Failed to process action %s: %s",
message.SessionType, err)
errorList = append(errorList, err)
} else {
processedAction.ActionStatus = message.Success
}
default:
processedAction.ActionType = action.ActionType
processedAction.ActionResult = message.Unsupported
processedAction.Error = fmt.Sprintf("Unsupported action %s", action.ActionType)
errorList = append(errorList, errors.New(processedAction.Error))
}
handshakeResponse.ProcessedClientActions = append(handshakeResponse.ProcessedClientActions, processedAction)
}
for _, x := range errorList {
handshakeResponse.Errors = append(handshakeResponse.Errors, x.Error())
}
err = dataChannel.sendHandshakeResponse(log, handshakeResponse)
return err
}