diff --git a/src/Simplex/Messaging/Agent.hs b/src/Simplex/Messaging/Agent.hs index a2aeb9d68..9ee45f362 100644 --- a/src/Simplex/Messaging/Agent.hs +++ b/src/Simplex/Messaging/Agent.hs @@ -162,7 +162,7 @@ setNtfServers :: AgentErrorMonad m => AgentClient -> [NtfServer] -> m () setNtfServers c = withAgentEnv c . setNtfServers' c -- | Register device notifications token -registerNtfToken :: AgentErrorMonad m => AgentClient -> DeviceToken -> m () +registerNtfToken :: AgentErrorMonad m => AgentClient -> DeviceToken -> m NtfTknStatus registerNtfToken c = withAgentEnv c . registerNtfToken' c -- | Verify device notifications token @@ -525,25 +525,25 @@ setSMPServers' :: AgentMonad m => AgentClient -> NonEmpty SMPServer -> m () setSMPServers' c servers = do atomically $ writeTVar (smpServers c) servers -registerNtfToken' :: forall m. AgentMonad m => AgentClient -> DeviceToken -> m () +registerNtfToken' :: forall m. AgentMonad m => AgentClient -> DeviceToken -> m NtfTknStatus registerNtfToken' c deviceToken = withStore (`getDeviceNtfToken` deviceToken) >>= \case (Just tkn@NtfToken {ntfTokenId, ntfTknStatus, ntfTknAction}, prevTokens) -> do mapM_ (deleteToken_ c) prevTokens case (ntfTokenId, ntfTknAction) of - (Nothing, Just NTARegister) -> registerToken tkn + (Nothing, Just NTARegister) -> registerToken tkn $> NTRegistered -- TODO minimal time before repeat registration - (Just _, Nothing) -> when (ntfTknStatus == NTRegistered) $ registerToken tkn + (Just _, Nothing) -> when (ntfTknStatus == NTRegistered) (registerToken tkn) $> NTRegistered (Just tknId, Just (NTAVerify code)) -> t tkn (NTActive, Just NTACheck) $ agentNtfVerifyToken c tknId tkn code (Just tknId, Just (NTACron interval)) -> t tkn (cronSuccess interval) $ agentNtfEnableCron c tknId tkn interval - (Just _tknId, Just NTACheck) -> pure () -- TODO + (Just _tknId, Just NTACheck) -> pure ntfTknStatus -- TODO -- agentNtfCheckToken c tknId tkn >>= \case (Just tknId, Just NTADelete) -> do agentNtfDeleteToken c tknId tkn - withStore $ \st -> removeNtfToken st tkn - _ -> pure () + withStore $ \st -> removeNtfToken st tkn $> NTExpired + _ -> pure ntfTknStatus _ -> getNtfServer c >>= \case Just ntfServer -> @@ -554,6 +554,7 @@ registerNtfToken' c deviceToken = let tkn = newNtfToken deviceToken ntfServer tknKeys dhKeys withStore $ \st -> createNtfToken st tkn registerToken tkn + pure NTRegistered _ -> throwError $ CMD PROHIBITED where t tkn = withToken c tkn Nothing @@ -569,7 +570,7 @@ verifyNtfToken' c deviceToken code nonce = withStore (`getDeviceNtfToken` deviceToken) >>= \case (Just tkn@NtfToken {ntfTokenId = Just tknId, ntfDhSecret = Just dhSecret}, _) -> do code' <- liftEither . bimap cryptoError NtfRegCode $ C.cbDecrypt dhSecret nonce code - withToken c tkn (Just (NTConfirmed, NTAVerify code')) (NTActive, Just NTACheck) $ + void . withToken c tkn (Just (NTConfirmed, NTAVerify code')) (NTActive, Just NTACheck) $ agentNtfVerifyToken c tknId tkn code' _ -> throwError $ CMD PROHIBITED @@ -578,7 +579,7 @@ enableNtfCron' c deviceToken interval = do when (interval < 20) . throwError $ CMD PROHIBITED withStore (`getDeviceNtfToken` deviceToken) >>= \case (Just tkn@NtfToken {ntfTokenId = Just tknId, ntfTknStatus = NTActive}, _) -> - withToken c tkn (Just (NTActive, NTACron interval)) (cronSuccess interval) $ + void . withToken c tkn (Just (NTActive, NTACron interval)) (cronSuccess interval) $ agentNtfEnableCron c tknId tkn interval _ -> throwError $ CMD PROHIBITED @@ -608,16 +609,16 @@ deleteToken_ c tkn@NtfToken {ntfTokenId, ntfTknStatus} = do e -> throwError e withStore $ \st -> removeNtfToken st tkn -withToken :: AgentMonad m => AgentClient -> NtfToken -> Maybe (NtfTknStatus, NtfTknAction) -> (NtfTknStatus, Maybe NtfTknAction) -> m a -> m a +withToken :: AgentMonad m => AgentClient -> NtfToken -> Maybe (NtfTknStatus, NtfTknAction) -> (NtfTknStatus, Maybe NtfTknAction) -> m a -> m NtfTknStatus withToken c tkn@NtfToken {deviceToken} from_ (toStatus, toAction_) f = do forM_ from_ $ \(status, action) -> withStore $ \st -> updateNtfToken st tkn status (Just action) tryError f >>= \case - Right res -> do + Right _ -> do withStore $ \st -> updateNtfToken st tkn toStatus toAction_ - pure res + pure toStatus Left e@(NTF AUTH) -> do withStore $ \st -> removeNtfToken st tkn - registerNtfToken' c deviceToken + void $ registerNtfToken' c deviceToken throwError e Left e -> throwError e diff --git a/src/Simplex/Messaging/Notifications/Server/Push/testpush.sh b/src/Simplex/Messaging/Notifications/Server/Push/testpush.sh index 204fce599..2af08356e 100755 --- a/src/Simplex/Messaging/Notifications/Server/Push/testpush.sh +++ b/src/Simplex/Messaging/Notifications/Server/Push/testpush.sh @@ -4,7 +4,7 @@ export TEAM_ID=5NN7GUYB6T # export APNS_KEY_FILE="" # export APNS_KEY_ID="" export TOPIC=chat.simplex.app -# export DEVICE_TOKEN="" +# export DEVICE_TOKEN= export APNS_HOST_NAME=api.sandbox.push.apple.com export JWT_ISSUE_TIME=$(date +%s) @@ -15,6 +15,6 @@ export JWT_HEADER_CLAIMS="${JWT_HEADER}.${JWT_CLAIMS}" export JWT_SIGNED_HEADER_CLAIMS=$(printf "${JWT_HEADER_CLAIMS}" | openssl dgst -binary -sha256 -sign "${APNS_KEY_FILE}" | openssl base64 -e -A | tr -- '+/' '-_' | tr -d =) export AUTHENTICATION_TOKEN="${JWT_HEADER}.${JWT_CLAIMS}.${JWT_SIGNED_HEADER_CLAIMS}" -# curl -v --header "apns-topic: $TOPIC" --header "apns-push-type: alert" --header "authorization: bearer $AUTHENTICATION_TOKEN" --data '{"aps":{"alert":"you have a new message"}}' --http2 https://${APNS_HOST_NAME}/3/device/${DEVICE_TOKEN} +curl -v --header "apns-topic: $TOPIC" --header "apns-push-type: alert" --header "authorization: bearer $AUTHENTICATION_TOKEN" --data '{"aps":{"alert":"you have a new message"},"data":{"test":"123"}}' --http2 https://${APNS_HOST_NAME}/3/device/${DEVICE_TOKEN} -curl -v --header "apns-topic: $TOPIC" --header "apns-push-type: background" --header "apns-priority: 5" --header "authorization: bearer $AUTHENTICATION_TOKEN" --data '{"aps":{"content-available":1}}' --http2 https://${APNS_HOST_NAME}/3/device/${DEVICE_TOKEN} +# curl -v --header "apns-topic: $TOPIC" --header "apns-push-type: background" --header "apns-priority: 5" --header "authorization: bearer $AUTHENTICATION_TOKEN" --data '{"aps":{"content-available":1}}' --http2 https://${APNS_HOST_NAME}/3/device/${DEVICE_TOKEN}