Exemple #1
0
        public IActionResult PatientOverview()
        {
            ViewBag.DoctorName = HttpContext.Session.GetString(Globals.currentUserName);
            if (HttpContext.Session.GetString(Globals.currentDSPriK) == null || HttpContext.Session.GetString(Globals.currentDAPriK) == null)
            {
                return(RedirectToAction("Login"));
            }
            else if (HttpContext.Session.GetString(Globals.currentPSPubK) == null || HttpContext.Session.GetString(Globals.currentPAPubK) == null)
            {
                return(RedirectToAction("PatientLookUp"));
            }
            else
            {
                Assets <PatientCredAssetData> userAsset = _bigChainDbService.GetPatientAssetFromID(HttpContext.Session.GetString(Globals.currentPPHN));

                var doctorSignPrivateKey  = HttpContext.Session.GetString(Globals.currentDSPriK);
                var doctorAgreePrivateKey = HttpContext.Session.GetString(Globals.currentDAPriK);
                var doctorSignPublicKey   = EncryptionService.getSignPublicKeyStringFromPrivate(doctorSignPrivateKey);
                var patientSignPublicKey  = HttpContext.Session.GetString(Globals.currentPSPubK);

                PatientCredMetadata userMetadata = _bigChainDbService.GetMetadataFromAssetPublicKey <PatientCredMetadata>(userAsset.id, patientSignPublicKey);

                var patientInfo = userAsset.data.Data;
                var patientOverviewViewModel = new PatientOverviewViewModel
                {
                    PatientAsset    = patientInfo,
                    PatientMetadata = userMetadata,
                    PatientAge      = patientInfo.DateOfBirth.CalculateAge()
                };

                return(View(patientOverviewViewModel));
            }
        }
Exemple #2
0
        public IActionResult UploadResult(string transID)
        {
            ViewBag.DoctorName = HttpContext.Session.GetString(Globals.currentUserName);
            if (HttpContext.Session.GetString(Globals.currentDSPriK) == null || HttpContext.Session.GetString(Globals.currentDAPriK) == null)
            {
                return(RedirectToAction("Login"));
            }
            else if (HttpContext.Session.GetString(Globals.currentPSPubK) == null || HttpContext.Session.GetString(Globals.currentPAPubK) == null)
            {
                return(RedirectToAction("PatientLookUp"));
            }
            else
            {
                ViewBag.DoctorName = HttpContext.Session.GetString(Globals.currentUserName);
                Assets <PatientCredAssetData> userAsset = _bigChainDbService.GetPatientAssetFromID(HttpContext.Session.GetString(Globals.currentPPHN));
                var doctorSignPrivateKey         = HttpContext.Session.GetString(Globals.currentDSPriK);
                var doctorAgreePrivateKey        = HttpContext.Session.GetString(Globals.currentDAPriK);
                var doctorSignPublicKey          = EncryptionService.getSignPublicKeyStringFromPrivate(doctorSignPrivateKey);
                var patientSignPublicKey         = HttpContext.Session.GetString(Globals.currentPSPubK);
                PatientCredMetadata userMetadata = _bigChainDbService.GetMetadataFromAssetPublicKey <PatientCredMetadata>(userAsset.id, patientSignPublicKey);
                var patientInfo = userAsset.data.Data;
                patientInfo.FingerprintData = null;

                var testRequisition = _bigChainDbService.GetMetaDataAndAssetFromTransactionId <string, double>(transID);
                if (testRequisition.metadata.AccessList.Keys.Contains(doctorSignPublicKey))
                {
                    var hashedKey         = testRequisition.metadata.AccessList[doctorSignPublicKey];
                    var dataDecryptionKey = EncryptionService.getDecryptedEncryptionKey(hashedKey, doctorAgreePrivateKey);
                    var data  = EncryptionService.getDecryptedAssetData(testRequisition.data.Data, dataDecryptionKey);
                    var asset = JsonConvert.DeserializeObject <TestRequisitionAsset>(data);
                    asset.AttachedFile.Data = null;
                    var viewModel = new UploadResultViewModel()
                    {
                        TestData = new TestRequisitionFullData
                        {
                            assetData = asset,
                            Metadata  = testRequisition.metadata.data,
                            assetID   = testRequisition.id,
                            transID   = testRequisition.transID
                        },
                        PatientAsset    = patientInfo,
                        PatientMetadata = userMetadata
                    };
                    TempData["viewModel"] = JsonConvert.SerializeObject(viewModel);
                    return(View(viewModel));
                }
                else
                {
                    return(new EmptyResult());
                }
            }
        }
Exemple #3
0
        public IActionResult PatientRecords()
        {
            ViewBag.DoctorName = HttpContext.Session.GetString(Globals.currentUserName);
            if (HttpContext.Session.GetString(Globals.currentDSPriK) == null || HttpContext.Session.GetString(Globals.currentDAPriK) == null)
            {
                return(RedirectToAction("Login"));
            }
            else if (HttpContext.Session.GetString(Globals.currentPSPubK) == null || HttpContext.Session.GetString(Globals.currentPAPubK) == null)
            {
                return(RedirectToAction("PatientLookUp"));
            }
            else
            {
                Assets <PatientCredAssetData> userAsset = _bigChainDbService.GetPatientAssetFromID(HttpContext.Session.GetString(Globals.currentPPHN));

                var doctorSignPrivateKey  = HttpContext.Session.GetString(Globals.currentDSPriK);
                var doctorAgreePrivateKey = HttpContext.Session.GetString(Globals.currentDAPriK);
                var doctorSignPublicKey   = EncryptionService.getSignPublicKeyStringFromPrivate(doctorSignPrivateKey);
                var patientSignPublicKey  = HttpContext.Session.GetString(Globals.currentPSPubK);

                PatientCredMetadata userMetadata = _bigChainDbService.GetMetadataFromAssetPublicKey <PatientCredMetadata>(userAsset.id, patientSignPublicKey);

                var prescriptionsList = _bigChainDbService.GetAllTypeRecordsFromDPublicPPublicKey <string, PrescriptionMetadata>
                                            (AssetType.Prescription, doctorSignPublicKey, patientSignPublicKey);
                var prescriptions = new List <PrescriptionFullData>();
                foreach (var prescription in prescriptionsList)
                {
                    var hashedKey         = prescription.metadata.AccessList[doctorSignPublicKey];
                    var dataDecryptionKey = EncryptionService.getDecryptedEncryptionKey(hashedKey, doctorAgreePrivateKey);
                    var data     = EncryptionService.getDecryptedAssetData(prescription.data.Data, dataDecryptionKey);
                    var newEntry = new PrescriptionFullData
                    {
                        assetData = JsonConvert.DeserializeObject <Prescription>(data),
                        Metadata  = prescription.metadata.data,
                        transID   = prescription.transID,
                        assetID   = prescription.id
                    };
                    prescriptions.Add(newEntry);
                }
                var patientInfo = userAsset.data.Data;
                var patientOverviewViewModel = new PatientOverviewViewModel
                {
                    PatientAsset    = patientInfo,
                    PatientMetadata = userMetadata,
                    PatientAge      = patientInfo.DateOfBirth.CalculateAge(),
                    Prescriptions   = prescriptions.OrderByDescending(p => p.assetData.PrescribingDate).ToList()
                };

                return(View(patientOverviewViewModel));
            }
        }
Exemple #4
0
        public IActionResult FillPrescription(string transID)
        {
            ViewBag.DoctorName = HttpContext.Session.GetString(Globals.currentUserName);
            if (HttpContext.Session.GetString(Globals.currentDSPriK) == null || HttpContext.Session.GetString(Globals.currentDAPriK) == null)
            {
                return(RedirectToAction("Login"));
            }
            else if (HttpContext.Session.GetString(Globals.currentPSPubK) == null || HttpContext.Session.GetString(Globals.currentPAPubK) == null)
            {
                return(RedirectToAction("PatientLookUp"));
            }
            else
            {
                Assets <PatientCredAssetData> userAsset = _bigChainDbService.GetPatientAssetFromID(HttpContext.Session.GetString(Globals.currentPPHN));

                var patientSignPublicKey = HttpContext.Session.GetString(Globals.currentPSPubK);

                PatientCredMetadata userMetadata = _bigChainDbService.GetMetadataFromAssetPublicKey <PatientCredMetadata>(userAsset.id, patientSignPublicKey);

                var patientInfo = userAsset.data.Data;
                patientInfo.FingerprintData = null;

                var doctorSignPrivateKey  = HttpContext.Session.GetString(Globals.currentDSPriK);
                var doctorAgreePrivateKey = HttpContext.Session.GetString(Globals.currentDAPriK);
                var doctorSignPublicKey   = EncryptionService.getSignPublicKeyStringFromPrivate(doctorSignPrivateKey);

                var prescriptionData  = _bigChainDbService.GetMetaDataAndAssetFromTransactionId <string, PrescriptionMetadata>(transID);
                var hashedKey         = prescriptionData.metadata.AccessList[doctorSignPublicKey];
                var dataDecryptionKey = EncryptionService.getDecryptedEncryptionKey(hashedKey, doctorAgreePrivateKey);
                var data      = EncryptionService.getDecryptedAssetData(prescriptionData.data.Data, dataDecryptionKey);
                var viewModel = new FillPrescriptionViewModel()
                {
                    PatientAsset     = patientInfo,
                    PatientMetadata  = userMetadata,
                    PrescriptionData = new PrescriptionFullData
                    {
                        assetData = JsonConvert.DeserializeObject <Prescription>(data),
                        Metadata  = prescriptionData.metadata.data,
                        transID   = prescriptionData.transID,
                        assetID   = prescriptionData.id
                    }
                };
                TempData["viewModel"] = JsonConvert.SerializeObject(viewModel);
                return(View(viewModel));
            }
        }
        public IActionResult Login(PatientLoginViewModel indexViewModel)
        {
            ViewBag.UserName = HttpContext.Session.GetString(Globals.currentUserName);
            if (!ModelState.IsValid)
            {
                return(View(indexViewModel));
            }
            string signPrivateKey = null, agreePrivateKey = null;
            Assets <PatientCredAssetData> userAsset = _bigChainDbService.GetPatientAssetFromID(indexViewModel.PatientPHN);

            if (userAsset == null)
            {
                ModelState.AddModelError("", "We could not find a matching user");
                return(View(indexViewModel));
            }
            var hashedKeys = userAsset.data.Data.PrivateKeys;

            try
            {
                EncryptionService.getPrivateKeyFromIDKeyword(indexViewModel.PatientPHN, indexViewModel.PatientKeyword, hashedKeys, out signPrivateKey, out agreePrivateKey);
            }
            catch
            {
                ModelState.AddModelError("", "Keyword may be incorrect");
                return(View(indexViewModel));
            }
            PatientCredMetadata userMetadata = _bigChainDbService.GetMetadataFromAssetPublicKey <PatientCredMetadata>(userAsset.id, userAsset.data.Data.SignPublicKey);
            var password = indexViewModel.password;

            if (EncryptionService.verifyPassword(password, userMetadata.hashedPassword))
            {
                HttpContext.Session.SetString(Globals.currentPSPriK, signPrivateKey);
                HttpContext.Session.SetString(Globals.currentPAPriK, agreePrivateKey);
                HttpContext.Session.SetString(Globals.currentPSPubK, userAsset.data.Data.SignPublicKey);
                HttpContext.Session.SetString(Globals.currentPAPubK, userAsset.data.Data.AgreePublicKey);
                HttpContext.Session.SetString(Globals.currentUserName, $"{userMetadata.FirstName} {userMetadata.LastName}");
                HttpContext.Session.SetString(Globals.currentUserID, userAsset.data.Data.ID);
                return(RedirectToAction("PatientOverview"));
            }
            else
            {
                ModelState.AddModelError("", "Password or Keyword incorrect.");
                return(View(indexViewModel));
            }
        }
        public IActionResult EditProfile(PatientCredMetadata patientCredMetadata)
        {
            Assets <PatientCredAssetData> userAsset = _bigChainDbService.GetPatientAssetFromID(HttpContext.Session.GetString(Globals.currentUserID));
            var patientSignPublicKey  = HttpContext.Session.GetString(Globals.currentPSPubK);
            var patientSignPrivateKey = HttpContext.Session.GetString(Globals.currentPSPriK);
            var transaction           = _bigChainDbService.GetMetadataIDFromAssetPublicKey <PatientCredMetadata>(userAsset.id, patientSignPublicKey);
            var transID = transaction.Id ?? userAsset.id;

            patientCredMetadata.hashedPassword = transaction.Metadata.data.hashedPassword;
            var newMetadata = new MetaDataSaved <PatientCredMetadata>
            {
                data = patientCredMetadata
            };

            _bigChainDbService.SendTransferTransactionToDataBase(userAsset.id, newMetadata,
                                                                 patientSignPrivateKey, patientSignPublicKey, transID);
            return(RedirectToAction("PatientOverview"));
        }
        public IActionResult EditProfile()
        {
            ViewBag.UserName = HttpContext.Session.GetString(Globals.currentUserName);
            if (HttpContext.Session.GetString(Globals.currentPSPubK) == null || HttpContext.Session.GetString(Globals.currentPAPubK) == null)
            {
                return(RedirectToAction("Login"));
            }
            else
            {
                Assets <PatientCredAssetData> userAsset = _bigChainDbService.GetPatientAssetFromID(HttpContext.Session.GetString(Globals.currentUserID));

                var patientSignPublicKey         = HttpContext.Session.GetString(Globals.currentPSPubK);
                PatientCredMetadata userMetadata = _bigChainDbService.GetMetadataFromAssetPublicKey <PatientCredMetadata>(userAsset.id, patientSignPublicKey);

                //Description: page where patient can edit their basic personal information
                return(View(userMetadata));
            }
        }
Exemple #8
0
        public IActionResult RequestAccess()
        {
            ViewBag.DoctorName = HttpContext.Session.GetString(Globals.currentUserName);
            if (HttpContext.Session.GetString(Globals.currentDSPriK) == null || HttpContext.Session.GetString(Globals.currentDAPriK) == null)
            {
                return(RedirectToAction("Login"));
            }
            else if (HttpContext.Session.GetString(Globals.currentPSPubK) == null || HttpContext.Session.GetString(Globals.currentPAPubK) == null)
            {
                return(RedirectToAction("PatientLookUp"));
            }
            else
            {
                Assets <PatientCredAssetData> userAsset = _bigChainDbService.GetPatientAssetFromID(HttpContext.Session.GetString(Globals.currentPPHN));

                var patientSignPublicKey = HttpContext.Session.GetString(Globals.currentPSPubK);

                PatientCredMetadata userMetadata = _bigChainDbService.GetMetadataFromAssetPublicKey <PatientCredMetadata>(userAsset.id, patientSignPublicKey);
                ViewBag.PatientName = userMetadata.FirstName + " " + userMetadata.LastName;
                ViewBag.PatientID   = userAsset.data.Data.ID;
                return(View());
            }
        }
Exemple #9
0
        public IActionResult PatientRecords()
        {
            ViewBag.DoctorName = HttpContext.Session.GetString(Globals.currentUserName);
            if (HttpContext.Session.GetString(Globals.currentDSPriK) == null || HttpContext.Session.GetString(Globals.currentDAPriK) == null)
            {
                return(RedirectToAction("Login"));
            }
            else if (HttpContext.Session.GetString(Globals.currentPSPubK) == null || HttpContext.Session.GetString(Globals.currentPAPubK) == null)
            {
                return(RedirectToAction("PatientLookUp"));
            }
            else
            {
                Assets <PatientCredAssetData> userAsset = _bigChainDbService.GetPatientAssetFromID(HttpContext.Session.GetString(Globals.currentPPHN));

                var doctorSignPrivateKey  = HttpContext.Session.GetString(Globals.currentDSPriK);
                var doctorAgreePrivateKey = HttpContext.Session.GetString(Globals.currentDAPriK);
                var doctorSignPublicKey   = EncryptionService.getSignPublicKeyStringFromPrivate(doctorSignPrivateKey);
                var patientSignPublicKey  = HttpContext.Session.GetString(Globals.currentPSPubK);

                PatientCredMetadata userMetadata = _bigChainDbService.GetMetadataFromAssetPublicKey <PatientCredMetadata>(userAsset.id, patientSignPublicKey);

                var testRequisitionList = _bigChainDbService.GetAllTypeRecordsFromDPublicPPublicKey <string, double>
                                              (AssetType.TestRequisition, doctorSignPublicKey, patientSignPublicKey);
                Dictionary <string, string> testResults = null;
                if (testRequisitionList.Any())
                {
                    testResults = _bigChainDbService.GetAssociatedTestResults(testRequisitionList);
                }
                var testRequisitions = new List <TestRequisitionFullData>();
                foreach (var testrequisition in testRequisitionList)
                {
                    var hashedKey         = testrequisition.metadata.AccessList[doctorSignPublicKey];
                    var dataDecryptionKey = EncryptionService.getDecryptedEncryptionKey(hashedKey, doctorAgreePrivateKey);
                    var data     = EncryptionService.getDecryptedAssetData(testrequisition.data.Data, dataDecryptionKey);
                    var newEntry = new TestRequisitionFullData
                    {
                        assetData = JsonConvert.DeserializeObject <TestRequisitionAsset>(data),
                        Metadata  = testrequisition.metadata.data,
                        assetID   = testrequisition.id,
                        transID   = testrequisition.transID
                    };
                    if (testResults != null && testResults.Keys.Contains(testrequisition.id))
                    {
                        var decryptedResultFile = EncryptionService.getDecryptedAssetData(testResults[testrequisition.id], dataDecryptionKey);
                        newEntry.ResultFile = JsonConvert.DeserializeObject <FileData>(decryptedResultFile);
                    }
                    testRequisitions.Add(newEntry);
                }
                var patientInfo = userAsset.data.Data;
                var patientOverviewViewModel = new PatientOverviewViewModel
                {
                    PatientAsset     = patientInfo,
                    PatientMetadata  = userMetadata,
                    PatientAge       = patientInfo.DateOfBirth.CalculateAge(),
                    TestRequisitions = testRequisitions.OrderByDescending(p => p.assetData.DateOrdered).ToList()
                };

                return(View(patientOverviewViewModel));
            }
        }
Exemple #10
0
        public IActionResult PatientSignUp(PatientSignUpViewModel patientSignUpViewModel)
        {
            // Description: Registers a patient up for a MedNet account
            ViewBag.DoctorName = HttpContext.Session.GetString(Globals.currentUserName);
            string signPrivateKey = null, agreePrivateKey = null, signPublicKey = null, agreePublicKey = null;
            Assets <PatientCredAssetData> userAsset = _bigChainDbService.GetPatientAssetFromID(patientSignUpViewModel.PHN);

            // Check if PHN is already in use
            if (userAsset != null)
            {
                ModelState.AddModelError("", "A Patient profile with that PHN already exists");
                return(View(patientSignUpViewModel));
            }

            // Register fingerprint information
            int           numScans = 5;
            List <Image>  fpList   = FingerprintService.authenticateFP("24.84.225.22", numScans);
            List <byte[]> fpdb     = new List <byte[]>();

            if (fpList.Count > numScans)
            {
                ModelState.AddModelError("", "Something went wrong with the fingerprint scan, try again.");
                return(View(patientSignUpViewModel));
            }

            // Parse the input data for user registration
            var passphrase = patientSignUpViewModel.KeyWord;
            var password   = patientSignUpViewModel.Password;

            // Encrypt fingerprint data
            List <string> encrList = new List <string>();

            foreach (var fp in fpList)
            {
                byte[] fpByte  = FingerprintService.imgToByte(fp);
                string encrStr = EncryptionService.encryptFingerprintData(patientSignUpViewModel.PHN, passphrase, fpByte);
                encrList.Add(encrStr);
            }

            // Create a user for the Blockchain
            EncryptionService.getNewBlockchainUser(out signPrivateKey, out signPublicKey, out agreePrivateKey, out agreePublicKey);

            // Create the user Asset
            var userAssetData = new PatientCredAssetData
            {
                ID              = patientSignUpViewModel.PHN,
                DateOfBirth     = patientSignUpViewModel.DateOfBirth,
                PrivateKeys     = EncryptionService.encryptPrivateKeys(patientSignUpViewModel.PHN, passphrase, signPrivateKey, agreePrivateKey),
                DateOfRecord    = DateTime.Now,
                SignPublicKey   = signPublicKey,
                AgreePublicKey  = agreePublicKey,
                FingerprintData = encrList,
            };

            // Encrypt the user's password in the metadata
            var userMetadata = new PatientCredMetadata
            {
                FirstName      = patientSignUpViewModel.FirstName,
                LastName       = patientSignUpViewModel.LastName,
                Email          = patientSignUpViewModel.Email,
                hashedPassword = EncryptionService.hashPassword(password)
            };

            // Save the user Asset and Metadata
            var asset = new AssetSaved <PatientCredAssetData>
            {
                Type     = AssetType.Patient,
                Data     = userAssetData,
                RandomId = _random.Next(0, 100000)
            };
            var metadata = new MetaDataSaved <PatientCredMetadata>
            {
                data = userMetadata
            };

            // Send the user's information to the Blockchain database
            _bigChainDbService.SendCreateTransactionToDataBase(asset, metadata, signPrivateKey);
            return(RedirectToAction("PatientLookUp"));
        }