Example #1
0
func sendAuthResult(
	cmd *ClientCmd,
	context *helpers.ConnectionContext,
	option HandlerParamsReader) (*ServerCmd, error) {
	// Check client hash
	serverKey := context.GetTmpData()
	var err error
	var result *ServerCmd
	if len(serverKey) == option.GetDefaultKeySize() {
		requestData := (*cmd).Data
		if len(requestData) > 0 {
			if clientParts := strings.Split(requestData, ":"); len(clientParts) == 2 {
				// clientParts[0] - hash from client clientParts[1] - client "salt"
				line := fmt.Sprintf(
					"%s%s%s",
					// main key
					option.GetSecretKey(),
					// client key
					clientParts[1],
					// server key
					serverKey)

				if hashMethod(line, option) == clientParts[0] {
					rand := helpers.NewSystemRandom()
					keySize, node := option.GetCidConstructorData()
					contextData := ContextNewData{auth: true}
					// offer new cid
					answer := ServerCmd{
						contextUpdater: &contextData,
						baseCmd:        baseCmd{Cid: rand.CreateCid(keySize, node), Target: CmdClientData}}
					result = &answer

				} else {
					err = errors.New("Auth failed!")
				}
			} else {
				err = errors.New("Client data format error.")
			}
		} else {
			err = errors.New("Client data not found.")
		}
	} else {
		// incorrect
		err = errors.New("Connection without auth request?")
	}
	return result, err
}