"""C17.05: authorization policy and escaped display, not authentication."""fromhtmlimportescapedefmay_read(actor:str|None,owner:str,role:str)->bool:ifactorisNoneornotactor:returnFalseifrolenotin{"member","admin"}:returnFalsereturnrole=="admin"oractor==ownerdefrender_note(actor:str|None,owner:str,role:str,text:str)->str:ifnotmay_read(actor,owner,role):raisePermissionError("access denied")# html.escape is for HTML text context, not JavaScript or SQL contexts.return"<p>"+escape(text,quote=True)+"</p>"if__name__=="__main__":print(render_note("learner","learner","member","x < y"))