package Ġapp . k 9 mail . html . clean er Ċ Ċ import Ġorg . js oup . nodes . Document Ċ import Ġorg . js oup . safety . Clean er Ċ import Ġorg . js oup . safety . S af elist Ċ Ċ internal Ġclass ĠBody Clean er Ġ{ ĊĠĠĠ Ġprivate Ġval Ġcleaner : ĠClean er ĊĠĠĠ Ġprivate Ġval Ġallowed Body Attributes Ġ= Ġset Of ( ĊĠĠĠĠĠĠĠ Ġ" id ", Ġ" class ", Ġ" dir ", Ġ" lang ", Ġ" style ", ĊĠĠĠĠĠĠĠ Ġ" al ink ", Ġ" background ", Ġ" bg color ", Ġ" link ", Ġ" text ", Ġ" v link " ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġallow List Ġ= ĠS af elist . relax ed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Tags (" font ", Ġ" hr ", Ġ" ins ", Ġ" del ", Ġ" center ", Ġ" map ", Ġ" area ", Ġ" title ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Attributes (" font ", Ġ" color ", Ġ" face ", Ġ" size ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Attributes ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" table ", Ġ" align ", Ġ" background ", Ġ" bg color ", Ġ" border ", Ġ" cell padding ", Ġ" cell spacing ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" width " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Attributes (" tr ", Ġ" align ", Ġ" background ", Ġ" bg color ", Ġ" val ign ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Attributes ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" th ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" align ", Ġ" background ", Ġ" bg color ", Ġ" col span ", Ġ" headers ", Ġ" height ", Ġ" nowrap ", Ġ" row span ", Ġ" scope ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" sorted ", Ġ" val ign ", Ġ" width " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Attributes ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" td ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" align ", Ġ" background ", Ġ" bg color ", Ġ" col span ", Ġ" headers ", Ġ" height ", Ġ" nowrap ", Ġ" row span ", Ġ" scope ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" val ign ", Ġ" width " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Attributes (" map ", Ġ" name ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Attributes (" area ", Ġ" shape ", Ġ" coords ", Ġ" href ", Ġ" alt ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Protocols (" area ", Ġ" href ", Ġ" http ", Ġ" https ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Attributes (" img ", Ġ" use map ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Attributes (": all ", Ġ" class ", Ġ" style ", Ġ" id ", Ġ" dir ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Protocols (" img ", Ġ" src ", Ġ" http ", Ġ" https ", Ġ" cid ", Ġ" data ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Protocols (" a ", Ġ" href ", Ġ" tel ", Ġ" sip ", Ġ" bitcoin ", Ġ" ethereum ", Ġ" rt sp ") ĊĊĠĠĠĠĠĠĠ Ġcleaner Ġ= ĠClean er ( allow List ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclean ( dirty Document : ĠDocument ): ĠDocument Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcleaned Document Ġ= Ġcleaner . clean ( dirty Document ) ĊĠĠĠĠĠĠĠ Ġcopy Document Type ( dirty Document , Ġcleaned Document ) ĊĠĠĠĠĠĠĠ Ġcopy Body Attributes ( dirty Document , Ġcleaned Document ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcleaned Document ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcopy Document Type ( dirty Document : ĠDocument , Ġcleaned Document : ĠDocument ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdirty Document . document Type ()?. let Ġ{ Ġdocument Type Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcleaned Document . insert Children ( 0 , Ġdocument Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcopy Body Attributes ( dirty Document : ĠDocument , Ġcleaned Document : ĠDocument ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcleaned Body Ġ= Ġcleaned Document . body () ĊĠĠĠĠĠĠĠ Ġfor Ġ( attribute Ġin Ġdirty Document . body (). attributes ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( attribute . key Ġ! in Ġallowed Body Attributes ) Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( attribute . has Declared Value ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcleaned Body . attr ( attribute . key , Ġattribute . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcleaned Body . attr ( attribute . key , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ