Esempio n. 1
0
        public MrzLine2 ParseMrzLine2FromString(string rawMrz)
        {
            MrzLine2 mrzLine2 = new MrzLine2();

            try
            {
                //All characters need to be uppercase
                rawMrz = rawMrz.ToUpper();
                mrzLine2.PassportNumber           = PassportValidatorHelper.ParseForString(rawMrz, PassportNumberLookup.Index, PassportNumberLookup.Length);
                mrzLine2.CheckDigitPassportNumber = PassportValidatorHelper.ParseForString(rawMrz, PassportNumberCheckDigitLookup.Index, PassportNumberCheckDigitLookup.Length);
                mrzLine2.Nationality           = (Nationality)PassportValidatorHelper.ParseForEnum(rawMrz, NationalityLookup.Index, NationalityLookup.Length, typeof(Nationality));
                mrzLine2.DateOfBirth           = PassportValidatorHelper.ParseForDateTime(rawMrz, DateofBirthLookup.Index, DateofBirthLookup.Length, DateMask);
                mrzLine2.CheckDigitDateOfBirth = PassportValidatorHelper.ParseForString(rawMrz, CheckDigitDateOfBirthLookup.Index, CheckDigitDateOfBirthLookup.Length);
                mrzLine2.Gender                   = (Gender)PassportValidatorHelper.ParseForEnum(rawMrz, GenderLookup.Index, GenderLookup.Length, typeof(Gender));
                mrzLine2.DateOfExpiry             = PassportValidatorHelper.ParseForDateTime(rawMrz, ExpiryDateLookup.Index, ExpiryDateLookup.Length, DateMask);
                mrzLine2.CheckDigitDateOfExpiry   = PassportValidatorHelper.ParseForString(rawMrz, ExpiryCheckDigitLookup.Index, ExpiryCheckDigitLookup.Length);
                mrzLine2.PersonalNumber           = PassportValidatorHelper.ParseForString(rawMrz, PersonalNumberLookup.Index, PersonalNumberLookup.Length);
                mrzLine2.CheckDigitPersonalNumber = PassportValidatorHelper.ParseForString(rawMrz, PersonalNumberCheckDigitLookup.Index, PersonalNumberCheckDigitLookup.Length);
                mrzLine2.CheckDigitOverall        = PassportValidatorHelper.ParseForString(rawMrz, CompositeCheckDigitLookup.Index, CompositeCheckDigitLookup.Length);
            }
            catch (Exception)
            {
                //Throw the exception up the stack
                throw;
            }

            return(mrzLine2);
        }
Esempio n. 2
0
        public ValidationResults ValidateMrzAndBaseData(PassportBaseData baseData, MrzLine2 mrzLine2)
        {
            ValidationResults results = new ValidationResults();

            //Check digits against what was passed into mrzline2
            results.PassportNumberCheckDigit         = CheckDigitHelper.CalculateCheckDigit(mrzLine2.PassportNumber) == mrzLine2.CheckDigitPassportNumber ? true : false;
            results.DateOfBirthCheckDigit            = CheckDigitHelper.CalculateCheckDigit(mrzLine2.DateOfBirth.ToString("yyMMdd")) == mrzLine2.CheckDigitDateOfBirth ? true : false;
            results.PassportExpirationDateCheckDigit = CheckDigitHelper.CalculateCheckDigit(mrzLine2.DateOfExpiry.ToString("yyMMdd")) == mrzLine2.CheckDigitDateOfExpiry ? true : false;
            results.PersonalNumberCheckDigit         = CheckDigitHelper.CalculateCheckDigit(mrzLine2.PersonalNumber) == mrzLine2.CheckDigitPersonalNumber ? true : false;

            //Composite check digit is all fields on line 2 minus nationality and gender
            string compositeCheckDigit = mrzLine2.PassportNumber +
                                         mrzLine2.CheckDigitPassportNumber +
                                         mrzLine2.DateOfBirth.ToString("yyMMdd") +
                                         mrzLine2.CheckDigitDateOfBirth +
                                         mrzLine2.DateOfExpiry.ToString("yyMMdd") +
                                         mrzLine2.CheckDigitDateOfExpiry +
                                         mrzLine2.PersonalNumber +
                                         mrzLine2.CheckDigitPersonalNumber;

            results.FinalCheckDigit = CheckDigitHelper.CalculateCheckDigit(compositeCheckDigit) == mrzLine2.CheckDigitOverall ? true : false;

            //Do a cross check between what the user entered vs what's on mrzline2
            results.GenderCrossCheck         = baseData.Gender == mrzLine2.Gender ? true : false;
            results.DateOfBirthCrossCheck    = baseData.DateOfBirth.ToString(DateMask) == mrzLine2.DateOfBirth.ToString(DateMask) ? true : false;
            results.ExpirationDateCrossCheck = baseData.DateOfExpiry.ToString(DateMask) == mrzLine2.DateOfExpiry.ToString(DateMask) ? true : false;
            results.NationalityCrossCheck    = baseData.Nationality == mrzLine2.Nationality ? true : false;
            results.PassportNumberCrossCheck = baseData.PassportNumber.ZeroFillerChars() == mrzLine2.PassportNumber ? true : false;

            return(results);
        }
        public void Validate_Valid_Passport_Returns_Validated_Results()
        {
            var mockMrzParse     = new Mock <IParseMrzLine2>();
            var mockMrzValidator = new Mock <IMrzValidator>();
            //We need to mock the IMapper, use the existing profile and pass this in
            var mockMapper = new MapperConfiguration(cfg =>
            {
                cfg.AddProfile(new MappingProfile());
            });
            var mapper = mockMapper.CreateMapper();
            PassportValidator controller = new PassportValidator(mockMrzParse.Object, mockMrzValidator.Object, mapper);

            PassportInput passportInput = new PassportInput()
            {
                PassportNumber = "112256503",
                Nationality    = Nationality.GBR,
                DateOfBirth    = new DateTime(1989, 02, 12),
                Gender         = Gender.M,
                DateOfExpiry   = new DateTime(2020, 10, 01),
                MrzLine2       = "1122565035GBR8902122M2010016<<<<<<<<<<<<<<04"
            };
            MrzLine2 fakeMrzLine2 = new MrzLine2()
            {
                PassportNumber           = "112256503",
                CheckDigitPassportNumber = "5",
                Nationality           = Nationality.GBR,
                DateOfBirth           = new DateTime(1989, 02, 12),
                CheckDigitDateOfBirth = "2",
                Gender                   = Gender.M,
                DateOfExpiry             = new DateTime(2020, 10, 01),
                CheckDigitDateOfExpiry   = "6",
                PersonalNumber           = "",
                CheckDigitPersonalNumber = "0",
                CheckDigitOverall        = "4"
            };
            ValidationResults expectedValidationResults = new ValidationResults()
            {
                PassportNumberCheckDigit         = true,
                DateOfBirthCheckDigit            = true,
                PassportExpirationDateCheckDigit = true,
                PersonalNumberCheckDigit         = true,
                FinalCheckDigit          = true,
                GenderCrossCheck         = true,
                DateOfBirthCrossCheck    = true,
                ExpirationDateCrossCheck = true,
                NationalityCrossCheck    = true,
                PassportNumberCrossCheck = true
            };

            mockMrzParse.Setup(x => x.ParseMrzLine2FromString(It.IsAny <string>())).Returns(fakeMrzLine2);
            mockMrzValidator.Setup(x => x.ValidateMrzAndBaseData(It.IsAny <PassportBaseData>(), It.IsAny <MrzLine2>())).Returns(expectedValidationResults);

            ValidationResults returnedValidationResults = controller.Validate(passportInput).Value;

            Assert.Equal(expectedValidationResults, returnedValidationResults);
        }
        public ActionResult <ValidationResults> Validate([FromBody] PassportInput input)
        {
            //Map view model onto model
            PassportBaseData baseData = _mapper.Map <PassportBaseData>(input);

            try
            {
                //Get the Mrzline2 string into a manageable object
                MrzLine2 mrzLine2 = _parsemrzLine2.ParseMrzLine2FromString(input.MrzLine2);
                //Check all data on the mrzline2 and whether what the user entered matches the mrzline2
                return(_mrzValidator.ValidateMrzAndBaseData(baseData, mrzLine2));
            }
            catch (Exception e)
            {
                //Always return a bad status code with the exception to the view
                return(BadRequest(e));
            }
        }