# python/01-gdpr-compliance.py"""GDPR compliance patterns and data protection implementation"""fromtypingimportList,Dict,Any,Optional,Union,Tuplefromdataclassesimportdataclass,asdictfromenumimportEnumimportjsonimporthashlibimportuuidfromdatetimeimportdatetime,timedeltaimportloggingfromfunctoolsimportwrapsimportasynciofromconcurrent.futuresimportThreadPoolExecutorimportthreadingfrompathlibimportPath# Configure logginglogging.basicConfig(level=logging.INFO)logger=logging.getLogger(__name__)classDataSubject(Enum):"""Data subject type enumeration"""CUSTOMER="customer"EMPLOYEE="employee"VENDOR="vendor"PARTNER="partner"classProcessingPurpose(Enum):"""Data processing purpose enumeration"""MARKETING="marketing"ANALYTICS="analytics"SERVICE_DELIVERY="service_delivery"LEGAL_COMPLIANCE="legal_compliance"RESEARCH="research"classDataCategory(Enum):"""Data category enumeration"""PERSONAL="personal"SENSITIVE="sensitive"FINANCIAL="financial"HEALTH="health"BIOMETRIC="biometric"@dataclassclassPersonalData:"""Personal data definition"""id:strdata_subject_id:strdata_category:DataCategorydata_type:strvalue:strprocessing_purpose:ProcessingPurposecollected_at:datetimeretention_period_days:intis_encrypted:bool=Trueconsent_given:bool=Falseconsent_date:Optional[datetime]=Nonelegal_basis:str="consent"defto_dict(self)->Dict[str,Any]:"""Convert to dictionary"""returnasdict(self)classGDPRComplianceManager:"""GDPR compliance manager"""def__init__(self,encryption_key:str):self.encryption_key=encryption_keyself.personal_data={}self.consent_records={}self.data_processing_logs=[]self.data_breach_logs=[]self.audit_logs=[]self.lock=threading.Lock()defcollect_personal_data(self,data_subject_id:str,data_category:DataCategory,data_type:str,value:str,processing_purpose:ProcessingPurpose,retention_period_days:int=2555,# 7 years defaultconsent_given:bool=False)->str:"""Collect personal data with GDPR compliance"""withself.lock:# Generate unique data IDdata_id=str(uuid.uuid4())# Encrypt sensitive dataencrypted_value=self._encrypt_data(value)ifdata_categoryin[DataCategory.SENSITIVE,DataCategory.HEALTH,DataCategory.BIOMETRIC]elsevalue# Create personal data recordpersonal_data=PersonalData(id=data_id,data_subject_id=data_subject_id,data_category=data_category,data_type=data_type,value=encrypted_value,processing_purpose=processing_purpose,collected_at=datetime.utcnow(),retention_period_days=retention_period_days,is_encrypted=data_categoryin[DataCategory.SENSITIVE,DataCategory.HEALTH,DataCategory.BIOMETRIC],consent_given=consent_given,consent_date=datetime.utcnow()ifconsent_givenelseNone)# Store personal dataself.personal_data[data_id]=personal_data# Log data collectionself._log_data_processing(action="collect",data_subject_id=data_subject_id,data_id=data_id,processing_purpose=processing_purpose.value,legal_basis="consent"ifconsent_givenelse"legitimate_interest")logger.info(f"Personal data collected: {data_id}")returndata_iddefget_personal_data(self,data_subject_id:str)->List[PersonalData]:"""Get all personal data for a data subject"""withself.lock:subject_data=[datafordatainself.personal_data.values()ifdata.data_subject_id==data_subject_id]# Log data accessself._log_data_processing(action="access",data_subject_id=data_subject_id,processing_purpose=ProcessingPurpose.SERVICE_DELIVERY)returnsubject_datadefupdate_personal_data(self,data_id:str,new_value:str)->bool:"""Update personal data"""withself.lock:ifdata_idnotinself.personal_data:returnFalsedata=self.personal_data[data_id]# Encrypt if necessaryifdata.is_encrypted:new_value=self._encrypt_data(new_value)# Update datadata.value=new_value# Log data updateself._log_data_processing(action="update",data_subject_id=data.data_subject_id,data_id=data_id,processing_purpose=data.processing_purpose)logger.info(f"Personal data updated: {data_id}")returnTruedefdelete_personal_data(self,data_id:str)->bool:"""Delete personal data (Right to be Forgotten)"""withself.lock:ifdata_idnotinself.personal_data:returnFalsedata=self.personal_data[data_id]# Log data deletionself._log_data_processing(action="delete",data_subject_id=data.data_subject_id,data_id=data_id,processing_purpose=data.processing_purpose)# Delete datadelself.personal_data[data_id]logger.info(f"Personal data deleted: {data_id}")returnTruedefexport_personal_data(self,data_subject_id:str)->Dict[str,Any]:"""Export personal data (Data Portability)"""withself.lock:subject_data=self.get_personal_data(data_subject_id)# Decrypt data for exportexport_data=[]fordatainsubject_data:export_item=data.to_dict()ifdata.is_encrypted:export_item['value']=self._decrypt_data(data.value)export_data.append(export_item)# Log data exportself._log_data_processing(action="export",data_subject_id=data_subject_id,processing_purpose=ProcessingPurpose.SERVICE_DELIVERY)return{"data_subject_id":data_subject_id,"export_date":datetime.utcnow().isoformat(),"personal_data":export_data}defgive_consent(self,data_subject_id:str,processing_purpose:ProcessingPurpose,consent_given:bool=True)->bool:"""Record data subject consent"""withself.lock:consent_id=str(uuid.uuid4())consent_record={"id":consent_id,"data_subject_id":data_subject_id,"processing_purpose":processing_purpose.value,"consent_given":consent_given,"consent_date":datetime.utcnow(),"ip_address":"unknown",# Would be captured from request"user_agent":"unknown"# Would be captured from request}self.consent_records[consent_id]=consent_record# Update related personal datafordatainself.personal_data.values():if(data.data_subject_id==data_subject_idanddata.processing_purpose==processing_purpose):data.consent_given=consent_givendata.consent_date=datetime.utcnow()# Log consentself._log_data_processing(action="consent",data_subject_id=data_subject_id,processing_purpose=processing_purpose)logger.info(f"Consent recorded: {consent_id}")returnTruedefwithdraw_consent(self,data_subject_id:str,processing_purpose:ProcessingPurpose)->bool:"""Withdraw data subject consent"""returnself.give_consent(data_subject_id,processing_purpose,False)defcheck_retention_periods(self)->List[Dict[str,Any]]:"""Check for data that should be deleted based on retention periods"""withself.lock:expired_data=[]current_time=datetime.utcnow()fordata_id,datainself.personal_data.items():retention_end=data.collected_at+timedelta(days=data.retention_period_days)ifcurrent_time>retention_end:expired_data.append({"data_id":data_id,"data_subject_id":data.data_subject_id,"data_type":data.data_type,"collected_at":data.collected_at.isoformat(),"retention_end":retention_end.isoformat(),"days_overdue":(current_time-retention_end).days})returnexpired_datadefauto_delete_expired_data(self)->int:"""Automatically delete expired data"""expired_data=self.check_retention_periods()deleted_count=0forexpiredinexpired_data:ifself.delete_personal_data(expired["data_id"]):deleted_count+=1logger.info(f"Auto-deleted expired data: {expired['data_id']}")returndeleted_countdefreport_data_breach(self,breach_description:str,affected_data_subjects:List[str],breach_date:datetime,discovered_date:datetime)->str:"""Report data breach"""breach_id=str(uuid.uuid4())breach_record={"id":breach_id,"description":breach_description,"affected_data_subjects":affected_data_subjects,"breach_date":breach_date,"discovered_date":discovered_date,"reported_date":datetime.utcnow(),"status":"reported"}self.data_breach_logs.append(breach_record)# Log breachself._log_data_processing(action="breach_report",data_subject_id="system",processing_purpose=ProcessingPurpose.LEGAL_COMPLIANCE)logger.warning(f"Data breach reported: {breach_id}")returnbreach_iddef_encrypt_data(self,data:str)->str:"""Encrypt sensitive data"""# Simple encryption for demonstration# In production, use proper encryption librariesreturnhashlib.sha256((data+self.encryption_key).encode()).hexdigest()def_decrypt_data(self,encrypted_data:str)->str:"""Decrypt data (simplified for demonstration)"""# In production, implement proper decryptionreturnf"decrypted_{encrypted_data}"def_log_data_processing(self,action:str,data_subject_id:str,data_id:Optional[str]=None,processing_purpose:Optional[ProcessingPurpose]=None,legal_basis:Optional[str]=None)->None:"""Log data processing activity"""log_entry={"timestamp":datetime.utcnow(),"action":action,"data_subject_id":data_subject_id,"data_id":data_id,"processing_purpose":processing_purpose.valueifprocessing_purposeelseNone,"legal_basis":legal_basis,"ip_address":"unknown","user_agent":"unknown"}self.data_processing_logs.append(log_entry)self.audit_logs.append(log_entry)defget_audit_trail(self,data_subject_id:Optional[str]=None,start_date:Optional[datetime]=None,end_date:Optional[datetime]=None)->List[Dict[str,Any]]:"""Get audit trail for compliance"""logs=self.audit_logs.copy()ifdata_subject_id:logs=[logforloginlogsiflog["data_subject_id"]==data_subject_id]ifstart_date:logs=[logforloginlogsiflog["timestamp"]>=start_date]ifend_date:logs=[logforloginlogsiflog["timestamp"]<=end_date]returnlogsclassHIPAAComplianceManager:"""HIPAA compliance manager for healthcare data"""def__init__(self):self.phi_data={}# Protected Health Informationself.access_logs=[]self.breach_logs=[]self.audit_logs=[]self.lock=threading.Lock()defstore_phi(self,patient_id:str,phi_type:str,value:str,access_level:str="restricted")->str:"""Store Protected Health Information"""withself.lock:phi_id=str(uuid.uuid4())phi_record={"id":phi_id,"patient_id":patient_id,"phi_type":phi_type,"value":value,"access_level":access_level,"created_at":datetime.utcnow(),"is_encrypted":True}self.phi_data[phi_id]=phi_record# Log PHI accessself._log_phi_access("store",patient_id,phi_id,phi_type)logger.info(f"PHI stored: {phi_id}")returnphi_iddefaccess_phi(self,patient_id:str,phi_id:str,user_id:str,access_reason:str)->Optional[str]:"""Access Protected Health Information"""withself.lock:ifphi_idnotinself.phi_data:returnNonephi_record=self.phi_data[phi_id]# Log PHI accessself._log_phi_access("access",patient_id,phi_id,phi_record["phi_type"],user_id,access_reason)returnphi_record["value"]def_log_phi_access(self,action:str,patient_id:str,phi_id:str,phi_type:str,user_id:Optional[str]=None,access_reason:Optional[str]=None)->None:"""Log PHI access for HIPAA compliance"""log_entry={"timestamp":datetime.utcnow(),"action":action,"patient_id":patient_id,"phi_id":phi_id,"phi_type":phi_type,"user_id":user_id,"access_reason":access_reason,"ip_address":"unknown","user_agent":"unknown"}self.access_logs.append(log_entry)self.audit_logs.append(log_entry)classSOXComplianceManager:"""SOX compliance manager for financial data"""def__init__(self):self.financial_data={}self.control_logs=[]self.audit_logs=[]self.lock=threading.Lock()defrecord_financial_transaction(self,transaction_id:str,amount:float,account_id:str,transaction_type:str,user_id:str)->bool:"""Record financial transaction with SOX controls"""withself.lock:transaction_record={"id":transaction_id,"amount":amount,"account_id":account_id,"transaction_type":transaction_type,"user_id":user_id,"timestamp":datetime.utcnow(),"is_approved":False,"approval_required":amount>10000# SOX threshold}self.financial_data[transaction_id]=transaction_record# Log transactionself._log_financial_activity("transaction",transaction_id,user_id)logger.info(f"Financial transaction recorded: {transaction_id}")returnTruedefapprove_transaction(self,transaction_id:str,approver_id:str)->bool:"""Approve financial transaction"""withself.lock:iftransaction_idnotinself.financial_data:returnFalsetransaction=self.financial_data[transaction_id]transaction["is_approved"]=Truetransaction["approver_id"]=approver_idtransaction["approval_date"]=datetime.utcnow()# Log approvalself._log_financial_activity("approval",transaction_id,approver_id)logger.info(f"Transaction approved: {transaction_id}")returnTruedef_log_financial_activity(self,activity_type:str,transaction_id:str,user_id:str)->None:"""Log financial activity for SOX compliance"""log_entry={"timestamp":datetime.utcnow(),"activity_type":activity_type,"transaction_id":transaction_id,"user_id":user_id,"ip_address":"unknown","user_agent":"unknown"}self.control_logs.append(log_entry)self.audit_logs.append(log_entry)# Usage examplesdefexample_gdpr_compliance():"""Example GDPR compliance usage"""# Create GDPR compliance managergdpr_manager=GDPRComplianceManager("encryption-key")# Collect personal datadata_id=gdpr_manager.collect_personal_data(data_subject_id="user123",data_category=DataCategory.PERSONAL,data_type="email",value="user@example.com",processing_purpose=ProcessingPurpose.SERVICE_DELIVERY,consent_given=True)print(f"Personal data collected: {data_id}")# Give consentgdpr_manager.give_consent("user123",ProcessingPurpose.MARKETING,True)# Get personal datapersonal_data=gdpr_manager.get_personal_data("user123")print(f"Personal data count: {len(personal_data)}")# Export personal dataexport_data=gdpr_manager.export_personal_data("user123")print(f"Export data keys: {list(export_data.keys())}")# Check retention periodsexpired_data=gdpr_manager.check_retention_periods()print(f"Expired data count: {len(expired_data)}")# Report data breachbreach_id=gdpr_manager.report_data_breach("Unauthorized access to user database",["user123","user456"],datetime.utcnow()-timedelta(days=1),datetime.utcnow())print(f"Data breach reported: {breach_id}")# Get audit trailaudit_trail=gdpr_manager.get_audit_trail("user123")print(f"Audit trail entries: {len(audit_trail)}")defexample_hipaa_compliance():"""Example HIPAA compliance usage"""# Create HIPAA compliance managerhipaa_manager=HIPAAComplianceManager()# Store PHIphi_id=hipaa_manager.store_phi(patient_id="patient123",phi_type="medical_record",value="Patient has diabetes",access_level="restricted")print(f"PHI stored: {phi_id}")# Access PHIphi_value=hipaa_manager.access_phi(patient_id="patient123",phi_id=phi_id,user_id="doctor456",access_reason="treatment")print(f"PHI accessed: {phi_value}")defexample_sox_compliance():"""Example SOX compliance usage"""# Create SOX compliance managersox_manager=SOXComplianceManager()# Record financial transactiontransaction_id=sox_manager.record_financial_transaction(transaction_id="txn123",amount=15000.00,account_id="acc456",transaction_type="payment",user_id="user789")print(f"Transaction recorded: {transaction_id}")# Approve transactionapproval_success=sox_manager.approve_transaction("txn123","approver123")print(f"Transaction approved: {approval_success}")