{"version":3,"file":"app/main.1c4674f701b194addf94.js","mappings":"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DCvmBC,MAAM2kK,EAAkB,CAC7B,SACA,UACA,YACA,QACA,UACA,UACA,SACA,OACA,WACA,WACA,WACA,UACA,UACA,SACA,WACA,UACA,WACA,WACA,WACA,WACA,UACA,UACA,WACA,SACA,SACA,UACA,YACA,YACA,UACA,WACA,WACA,WACA,UACA,WACA,SACA,OACA,QACA,WACA,UACA,OACA,UACA,UACA,SACA,SACA,WACA,YACA,SACA,WACA,WACA,WACA,UACA,OACA,UACA,YACA,WACA,WACA,UACA,YACA,OACA,SACA,WACA,YACA,YACA,YACA,YACA,SACA,QACA,YACA,WACA,SACA,UACA,SACA,SACA,WACA,QACA,SACA,YACA,YACA,YACA,YACA,YACA,OACA,UACA,SACA,SACA,QACA,YACA,SACA,QACA,UACA,QACA,WACA,UACA,YACA,QACA,YACA,YACA,SACA,WACA,YACA,UACA,QACA,OACA,OACA,OACA,MACA,OACA,YACA,QACA,YACA,QACA,UACA,UACA,YACA,QACA,QACA,YACA,WACA,SACA,QACA,QACA,WACA,WACA,UACA,WACA,SACA,OACA,QACA,QACA,QACA,YACA,QACA,WACA,UACA,WACA,WACA,OACA,WACA,SACA,SACA,WACA,QACA,YACA,QACA,WACA,YACA,YACA,WACA,YACA,YACA,SACA,YACA,YACA,SACA,UACA,UACA,WACA,OACA,QACA,QACA,QACA,UACA,WACA,UACA,WACA,QACA,SACA,WACA,QACA,YACA,UACA,QACA,QACA,SACA,WACA,SACA,YACA,SACA,UACA,WACA,YACA,UACA,YACA,UACA,SACA,UACA,UACA,UACA,SACA,SACA,WACA,OACA,YACA,UACA,QACA,SACA,SACA,SACA,UACA,UACA,YACA,YACA,UACA,SACA,UACA,YACA,YACA,WACA,QACA,YACA,QACA,QACA,WACA,YACA,WACA,WACA,UACA,WACA,UACA,YACA,UACA,YACA,WACA,WACA,WACA,SACA,UACA,YACA,WACA,SACA,WACA,WACA,YACA,WACA,YACA,WACA,YACA,YACA,YACA,YACA,SACA,UACA,QACA,QACA,UACA,SACA,UACA,SACA,WACA,WACA,UACA,SACA,WACA,QACA,SACA,UACA,YACA,SACA,UACA,YACA,YACA,WACA,WACA,YACA,UACA,WACA,QACA,YACA,YACA,UACA,QACA,YACA,YACA,YACA,YACA,WACA,WACA,UACA,UACA,QACA,QACA,WACA,QACA,OACA,WACA,YACA,YACA,WACA,OACA,QACA,WACA,WACA,QACA,QACA,YACA,UACA,WACA,QACA,SACA,UACA,SACA,UACA,UACA,UACA,SACA,UACA,OACA,QACA,QACA,SACA,UACA,UACA,QACA,SACA,UACA,SACA,YACA,WACA,QACA,MACA,SACA,YACA,SACA,YACA,UACA,QACA,QACA,OACA,QACA,QACA,SACA,YACA,SACA,WACA,SACA,UACA,WACA,UACA,UACA,YACA,YACA,YACA,SACA,WACA,QACA,OACA,WACA,OACA,SACA,YACA,UACA,SACA,SACA,UACA,YACA,WACA,YACA,YACA,SACA,QACA,SACA,WACA,YACA,YACA,WACA,UACA,YACA,WACA,UACA,UACA,WACA,QACA,WACA,YACA,SACA,YACA,SACA,SACA,WACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,SACA,SACA,WACA,SACA,UACA,WACA,QACA,WACA,UACA,OACA,QACA,QACA,SACA,QACA,QACA,SACA,UACA,SACA,QACA,OACA,OACA,SACA,WACA,SACA,SACA,WACA,YACA,YACA,WACA,SACA,SACA,YACA,WACA,WACA,UACA,YACA,WACA,WACA,YACA,UACA,UACA,WACA,YACA,WACA,WACA,YACA,WACA,WACA,YACA,WACA,WACA,YACA,WACA,YACA,SACA,WACA,WACA,YACA,WACA,QACA,WACA,YACA,SACA,QACA,UACA,QACA,UACA,SACA,WACA,QACA,SACA,UACA,SACA,SACA,YACA,UACA,QACA,UACA,WACA,QACA,SACA,WACA,SACA,UACA,YACA,UACA,QACA,WACA,SACA,SACA,SACA,WACA,QACA,WACA,WACA,SACA,SACA,UACA,WACA,WACA,SACA,YACA,UACA,SACA,WACA,SACA,UACA,SACA,UACA,QACA,WACA,UACA,WACA,SACA,UACA,SACA,OACA,YACA,UACA,YACA,SACA,WACA,YACA,UACA,WACA,YACA,WACA,OACA,YACA,SACA,QACA,QACA,QACA,SACA,SACA,QACA,OACA,QACA,OACA,YACA,WACA,YACA,UACA,UACA,SACA,SACA,UACA,UACA,UACA,QACA,OACA,QACA,UACA,YACA,YACA,QACA,YACA,YACA,QACA,WACA,YACA,SACA,UACA,SACA,QACA,QACA,UACA,QACA,QACA,WACA,QACA,QACA,UACA,UACA,WACA,SACA,OACA,WACA,QACA,WACA,UACA,WACA,OACA,OACA,WACA,WACA,UACA,OACA,SACA,UACA,QACA,SACA,YACA,QACA,QACA,UACA,SACA,QACA,QACA,WACA,UACA,WACA,WACA,OACA,SACA,UACA,SACA,SACA,UACA,UACA,YACA,OACA,SACA,SACA,QACA,OACA,MACA,UACA,OACA,UACA,SACA,UACA,WACA,QACA,WACA,WACA,WACA,QACA,UACA,SACA,SACA,QACA,OACA,YACA,YACA,OACA,YACA,SACA,QACA,SACA,UACA,WACA,UACA,QACA,QACA,QACA,SACA,UACA,WACA,YACA,OACA,YACA,WACA,SACA,QACA,OACA,SACA,WACA,SACA,SACA,WACA,SACA,WACA,YACA,YACA,SACA,SACA,QACA,SACA,UACA,OACA,SACA,SACA,WACA,YACA,UACA,WACA,SACA,SACA,WACA,UACA,UACA,QACA,QACA,QACA,QACA,UACA,UACA,SACA,YACA,OACA,QACA,QACA,UACA,UACA,YACA,UACA,UACA,YACA,YACA,UACA,UACA,YACA,YACA,YACA,UACA,WACA,SACA,SACA,YACA,SACA,SACA,WACA,QACA,QACA,UACA,WACA,YACA,SACA,WACA,WACA,SACA,WACA,QACA,QACA,WACA,QACA,YACA,SACA,WACA,SACA,YACA,SACA,SACA,SACA,WACA,WACA,YACA,YACA,WACA,WACA,UACA,QACA,SACA,UACA,SACA,SACA,UACA,UACA,QACA,OACA,QACA,YACA,SACA,OACA,UACA,YACA,YACA,WACA,WACA,UACA,UACA,UACA,WACA,WACA,WACA,QACA,QACA,SACA,SACA,SACA,UACA,YACA,WACA,QACA,OACA,SACA,OACA,SACA,UACA,OACA,WACA,OACA,SACA,UACA,SACA,YACA,QACA,UACA,QACA,SACA,QACA,SACA,SACA,QACA,QACA,WACA,UACA,OACA,UACA,OACA,WACA,WACA,UACA,YACA,WACA,UACA,YACA,OACA,UACA,UACA,UACA,YACA,QACA,SACA,WACA,SACA,WACA,UACA,WACA,SACA,QACA,SACA,SACA,UACA,SACA,QACA,OACA,SACA,WACA,WACA,SACA,UACA,SACA,SACA,SACA,QACA,YACA,SACA,UACA,SACA,UACA,UACA,WACA,OACA,YACA,UACA,UACA,SACA,YACA,UACA,UACA,UACA,YACA,UACA,YACA,UACA,UACA,QACA,UACA,SACA,YACA,SACA,UACA,WACA,WACA,YACA,YACA,YACA,WACA,SACA,YACA,QACA,SACA,UACA,UACA,WACA,UACA,YACA,WACA,YACA,QACA,YACA,YACA,UACA,UACA,UACA,SACA,YACA,QACA,SACA,WACA,SACA,UACA,YACA,YACA,QACA,UACA,UACA,UACA,OACA,OACA,SACA,SACA,SACA,WACA,WACA,WACA,WACA,UACA,WACA,WACA,WACA,WACA,YACA,UACA,YACA,UACA,WACA,SACA,UACA,WACA,WACA,UACA,YACA,WACA,UACA,SACA,SACA,SACA,UACA,YACA,SACA,QACA,UACA,YACA,SACA,SACA,YACA,QACA,UACA,YACA,UACA,WACA,WACA,UACA,SACA,SACA,QACA,SACA,YACA,WACA,WACA,SACA,SACA,SACA,WACA,WACA,YACA,YACA,YACA,UACA,WACA,WACA,QACA,WACA,QACA,QACA,UACA,YACA,UACA,YACA,WACA,SACA,SACA,UACA,QACA,QACA,YACA,WACA,UACA,QACA,UACA,YACA,YACA,WACA,UACA,WACA,UACA,UACA,QACA,UACA,UACA,WACA,QACA,UACA,SACA,WACA,WACA,WACA,UACA,WACA,SACA,WACA,UACA,QACA,QACA,SACA,SACA,OACA,YACA,UACA,QACA,YACA,SACA,QACA,QACA,UACA,QACA,WACA,SACA,UACA,QACA,QACA,YACA,YACA,YACA,WACA,YACA,YACA,QACA,QACA,QACA,OACA,WACA,SACA,WACA,WACA,QACA,WACA,WACA,SACA,YACA,UACA,QACA,UACA,WACA,SACA,OACA,SACA,UACA,WACA,SACA,SACA,QACA,OACA,SACA,QACA,QACA,QACA,QACA,QACA,WACA,QACA,SACA,WACA,SACA,WACA,WACA,YACA,SACA,UACA,UACA,WACA,UACA,SACA,SACA,OACA,QACA,QACA,OACA,QACA,WACA,SACA,SACA,QACA,YACA,QACA,WACA,UACA,UACA,WACA,UACA,WACA,UACA,QACA,QACA,QACA,UACA,SACA,WACA,OACA,OACA,QACA,QACA,QACA,UACA,QACA,SACA,YACA,WACA,QACA,SACA,UACA,SACA,UACA,WACA,QACA,SACA,WACA,OACA,SACA,QACA,UACA,QACA,QACA,UACA,WACA,UACA,UACA,WACA,QACA,SACA,UACA,WACA,YACA,QACA,WACA,SACA,SACA,YACA,SACA,UACA,QACA,YACA,UACA,UACA,WACA,YACA,YACA,OACA,WACA,SACA,UACA,SACA,QACA,UACA,MACA,WACA,SACA,UACA,SACA,YACA,YACA,YACA,WACA,YACA,WACA,WACA,OACA,OACA,OACA,OACA,WACA,WACA,UACA,WACA,SACA,YACA,YACA,UACA,SACA,YACA,WACA,WACA,WACA,SACA,WACA,OACA,OACA,OACA,UACA,QACA,QACA,SACA,QACA,WACA,UACA,UACA,WACA,UACA,YACA,YACA,SACA,YACA,UACA,YACA,YACA,YACA,YACA,YACA,YACA,UACA,UACA,SACA,UACA,SACA,YACA,WACA,WACA,YACA,UACA,YACA,WACA,WACA,YACA,WACA,YACA,UACA,UACA,UACA,WACA,UACA,YACA,UACA,QACA,YACA,UACA,WACA,WACA,SACA,WACA,YACA,YACA,UACA,YACA,YACA,UACA,OACA,UACA,WACA,YACA,YACA,WACA,YACA,YACA,WACA,YACA,UACA,WACA,UACA,WACA,WACA,WACA,YACA,YACA,YACA,YACA,WACA,WACA,UACA,YACA,UACA,WACA,YACA,YACA,YACA,UACA,UACA,YACA,YACA,YACA,WACA,YACA,YACA,YACA,UACA,WACA,YACA,UACA,YACA,WACA,UACA,YACA,YACA,WACA,UACA,UACA,UACA,UACA,WACA,UACA,YACA,UACA,UACA,YACA,OACA,SACA,SACA,UACA,SACA,UACA,SACA,OACA,QACA,OACA,WACA,YACA,UACA,SACA,SACA,SACA,YACA,YACA,WACA,WACA,YACA,QACA,WACA,UACA,WACA,YACA,SACA,UACA,WACA,UACA,YACA,YACA,UACA,SACA,SACA,WACA,YACA,SACA,SACA,YACA,OACA,UACA,SACA,QACA,QACA,QACA,YACA,YACA,WACA,YACA,UACA,SACA,UACA,WACA,QACA,UACA,WACA,UACA,SACA,WACA,OACA,WACA,YACA,WACA,WACA,SACA,WACA,UACA,WACA,YACA,YACA,SACA,QACA,YACA,QACA,UACA,UACA,QACA,QACA,QACA,UACA,WACA,WACA,WACA,WACA,SACA,SACA,UACA,YACA,QACA,UACA,UACA,YACA,SACA,WACA,YACA,SACA,WACA,WACA,WACA,WACA,WACA,SACA,QACA,QACA,SACA,QACA,QACA,WACA,UACA,WACA,YACA,UACA,WACA,UACA,WACA,OACA,UACA,QACA,QACA,QACA,UACA,SACA,WACA,UACA,UACA,UACA,WACA,UACA,YACA,SACA,WACA,UACA,QACA,QACA,QACA,QACA,OACA,QACA,SACA,UACA,UACA,QACA,QACA,UACA,UACA,YACA,UACA,YACA,UACA,QACA,YACA,SACA,UACA,WACA,WACA,YACA,UACA,WACA,YACA,UACA,UACA,WACA,QACA,OACA,SACA,UACA,UACA,YACA,OACA,UACA,UACA,WACA,SACA,SACA,WACA,WACA,YACA,WACA,UACA,YACA,WACA,UACA,YACA,UACA,QACA,SACA,UACA,UACA,UACA,SACA,OACA,SACA,SACA,SACA,SACA,YACA,UACA,QACA,QACA,QACA,UACA,SACA,UACA,SACA,SACA,YACA,QACA,QACA,QACA,OACA,SACA,UACA,YACA,UACA,YACA,WACA,YACA,UACA,MACA,QACA,SACA,UACA,UACA,WACA,SACA,YACA,YACA,MACA,MACA,WACA,SACA,QACA,WACA,SACA,QACA,QACA,WACA,QACA,UACA,YACA,SACA,WACA,QACA,SACA,SACA,WACA,YACA,QACA,WACA,WACA,YACA,UACA,WACA,WACA,UACA,OACA,OACA,YACA,OACA,YACA,OACA,WACA,SACA,WACA,WACA,UACA,OACA,SACA,WACA,UACA,WACA,WACA,UACA,UACA,UACA,UACA,WACA,SACA,YACA,WACA,SACA,UACA,YACA,QACA,OACA,YACA,SACA,WACA,QACA,UACA,WACA,SACA,QACA,SACA,SACA,QACA,QACA,YACA,QACA,WACA,SACA,WACA,YACA,WACA,UACA,SACA,YACA,YACA,UACA,YACA,UACA,YACA,WACA,OACA,WACA,UACA,SACA,YACA,YACA,YACA,QACA,WACA,SACA,WACA,YACA,SACA,SACA,OACA,OACA,SACA,SACA,WACA,SACA,WACA,SACA,UACA,SACA,YACA,YACA,YACA,WACA,UACA,YACA,WACA,WACA,WACA,UACA,SACA,WACA,SACA,WACA,UACA,YACA,WACA,YACA,YACA,QACA,WACA,UACA,UACA,SACA,SACA,OACA,WACA,YACA,WACA,SACA,YACA,QACA,WACA,QACA,WACA,YACA,SACA,WACA,WACA,WACA,YACA,YACA,YACA,WACA,YACA,WACA,UACA,QACA,SACA,WACA,SACA,YACA,YACA,WACA,SACA,YACA,WACA,SACA,WACA,YACA,YACA,WACA,SACA,QACA,SACA,QACA,UACA,SACA,UACA,UACA,OACA,YACA,YACA,WACA,YACA,SACA,UACA,YACA,WACA,SACA,SACA,SACA,WACA,YACA,YACA,UACA,UACA,QACA,WACA,SACA,SACA,WACA,QACA,UACA,YACA,UACA,YACA,YACA,WACA,WACA,YACA,YACA,UACA,WACA,WACA,UACA,UACA,UACA,UACA,YACA,WACA,WACA,SACA,YACA,YACA,WACA,YACA,YACA,SACA,WACA,YACA,WACA,UACA,QACA,UACA,WACA,UACA,UACA,YACA,WACA,SACA,UACA,YACA,UACA,WACA,WACA,YACA,WACA,YACA,YACA,WACA,WACA,WACA,YACA,YACA,UACA,OACA,WACA,SACA,YACA,QACA,OACA,SACA,UACA,YACA,WACA,YACA,WACA,WACA,YACA,YACA,MACA,WACA,YACA,WACA,OACA,SACA,OACA,WACA,QACA,SACA,SACA,UACA,SACA,QACA,UACA,SACA,YACA,QACA,QACA,SACA,SACA,UACA,UACA,UACA,SACA,SACA,UACA,WACA,YACA,YACA,WACA,YACA,WACA,YACA,WACA,WACA,WACA,SACA,WACA,WACA,UACA,YACA,WACA,UACA,UACA,YACA,WACA,WACA,WACA,YACA,WACA,UACA,UACA,YACA,YACA,WACA,OACA,YACA,UACA,OACA,UACA,YACA,YACA,WACA,WACA,YACA,SACA,UACA,WACA,UACA,WACA,SACA,YACA,YACA,WACA,WACA,YACA,YACA,YACA,WACA,UACA,YACA,WACA,UACA,WACA,UACA,YACA,UACA,WACA,WACA,UACA,WACA,UACA,WACA,UACA,WACA,WACA,WACA,WACA,QACA,QACA,QACA,YACA,UACA,WACA,WACA,WACA,WACA,SACA,WACA,YACA,YACA,WACA,WACA,WACA,YACA,QACA,SACA,SACA,OACA,WACA,WACA,QACA,QACA,QACA,QACA,OACA,SACA,YACA,SACA,QACA,UACA,SACA,WACA,WACA,WACA,WACA,UACA,WACA,UACA,QACA,QACA,SACA,WACA,YACA,WACA,UACA,UACA,WACA,WACA,WACA,WACA,UACA,QACA,OACA,YACA,SACA,SACA,OACA,SACA,WACA,SACA,OACA,OACA,QACA,OACA,OACA,WACA,YACA,YACA,WACA,YACA,WACA,UACA,UACA,YACA,WACA,YACA,QACA,UACA,UACA,OACA,UACA,WACA,YACA,YACA,WACA,YACA,YACA,YACA,SACA,SACA,WACA,SACA,SACA,QACA,OACA,UACA,QACA,QACA,QACA,UACA,WACA,YACA,WACA,WACA,SACA,WACA,SACA,SACA,WACA,UACA,UACA,UACA,QACA,QACA,QACA,YACA,UACA,WACA,UACA,UACA,UACA,QACA,QACA,WACA,SACA,OACA,MACA,SACA,YACA,UACA,WACA,UACA,WACA,WACA,QACA,OACA,OACA,SACA,SACA,MACA,OACA,SACA,WACA,OACA,UACA,WACA,WACA,MACA,OACA,SACA,YACA,YACA,UACA,UACA,WACA,SACA,SACA,OACA,OACA,UACA,OACA,QACA,QACA,QACA,UACA,UACA,WACA,UACA,YACA,UACA,WACA,UACA,WACA,WACA,OACA,QACA,UACA,UACA,UACA,SACA,UACA,QACA,UACA,UACA,WACA,WACA,WACA,UACA,UACA,UACA,YACA,YACA,UACA,YACA,SACA,SACA,UACA,QACA,UACA,SACA,WACA,SACA,YACA,YACA,SACA,WACA,UACA,QACA,SACA,SACA,OACA,OACA,QACA,QACA,QACA,YACA,OACA,SACA,UACA,YACA,UACA,WACA,YACA,UACA,YACA,YACA,OACA,WACA,SACA,OACA,UACA,SACA,WACA,YACA,WACA,MACA,YACA,UACA,YACA,SACA,YACA,SACA,SACA,WACA,WACA,YACA,UACA,YACA,SACA,QACA,YACA,UACA,SACA,QACA,YACA,UACA,SACA,YACA,WACA,WACA,WACA,UACA,YACA,YACA,WACA,SACA,MACA,WACA,WACA,YACA,QACA,UACA,SACA,MACA,UACA,WACA,MACA,YACA,QACA,YACA,WACA,YACA,QACA,UACA,QACA,QACA,UACA,SACA,UACA,YACA,YACA,QACA,WACA,UACA,SACA,SACA,WACA,SACA,YACA,QACA,UACA,YACA,WACA,OACA,QACA,WACA,UACA,WACA,UACA,UACA,WACA,WACA,YACA,WACA,YACA,WACA,WACA,WACA,WACA,UACA,UACA,YACA,QACA,MACA,SACA,YACA,SACA,YACA,YACA,WACA,UACA,YACA,SACA,SACA,YACA,YACA,WACA,UACA,UACA,WACA,WACA,YACA,QACA,SACA,UACA,UACA,YACA,YACA,UACA,YACA,WACA,YACA,YACA,WACA,YACA,WACA,SACA,WACA,WACA,UACA,WACA,SACA,UACA,WACA,WACA,YACA,UACA,SACA,UACA,YACA,YACA,YACA,UACA,WACA,YACA,WACA,YACA,YACA,WACA,WACA,SACA,SACA,SACA,UACA,UACA,SACA,SACA,YACA,WACA,YACA,WACA,SACA,UACA,SACA,SACA,YACA,SACA,SACA,WACA,UACA,WACA,UACA,YACA,WACA,WACA,WACA,UACA,WACA,QACA,OACA,SACA,OACA,WACA,YACA,YACA,WACA,WACA,YACA,WACA,WACA,UACA,QACA,SACA,WACA,UACA,UACA,YACA,SACA,YACA,YACA,WACA,SACA,SACA,UACA,YACA,SACA,SACA,UACA,QACA,QACA,WACA,YACA,YACA,WACA,WACA,WACA,SACA,YACA,YACA,WACA,UACA,QACA,UACA,YACA,YACA,SACA,WACA,WACA,YACA,YACA,WACA,UACA,UACA,WACA,UACA,QACA,YACA,SACA,YACA,WACA,UACA,QACA,WACA,YACA,YACA,UACA,UACA,OACA,YACA,YACA,YACA,WACA,WACA,QACA,WACA,UACA,OACA,QACA,YACA,SACA,QACA,UACA,UACA,WACA,YACA,YACA,YACA,SACA,WACA,YACA,WACA,UACA,UACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,SACA,YACA,YACA,YACA,YACA,QACA,OACA,YACA,SACA,UACA,SACA,QACA,WACA,OACA,SACA,YACA,WACA,WACA,SACA,UACA,YACA,YACA,YACA,YACA,YACA,QACA,SACA,WACA,YACA,SACA,SACA,WACA,UACA,YACA,WACA,UACA,UACA,UACA,YACA,WACA,WACA,YACA,SACA,WACA,UACA,YACA,YACA,WACA,YACA,SACA,YACA,WACA,WACA,UACA,YACA,YACA,SACA,YACA,UACA,YACA,YACA,QACA,SACA,WACA,WACA,YACA,WACA,WACA,WACA,YACA,UACA,SACA,WACA,SACA,YACA,UACA,UACA,SACA,YACA,UACA,UACA,OACA,SACA,UACA,SACA,OACA,QACA,UACA,OACA,WACA,SACA,SACA,WACA,UACA,UACA,YACA,QACA,UACA,OACA,UACA,YACA,YACA,UACA,UACA,WACA,SACA,UACA,WACA,SACA,YACA,YACA,UACA,WACA,WACA,MACA,QACA,UACA,SACA,SACA,OACA,OACA,SACA,SACA,WACA,WACA,WACA,WACA,WACA,QACA,QACA,UACA,SACA,UACA,WACA,YACA,WACA,SACA,SACA,QACA,SACA,SACA,WACA,UACA,YACA,QACA,QACA,QACA,QACA,UACA,SACA,WACA,WACA,YACA,UACA,UACA,QACA,WACA,QACA,UACA,SACA,WACA,SACA,SACA,SACA,UACA,OACA,SACA,QACA,WACA,SACA,WACA,WACA,UACA,UACA,YACA,QACA,WACA,QACA,UACA,WACA,WACA,YACA,SACA,UACA,UACA,WACA,MACA,OACA,UACA,UACA,WACA,WACA,YACA,YACA,QACA,UACA,QACA,QACA,YACA,UACA,WACA,WACA,OACA,UACA,YACA,YACA,YACA,WACA,WACA,SACA,QACA,UACA,WACA,SACA,WACA,UACA,YACA,YACA,WACA,UACA,WACA,WACA,WACA,YACA,YACA,WACA,OACA,UACA,SACA,QACA,QACA,SACA,SACA,QACA,QACA,OACA,QACA,QACA,QACA,WACA,OACA,SACA,UACA,QACA,WACA,UACA,UACA,QACA,SACA,UACA,WACA,OACA,MACA,MACA,OACA,QACA,OACA,WACA,SACA,WACA,SACA,WACA,SACA,OACA,OACA,OACA,UACA,WACA,WACA,YACA,SACA,WACA,WACA,WACA,UACA,WACA,UACA,WACA,UACA,WACA,YACA,WACA,UACA,WACA,WACA,WACA,SACA,SACA,UACA,WACA,WACA,MACA,QACA,WACA,WACA,UACA,YACA,WACA,YACA,WACA,QACA,QACA,UACA,UACA,YACA,SACA,UACA,QACA,WACA,WACA,WACA,UACA,UACA,UACA,WACA,WACA,UACA,WACA,SACA,YACA,WACA,YACA,WACA,UACA,WACA,YACA,WACA,UACA,SACA,WACA,SACA,YACA,WACA,QACA,UACA,UACA,WACA,SACA,SACA,QACA,SACA,WACA,YACA,YACA,WACA,QACA,SACA,UACA,QACA,UACA,YACA,SACA,OACA,QACA,YACA,UACA,WACA,WACA,YACA,SACA,QACA,QACA,SACA,WACA,YACA,WACA,QACA,YACA,SACA,MACA,QACA,MACA,YACA,UACA,QACA,OACA,YACA,WACA,UACA,SACA,SACA,UACA,YACA,SACA,YACA,WACA,OACA,SACA,QACA,SACA,SACA,WACA,UACA,MACA,SACA,UACA,SACA,SACA,UACA,SACA,UACA,SACA,UACA,SACA,MACA,WACA,YACA,SACA,UACA,WACA,QACA,OACA,OACA,SACA,OACA,QACA,OACA,SACA,MACA,SACA,UACA,WACA,WACA,QACA,UACA,YACA,SACA,QACA,YACA,WACA,YACA,UACA,YACA,WACA,WACA,SACA,YACA,YACA,YACA,WACA,YACA,UACA,YACA,UACA,UACA,UACA,QACA,QACA,YACA,SACA,UACA,YACA,QACA,OACA,WACA,YACA,WACA,SACA,WACA,SACA,SACA,SACA,QACA,UACA,SACA,WACA,QACA,QACA,SACA,QACA,UACA,UACA,UACA,QACA,YACA,SACA,YACA,UACA,SACA,WACA,YACA,QACA,UACA,QACA,WACA,UACA,WACA,UACA,SACA,UACA,UACA,UACA,UACA,SACA,UACA,SACA,UACA,WACA,WACA,SACA,YACA,YACA,UACA,WACA,QACA,QACA,QACA,UACA,WACA,UACA,OACA,SACA,YACA,UACA,SACA,OACA,OACA,WACA,OACA,UACA,QACA,WACA,WACA,YACA,OACA,UACA,QACA,UACA,OACA,OACA,OACA,QACA,WACA,YACA,QACA,SACA,OACA,SACA,OACA,SACA,WACA,OACA,UACA,SACA,SACA,SACA,OACA,OACA,OACA,WACA,YACA,WACA,YACA,SACA,SACA,WACA,UACA,YACA,WACA,WACA,UACA,WACA,QACA,WACA,WACA,UACA,UACA,UACA,WACA,UACA,SACA,UACA,QACA,WACA,QACA,QACA,UACA,YACA,QACA,QACA,YACA,UACA,UACA,YACA,WACA,SACA,YACA,SACA,YACA,YACA,UACA,QACA,OACA,UACA,WACA,WACA,YACA,SACA,QACA,UACA,WACA,OACA,YACA,OACA,QACA,YACA,WACA,WACA,QACA,UACA,YACA,QACA,YACA,QACA,SACA,WACA,OACA,UACA,OACA,WACA,SACA,QACA,QACA,SACA,WACA,SACA,QACA,SACA,UACA,QACA,QACA,SACA,UACA,QACA,OACA,SACA,WACA,WACA,UACA,UACA,YACA,UACA,WACA,SACA,QACA,YACA,WACA,WACA,QACA,UACA,YACA,QACA,OACA,WACA,QACA,OACA,UACA,UACA,YACA,UACA,QACA,SACA,WACA,OACA,OACA,QACA,QACA,UACA,OACA,SACA,MACA,UACA,WACA,YACA,WACA,UACA,WACA,SACA,SACA,UACA,UACA,MACA,UACA,QACA,OACA,UACA,OACA,SACA,SACA,YACA,SACA,UACA,SACA,UACA,YACA,UACA,WACA,WACA,YACA,WACA,WACA,YACA,YACA,WACA,SACA,UACA,WACA,UACA,WACA,YACA,YACA,YACA,UACA,UACA,WACA,WACA,UACA,WACA,YACA,WACA,UACA,UACA,YACA,YACA,YACA,WACA,WACA,YACA,YACA,WACA,WACA,UACA,WACA,SACA,YACA,SACA,QACA,YACA,YACA,UACA,WACA,UACA,YACA,QACA,SACA,WACA,WACA,YACA,WACA,WACA,WACA,YACA,UACA,WACA,YACA,SACA,WACA,WACA,WACA,YACA,WACA,QACA,UACA,WACA,YACA,YACA,YACA,UACA,UACA,UACA,QACA,UACA,OACA,SACA,QACA,UACA,YACA,QACA,SACA,YACA,WACA,UACA,WACA,YACA,OACA,UACA,SACA,QACA,QACA,SACA,WACA,SACA,WACA,SACA,OACA,WACA,WACA,YACA,YACA,YACA,SACA,SACA,YACA,WACA,UACA,WACA,WACA,WACA,YACA,YACA,WACA,WACA,YACA,UACA,WACA,YACA,YACA,UACA,WACA,OACA,OACA,QACA,UACA,YACA,UACA,QACA,UACA,YACA,QACA,SACA,SACA,SACA,UACA,UACA,WACA,WACA,UACA,YACA,QACA,WACA,QACA,SACA,SACA,YACA,QACA,WACA,SACA,UACA,UACA,UACA,UACA,QACA,YACA,WACA,WACA,UACA,WACA,SACA,SACA,WACA,OACA,MACA,OACA,OACA,OACA,QACA,SACA,WACA,SACA,QACA,YACA,WACA,UACA,SACA,YACA,WACA,YACA,WACA,WACA,SACA,SACA,YACA,YACA,SACA,WACA,SACA,OACA,SACA,UACA,WACA,WACA,SACA,SACA,SACA,UACA,SACA,YACA,UACA,QACA,OACA,UACA,OACA,SACA,YACA,MACA,SACA,UACA,WACA,YACA,WACA,YACA,YACA,YACA,SACA,WACA,WACA,WACA,YACA,YACA,YACA,YACA,YACA,YACA,MACA,UACA,QACA,OACA,OACA,MACA,WACA,WACA,WACA,UACA,YACA,YACA,WACA,WACA,WACA,SACA,QACA,OACA,QACA,WACA,SACA,SACA,YACA,WACA,WACA,QACA,YACA,WACA,UACA,WACA,UACA,YACA,WACA,UACA,YACA,WACA,WACA,WACA,YACA,WACA,YACA,YACA,WACA,WACA,WACA,SACA,SACA,YACA,UACA,WACA,YACA,YACA,WACA,SACA,UACA,YACA,YACA,WACA,UACA,YACA,YACA,QACA,WACA,YACA,WACA,SACA,WACA,YACA,YACA,WACA,UACA,YACA,UACA,WACA,YACA,WACA,UACA,YACA,YACA,YACA,UACA,YACA,SACA,WACA,SACA,SACA,MACA,OACA,SACA,OACA,QACA,MACA,OACA,YACA,WACA,YACA,YACA,WACA,WACA,UACA,WACA,WACA,YACA,YACA,UACA,QACA,UACA,YACA,UACA,OACA,YACA,SACA,QACA,MACA,MACA,SACA,SACA,YACA,UACA,WACA,YACA,SACA,YACA,WACA,MACA,UACA,UACA,SACA,UACA,UACA,WACA,QACA,OACA,QACA,UACA,UACA,OACA,UACA,YACA,OACA,OACA,YACA,UACA,QACA,SACA,SACA,MACA,QACA,SACA,QACA,SACA,WACA,OACA,UACA,UACA,MACA,SACA,YACA,SACA,UACA,OACA,UACA,WACA,WACA,YACA,QACA,OACA,MACA,SACA,WACA,YACA,SACA,UACA,WACA,YACA,WACA,QACA,YACA,WACA,YACA,OACA,SACA,WACA,UACA,QACA,YACA,QACA,UACA,UACA,OACA,SACA,QACA,OACA,WACA,WACA,OACA,SACA,UACA,SACA,UACA,WACA,SACA,QACA,OACA,UACA,YACA,UACA,SACA,WACA,WACA,QACA,WACA,UACA,SACA,QACA,QACA,SACA,WACA,OACA,MACA,OACA,SACA,OACA,WACA,WACA,SACA,OACA,OACA,WACA,WACA,YACA,WACA,OACA,SACA,SACA,WACA,SACA,WACA,UACA,UACA,UACA,OACA,UACA,UACA,YACA,WACA,SACA,UACA,UACA,OACA,SACA,QACA,OACA,UACA,WACA,OACA,QACA,WACA,QACA,QACA,QACA,SACA,UACA,QACA,OACA,UACA,UACA,WACA,YACA,WACA,SACA,SACA,QACA,UACA,WACA,SACA,UACA,SACA,OACA,OACA,QACA,SACA,WACA,WACA,UACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,YACA,YACA,WACA,YACA,WACA,YACA,QACA,UACA,SACA,QACA,SACA,UACA,SACA,OACA,QACA,OACA,OACA,QACA,OACA,QACA,OACA,SACA,WACA,UACA,SACA,WACA,SACA,UACA,UACA,SACA,WACA,SACA,WACA,SACA,WACA,OACA,WACA,OACA,SACA,QACA,SACA,SACA,WACA,UACA,UACA,YACA,OACA,UACA,SACA,YACA,UACA,QACA,OACA,SACA,OACA,OACA,UACA,SACA,UACA,YACA,WACA,SACA,UACA,QACA,WACA,SACA,WACA,YACA,YACA,SACA,UACA,YACA,UACA,UACA,WACA,MACA,OACA,SACA,UACA,UACA,WACA,SACA,WACA,WACA,SACA,QACA,QACA,OACA,OACA,UACA,YACA,QACA,QACA,UACA,WACA,OACA,QACA,WACA,WACA,SACA,SACA,WACA,UACA,OACA,OACA,MACA,UACA,UACA,SACA,OACA,OACA,WACA,YACA,SACA,SACA,SACA,UACA,QACA,SACA,QACA,YACA,UACA,SACA,SACA,YACA,YACA,QACA,UACA,YACA,WACA,YACA,YACA,SACA,WACA,UACA,SACA,YACA,WACA,YACA,UACA,UACA,SACA,QACA,WACA,WACA,YACA,YACA,OACA,QACA,OACA,YACA,OACA,SACA,WACA,SACA,YACA,UACA,YACA,WACA,QACA,YACA,SACA,QACA,YACA,WACA,WACA,SACA,WACA,WACA,QACA,OACA,UACA,YACA,WACA,UACA,SACA,UACA,WACA,QACA,YACA,WACA,YACA,YACA,YACA,UACA,YACA,WACA,WACA,SACA,WACA,UACA,YACA,WACA,WACA,QACA,YACA,SACA,YACA,OACA,OACA,SACA,UACA,YACA,UACA,WACA,UACA,WACA,UACA,YACA,WACA,SACA,SACA,QACA,QACA,YACA,UACA,UACA,UACA,YACA,WACA,YACA,SACA,UACA,UACA,YACA,QACA,UACA,SACA,UACA,QACA,WACA,SACA,SACA,SACA,OACA,MACA,WACA,YACA,UACA,UACA,WACA,QACA,QACA,YACA,YACA,SACA,WACA,SACA,SACA,UACA,WACA,SACA,YACA,SACA,UACA,SACA,QACA,YACA,SACA,YACA,YACA,UACA,SACA,YACA,SACA,UACA,WACA,SACA,UACA,UACA,UACA,YACA,WACA,UACA,WACA,YACA,WACA,WACA,YACA,OACA,SACA,YACA,YACA,SACA,SACA,SACA,SACA,WACA,WACA,WACA,QACA,WACA,WACA,UACA,QACA,SACA,YACA,SACA,UACA,SACA,WACA,WACA,UACA,QACA,SACA,SACA,WACA,SACA,UACA,YACA,SACA,UACA,YACA,WACA,QACA,WACA,OACA,YACA,WACA,WACA,UACA,MACA,YACA,SACA,WACA,WACA,YACA,YACA,YACA,WACA,UACA,UACA,WACA,WACA,WACA,YACA,WACA,WACA,WACA,WACA,WACA,WACA,UACA,YACA,UACA,WACA,UACA,YACA,QACA,SACA,WACA,SACA,YACA,WACA,UACA,WACA,YACA,YACA,YACA,WACA,MACA,SACA,WACA,UACA,YACA,WACA,WACA,WACA,QACA,YACA,WACA,YACA,YACA,UACA,WACA,SACA,QACA,OACA,WACA,YACA,SACA,WACA,YACA,SACA,YACA,QACA,QACA,YACA,WACA,UACA,WACA,UACA,WACA,QACA,YACA,YACA,QACA,QACA,UACA,OACA,QACA,SACA,QACA,SACA,OACA,OACA,MACA,MACA,WACA,QACA,OACA,SACA,UACA,WACA,WACA,YACA,YACA,SACA,WACA,QACA,YACA,UACA,QACA,QACA,WACA,UACA,YACA,SACA,QACA,YACA,QACA,YACA,WACA,SACA,UACA,YACA,WACA,QACA,QACA,SACA,YACA,QACA,UACA,UACA,SACA,YACA,QACA,UACA,SACA,WACA,OACA,YACA,YACA,SACA,OACA,SACA,SACA,SACA,UACA,YACA,UACA,OACA,QACA,MACA,OACA,OACA,SACA,QACA,YACA,OACA,SACA,SACA,UACA,QACA,SACA,UACA,YACA,WACA,SACA,WACA,UACA,SACA,WACA,WACA,WACA,YACA,OACA,SACA,UACA,SACA,WACA,SACA,WACA,SACA,YACA,SACA,SACA,WACA,WACA,YACA,WACA,YACA,YACA,UACA,UACA,OACA,SACA,OACA,UACA,QACA,OACA,MACA,YACA,SACA,WACA,WACA,SACA,UACA,QACA,OACA,SACA,WACA,WACA,QACA,QACA,SACA,SACA,WACA,YACA,QACA,WACA,QACA,UACA,SACA,UACA,SACA,UACA,SACA,UACA,SACA,WACA,UACA,WACA,YACA,UACA,WACA,WACA,UACA,UACA,UACA,UACA,UACA,SACA,WACA,WACA,YACA,QACA,SACA,QACA,MACA,MACA,QACA,MACA,YACA,WACA,WACA,SACA,WACA,UACA,WACA,YACA,SACA,YACA,OACA,UACA,YACA,YACA,WACA,YACA,WACA,YACA,YACA,WACA,WACA,YACA,WACA,SACA,YACA,SACA,UACA,YACA,YACA,WACA,WACA,SACA,QACA,SACA,UACA,SACA,UACA,UACA,OACA,MACA,OACA,WACA,OACA,MACA,QACA,WACA,QACA,OACA,UACA,WACA,OACA,WACA,UACA,WACA,UACA,QACA,SACA,WACA,OACA,WACA,QACA,UACA,YACA,UACA,OACA,SACA,OACA,OACA,OACA,OACA,UACA,OACA,OACA,WACA,UACA,YACA,YACA,YACA,WACA,QACA,UACA,WACA,SACA,WACA,WACA,YACA,YACA,MACA,YACA,UACA,QACA,QACA,OACA,QACA,QACA,SACA,UACA,SACA,WACA,WACA,WACA,WACA,UACA,WACA,UACA,WACA,WACA,QACA,WACA,SACA,WACA,WACA,UACA,WACA,SACA,UACA,SACA,UACA,UACA,WACA,WACA,UACA,YACA,YACA,UACA,UACA,SACA,UACA,UACA,WACA,WACA,WACA,UACA,WACA,WACA,WACA,YACA,WACA,YACA,YACA,WACA,WACA,UACA,WACA,SACA,OACA,QACA,OACA,UACA,UACA,WACA,UACA,WACA,WACA,YACA,YACA,WACA,YACA,WACA,WACA,WACA,WACA,YACA,YACA,YACA,YACA,YACA,UACA,YACA,YACA,YACA,UACA,WACA,WACA,WACA,WACA,YACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,YACA,WACA,YACA,WACA,UACA,UACA,WACA,WACA,WACA,YACA,YACA,WACA,UACA,YACA,WACA,YACA,YACA,WACA,YACA,YACA,WACA,WACA,WACA,UACA,YACA,WACA,YACA,YACA,YACA,WACA,YACA,YACA,WACA,WACA,YACA,YACA,YACA,WACA,YACA,WACA,UACA,WACA,WACA,WACA,UACA,YACA,WACA,YACA,MACA,SACA,UACA,YACA,UACA,YACA,SACA,WACA,SACA,QACA,QACA,YACA,UACA,WACA,WACA,WACA,SACA,SACA,UACA,SACA,WACA,UACA,QACA,QACA,SACA,UACA,SACA,YACA,OACA,WACA,YACA,SACA,WACA,WACA,UACA,WACA,SACA,UACA,WACA,QACA,WACA,OACA,YACA,QACA,UACA,WACA,YACA,UACA,YACA,SACA,QACA,YACA,YACA,SACA,QACA,UACA,UACA,WACA,YACA,SACA,UACA,YACA,WACA,YACA,YACA,YACA,WACA,YACA,YACA,YACA,WACA,WACA,YACA,SACA,UACA,YACA,SACA,SACA,QACA,UACA,UACA,SACA,WACA,SACA,SACA,UACA,UACA,UACA,SACA,UACA,YACA,SACA,UACA,YACA,QACA,WACA,WACA,UACA,WACA,YACA,WACA,UACA,UACA,UACA,YACA,WACA,WACA,WACA,QACA,SACA,SACA,UACA,SACA,WACA,UACA,QACA,YACA,SACA,WACA,YACA,OACA,WACA,UACA,QACA,YACA,UACA,SACA,YACA,YACA,SACA,WACA,QACA,YACA,WACA,SACA,SACA,UACA,UACA,WACA,SACA,QACA,QACA,SACA,UACA,WACA,UACA,SACA,SACA,QACA,SACA,WACA,WACA,YACA,WACA,WACA,YACA,WACA,UACA,SACA,OACA,SACA,WACA,UACA,SACA,UACA,UACA,YACA,WACA,UACA,YACA,QACA,SACA,UACA,WACA,YACA,MACA,WACA,UACA,QACA,YACA,YACA,YACA,YACA,UACA,YACA,SACA,WACA,UACA,YACA,QACA,OACA,WACA,YACA,YACA,YACA,YACA,YACA,YACA,QACA,OACA,YACA,YACA,SACA,YACA,QACA,SACA,WACA,QACA,YACA,SACA,YACA,YACA,QACA,UACA,UACA,SACA,UACA,YACA,SACA,UACA,YACA,QACA,YACA,QACA,SACA,WACA,UACA,UACA,WACA,QACA,UACA,QACA,SACA,UACA,UACA,SACA,WACA,UACA,WACA,WACA,UACA,WACA,YACA,YACA,WACA,WACA,SACA,UACA,YACA,YACA,UACA,WACA,YACA,WACA,UACA,UACA,WACA,UACA,YACA,WACA,QACA,WACA,QACA,SACA,YACA,SACA,WACA,YACA,UACA,OACA,OACA,OACA,OACA,OACA,QACA,OACA,UACA,WACA,SACA,OACA,YACA,UACA,QACA,MACA,OACA,OACA,OACA,UACA,UACA,WACA,YACA,SACA,QACA,SACA,QACA,SACA,QACA,SACA,SACA,QACA,SACA,WACA,QACA,OACA,YACA,UACA,YACA,UACA,SACA,OACA,OACA,UACA,OACA,SACA,SACA,QACA,WACA,WACA,UACA,WACA,YACA,OACA,SACA,WACA,WACA,SACA,YACA,WACA,UACA,SACA,WACA,QACA,OACA,SACA,WACA,WACA,SACA,UACA,SACA,UACA,WACA,SACA,SACA,UACA,YACA,UACA,UACA,QACA,SACA,WACA,QACA,UACA,OACA,WACA,YACA,UACA,QACA,SACA,MACA,WACA,SACA,WACA,UACA,WACA,YACA,SACA,UACA,WACA,YACA,UACA,WACA,WACA,UACA,YACA,UACA,SACA,WACA,YACA,UACA,UACA,SACA,YACA,YACA,UACA,YACA,WACA,YACA,YACA,SACA,UACA,WACA,WACA,UACA,WACA,YACA,WACA,UACA,SACA,UACA,SACA,YACA,YACA,YACA,SACA,UACA,YACA,UACA,QACA,UACA,YACA,UACA,YACA,YACA,WACA,UACA,SACA,UACA,UACA,YACA,UACA,UACA,WACA,SACA,YACA,WACA,QACA,SACA,YACA,UACA,UACA,SACA,QACA,WACA,QACA,QACA,QACA,SACA,SACA,WACA,UACA,UACA,YACA,QACA,YACA,WACA,WACA,YACA,QACA,UACA,YACA,UACA,YACA,UACA,WACA,YACA,WACA,WACA,UACA,UACA,UACA,UACA,YACA,YACA,YACA,UACA,WACA,YACA,UACA,YACA,UACA,WACA,YACA,WACA,YACA,YACA,YACA,WACA,YACA,WACA,WACA,QACA,QACA,YACA,SACA,WACA,YACA,SACA,YACA,WACA,WACA,YACA,WACA,UACA,QACA,UACA,YACA,WACA,SACA,YACA,YACA,WACA,WACA,QACA,WACA,SACA,SACA,WACA,WACA,YACA,WACA,UACA,UACA,YACA,YACA,UACA,UACA,WACA,YACA,QACA,SACA,QACA,YACA,QACA,UACA,MACA,UACA,SACA,YACA,SACA,SACA,MACA,OACA,YACA,OACA,UACA,QACA,YACA,OACA,SACA,SACA,QACA,WACA,YACA,YACA,UACA,WACA,OACA,QACA,SACA,QACA,WACA,YACA,WACA,SACA,WACA,YACA,QACA,UACA,WACA,SACA,SACA,UACA,SACA,SACA,WACA,YACA,OACA,QACA,YACA,WACA,UACA,WACA,WACA,YACA,SACA,YACA,UACA,WACA,UACA,SACA,QACA,UACA,OACA,SACA,WACA,UACA,YACA,SACA,QACA,WACA,QACA,WACA,QACA,UACA,YACA,YACA,UACA,UACA,QACA,UACA,UACA,SACA,YACA,YACA,WACA,UACA,SACA,QACA,UACA,UACA,YACA,YACA,YACA,QACA,QACA,QACA,UACA,YACA,QACA,OACA,SACA,YACA,WACA,YACA,QACA,QACA,OACA,SACA,SACA,OACA,SACA,QACA,SACA,WACA,YACA,WACA,YACA,WACA,QACA,SACA,SACA,OACA,OACA,SACA,SACA,UACA,SACA,UACA,UACA,WACA,UACA,SACA,OACA,SACA,QACA,SACA,WACA,OACA,SACA,QACA,YACA,SACA,SACA,SACA,UACA,SACA,UACA,UACA,UACA,QACA,OACA,SACA,SACA,OACA,UACA,SACA,QACA,SACA,SACA,UACA,YACA,WACA,QACA,YACA,WACA,WACA,UACA,WACA,OACA,YACA,WACA,UACA,YACA,YACA,YACA,WACA,SACA,WACA,WACA,WACA,UACA,YACA,SACA,QACA,UACA,SACA,SACA,UACA,SACA,UACA,UACA,WACA,WACA,SACA,SACA,YACA,SACA,SACA,SACA,SACA,YACA,YACA,UACA,SACA,WACA,UACA,WACA,YACA,UACA,YACA,YACA,SACA,YACA,UACA,YACA,YACA,YACA,SACA,SACA,UACA,SACA,WACA,WACA,SACA,YACA,YACA,UACA,WACA,WACA,YACA,WACA,UACA,UACA,UACA,YACA,YACA,UACA,YACA,SACA,YACA,UACA,WACA,WACA,WACA,YACA,YACA,SACA,SACA,UACA,SACA,WACA,WACA,WACA,WACA,YACA,UACA,UACA,WACA,UACA,UACA,YACA,SACA,YACA,YACA,UACA,SACA,WACA,YACA,SACA,SACA,UACA,UACA,SACA,SACA,SACA,WACA,YACA,WACA,UACA,YACA,UACA,UACA,WACA,YACA,QACA,SACA,SACA,YACA,YACA,UACA,YACA,UACA,YACA,SACA,WACA,UACA,YACA,YACA,UACA,WACA,WACA,QACA,QACA,UACA,UACA,YACA,WACA,WACA,WACA,UACA,QACA,UACA,YACA,UACA,SACA,SACA,SACA,WACA,SACA,YACA,OACA,SACA,SACA,UACA,UACA,WACA,SACA,WACA,WACA,YACA,YACA,QACA,UACA,YACA,SACA,UACA,SACA,YACA,UACA,UACA,UACA,WACA,SACA,WACA,YACA,YACA,WACA,YACA,YACA,UACA,UACA,WACA,WACA,YACA,WACA,SACA,SACA,SACA,WACA,UACA,SACA,UACA,YACA,YACA,UACA,SACA,SACA,WACA,YACA,SACA,WACA,WACA,SACA,WACA,UACA,SACA,UACA,QACA,WACA,SACA,YACA,SACA,YACA,YACA,UACA,UACA,WACA,YACA,YACA,YACA,OACA,UACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,UACA,UACA,YACA,UACA,QACA,SACA,WACA,UACA,SACA,WACA,WACA,WACA,WACA,SACA,SACA,QACA,UACA,UACA,YACA,YACA,YACA,WACA,WACA,UACA,WACA,YACA,YACA,YACA,SACA,WACA,WACA,WACA,WACA,SACA,WACA,UACA,WACA,SACA,SACA,WACA,YACA,YACA,SACA,WACA,YACA,SACA,YACA,YACA,UACA,UACA,UACA,UACA,WACA,SACA,SACA,WACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,YACA,YACA,QACA,SACA,UACA,SACA,UACA,UACA,WACA,QACA,SACA,UACA,UACA,UACA,SACA,UACA,YACA,WACA,WACA,UACA,YACA,YACA,SACA,YACA,SACA,WACA,UACA,YACA,UACA,UACA,WACA,YACA,SACA,SACA,WACA,YACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,UACA,QACA,SACA,UACA,OACA,SACA,SACA,WACA,UACA,UACA,WACA,SACA,OACA,SACA,UACA,OACA,UACA,QACA,QACA,UACA,SACA,OACA,OACA,QACA,UACA,OACA,UACA,WACA,WACA,UACA,SACA,WACA,UACA,OACA,SACA,OACA,UACA,UACA,QACA,QACA,YACA,WACA,YACA,YACA,UACA,WACA,SACA,UACA,QACA,UACA,OACA,QACA,WACA,SACA,WACA,SACA,SACA,WACA,YACA,UACA,WACA,YACA,WACA,QACA,QACA,QACA,OACA,OACA,SACA,SACA,OACA,SACA,UACA,UACA,WACA,WACA,WACA,YACA,UACA,YACA,UACA,UACA,QACA,SACA,QACA,SACA,SACA,UACA,SACA,UACA,OACA,SACA,SACA,MACA,SACA,OACA,SACA,WACA,UACA,QACA,YACA,UACA,SACA,UACA,QACA,OACA,SACA,UACA,QACA,OACA,OACA,OACA,MACA,UACA,WACA,YACA,SACA,YACA,SACA,YACA,UACA,WACA,QACA,UACA,SACA,YACA,YACA,SACA,WACA,UACA,OACA,OACA,UACA,QACA,OACA,QACA,OACA,QACA,SACA,WACA,SACA,SACA,QACA,SACA,QACA,OACA,WACA,SACA,UACA,YACA,YACA,OACA,SACA,WACA,WACA,WACA,YACA,SACA,UACA,WACA,UACA,YACA,UACA,SACA,WACA,UACA,UACA,YACA,UACA,YACA,YACA,WACA,QACA,WACA,YACA,OACA,QACA,UACA,YACA,QACA,UACA,YACA,UACA,OACA,YACA,QACA,UACA,WACA,QACA,YACA,YACA,UACA,WACA,WACA,YACA,QACA,QACA,SACA,UACA,QACA,UACA,SACA,QACA,YACA,MACA,UACA,SACA,UACA,WACA,QACA,UACA,WACA,UACA,WACA,OACA,UACA,UACA,WACA,QACA,YACA,SACA,WACA,YACA,SACA,QACA,UACA,YACA,WACA,QACA,YACA,SACA,WACA,YACA,SACA,WACA,YACA,WACA,UACA,UACA,YACA,QACA,QACA,WACA,QACA,QACA,UACA,QACA,SACA,YACA,YACA,SACA,YACA,SACA,UACA,QACA,WACA,SACA,YACA,UACA,WACA,WACA,SACA,WACA,WACA,WACA,YACA,YACA,QACA,UACA,UACA,SACA,WACA,SACA,WACA,YACA,SACA,SACA,UACA,YACA,WACA,WACA,UACA,UACA,WACA,QACA,QACA,WACA,YACA,SACA,UACA,WACA,YACA,YACA,SACA,UACA,SACA,YACA,SACA,UACA,WACA,WACA,QACA,SACA,WACA,WACA,WACA,SACA,WACA,UACA,UACA,UACA,SACA,WACA,YACA,YACA,WACA,OACA,UACA,WACA,WACA,YACA,YACA,UACA,WACA,YACA,SACA,UACA,OACA,SACA,WACA,YACA,YACA,YACA,YACA,WACA,QACA,YACA,SACA,SACA,SACA,WACA,YACA,SACA,SACA,YACA,UACA,WACA,QACA,UACA,UACA,SACA,WACA,UACA,UACA,SACA,WACA,QACA,YACA,YACA,UACA,UACA,WACA,SACA,QACA,SACA,UACA,YACA,UACA,SACA,QACA,QACA,WACA,UACA,YACA,UACA,QACA,QACA,UACA,UACA,QACA,UACA,WACA,QACA,SACA,QACA,UACA,QACA,YACA,UACA,UACA,UACA,YACA,QACA,SACA,OACA,QACA,QACA,QACA,QACA,UACA,SACA,WACA,SACA,SACA,UACA,WACA,YACA,SACA,UACA,SACA,UACA,QACA,UACA,YACA,UACA,QACA,OACA,QACA,YACA,QACA,QACA,WACA,UACA,WACA,WACA,QACA,WACA,YACA,WACA,UACA,UACA,YACA,YACA,UACA,YACA,SACA,YACA,SACA,QACA,QACA,UACA,WACA,WACA,SACA,WACA,UACA,UACA,QACA,UACA,YACA,YACA,WACA,QACA,SACA,WACA,WACA,YACA,WACA,SACA,SACA,SACA,SACA,SACA,UACA,WACA,YACA,SACA,QACA,SACA,WACA,UACA,UACA,YACA,OACA,QACA,OACA,MACA,UACA,WACA,UACA,SACA,SACA,SACA,OACA,UACA,WACA,WACA,SACA,SACA,UACA,OACA,YACA,QACA,OACA,OACA,SACA,YACA,SACA,YACA,SACA,WACA,SACA,UACA,YACA,SACA,UACA,SACA,WACA,WACA,UACA,SACA,UACA,MACA,QACA,SACA,SACA,SACA,UACA,WACA,YACA,UACA,UACA,QACA,UACA,WACA,YACA,UACA,UACA,OACA,SACA,SACA,WACA,SACA,UACA,YACA,WACA,WACA,UACA,SACA,SACA,SACA,OACA,QACA,QACA,QACA,SACA,UACA,UACA,WACA,UACA,UACA,WACA,WACA,WACA,WACA,WACA,WACA,SACA,YACA,UACA,WACA,WACA,QACA,UACA,WACA,WACA,UACA,QACA,YACA,UACA,OACA,UACA,UACA,WACA,YACA,SACA,QACA,OACA,UACA,QACA,WACA,YACA,UACA,WACA,QACA,UACA,OACA,OACA,QACA,QACA,QACA,SACA,QACA,YACA,SACA,SACA,UACA,QACA,SACA,YACA,UACA,WACA,YACA,WACA,WACA,QACA,WACA,YACA,SACA,OACA,OACA,SACA,WACA,SACA,SACA,UACA,WACA,SACA,OACA,YACA,UACA,SACA,OACA,OACA,QACA,QACA,MACA,QACA,UACA,YACA,UACA,WACA,UACA,QACA,WACA,QACA,YACA,QACA,QACA,QACA,UACA,QACA,OACA,SACA,YACA,YACA,UACA,QACA,UACA,SACA,UACA,SACA,SACA,WACA,YACA,SACA,WACA,QACA,UACA,UACA,OACA,QACA,QACA,SACA,QACA,QACA,SACA,WACA,QACA,QACA,UACA,WACA,SACA,UACA,SACA,QACA,UACA,UACA,QACA,QACA,WACA,YACA,YACA,UACA,YACA,WACA,WACA,YACA,YACA,YACA,WACA,UACA,WACA,WACA,YACA,WACA,QACA,OACA,QACA,UACA,SACA,WACA,QACA,YACA,YACA,WACA,YACA,UACA,WACA,UACA,WACA,SACA,YACA,YACA,WACA,YACA,SACA,QACA,YACA,UACA,WACA,YACA,UACA,WACA,QACA,OACA,SACA,YACA,SACA,SACA,QACA,SACA,QACA,QACA,UACA,SACA,UACA,UACA,WACA,UACA,WACA,QACA,SACA,WACA,YACA,UACA,YACA,WACA,YACA,UACA,WACA,SACA,WACA,WACA,SACA,WACA,WACA,WACA,UACA,WACA,UACA,UACA,WACA,SACA,SACA,YACA,SACA,SACA,UACA,QACA,WACA,SACA,QACA,QACA,QACA,WACA,SACA,SACA,WACA,YACA,UACA,UACA,WACA,SACA,UACA,SACA,QACA,SACA,SACA,SACA,QACA,QACA,QACA,SACA,YACA,YACA,SACA,SACA,SACA,SACA,SACA,OACA,OACA,OACA,UACA,WACA,WACA,QACA,SACA,WACA,SACA,WACA,WACA,YACA,SACA,WACA,YACA,YACA,WACA,UACA,YACA,QACA,WACA,WACA,SACA,SACA,SACA,YACA,UACA,YACA,YACA,SACA,QACA,UACA,QACA,QACA,UACA,WACA,WACA,YACA,UACA,WACA,YACA,YACA,YACA,WACA,WACA,UACA,UACA,QACA,QACA,QACA,SACA,WACA,YACA,SACA,UACA,WACA,WACA,YACA,UACA,QACA,WACA,UACA,YACA,UACA,WACA,SACA,WACA,UACA,WACA,UACA,YACA,UACA,UACA,WACA,QACA,QACA,SACA,YACA,SACA,UACA,SACA,UACA,YACA,UACA,QACA,YACA,WACA,WACA,YACA,QACA,QACA,QACA,YACA,WACA,YACA,YACA,UACA,OACA,SACA,UACA,OACA,SACA,UACA,YACA,YACA,WACA,YACA,UACA,OACA,QACA,UACA,UACA,YACA,SACA,WACA,YACA,QACA,YACA,YACA,UACA,WACA,UACA,WACA,WACA,WACA,SACA,WACA,SACA,UACA,YACA,OACA,SACA,QACA,QACA,QACA,QACA,QACA,YACA,YACA,YACA,UACA,QACA,QACA,SACA,QACA,QACA,YACA,YACA,WACA,UACA,UACA,WACA,YACA,WACA,UACA,YACA,YACA,QACA,QACA,QACA,WACA,UACA,WACA,YACA,WACA,WACA,YACA,YACA,WACA,WACA,YACA,WACA,UACA,QACA,QACA,SACA,SACA,SACA,WACA,YACA,QACA,SACA,UACA,SACA,WACA,SACA,SACA,SACA,SACA,WACA,SACA,WACA,SACA,SACA,WACA,YACA,WACA,YACA,SACA,YACA,UACA,WACA,QACA,SACA,QACA,UACA,UACA,UACA,WACA,SACA,QACA,UACA,UACA,SACA,QACA,UACA,WACA,SACA,UACA,YACA,QACA,QACA,UACA,UACA,WACA,QACA,SACA,WACA,SACA,UACA,YACA,UACA,WACA,SACA,QACA,YACA,YACA,YACA,UACA,WACA,WACA,WACA,YACA,UACA,WACA,SACA,WACA,UACA,YACA,WACA,YACA,YACA,WACA,SACA,UACA,WACA,YACA,YACA,YACA,UACA,YACA,YACA,UACA,UACA,WACA,YACA,YACA,UACA,WACA,SACA,WACA,WACA,UACA,SACA,SACA,YACA,UACA,YACA,OACA,UACA,SACA,SACA,OACA,WACA,YACA,UACA,SACA,YACA,WACA,QACA,UACA,QACA,WACA,WACA,WACA,SACA,UACA,UACA,UACA,SACA,OACA,SACA,WACA,YACA,SACA,YACA,YACA,YACA,WACA,WACA,WACA,WACA,YACA,YACA,SACA,WACA,SACA,UACA,YACA,UACA,YACA,SACA,WACA,UACA,YACA,YACA,SACA,UACA,WACA,UACA,UACA,UACA,UACA,WACA,UACA,YACA,YACA,WACA,SACA,WACA,UACA,YACA,WACA,QACA,UACA,UACA,WACA,YACA,YACA,OACA,YACA,UACA,YACA,OACA,WACA,QACA,OACA,QACA,QACA,QACA,QACA,QACA,SACA,UACA,UACA,YACA,YACA,UACA,WACA,WACA,WACA,UACA,WACA,QACA,QACA,SACA,SACA,UACA,UACA,QACA,SACA,QACA,QACA,QACA,WACA,WACA,YACA,WACA,UACA,UACA,WACA,UACA,WACA,WACA,YACA,YACA,QACA,SACA,UACA,UACA,QACA,WACA,SACA,SACA,YACA,UACA,YACA,UACA,SACA,WACA,QACA,OACA,UACA,WACA,UACA,UACA,WACA,UACA,YACA,MACA,UACA,OACA,SACA,SACA,WACA,OACA,QACA,SACA,WACA,QACA,SACA,OACA,SACA,UACA,UACA,UACA,WACA,UACA,WACA,WACA,UACA,UACA,OACA,YACA,SACA,SACA,UACA,QACA,SACA,SACA,WACA,OACA,SACA,QACA,YACA,UACA,QACA,WACA,SACA,WACA,SACA,QACA,SACA,QACA,OACA,OACA,UACA,YACA,OACA,QACA,QACA,WACA,WACA,UACA,UACA,YACA,QACA,SACA,WACA,UACA,UACA,YACA,WACA,WACA,QACA,UACA,QACA,QACA,SACA,UACA,WACA,WACA,YACA,YACA,UACA,WACA,SACA,QACA,QACA,QACA,WACA,SACA,SACA,WACA,YACA,SACA,SACA,SACA,WACA,SACA,YACA,SACA,WACA,YACA,YACA,UACA,WACA,OACA,QACA,WACA,WACA,OACA,YACA,UACA,QACA,QACA,QACA,SACA,WACA,UACA,OACA,QACA,UACA,UACA,YACA,YACA,WACA,UACA,OACA,SACA,OACA,OACA,QACA,SACA,UACA,YACA,UACA,SACA,WACA,SACA,SACA,WACA,SACA,WACA,OACA,UACA,OACA,SACA,SACA,SACA,UACA,YACA,SACA,SACA,SACA,QACA,UACA,QACA,WACA,UACA,QACA,UACA,YACA,UACA,UACA,WACA,YACA,QACA,UACA,SACA,WACA,WACA,YACA,YACA,YACA,YACA,YACA,WACA,UACA,YACA,UACA,UACA,WACA,QACA,QACA,SACA,WACA,WACA,OACA,YACA,WACA,YACA,UACA,QACA,SACA,OACA,UACA,UACA,YACA,SACA,SACA,QACA,WACA,SACA,QACA,WACA,YACA,WACA,UACA,YACA,UACA,UACA,WACA,WACA,WACA,UACA,YACA,SACA,WACA,WACA,UACA,QACA,SACA,YACA,WACA,UACA,YACA,UACA,WACA,WACA,UACA,OACA,SACA,WACA,UACA,UACA,UACA,WACA,WACA,SACA,WACA,UACA,UACA,YACA,SACA,WACA,QACA,SACA,QACA,QACA,UACA,QACA,SACA,YACA,UACA,WACA,WACA,YACA,QACA,MACA,QACA,WACA,UACA,UACA,UACA,MACA,UACA,QACA,SACA,WACA,QACA,SACA,UACA,WACA,WACA,YACA,OACA,SACA,UACA,SACA,SACA,OACA,QACA,OACA,MACA,QACA,QACA,QACA,WACA,SACA,YACA,SACA,QACA,QACA,UACA,YACA,OACA,WACA,QACA,QACA,QACA,YACA,UACA,UACA,WACA,SACA,SACA,UACA,SACA,QACA,OACA,QACA,WACA,YACA,QACA,YACA,WACA,SACA,YACA,SACA,YACA,YACA,WACA,UACA,YACA,YACA,YACA,YACA,YACA,UACA,UACA,UACA,YACA,WACA,SACA,SACA,WACA,WACA,YACA,YACA,UACA,WACA,YACA,UACA,YACA,WACA,WACA,YACA,WACA,WACA,WACA,UACA,WACA,WACA,YACA,UACA,YACA,YACA,UACA,UACA,SACA,YACA,YACA,UACA,QACA,SACA,UACA,SACA,YACA,WACA,WACA,YACA,WACA,WACA,WACA,SACA,YACA,YACA,WACA,UACA,UACA,UACA,UACA,YACA,UACA,YACA,WACA,QACA,YACA,UACA,YACA,SACA,YACA,YACA,WACA,WACA,YACA,YACA,WACA,WACA,YACA,WACA,YACA,YACA,UACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,WACA,YACA,YACA,YACA,YACA,WACA,WACA,YACA,YACA,YACA,YACA,YACA,YACA,WACA,UACA,SACA,YACA,UACA,YACA,WACA,UACA,WACA,UACA,SACA,WACA,SACA,YACA,UACA,WACA,YACA,WACA,YACA,WACA,UACA,YACA,SACA,YACA,YACA,YACA,SACA,WACA,UACA,YACA,UACA,WACA,WACA,YACA,YACA,UACA,WACA,YACA,SACA,YACA,WACA,WACA,YACA,WACA,WACA,WACA,WACA,SACA,UACA,WACA,YACA,YACA,WACA,YACA,UACA,WACA,YACA,UACA,YACA,WACA,YACA,WACA,UACA,YACA,SACA,SACA,UACA,WACA,UACA,UACA,YACA,YACA,QACA,YACA,YACA,YACA,YACA,YACA,QACA,WACA,YACA,SACA,WACA,OACA,YACA,WACA,WACA,UACA,SACA,YACA,YACA,UACA,UACA,UACA,WACA,WACA,YACA,UACA,SACA,YACA,YACA,YACA,YACA,UACA,WACA,WACA,QACA,YACA,WACA,WACA,WACA,YACA,YACA,UACA,WACA,WACA,YACA,UACA,SACA,YACA,WACA,WACA,WACA,WACA,YACA,YACA,YACA,YACA,UACA,WACA,UACA,YACA,UACA,WACA,YACA,UACA,YACA,WACA,UACA,YACA,YACA,WACA,YACA,SACA,WACA,SACA,YACA,WACA,UACA,WACA,WACA,YACA,WACA,YACA,YACA,YACA,YACA,WACA,SACA,YACA,WACA,UACA,WACA,UACA,YACA,YACA,SACA,SACA,YACA,YACA,YACA,WACA,SACA,YACA,YACA,WACA,SACA,YACA,YACA,UACA,SACA,YACA,SACA,WACA,WACA,SACA,SACA,WACA,UACA,WACA,YACA,YACA,UACA,WACA,WACA,YACA,WACA,WACA,SACA,WACA,YACA,SACA,YACA,YACA,WACA,WACA,WACA,YACA,YACA,YACA,WACA,YACA,WACA,WACA,SACA,WACA,WACA,SACA,WACA,WACA,YACA,WACA,WACA,YACA,YACA,WACA,YACA,YACA,WACA,YACA,UACA,YACA,YACA,WACA,WACA,WACA,SACA,UACA,WACA,YACA,UACA,UACA,YACA,WACA,UACA,WACA,WACA,SACA,QACA,QACA,UACA,WACA,WACA,YACA,SACA,YACA,YACA,YACA,YACA,UACA,YACA,SACA,UACA,WACA,UACA,UACA,WACA,SACA,UACA,WACA,WACA,YACA,WACA,YACA,WACA,WACA,YACA,UACA,WACA,YACA,SACA,WACA,YACA,UACA,QACA,YACA,SACA,WACA,YACA,SACA,UACA,YACA,YACA,YACA,SACA,YACA,WACA,UACA,UACA,YACA,YACA,QACA,SACA,UACA,WACA,YACA,SACA,UACA,UACA,WACA,SACA,SACA,SACA,WACA,YACA,SACA,OACA,QACA,UACA,WACA,UACA,SACA,SACA,UACA,SACA,UACA,WACA,UACA,UACA,WACA,WACA,UACA,SACA,UACA,SACA,WACA,SACA,SACA,UACA,QACA,SACA,WACA,UACA,SACA,SACA,YACA,UACA,SACA,QACA,UACA,OACA,YACA,OACA,QACA,QACA,UACA,UACA,UACA,SACA,SACA,QACA,UACA,SACA,SACA,WACA,WACA,WACA,YACA,UACA,YACA,UACA,QACA,SACA,SACA,YACA,QACA,UACA,SACA,SACA,WACA,UACA,YACA,WACA,WACA,SACA,UACA,UACA,UACA,UACA,UACA,UACA,WACA,WACA,SACA,WACA,OACA,QACA,SACA,YACA,SACA,WACA,SACA,WACA,UACA,SACA,YACA,WACA,WACA,YACA,UACA,QACA,QACA,YACA,WACA,UACA,UACA,SACA,QACA,UACA,SACA,YACA,WACA,UACA,OACA,SACA,OACA,UACA,OACA,WACA,YACA,SACA,QACA,OACA,WACA,UACA,QACA,WACA,SACA,UACA,WACA,YACA,WACA,UACA,UACA,YACA,WACA,UACA,UACA,YACA,WACA,SACA,SACA,QACA,QACA,UACA,WACA,QACA,OACA,YACA,UACA,WACA,UACA,UACA,SACA,WACA,UACA,QACA,QACA,WACA,WACA,UACA,WACA,YACA,UACA,YACA,QACA,WACA,WACA,UACA,WACA,QACA,UACA,OACA,WACA,SACA,UACA,UACA,QACA,SACA,UACA,QACA,QACA,SACA,YACA,MACA,QACA,SACA,QACA,QACA,QACA,SACA,QACA,OACA,SACA,OACA,UACA,SACA,SACA,QACA,OACA,UACA,SACA,UACA,SACA,WACA,YACA,YACA,WACA,YACA,UACA,SACA,SACA,YACA,UACA,UACA,WACA,YACA,UACA,OACA,UACA,QACA,QACA,WACA,SACA,OACA,WACA,SACA,OACA,QACA,QACA,WACA,QACA,YACA,SACA,QACA,WACA,UACA,QACA,WACA,UACA,WACA,SACA,MACA,OACA,SACA,QACA,SACA,QACA,QACA,YACA,UACA,OACA,OACA,YACA,WACA,UACA,SACA,WACA,WACA,WACA,WACA,SACA,WACA,SACA,YACA,UACA,SACA,YACA,OACA,OACA,QACA,UACA,OACA,OACA,UACA,SACA,WACA,SACA,OACA,QACA,WACA,SACA,OACA,SACA,OACA,OACA,WACA,QACA,UACA,SACA,SACA,WACA,SACA,MACA,OACA,YACA,YACA,YACA,YACA,YACA,UACA,OACA,OACA,SACA,OACA,QACA,OACA,OACA,UACA,UACA,YACA,QACA,YACA,YACA,QACA,QACA,QACA,MACA,UACA,QACA,SACA,WACA,UACA,WACA,SACA,UACA,UACA,UACA,UACA,QACA,UACA,UACA,YACA,UACA,WACA,UACA,YACA,UACA,OACA,QACA,QACA,MACA,UACA,UACA,OACA,OACA,OACA,WACA,WACA,SACA,WACA,QACA,UACA,OACA,MACA,YACA,UACA,QACA,MACA,SACA,QACA,QACA,OACA,SACA,SACA,OACA,QACA,MACA,UACA,QACA,MACA,WACA,OACA,YACA,QACA,YACA,UACA,UACA,QACA,OACA,MACA,SACA,SACA,OACA,SACA,YACA,YACA,UACA,O,iDCxlPK,MAAMC,EAQX74N,YAAY84N,GAFZ,KAAA7mK,cAA2C,CAAC,EAG1CtxD,KAAKuxD,QAAU4mK,aAAoB,EAApBA,EAAsB5mK,QACrCvxD,KAAKwxD,QAAU2mK,aAAoB,EAApBA,EAAsB3mK,QACrCxxD,KAAKyxD,QAAS0mK,aAAoB,EAApBA,EAAsB1mK,QAChC,IAAI2mK,EAA2BD,EAAqB1mK,QACpD,KACJzxD,KAAKqyD,SAAU,IAAIh3B,MAAO0gE,cAC1B/7F,KAAK2xD,aAAcwmK,aAAoB,EAApBA,EAAsBxmK,aACrC,IAAI0mK,EAA4BF,EAAqBxmK,aACrD,KACJ3xD,KAAKsxD,cAAgB6mK,aAAoB,EAApBA,EAAsB7mK,aAC7C,CAEA5kD,gBAAgBg2B,GACd,OAAO91B,OAAOC,OAAO,IAAIqrN,EAAiB,CAAC,GAAIx1L,EAAK,CAClD+uB,QAAQ/uB,aAAG,EAAHA,EAAK+uB,QAAS2mK,EAA2BzwK,SAASjlB,EAAI+uB,QAAU,KACxEE,aAAajvB,aAAG,EAAHA,EAAKivB,aAAc0mK,EAA4B1wK,SAASjlB,EAAIivB,aAAe,MAE5F,EAGK,MAAMymK,EAIX/4N,YAAYoC,GACVzB,KAAKuC,KAAOd,EAASc,KACrBvC,KAAK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","sources":["webpack://@bitwarden/web-vault/webpack/runtime/chunk loaded","webpack://@bitwarden/web-vault/webpack/runtime/create fake namespace object","webpack://@bitwarden/web-vault/webpack/runtime/load script","webpack://@bitwarden/web-vault/./src/app/admin-console/common/base.events.component.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/manage/user-confirm.component.html","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/manage/user-confirm.component.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/common/base.people.component.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/core/policy-list.service.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/core/core-organization.module.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/core/services/group/responses/group.response.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/core/views/group.view.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/core/services/group/requests/group.request.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/core/services/group/requests/organization-group-bulk.request.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/core/services/group/group.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/abstractions/organization-user/requests/organization-user-update.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/abstractions/organization-user/requests/organization-user-invite.request.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/core/views/organization-user-admin-view.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/core/services/user-admin.service.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/core/views/collection-access-selection.view.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/create/organization-create.module.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/create/organization-information.component.html","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/create/organization-information.component.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/guards/org-permissions.guard.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/icons/admin-console-logo.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/layouts/organization-layout.component.html","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/layouts/organization-layout.component.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/manage/entity-events.component.html","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/manage/entity-events.component.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/abstractions/organization-user/requests/organization-user-bulk-confirm.request.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/members/components/bulk/bulk-confirm.component.html","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/members/components/bulk/bulk-confirm.component.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/members/components/bulk/bulk-remove.component.html","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/members/components/bulk/bulk-remove.component.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/members/components/bulk/bulk-status.component.html","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/members/components/bulk/bulk-status.component.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/members/services/organization-user-reset-password/organization-user-reset-password.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/request/policy.request.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/policies/base-policy.component.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/policies/policies.module.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/policies/disable-send.component.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/policies/disable-send.component.html","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/policies/master-password.component.html","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/policies/master-password.component.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/policies/password-generator.component.html","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/policies/password-generator.component.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/policies/personal-ownership.component.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/policies/personal-ownership.component.html","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/policies/require-sso.component.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/policies/require-sso.component.html","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/policies/reset-password.component.html","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/policies/reset-password.component.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/policies/send-options.component.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/policies/send-options.component.html","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/policies/single-org.component.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/policies/single-org.component.html","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/policies/two-factor-authentication.component.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/policies/two-factor-authentication.component.html","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/policies/policy-edit.component.html","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/policies/policy-edit.component.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/policies/policies.component.html","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/policies/policies.component.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/settings/components/delete-organization-dialog.component.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/settings/components/delete-organization-dialog.component.html","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/shared/components/access-selector/user-type.pipe.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/shared/components/access-selector/access-selector.component.html","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/shared/components/access-selector/access-selector.component.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/shared/components/access-selector/access-selector.models.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/shared/components/access-selector/access-selector.module.ts","webpack://@bitwarden/web-vault/./src/app/auth/core/views/credential-create-options.view.ts","webpack://@bitwarden/web-vault/./src/app/auth/core/views/pending-webauthn-login-credential.view.ts","webpack://@bitwarden/web-vault/./src/app/auth/core/views/webauthn-login-credential.view.ts","webpack://@bitwarden/web-vault/./src/app/auth/core/services/rotateable-key-set.service.ts","webpack://@bitwarden/web-vault/./src/app/auth/core/services/webauthn-login/request/enable-credential-encryption.request.ts","webpack://@bitwarden/web-vault/./src/app/auth/core/services/webauthn-login/request/save-credential.request.ts","webpack://@bitwarden/web-vault/./src/app/auth/core/services/webauthn-login/request/webauthn-login-authenticator-response.request.ts","webpack://@bitwarden/web-vault/./src/app/auth/core/services/webauthn-login/request/webauthn-login-attestation-response.request.ts","webpack://@bitwarden/web-vault/./src/app/auth/core/services/webauthn-login/response/webauthn-login-credential-create-options.response.ts","webpack://@bitwarden/web-vault/./src/app/auth/core/services/webauthn-login/webauthn-login-admin-api.service.ts","webpack://@bitwarden/web-vault/./src/app/auth/core/services/webauthn-login/webauthn-login-admin.service.ts","webpack://@bitwarden/web-vault/./src/app/auth/emergency-access/emergency-access.module.ts","webpack://@bitwarden/web-vault/./src/app/auth/emergency-access/enums/emergency-access-status-type.ts","webpack://@bitwarden/web-vault/./src/app/auth/emergency-access/response/emergency-access.response.ts","webpack://@bitwarden/web-vault/./src/app/auth/emergency-access/services/emergency-access-api.service.ts","webpack://@bitwarden/web-vault/./src/app/auth/emergency-access/request/emergency-access-accept.request.ts","webpack://@bitwarden/web-vault/./src/app/auth/emergency-access/request/emergency-access-confirm.request.ts","webpack://@bitwarden/web-vault/./src/app/auth/emergency-access/request/emergency-access-invite.request.ts","webpack://@bitwarden/web-vault/./src/app/auth/emergency-access/request/emergency-access-password.request.ts","webpack://@bitwarden/web-vault/./src/app/auth/emergency-access/request/emergency-access-update.request.ts","webpack://@bitwarden/web-vault/./src/app/auth/emergency-access/services/emergency-access.service.ts","webpack://@bitwarden/web-vault/./src/app/auth/guards/deep-link.guard.ts","webpack://@bitwarden/web-vault/./src/app/auth/key-rotation/user-key-rotation-api.service.ts","webpack://@bitwarden/web-vault/./src/app/auth/key-rotation/user-key-rotation.module.ts","webpack://@bitwarden/web-vault/./src/app/auth/key-rotation/request/update-key.request.ts","webpack://@bitwarden/web-vault/./src/app/auth/key-rotation/user-key-rotation.service.ts","webpack://@bitwarden/web-vault/./src/app/auth/register-form/register-form.module.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/account/danger-zone.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/account/danger-zone.component.html","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/request/update-profile.request.ts","webpack://@bitwarden/web-vault/./src/app/components/selectable-avatar.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/account/change-avatar.component.html","webpack://@bitwarden/web-vault/./src/app/auth/settings/account/change-avatar.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/account/profile.component.html","webpack://@bitwarden/web-vault/./src/app/auth/settings/account/profile.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/security/api-key.component.html","webpack://@bitwarden/web-vault/./src/app/auth/settings/security/api-key.component.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/request/two-factor-provider.request.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/two-factor-base.component.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/request/update-two-factor-duo.request.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/two-factor-duo.component.html","webpack://@bitwarden/web-vault/./src/app/auth/settings/two-factor-duo.component.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/request/update-two-factor-authenticator.request.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/two-factor-authenticator.component.html","webpack://@bitwarden/web-vault/./src/app/auth/settings/two-factor-authenticator.component.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/request/update-two-factor-email.request.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/two-factor-email.component.html","webpack://@bitwarden/web-vault/./src/app/auth/settings/two-factor-email.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/two-factor-recovery.component.html","webpack://@bitwarden/web-vault/./src/app/auth/settings/two-factor-recovery.component.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/request/update-two-factor-web-authn-delete.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/request/update-two-factor-web-authn.request.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/two-factor-webauthn.component.html","webpack://@bitwarden/web-vault/./src/app/auth/settings/two-factor-webauthn.component.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/request/update-two-factor-yubio-otp.request.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/two-factor-yubikey.component.html","webpack://@bitwarden/web-vault/./src/app/auth/settings/two-factor-yubikey.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/two-factor-setup.component.html","webpack://@bitwarden/web-vault/./src/app/auth/settings/two-factor-setup.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/two-factor-verify.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/two-factor-verify.component.html","webpack://@bitwarden/web-vault/./src/app/auth/shared/components/user-verification/user-verification.module.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/auth/components/user-verification-prompt.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/shared/components/user-verification/user-verification-prompt.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/shared/components/user-verification/user-verification-prompt.component.html","webpack://@bitwarden/web-vault/../../libs/angular/src/auth/components/user-verification.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/shared/components/user-verification/user-verification.component.html","webpack://@bitwarden/web-vault/./src/app/auth/shared/components/user-verification/user-verification.component.ts","webpack://@bitwarden/web-vault/./src/app/billing/accounts/trial-initiation/trial-billing-step.component.ts","webpack://@bitwarden/web-vault/./src/app/billing/accounts/trial-initiation/trial-billing-step.component.html","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/request/organization-upgrade.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/request/provider/provider-organization-create.request.ts","webpack://@bitwarden/web-vault/./src/app/billing/organizations/organization-plans.component.html","webpack://@bitwarden/web-vault/./src/app/billing/organizations/organization-plans.component.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/request/storage.request.ts","webpack://@bitwarden/web-vault/./src/app/billing/shared/adjust-storage.component.html","webpack://@bitwarden/web-vault/./src/app/billing/shared/adjust-storage.component.ts","webpack://@bitwarden/web-vault/../../libs/common/src/billing/models/request/bit-pay-invoice.request.ts","webpack://@bitwarden/web-vault/./src/app/billing/shared/add-credit.component.html","webpack://@bitwarden/web-vault/./src/app/billing/shared/add-credit.component.ts","webpack://@bitwarden/web-vault/./src/app/billing/shared/adjust-payment.component.ts","webpack://@bitwarden/web-vault/./src/app/billing/shared/adjust-payment.component.html","webpack://@bitwarden/web-vault/../../libs/common/src/models/request/verify-bank.request.ts","webpack://@bitwarden/web-vault/./src/app/billing/shared/payment-method.component.html","webpack://@bitwarden/web-vault/./src/app/billing/shared/payment-method.component.ts","webpack://@bitwarden/web-vault/./src/app/billing/shared/billing-shared.module.ts","webpack://@bitwarden/web-vault/./src/app/billing/shared/payment-method-warnings/payment-method-warnings.module.ts","webpack://@bitwarden/web-vault/./src/app/billing/shared/payment-method-warnings/payment-method-warnings.component.html","webpack://@bitwarden/web-vault/./src/app/billing/shared/payment-method-warnings/payment-method-warnings.component.ts","webpack://@bitwarden/web-vault/./src/app/billing/shared/payment.component.html","webpack://@bitwarden/web-vault/./src/app/billing/shared/payment.component.ts","webpack://@bitwarden/web-vault/./src/app/billing/shared/sm-subscribe.component.html","webpack://@bitwarden/web-vault/./src/app/billing/shared/sm-subscribe.component.ts","webpack://@bitwarden/web-vault/./src/app/billing/shared/tax-info.component.html","webpack://@bitwarden/web-vault/./src/app/billing/shared/tax-info.component.ts","webpack://@bitwarden/web-vault/./src/app/common/base.accept.component.ts","webpack://@bitwarden/web-vault/./src/app/components/dynamic-avatar.component.ts","webpack://@bitwarden/web-vault/./src/app/components/environment-selector/environment-selector.component.html","webpack://@bitwarden/web-vault/./src/app/components/environment-selector/environment-selector.component.ts","webpack://@bitwarden/web-vault/./src/app/components/environment-selector/environment-selector.module.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/response/api-key.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/response/organization-sso.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/billing/models/response/billing.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/billing/models/response/plan.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/response/organization.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/billing/models/response/subscription.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/billing/models/response/organization-subscription.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/response/profile-organization.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/response/profile-provider-organization.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/response/profile-provider.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/response/profile.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/billing/models/response/payment.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/billing/models/response/tax-info.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/response/organization-api-key-information.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/response/organization-auto-enroll-status.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/response/keys.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/response/organization-keys.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/services/organization/organization.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/abstractions/organization-domain/responses/organization-domain-sso-details.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/abstractions/organization-domain/responses/organization-domain.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/services/organization-domain/requests/organization-domain-sso-details.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/services/organization-management-preferences/default-organization-management-preferences.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/abstractions/organization-user/responses/organization-user.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/abstractions/organization-user/responses/organization-user-bulk.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/abstractions/organization-user/responses/organization-user-bulk-public-key.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/services/organization-user/requests/organization-user-bulk.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/domain/reset-password-policy-options.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/services/policy/policy.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/domain/provider.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/services/provider.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/abstractions/user-verification/user-verification-api.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/abstractions/webauthn/webauthn-login-api.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/services/account.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/response/notification.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/request/update-avatar.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/services/avatar.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/request/update-devices-trust.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/abstractions/devices/views/device.view.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/abstractions/devices/responses/device.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/response/protected-device.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/services/devices/requests/trusted-device-keys.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/request/key-connector-user-key.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/request/set-key-connector-key.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/services/login.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/services/sso-login.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/services/token.state.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/services/token.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/request/verify-otp.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/view/webauthn-login/webauthn-login-credential-assertion.view.ts","webpack://@bitwarden/web-vault/../../libs/common/src/autofill/constants/index.ts","webpack://@bitwarden/web-vault/../../libs/common/src/autofill/services/autofill-settings.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/autofill/services/badge-settings.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/billing/services/account/billing-account-profile-state.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/billing/models/response/organization-billing-status.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/billing/models/billing-keys.state.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/abstractions/config/config-api.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/abstractions/file-upload/file-upload.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/abstractions/storage.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/factories/account-factory.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/factories/global-state-factory.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/factories/state-factory.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/models/domain/global-state.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/services/app-id.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/models/response/server-config.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/abstractions/config/server-config.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/services/config/config.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/misc/sequentialize.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/domain/encrypted-organization-key.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/services/key-state/org-keys.state.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/services/key-state/provider-keys.state.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/services/key-state/user-key.state.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/services/crypto.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/models/domain/encrypted-object.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/services/cryptography/encrypt.service.implementation.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/services/cryptography/get-class-initializer.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/services/cryptography/multithread-encrypt.service.implementation.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/services/default-environment.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/services/file-upload/azure-file-upload.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/services/file-upload/bitwarden-file-upload.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migration-builder.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrator.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/10-move-ever-had-user-key-to-state-providers.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/11-move-org-keys-to-state-providers.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/12-move-environment-state-to-providers.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/13-move-provider-keys-to-state-providers.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/14-move-biometric-client-key-half-state-to-providers.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/15-move-folder-state-to-state-provider.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/16-move-last-sync-to-state-provider.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/17-move-enable-passkeys-to-state-providers.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/18-move-autofill-settings-to-state-providers.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/19-migrate-require-password-on-start.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/20-move-private-key-to-state-providers.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/21-move-collections-state-to-state-provider.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/22-move-collapsed-groupings-to-state-provider.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/23-move-biometric-prompts-to-state-providers.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/24-move-sm-onboarding-key-to-state-providers.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/25-move-clear-clipboard-to-autofill-settings-state-provider.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/26-revert-move-last-sync-to-state-provider.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/27-move-badge-settings-to-state-providers.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/28-move-biometric-unlock-to-state-providers.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/29-move-user-notification-settings-to-state-provider.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/30-move-policy-state-to-state-provider.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/31-move-enable-context-menu-to-autofill-settings-state-provider.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/32-move-preferred-language.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/33-move-app-id-to-state-providers.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/34-move-domain-settings-to-state-providers.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/35-move-theme-to-state-providers.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/36-move-show-card-and-identity-to-state-provider.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/37-move-avatar-color-to-state-providers.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/38-migrate-token-svc-to-state-provider.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/39-move-billing-account-profile-to-state-providers.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/4-remove-ever-been-unlocked.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/40-move-organization-state-to-state-provider.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/41-move-event-collection-to-state-provider.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/42-move-enable-favicon-to-domain-settings-state-provider.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/43-move-auto-confirm-finger-prints-to-state-provider.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/44-move-user-decryption-options-to-state-provider.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/45-merge-environment-state.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/46-delete-orphaned-biometric-prompt-data.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/47-move-desktop-settings.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/48-move-ddg-to-state-provider.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/5-add-key-type-to-org-keys.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/6-remove-legacy-etm-key.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/7-move-biometric-auto-prompt-to-account.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/8-move-state-version.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/9-move-browser-settings-to-global.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrations/min-version.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migrate.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/services/migration-builder.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/state-migrations/migration-helper.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/services/migration-runner.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/send/models/data/send-file.data.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/send/models/data/send-text.data.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/send/models/data/send.data.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/models/domain/state.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/services/state.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/services/storage-service.provider.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/models/domain/decrypt-parameters.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/state/user-state.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/state/implementations/default-active-user-state.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/state/implementations/default-derived-state.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/state/state-update-options.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/state/implementations/util.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/state/implementations/state-base.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/state/implementations/default-global-state.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/state/implementations/default-single-user-state.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/response/organization-connection.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/response/organization-export.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/response/organization-sponsorship-sync-status.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/response/provider/provider-organization.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/response/provider/provider-user-bulk-public-key.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/response/provider/provider-user-bulk.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/response/provider/provider-user.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/response/provider/provider.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/response/auth-request.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/response/device-verification.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/response/key-connector-user-key.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/response/prelogin.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/response/register.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/response/sso-pre-validate.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/response/two-factor-authenticator.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/response/two-factor-duo.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/response/two-factor-email.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/response/two-factor-provider.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/response/two-factor-recover.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/response/two-factor-yubi-key.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/billing/models/response/billing-history.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/billing/models/response/billing-payment.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/billing/models/response/tax-rate.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/request/collection-bulk-delete.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/response/breach-account.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/response/global-domain.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/response/domains.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/response/user-key.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/response/attachment-upload-data.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/send/models/api/send-file.api.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/send/models/api/send-text.api.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/send/models/response/send.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/response/folder.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/response/sync.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/services/audit.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/misc/throttle.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/data/event.data.ts","webpack://@bitwarden/web-vault/../../libs/common/src/services/event/key-definitions.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/request/event.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/services/search.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/services/vault-timeout/vault-timeout.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/send/models/request/send.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/send/models/response/send-access.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/send/models/response/send-file-download-data.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/send/models/response/send-file-upload-data.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/send/models/request/send-with-id.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/abstractions/file-upload/cipher-file-upload.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/domain/sorted-ciphers-cache.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/request/cipher-bulk-move.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/request/cipher-bulk-restore.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/request/cipher-bulk-share.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/request/cipher-bulk-update-collections.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/request/cipher-create.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/request/cipher-partial.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/request/cipher-share.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/services/cipher.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/services/collection.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/data/folder.data.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/services/key-state/folder.state.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/data/provider.data.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/services/sync/sync.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/services/totp.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/services/key-state/vault-settings.state.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/services/broadcaster.service.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/platform/services/broadcaster.service.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/platform/services/theming/angular-theming.service.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/services/jslib-services.module.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/services/auth.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/services/file-upload/file-upload.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/services/file-upload/cipher-file-upload.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/services/folder/folder.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/services/folder/folder-api.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/services/account-api.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/services/key-generation.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/services/api.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/send/services/send.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/send/services/send-api.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/services/vault-timeout/vault-timeout-settings.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/services/noop-notifications.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/services/notifications.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/services/web-crypto-function.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/services/event/event-upload.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/services/event/event-collection.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/services/policy/policy-api.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/services/key-connector.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/services/user-verification/user-verification.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/types/verification.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/services/organization-user/organization-user.service.implementation.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/services/password-reset-enrollment.service.implementation.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/platform/services/form-validation-errors.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/services/user-verification/user-verification-api.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/services/organization/organization-api.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/abstractions/sync/sync-notifier.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/services/sync/sync-notifier.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/services/config/config-api.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/services/anonymous-hub.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/services/validation.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/services/organization-domain/org-domain.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/services/organization-domain/org-domain-api.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/services/devices-api.service.implementation.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/services/devices/devices.service.implementation.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/services/device-trust-crypto.service.implementation.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/services/webauthn-login/webauthn-login-prf-crypto.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/services/webauthn-login/webauthn-login-api.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/services/webauthn-login/webauthn-login.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/state/implementations/default-global-state.provider.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/state/implementations/default-active-user-state.provider.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/state/implementations/default-single-user-state.provider.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/state/implementations/default-derived-state.provider.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/state/implementations/default-state.provider.ts","webpack://@bitwarden/web-vault/../../libs/common/src/billing/services/organization-billing.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/abstractions/vault-settings/vault-settings.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/services/vault-settings/vault-settings.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/billing/services/billing-api.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/billing/services/payment-method-warnings.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/services/memory-storage.service.ts","webpack://@bitwarden/web-vault/./src/app/core/html-storage.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/services/translation.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/services/i18n.service.ts","webpack://@bitwarden/web-vault/./src/translation-constants.ts","webpack://@bitwarden/web-vault/./src/app/platform/web-environment.service.ts","webpack://@bitwarden/web-vault/./src/app/platform/web-migration-runner.ts","webpack://@bitwarden/web-vault/./src/app/platform/window-storage.service.ts","webpack://@bitwarden/web-vault/./src/app/core/broadcaster-messaging.service.ts","webpack://@bitwarden/web-vault/./src/app/core/event.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/services/container.service.ts","webpack://@bitwarden/web-vault/./src/app/core/init.service.ts","webpack://@bitwarden/web-vault/./src/app/core/modal.service.ts","webpack://@bitwarden/web-vault/./src/app/core/state/account.ts","webpack://@bitwarden/web-vault/./src/app/core/state/state.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/abstractions/file-download/file-download.builder.ts","webpack://@bitwarden/web-vault/./src/app/core/web-file-download.service.ts","webpack://@bitwarden/web-vault/./src/app/core/core.module.ts","webpack://@bitwarden/web-vault/./src/app/core/state/global-state.ts","webpack://@bitwarden/web-vault/./src/app/core/i18n.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/state/storage/memory-storage.service.ts","webpack://@bitwarden/web-vault/./src/app/platform/web-storage-service.provider.ts","webpack://@bitwarden/web-vault/./src/app/core/router.service.ts","webpack://@bitwarden/web-vault/./src/app/core/web-platform-utils.service.ts","webpack://@bitwarden/web-vault/./src/app/layouts/frontend-layout.component.ts","webpack://@bitwarden/web-vault/./src/app/layouts/frontend-layout.component.html","webpack://@bitwarden/web-vault/./src/app/layouts/product-switcher/product-switcher-content.component.html","webpack://@bitwarden/web-vault/./src/app/layouts/product-switcher/product-switcher-content.component.ts","webpack://@bitwarden/web-vault/./src/app/layouts/product-switcher/product-switcher.component.html","webpack://@bitwarden/web-vault/./src/app/layouts/product-switcher/product-switcher.component.ts","webpack://@bitwarden/web-vault/./src/app/layouts/header/header.module.ts","webpack://@bitwarden/web-vault/./src/app/layouts/header/web-layout-migration-banner.service.ts","webpack://@bitwarden/web-vault/./src/app/layouts/header/web-header.component.html","webpack://@bitwarden/web-vault/./src/app/layouts/header/web-header.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/navigation/nav-divider.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/navigation/nav-divider.component.html","webpack://@bitwarden/web-vault/./src/app/layouts/org-switcher/org-switcher.component.html","webpack://@bitwarden/web-vault/./src/app/layouts/org-switcher/org-switcher.component.ts","webpack://@bitwarden/web-vault/./src/app/layouts/product-switcher/product-switcher.module.ts","webpack://@bitwarden/web-vault/./src/app/layouts/secrets-manager-logo.ts","webpack://@bitwarden/web-vault/./src/app/layouts/password-manager-logo.ts","webpack://@bitwarden/web-vault/./src/app/layouts/user-layout.component.html","webpack://@bitwarden/web-vault/./src/app/layouts/user-layout.component.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/sponsorships/accept-family-sponsorship.component.html","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/sponsorships/accept-family-sponsorship.component.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/request/organization/organization-sponsorship-redeem.request.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/sponsorships/families-for-enterprise-setup.component.html","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/sponsorships/families-for-enterprise-setup.component.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/settings/create-organization.component.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/settings/create-organization.component.html","webpack://@bitwarden/web-vault/../../libs/angular/src/admin-console/validators/not-allowed-value-async.validator.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/settings/sponsoring-org-row.component.html","webpack://@bitwarden/web-vault/./src/app/admin-console/settings/sponsoring-org-row.component.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/settings/sponsored-families.component.html","webpack://@bitwarden/web-vault/./src/app/admin-console/settings/sponsored-families.component.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/abstractions/organization-user/requests/organization-user-accept-init.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/abstractions/organization-user/requests/organization-user-accept.request.ts","webpack://@bitwarden/web-vault/./src/app/auth/accept-organization.component.html","webpack://@bitwarden/web-vault/./src/app/auth/accept-organization.component.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/request/password-hint.request.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/auth/components/hint.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/hint.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/hint.component.html","webpack://@bitwarden/web-vault/../../libs/angular/src/auth/components/lock.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/lock.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/lock.component.html","webpack://@bitwarden/web-vault/../../libs/angular/src/auth/components/base-login-decryption-options.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/login/login-decryption-options/login-decryption-options.component.html","webpack://@bitwarden/web-vault/./src/app/auth/login/login-decryption-options/login-decryption-options.component.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/enums/auth-request-type.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/request/create-auth.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/iframe-component.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/captcha-iframe.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/auth/components/captcha-protected.component.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/auth/components/login-via-auth-request.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/login/login-via-auth-request.component.html","webpack://@bitwarden/web-vault/./src/app/auth/login/login-via-auth-request.component.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/auth/components/base-login-via-webauthn.component.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/auth/icons/create-passkey-failed.icon.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/auth/icons/create-passkey.icon.ts","webpack://@bitwarden/web-vault/./src/app/auth/login/login-via-webauthn/login-via-webauthn.component.html","webpack://@bitwarden/web-vault/./src/app/auth/login/login-via-webauthn/login-via-webauthn.component.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/auth/components/login.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/login/login.component.html","webpack://@bitwarden/web-vault/./src/app/auth/login/login.component.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/request/delete-recover.request.ts","webpack://@bitwarden/web-vault/./src/app/auth/recover-delete.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/recover-delete.component.html","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/request/two-factor-recovery.request.ts","webpack://@bitwarden/web-vault/./src/app/auth/recover-two-factor.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/recover-two-factor.component.html","webpack://@bitwarden/web-vault/../../libs/angular/src/auth/components/remove-password.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/remove-password.component.html","webpack://@bitwarden/web-vault/./src/app/auth/remove-password.component.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/request/set-password.request.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/auth/components/change-password.component.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/auth/components/set-password.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/set-password.component.html","webpack://@bitwarden/web-vault/./src/app/auth/set-password.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/account/deauthorize-sessions.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/account/deauthorize-sessions.component.html","webpack://@bitwarden/web-vault/./src/app/auth/settings/account/delete-account.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/account/delete-account.component.html","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/request/email-token.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/request/email.request.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/account/change-email.component.html","webpack://@bitwarden/web-vault/./src/app/auth/settings/account/change-email.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/account/account.component.html","webpack://@bitwarden/web-vault/./src/app/auth/settings/account/account.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/emergency-access/enums/emergency-access-type.ts","webpack://@bitwarden/web-vault/./src/app/auth/emergency-access/models/emergency-access.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/emergency-access/confirm/emergency-access-confirm.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/emergency-access/confirm/emergency-access-confirm.component.html","webpack://@bitwarden/web-vault/./src/app/auth/settings/emergency-access/emergency-access-add-edit.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/emergency-access/emergency-access-add-edit.component.html","webpack://@bitwarden/web-vault/./src/app/auth/settings/emergency-access/takeover/emergency-access-takeover.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/emergency-access/takeover/emergency-access-takeover.component.html","webpack://@bitwarden/web-vault/./src/app/auth/settings/emergency-access/emergency-access.component.html","webpack://@bitwarden/web-vault/./src/app/auth/settings/emergency-access/emergency-access.component.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/attachments.component.html","webpack://@bitwarden/web-vault/./src/app/auth/settings/emergency-access/attachments/emergency-access-attachments.component.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/add-edit.component.html","webpack://@bitwarden/web-vault/./src/app/auth/settings/emergency-access/view/emergency-add-edit-cipher.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/emergency-access/view/emergency-access-view.component.html","webpack://@bitwarden/web-vault/./src/app/auth/settings/emergency-access/view/emergency-access-view.component.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/request/password.request.ts","webpack://@bitwarden/web-vault/./src/app/auth/core/enums/webauthn-login-credential-prf-status.enum.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/webauthn-login-settings/create-credential-dialog/create-passkey-failed.icon.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/webauthn-login-settings/create-credential-dialog/create-passkey.icon.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/webauthn-login-settings/create-credential-dialog/create-credential-dialog.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/webauthn-login-settings/create-credential-dialog/create-credential-dialog.component.html","webpack://@bitwarden/web-vault/./src/app/auth/settings/webauthn-login-settings/delete-credential-dialog/delete-credential-dialog.component.html","webpack://@bitwarden/web-vault/./src/app/auth/settings/webauthn-login-settings/delete-credential-dialog/delete-credential-dialog.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/webauthn-login-settings/enable-encryption-dialog/enable-encryption-dialog.component.html","webpack://@bitwarden/web-vault/./src/app/auth/settings/webauthn-login-settings/enable-encryption-dialog/enable-encryption-dialog.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/webauthn-login-settings/webauthn-login-settings.component.html","webpack://@bitwarden/web-vault/./src/app/auth/settings/webauthn-login-settings/webauthn-login-settings.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/change-password.component.html","webpack://@bitwarden/web-vault/./src/app/auth/settings/change-password.component.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/request/kdf.request.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/security/change-kdf/change-kdf-confirmation.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/security/change-kdf/change-kdf-confirmation.component.html","webpack://@bitwarden/web-vault/./src/app/auth/settings/security/change-kdf/change-kdf.component.html","webpack://@bitwarden/web-vault/./src/app/auth/settings/security/change-kdf/change-kdf.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/security/security-keys.component.html","webpack://@bitwarden/web-vault/./src/app/auth/settings/security/security-keys.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/security/security.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/security/security.component.html","webpack://@bitwarden/web-vault/./src/app/auth/settings/security/security-routing.module.ts","webpack://@bitwarden/web-vault/./src/app/auth/sso.component.html","webpack://@bitwarden/web-vault/./src/app/auth/sso.component.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/request/reference-event.request.ts","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/vertical-stepper/vertical-step.component.html","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/vertical-stepper/vertical-step.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/vertical-stepper/vertical-step-content.component.html","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/vertical-stepper/vertical-step-content.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/vertical-stepper/vertical-stepper.component.html","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/vertical-stepper/vertical-stepper.component.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/request/register.request.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/auth/validators/inputs-field-match.validator.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/auth/components/register.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/register-form/register-form.component.html","webpack://@bitwarden/web-vault/./src/app/auth/register-form/register-form.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/logo-cnet-5-stars.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/logo-cnet-5-stars.component.html","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/review-logo.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/review-logo.component.html","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/enterprise-content.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/enterprise-content.component.html","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/logo-forbes.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/logo-forbes.component.html","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/logo-us-news.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/logo-us-news.component.html","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/teams-content.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/teams-content.component.html","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/confirmation-details.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/confirmation-details.component.html","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/default-content.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/default-content.component.html","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/enterprise1-content.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/enterprise1-content.component.html","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/enterprise2-content.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/enterprise2-content.component.html","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/teams1-content.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/teams1-content.component.html","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/teams2-content.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/teams2-content.component.html","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/teams3-content.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/teams3-content.component.html","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/logo-cnet.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/logo-cnet.component.html","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/cnet-enterprise-content.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/cnet-enterprise-content.component.html","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/cnet-individual-content.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/cnet-individual-content.component.html","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/cnet-teams-content.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/cnet-teams-content.component.html","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/abm-enterprise-content.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/abm-enterprise-content.component.html","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/abm-teams-content.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/abm-teams-content.component.html","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/review-blurb.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/secrets-manager-content.component.html","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/review-blurb.component.html","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/content/secrets-manager-content.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/secrets-manager/secrets-manager-trial-free-stepper.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/secrets-manager/secrets-manager-trial-free-stepper.component.html","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/secrets-manager/secrets-manager-trial-paid-stepper.component.html","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/secrets-manager/secrets-manager-trial-paid-stepper.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/secrets-manager/secrets-manager-trial.component.html","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/secrets-manager/secrets-manager-trial.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/trial-initiation.component.html","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/trial-initiation.component.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/webauthn-iframe.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/auth/components/two-factor.component.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/auth/components/two-factor-options.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/two-factor-options.component.html","webpack://@bitwarden/web-vault/./src/app/auth/two-factor-options.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/two-factor.component.html","webpack://@bitwarden/web-vault/./src/app/auth/two-factor.component.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/auth/components/update-password.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/update-password.component.html","webpack://@bitwarden/web-vault/./src/app/auth/update-password.component.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/request/update-temp-password.request.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/auth/components/update-temp-password.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/update-temp-password.component.html","webpack://@bitwarden/web-vault/./src/app/auth/update-temp-password.component.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/request/verify-email.request.ts","webpack://@bitwarden/web-vault/./src/app/auth/verify-email-token.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/verify-email-token.component.html","webpack://@bitwarden/web-vault/../../libs/common/src/models/request/verify-delete-recover.request.ts","webpack://@bitwarden/web-vault/./src/app/auth/verify-recover-delete.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/verify-recover-delete.component.html","webpack://@bitwarden/web-vault/../../libs/common/src/models/request/update-domains.request.ts","webpack://@bitwarden/web-vault/./src/app/settings/domain-rules.component.html","webpack://@bitwarden/web-vault/./src/app/settings/domain-rules.component.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/components/settings/vault-timeout-input.component.ts","webpack://@bitwarden/web-vault/./src/app/settings/vault-timeout-input.component.html","webpack://@bitwarden/web-vault/./src/app/settings/vault-timeout-input.component.ts","webpack://@bitwarden/web-vault/./src/app/settings/preferences.component.html","webpack://@bitwarden/web-vault/./src/app/settings/preferences.component.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/tools/generator/components/generator.component.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/tools/generator/components/password-generator-history.component.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/directives/copy-text.directive.ts","webpack://@bitwarden/web-vault/./src/app/tools/password-generator-history.component.html","webpack://@bitwarden/web-vault/./src/app/tools/password-generator-history.component.ts","webpack://@bitwarden/web-vault/./src/app/tools/generator.component.html","webpack://@bitwarden/web-vault/./src/app/tools/generator.component.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/tools/send/send.component.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/tools/send/add-edit.component.ts","webpack://@bitwarden/web-vault/./src/app/tools/send/add-edit.component.html","webpack://@bitwarden/web-vault/./src/app/tools/send/add-edit.component.ts","webpack://@bitwarden/web-vault/./src/app/tools/send/icons/no-send.icon.ts","webpack://@bitwarden/web-vault/./src/app/tools/send/send.component.html","webpack://@bitwarden/web-vault/./src/app/tools/send/send.component.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/bulk-action-dialogs/bulk-dialogs.module.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/vault-onboarding/services/abstraction/vault-onboarding.service.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/vault-onboarding/services/vault-onboarding.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/enums/vault-onboarding.enum.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.html","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/bulk-action-dialogs/bulk-move-dialog/bulk-move-dialog.component.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/bulk-action-dialogs/bulk-move-dialog/bulk-move-dialog.component.html","webpack://@bitwarden/web-vault/../../libs/common/src/types/checkable.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/bulk-action-dialogs/bulk-share-dialog/bulk-share-dialog.component.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/bulk-action-dialogs/bulk-share-dialog/bulk-share-dialog.component.html","webpack://@bitwarden/web-vault/../../libs/angular/src/vault/components/folder-add-edit.component.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/folder-add-edit.component.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/folder-add-edit.component.html","webpack://@bitwarden/web-vault/../../libs/angular/src/components/share.component.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/share.component.html","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/share.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/verify-email.component.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/verify-email.component.html","webpack://@bitwarden/web-vault/./src/app/settings/low-kdf.component.ts","webpack://@bitwarden/web-vault/./src/app/settings/low-kdf.component.html","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/vault-header/vault-header.component.html","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/vault-header/vault-header.component.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/vault.component.html","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/vault.component.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/vault-routing.module.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/vault.module.ts","webpack://@bitwarden/web-vault/./src/app/oss-routing.module.ts","webpack://@bitwarden/web-vault/./src/app/shared/components/account-fingerprint/account-fingerprint.component.html","webpack://@bitwarden/web-vault/./src/app/shared/components/account-fingerprint/account-fingerprint.component.ts","webpack://@bitwarden/web-vault/./src/app/shared/components/onboarding/onboarding-task.component.html","webpack://@bitwarden/web-vault/./src/app/shared/components/onboarding/onboarding-task.component.ts","webpack://@bitwarden/web-vault/./src/app/shared/components/onboarding/onboarding.component.html","webpack://@bitwarden/web-vault/./src/app/shared/components/onboarding/onboarding.component.ts","webpack://@bitwarden/web-vault/./src/app/shared/components/onboarding/onboarding.module.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/security/change-kdf/change-kdf.module.ts","webpack://@bitwarden/web-vault/./src/app/shared/loose-components.module.ts","webpack://@bitwarden/web-vault/../../libs/components/src/avatar/avatar.module.ts","webpack://@bitwarden/web-vault/../../libs/components/src/badge-list/badge-list.module.ts","webpack://@bitwarden/web-vault/../../libs/components/src/color-password/color-password.module.ts","webpack://@bitwarden/web-vault/../../libs/components/src/tabs/tabs.module.ts","webpack://@bitwarden/web-vault/../../libs/components/src/toggle-group/toggle-group.module.ts","webpack://@bitwarden/web-vault/./src/app/shared/locales.ts","webpack://@bitwarden/web-vault/./src/app/shared/shared.module.ts","webpack://@bitwarden/web-vault/./src/app/tools/event-export/event.export.ts","webpack://@bitwarden/web-vault/./src/app/tools/event-export/event-export.service.ts","webpack://@bitwarden/web-vault/./src/app/core/guards/has-premium.guard.ts","webpack://@bitwarden/web-vault/./src/app/tools/reports/pages/breach-report.component.html","webpack://@bitwarden/web-vault/./src/app/tools/reports/pages/breach-report.component.ts","webpack://@bitwarden/web-vault/./src/app/tools/reports/icons/report-breach.icon.ts","webpack://@bitwarden/web-vault/./src/app/tools/reports/icons/report-exposed-passwords.icon.ts","webpack://@bitwarden/web-vault/./src/app/tools/reports/icons/report-inactive-two-factor.icon.ts","webpack://@bitwarden/web-vault/./src/app/tools/reports/icons/report-reused-passwords.icon.ts","webpack://@bitwarden/web-vault/./src/app/tools/reports/icons/report-unsecured-websites.icon.ts","webpack://@bitwarden/web-vault/./src/app/tools/reports/icons/report-weak-passwords.icon.ts","webpack://@bitwarden/web-vault/./src/app/tools/reports/reports.ts","webpack://@bitwarden/web-vault/./src/app/tools/reports/shared/reports-shared.module.ts","webpack://@bitwarden/web-vault/./src/app/tools/reports/pages/reports-home.component.ts","webpack://@bitwarden/web-vault/./src/app/tools/reports/pages/reports-home.component.html","webpack://@bitwarden/web-vault/./src/app/tools/reports/reports-layout.component.html","webpack://@bitwarden/web-vault/./src/app/tools/reports/reports-layout.component.ts","webpack://@bitwarden/web-vault/./src/app/tools/reports/reports-routing.module.ts","webpack://@bitwarden/web-vault/./src/app/tools/reports/reports.module.ts","webpack://@bitwarden/web-vault/./src/app/tools/reports/pages/cipher-report.component.ts","webpack://@bitwarden/web-vault/./src/app/tools/reports/pages/exposed-passwords-report.component.html","webpack://@bitwarden/web-vault/./src/app/tools/reports/pages/exposed-passwords-report.component.ts","webpack://@bitwarden/web-vault/./src/app/tools/reports/pages/inactive-two-factor-report.component.html","webpack://@bitwarden/web-vault/./src/app/tools/reports/pages/inactive-two-factor-report.component.ts","webpack://@bitwarden/web-vault/./src/app/tools/reports/pages/reused-passwords-report.component.html","webpack://@bitwarden/web-vault/./src/app/tools/reports/pages/reused-passwords-report.component.ts","webpack://@bitwarden/web-vault/./src/app/tools/reports/pages/unsecured-websites-report.component.html","webpack://@bitwarden/web-vault/./src/app/tools/reports/pages/unsecured-websites-report.component.ts","webpack://@bitwarden/web-vault/./src/app/tools/reports/pages/weak-passwords-report.component.html","webpack://@bitwarden/web-vault/./src/app/tools/reports/pages/weak-passwords-report.component.ts","webpack://@bitwarden/web-vault/./src/app/tools/reports/shared/models/report-variant.ts","webpack://@bitwarden/web-vault/./src/app/tools/reports/shared/report-card/report-card.component.html","webpack://@bitwarden/web-vault/./src/app/tools/reports/shared/report-card/report-card.component.ts","webpack://@bitwarden/web-vault/./src/app/tools/reports/shared/report-list/report-list.component.html","webpack://@bitwarden/web-vault/./src/app/tools/reports/shared/report-list/report-list.component.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/send/models/view/send-access.view.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/send/models/domain/send-access.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/send/models/request/send-access.request.ts","webpack://@bitwarden/web-vault/./src/app/tools/send/icons/expired-send.icon.ts","webpack://@bitwarden/web-vault/./src/app/tools/send/send-access-file.component.ts","webpack://@bitwarden/web-vault/./src/app/tools/send/send-access-file.component.html","webpack://@bitwarden/web-vault/./src/app/tools/send/send-access-password.component.ts","webpack://@bitwarden/web-vault/./src/app/tools/send/send-access-password.component.html","webpack://@bitwarden/web-vault/./src/app/tools/send/send-access-text.component.html","webpack://@bitwarden/web-vault/./src/app/tools/send/send-access-text.component.ts","webpack://@bitwarden/web-vault/./src/app/tools/send/access.component.html","webpack://@bitwarden/web-vault/./src/app/tools/send/access.component.ts","webpack://@bitwarden/web-vault/./src/app/vault/components/collection-dialog/collection-dialog.component.ts","webpack://@bitwarden/web-vault/./src/app/vault/components/collection-dialog/collection-dialog.component.html","webpack://@bitwarden/web-vault/../../libs/components/src/form-field/bit-validators/forbidden-characters.validator.ts","webpack://@bitwarden/web-vault/./src/app/vault/components/collection-dialog/collection-dialog.module.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/directives/not-premium.directive.ts","webpack://@bitwarden/web-vault/./src/app/vault/components/premium-badge.component.ts","webpack://@bitwarden/web-vault/./src/app/vault/components/vault-items/vault-items.component.html","webpack://@bitwarden/web-vault/./src/app/vault/components/vault-items/vault-items.component.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/pipes/get-collection-name.pipe.ts","webpack://@bitwarden/web-vault/./src/app/vault/org-vault/collection-badge/collection-name-badge.component.html","webpack://@bitwarden/web-vault/./src/app/vault/org-vault/collection-badge/collection-name.badge.component.ts","webpack://@bitwarden/web-vault/./src/app/vault/components/vault-items/vault-cipher-row.component.html","webpack://@bitwarden/web-vault/./src/app/vault/components/vault-items/vault-cipher-row.component.ts","webpack://@bitwarden/web-vault/./src/app/vault/org-vault/group-badge/group-name-badge.component.ts","webpack://@bitwarden/web-vault/./src/app/vault/org-vault/group-badge/group-name-badge.component.html","webpack://@bitwarden/web-vault/./src/app/vault/components/vault-items/vault-collection-row.component.html","webpack://@bitwarden/web-vault/./src/app/vault/components/vault-items/vault-collection-row.component.ts","webpack://@bitwarden/web-vault/./src/app/vault/components/vault-items/vault-items.module.ts","webpack://@bitwarden/web-vault/./src/app/vault/core/bulk-collection-access.request.ts","webpack://@bitwarden/web-vault/./src/app/vault/core/collection-admin.service.ts","webpack://@bitwarden/web-vault/./src/app/vault/core/views/collection-admin.view.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/vault/components/add-edit-custom-fields.component.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/directives/true-false-value.directive.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/add-edit-custom-fields.component.html","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/add-edit-custom-fields.component.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/vault/components/add-edit.component.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/add-edit.component.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/attachments.component.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/bulk-action-dialogs/bulk-delete-dialog/bulk-delete-dialog.component.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/bulk-action-dialogs/bulk-delete-dialog/bulk-delete-dialog.component.html","webpack://@bitwarden/web-vault/../../libs/angular/src/admin-console/components/collections.component.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/collections.component.html","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/collections.component.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/organization-badge/organization-badge.module.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/organization-badge/organization-name-badge.component.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/organization-badge/organization-name-badge.component.html","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/pipes/get-organization-name.pipe.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/pipes/pipes.module.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/users/enroll-master-password-reset.component.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/users/enroll-master-password-reset.component.html","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/vault-filter/components/link-sso.directive.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/vault-filter/components/organization-options.component.html","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/vault-filter/components/organization-options.component.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/vault-filter/components/vault-filter.component.html","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/vault-filter/components/vault-filter.component.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/vault-filter/services/abstractions/vault-filter.service.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/vault-filter/shared/models/routed-vault-filter-bridge.model.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/vault-filter/services/routed-vault-filter-bridge.service.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/vault-filter/services/routed-vault-filter.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/services/key-state/collapsed-groupings.state.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/vault-filter/services/vault-filter.service.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/vault-filter/shared/components/vault-filter-section.component.html","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/vault-filter/shared/components/vault-filter-section.component.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/vault-filter/shared/models/filter-function.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/vault-filter/shared/models/routed-vault-filter.model.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/vault-filter/shared/models/vault-filter.model.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/vault-filter/shared/vault-filter-shared.module.ts","webpack://@bitwarden/web-vault/./src/app/vault/individual-vault/vault-filter/vault-filter.module.ts","webpack://@bitwarden/web-vault/./src/app/vault/org-vault/add-edit.component.ts","webpack://@bitwarden/web-vault/./src/app/vault/org-vault/collection-badge/collection-badge.module.ts","webpack://@bitwarden/web-vault/./src/app/vault/org-vault/group-badge/group-badge.module.ts","webpack://@bitwarden/web-vault/./src/app/vault/settings/purge-vault.component.ts","webpack://@bitwarden/web-vault/./src/app/vault/settings/purge-vault.component.html","webpack://@bitwarden/web-vault/./src/app/vault/utils/collection-utils.ts","webpack://@bitwarden/web-vault/./src/utils/flags.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/organizations/users/organization-user.module.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/webauthn-login-settings/webauthn-login-settings.module.ts","webpack://@bitwarden/web-vault/./src/app/auth/settings/settings.module.ts","webpack://@bitwarden/web-vault/./src/app/auth/auth.module.ts","webpack://@bitwarden/web-vault/./src/app/auth/login/login.module.ts","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/vertical-stepper/vertical-stepper.module.ts","webpack://@bitwarden/web-vault/./src/app/auth/trial-initiation/trial-initiation.module.ts","webpack://@bitwarden/web-vault/./src/app/oss.module.ts","webpack://@bitwarden/web-vault/./src/app/wildcard-routing.module.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/organizations/core/views/pending-auth-request.view.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/organizations/core/services/auth-requests/admin-auth-request-update.request.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/organizations/core/services/auth-requests/bulk-deny-auth-requests.request.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/organizations/core/services/auth-requests/pending-organization-auth-request.response.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/organizations/core/services/auth-requests/organization-auth-request.service.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/organizations/core/core-organization.module.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/request/organization-sso.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/view/sso-config.view.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/directives/input-strip-spaces.directive.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/directives/launch-click.directive.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/auth/sso/sso.component.html","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/auth/sso/sso.component.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/auth/sso/sso-type.validator.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/icons/devices.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/organizations/manage/device-approvals/device-approvals.component.html","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/organizations/manage/device-approvals/device-approvals.component.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/services/organization-domain/requests/organization-domain.request.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/organizations/manage/domain-verification/domain-add-edit-dialog/validators/unique-in-array.validator.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/organizations/manage/domain-verification/domain-add-edit-dialog/domain-add-edit-dialog.component.html","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/organizations/manage/domain-verification/domain-add-edit-dialog/domain-add-edit-dialog.component.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/organizations/manage/domain-verification/domain-add-edit-dialog/validators/domain-name.validator.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/organizations/manage/domain-verification/domain-verification.component.html","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/organizations/manage/domain-verification/domain-verification.component.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/api/scim-config.api.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/request/scim-config.request.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/organizations/manage/scim.component.html","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/organizations/manage/scim.component.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/organizations/organizations-routing.module.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/organizations/organizations.module.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/providers/guards/provider-permissions.guard.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/icons/provider-portal-logo.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/providers/providers-layout.component.html","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/providers/providers-layout.component.ts","webpack://@bitwarden/web-vault/./src/app/admin-console/providers/providers.component.html","webpack://@bitwarden/web-vault/./src/app/admin-console/providers/providers.component.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/request/provider/provider-add-organization.request.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/providers/services/web-provider.service.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/providers/clients/add-organization.component.html","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/providers/clients/add-organization.component.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/providers/clients/clients.component.html","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/providers/clients/clients.component.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/providers/clients/create-organization.component.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/providers/clients/create-organization.component.html","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/request/provider/provider-user-accept.request.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/providers/manage/accept-provider.component.html","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/providers/manage/accept-provider.component.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/providers/manage/events.component.html","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/providers/manage/events.component.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/request/provider/provider-user-bulk.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/request/provider/provider-user-confirm.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/request/provider/provider-user-bulk-confirm.request.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/providers/manage/bulk/bulk-confirm.component.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/providers/manage/bulk/bulk-remove.component.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/request/provider/provider-user-invite.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/request/provider/provider-user-update.request.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/providers/manage/user-add-edit.component.html","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/providers/manage/user-add-edit.component.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/providers/manage/people.component.html","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/providers/manage/people.component.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/request/provider/provider-update.request.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/providers/settings/account.component.html","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/providers/settings/account.component.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/providers/setup/setup-provider.component.html","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/providers/setup/setup-provider.component.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/request/provider/provider-setup.request.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/providers/setup/setup.component.html","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/providers/setup/setup.component.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/providers/providers-routing.module.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/providers/providers.module.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/app-routing.module.ts","webpack://@bitwarden/web-vault/./src/app/app.component.ts","webpack://@bitwarden/web-vault/./src/app/app.component.html","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/policies/activate-autofill.component.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/policies/activate-autofill.component.html","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/policies/disable-personal-vault-export.component.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/policies/disable-personal-vault-export.component.html","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/policies/maximum-vault-timeout.component.html","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/admin-console/policies/maximum-vault-timeout.component.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/app.component.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/app/app.module.ts","webpack://@bitwarden/web-vault/../../bitwarden_license/bit-web/src/main.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/auth/components/sso.component.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/auth/guards/auth.guard.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/auth/guards/lock.guard.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/auth/guards/redirect.guard.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/auth/guards/tde-decryption-required.guard.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/auth/guards/unauth.guard.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/components/callout.component.html","webpack://@bitwarden/web-vault/../../libs/angular/src/components/callout.component.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/directives/a11y-title.directive.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/directives/api-action.directive.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/directives/copy-click.directive.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/directives/input-verbatim.directive.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/directives/stop-click.directive.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/directives/stop-prop.directive.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/components/toastr.component.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/pipes/credit-card-number.pipe.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/jslib.module.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/pipes/search.pipe.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/pipes/user-name.pipe.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/pipes/user-type.pipe.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/platform/abstractions/form-validation-errors.service.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/platform/pipes/ellipsis.pipe.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/platform/pipes/fingerprint.pipe.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/platform/pipes/i18n.pipe.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/platform/services/theming/theming.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/services/injection-tokens.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/components/modal/modal.ref.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/components/modal/dynamic-modal.component.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/components/modal/modal-injector.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/services/modal.service.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/tools/password-strength/password-strength.component.html","webpack://@bitwarden/web-vault/../../libs/angular/src/tools/password-strength/password-strength.component.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/utils/form-selection-list.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/vault/components/attachments.component.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/directives/fallback-src.directive.ts","webpack://@bitwarden/web-vault/../../libs/angular/src/vault/components/icon.component.html","webpack://@bitwarden/web-vault/../../libs/angular/src/vault/components/icon.component.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/icon/build-cipher-icon.ts","webpack://@bitwarden/web-vault/../../libs/auth/src/angular/icons/user-verification-biometrics-fingerprint.icon.ts","webpack://@bitwarden/web-vault/../../libs/auth/src/angular/fingerprint-dialog/fingerprint-dialog.component.ts","webpack://@bitwarden/web-vault/../../libs/auth/src/angular/fingerprint-dialog/fingerprint-dialog.component.html","webpack://@bitwarden/web-vault/../../libs/auth/src/angular/user-verification/active-client-verification-option.enum.ts","webpack://@bitwarden/web-vault/../../libs/auth/src/angular/user-verification/user-verification-form-input.component.html","webpack://@bitwarden/web-vault/../../libs/auth/src/angular/user-verification/user-verification-form-input.component.ts","webpack://@bitwarden/web-vault/../../libs/auth/src/angular/user-verification/user-verification-dialog.component.html","webpack://@bitwarden/web-vault/../../libs/auth/src/angular/user-verification/user-verification-dialog.component.ts","webpack://@bitwarden/web-vault/../../libs/auth/src/angular/password-callout/password-callout.component.html","webpack://@bitwarden/web-vault/../../libs/auth/src/angular/password-callout/password-callout.component.ts","webpack://@bitwarden/web-vault/../../libs/auth/src/common/abstractions/pin-crypto.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/auth/src/common/abstractions/login-strategy.service.ts","webpack://@bitwarden/web-vault/../../libs/auth/src/common/abstractions/user-decryption-options.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/auth/src/common/abstractions/auth-request.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/auth/src/common/models/domain/rotateable-key-set.ts","webpack://@bitwarden/web-vault/../../libs/auth/src/common/models/domain/login-credentials.ts","webpack://@bitwarden/web-vault/../../libs/auth/src/common/models/domain/user-decryption-options.ts","webpack://@bitwarden/web-vault/../../libs/auth/src/common/services/pin-crypto/pin-crypto.service.implementation.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/request/passwordless-auth.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/request/prelogin.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/request/identity-token/password-token.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/domain/auth-result.ts","webpack://@bitwarden/web-vault/../../libs/auth/src/common/login-strategies/login.strategy.ts","webpack://@bitwarden/web-vault/../../libs/auth/src/common/login-strategies/auth-request-login.strategy.ts","webpack://@bitwarden/web-vault/../../libs/auth/src/common/login-strategies/password-login.strategy.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/request/identity-token/sso-token.request.ts","webpack://@bitwarden/web-vault/../../libs/auth/src/common/login-strategies/sso-login.strategy.ts","webpack://@bitwarden/web-vault/../../libs/auth/src/common/login-strategies/user-api-login.strategy.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/request/identity-token/webauthn-login-token.request.ts","webpack://@bitwarden/web-vault/../../libs/auth/src/common/login-strategies/webauthn-login.strategy.ts","webpack://@bitwarden/web-vault/../../libs/auth/src/common/services/login-strategies/login-strategy.state.ts","webpack://@bitwarden/web-vault/../../libs/auth/src/common/services/login-strategies/login-strategy.service.ts","webpack://@bitwarden/web-vault/../../libs/auth/src/common/services/user-decryption-options/user-decryption-options.service.ts","webpack://@bitwarden/web-vault/../../libs/auth/src/common/services/auth-request/auth-request.service.ts","webpack://@bitwarden/web-vault/../../libs/auth/src/common/utilities/decode-jwt-token-to-json.utility.ts","webpack://@bitwarden/web-vault/../../libs/common/src/abstractions/api.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/abstractions/audit.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/abstractions/event/event-collection.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/abstractions/event/event-upload.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/abstractions/notifications.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/abstractions/search.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/abstractions/vault-timeout/vault-timeout-settings.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/abstractions/vault-timeout/vault-timeout.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/abstractions/organization-domain/org-domain-api.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/abstractions/organization-domain/org-domain.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/abstractions/organization-management-preferences/organization-management-preferences.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/abstractions/organization-user/organization-user.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/abstractions/organization-user/requests/organization-user-reset-password-enrollment.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/abstractions/organization-user/requests/organization-user-reset-password.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/abstractions/organization/organization-api.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/abstractions/organization/organization.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/abstractions/policy/policy-api.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/abstractions/policy/policy.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/abstractions/provider.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/enums/organization-api-key-type.enum.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/enums/organization-connection-type.enum.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/enums/organization-user-status-type.enum.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/enums/organization-user-type.enum.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/enums/policy-type.enum.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/enums/provider-type.enum.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/enums/provider-user-status-type.enum.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/enums/provider-user-type.enum.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/enums/scim-provider-type.enum.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/api/permissions.api.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/data/organization.data.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/data/policy.data.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/domain/master-password-policy-options.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/domain/organization.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/domain/policy.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/request/organization-api-key.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/request/organization-connection.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/request/organization-create.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/request/organization-keys.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/request/selection-read-only.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/response/policy.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/response/selection-read-only.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/abstractions/account-api.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/abstractions/account.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/abstractions/anonymous-hub.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/abstractions/auth.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/abstractions/avatar.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/abstractions/device-trust-crypto.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/abstractions/devices-api.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/abstractions/devices/devices.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/abstractions/key-connector.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/abstractions/login.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/abstractions/password-reset-enrollment.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/abstractions/sso-login.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/abstractions/token.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/abstractions/two-factor.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/abstractions/user-verification/user-verification.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/abstractions/webauthn/webauthn-login-prf-crypto.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/abstractions/webauthn/webauthn-login.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/enums/authentication-status.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/enums/authentication-type.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/enums/sso.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/enums/two-factor-provider-type.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/enums/verification-type.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/api/sso-config.api.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/domain/admin-auth-req-storable.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/domain/force-set-password-reason.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/domain/kdf-config.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/request/identity-token/device.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/request/identity-token/token-two-factor.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/request/identity-token/token.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/request/identity-token/user-api-token.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/request/secret-verification.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/request/two-factor-email.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/response/identity-captcha.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/response/user-decryption-options/key-connector-user-decryption-option.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/response/user-decryption-options/trusted-device-user-decryption-option.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/response/user-decryption-options/webauthn-prf-decryption-option.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/response/user-decryption-options/user-decryption-options.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/response/identity-token.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/response/identity-two-factor.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/response/master-password-policy.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/response/two-factor-web-authn.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/models/view/webauthn-login/webauthn-login-credential-assertion-options.view.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/services/two-factor.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/services/webauthn-login/request/webauthn-login-response.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/services/webauthn-login/request/webauthn-login-assertion-response.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/services/webauthn-login/response/assertion-options.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/auth/services/webauthn-login/response/credential-assertion-options.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/autofill/services/domain-settings.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/billing/abstractions/account/billing-account-profile-state.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/billing/abstractions/billilng-api.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/common/src/billing/abstractions/organization-billing.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/billing/abstractions/payment-method-warnings-service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/common/src/billing/enums/payment-method-type.enum.ts","webpack://@bitwarden/web-vault/../../libs/common/src/billing/enums/plan-sponsorship-type.enum.ts","webpack://@bitwarden/web-vault/../../libs/common/src/billing/enums/plan-type.enum.ts","webpack://@bitwarden/web-vault/../../libs/common/src/billing/enums/transaction-type.enum.ts","webpack://@bitwarden/web-vault/../../libs/common/src/billing/enums/bitwarden-product-type.enum.ts","webpack://@bitwarden/web-vault/../../libs/common/src/billing/models/request/organization-tax-info-update.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/billing/models/request/payment.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/billing/models/request/tax-info-update.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/enums/feature-flag.enum.ts","webpack://@bitwarden/web-vault/../../libs/common/src/enums/http-status-code.enum.ts","webpack://@bitwarden/web-vault/../../libs/common/src/enums/client-type.enum.ts","webpack://@bitwarden/web-vault/../../libs/common/src/enums/device-type.enum.ts","webpack://@bitwarden/web-vault/../../libs/common/src/enums/event-system-user.enum.ts","webpack://@bitwarden/web-vault/../../libs/common/src/enums/event-type.enum.ts","webpack://@bitwarden/web-vault/../../libs/common/src/enums/native-messaging-version.enum.ts","webpack://@bitwarden/web-vault/../../libs/common/src/enums/notification-type.enum.ts","webpack://@bitwarden/web-vault/../../libs/common/src/enums/product-type.enum.ts","webpack://@bitwarden/web-vault/../../libs/common/src/enums/vault-timeout-action.enum.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/domain/domain-service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/export/card.export.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/export/field.export.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/export/identity.export.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/export/fido2-credential.export.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/export/login-uri.export.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/export/login.export.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/export/password-history.export.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/export/secure-note.export.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/export/cipher.export.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/export/cipher-with-ids.export.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/export/collection.export.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/export/collection-with-id.export.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/export/folder.export.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/export/folder-with-id.export.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/request/keys.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/response/base.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/response/error.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/response/event.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/response/list.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/view/event.view.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/view/view.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/abstractions/app-id.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/abstractions/broadcaster.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/abstractions/config/config.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/abstractions/crypto-function.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/abstractions/crypto.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/abstractions/encrypt.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/abstractions/environment.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/abstractions/file-download/file-download.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/abstractions/translation.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/abstractions/i18n.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/abstractions/key-generation.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/abstractions/log.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/abstractions/messaging.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/abstractions/platform-utils.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/abstractions/state.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/abstractions/validation.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/biometrics/biometric.state.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/biometrics/biometric-state.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/enums/encryption-type.enum.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/enums/file-upload-type.enum.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/enums/hash-purpose.enum.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/enums/html-storage-location.enum.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/enums/kdf-type.enum.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/enums/key-suffix-options.enum.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/enums/log-level-type.enum.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/enums/storage-location.enum.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/enums/theme-type.enum.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/misc/flags.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/misc/range-with-default.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/misc/safe-urls.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/misc/utils.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/misc/wordlist.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/models/data/server-config.data.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/models/domain/account.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/models/domain/domain-base.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/models/domain/enc-array-buffer.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/models/domain/enc-string.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/models/domain/symmetric-crypto-key.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/services/console-log.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/services/cryptography/initializer-key.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/state/deserialization-helpers.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/state/derive-definition.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/state/derived-state.provider.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/state/state.provider.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/state/global-state.provider.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/state/user-state.provider.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/state/key-definition.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/state/state-definition.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/state/state-definitions.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/state/state-event-registrar.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/state/state-event-runner.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/state/user-key-definition.ts","webpack://@bitwarden/web-vault/../../libs/common/src/platform/theming/theme-state.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/generator/key-definitions.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/generator/password/password-generation-options.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/generator/password/password-generator-policy.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/generator/password/password-generation.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/common/src/admin-console/models/domain/password-generator-policy-options.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/generator/passphrase/passphrase-generation-options.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/generator/passphrase/passphrase-generator-options-evaluator.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/generator/password/generated-password-history.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/generator/password/password-generation.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/generator/password/password-generator-options-evaluator.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/generator/username/username-generation.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/generator/username/email-forwarders/anon-addy-forwarder.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/generator/username/email-forwarders/duck-duck-go-forwarder.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/generator/username/email-forwarders/fastmail-forwarder.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/generator/username/email-forwarders/firefox-relay-forwarder.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/generator/username/email-forwarders/forwarder-options.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/generator/username/email-forwarders/simple-login-forwarder.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/generator/username/email-forwarders/forward-email-forwarder.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/generator/username/username-generation.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/password-strength/password-strength.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/password-strength/password-strength.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/send/enums/send-type.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/send/models/domain/send-file.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/send/models/domain/send-text.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/send/models/domain/send.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/send/models/view/send-file.view.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/send/models/view/send-text.view.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/send/models/view/send.view.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/send/send-kdf.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/send/services/send-api.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/common/src/tools/send/services/send.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/abstractions/cipher.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/abstractions/collection.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/abstractions/folder/folder-api.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/abstractions/folder/folder.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/abstractions/sync/sync.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/abstractions/totp.service.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/enums/cipher-reprompt-type.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/enums/cipher-type.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/enums/field-type.enum.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/enums/linked-id-type.enum.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/enums/secure-note-type.enum.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/linked-field-option.decorator.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/api/card.api.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/api/fido2-credential.api.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/api/field.api.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/api/identity.api.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/api/login-uri.api.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/api/login.api.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/api/secure-note.api.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/data/attachment.data.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/data/card.data.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/data/cipher.data.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/data/collection.data.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/data/fido2-credential.data.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/data/field.data.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/data/identity.data.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/data/login-uri.data.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/data/login.data.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/data/password-history.data.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/data/secure-note.data.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/domain/attachment.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/domain/card.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/domain/cipher.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/domain/collection.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/domain/fido2-credential.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/domain/field.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/domain/folder.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/domain/identity.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/domain/login-uri.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/domain/login.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/domain/password.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/domain/secure-note.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/domain/tree-node.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/request/cipher-bulk-delete.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/request/cipher-collections.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/request/cipher-with-id.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/request/attachment.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/request/cipher.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/request/collection.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/request/folder-with-id.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/request/folder.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/response/attachment.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/response/password-history.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/response/cipher.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/response/collection.response.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/view/attachment.view.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/view/card.view.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/view/cipher.view.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/view/collection.view.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/view/fido2-credential.view.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/view/field.view.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/view/folder.view.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/view/identity.view.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/view/item.view.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/view/login-uri.view.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/view/login.view.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/view/password-history.view.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/view/secure-note.view.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/service-utils.ts","webpack://@bitwarden/web-vault/../../libs/components/src/async-actions/async-actions.module.ts","webpack://@bitwarden/web-vault/../../libs/components/src/async-actions/bit-action.directive.ts","webpack://@bitwarden/web-vault/../../libs/components/src/async-actions/bit-submit.directive.ts","webpack://@bitwarden/web-vault/../../libs/components/src/async-actions/form-button.directive.ts","webpack://@bitwarden/web-vault/../../libs/components/src/avatar/avatar.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/badge-list/badge-list.component.html","webpack://@bitwarden/web-vault/../../libs/components/src/badge-list/badge-list.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/badge/badge.directive.ts","webpack://@bitwarden/web-vault/../../libs/components/src/badge/badge.module.ts","webpack://@bitwarden/web-vault/../../libs/components/src/banner/banner.component.html","webpack://@bitwarden/web-vault/../../libs/components/src/banner/banner.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/banner/banner.module.ts","webpack://@bitwarden/web-vault/../../libs/components/src/breadcrumbs/breadcrumb.component.html","webpack://@bitwarden/web-vault/../../libs/components/src/breadcrumbs/breadcrumb.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/breadcrumbs/breadcrumbs.component.html","webpack://@bitwarden/web-vault/../../libs/components/src/breadcrumbs/breadcrumbs.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/breadcrumbs/breadcrumbs.module.ts","webpack://@bitwarden/web-vault/../../libs/components/src/button/button.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/button/button.component.html","webpack://@bitwarden/web-vault/../../libs/components/src/button/button.module.ts","webpack://@bitwarden/web-vault/../../libs/components/src/callout/callout.component.html","webpack://@bitwarden/web-vault/../../libs/components/src/callout/callout.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/callout/callout.module.ts","webpack://@bitwarden/web-vault/../../libs/components/src/checkbox/checkbox.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/checkbox/checkbox.module.ts","webpack://@bitwarden/web-vault/../../libs/components/src/color-password/color-password.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/container/container.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/container/container.component.html","webpack://@bitwarden/web-vault/../../libs/components/src/dialog/animations.ts","webpack://@bitwarden/web-vault/../../libs/components/src/dialog/dialog.module.ts","webpack://@bitwarden/web-vault/../../libs/components/src/dialog/simple-dialog/simple-configurable-dialog/simple-configurable-dialog.component.html","webpack://@bitwarden/web-vault/../../libs/components/src/dialog/simple-dialog/simple-configurable-dialog/simple-configurable-dialog.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/dialog/dialog.service.ts","webpack://@bitwarden/web-vault/../../libs/components/src/dialog/dialog/dialog.component.html","webpack://@bitwarden/web-vault/../../libs/components/src/dialog/dialog/dialog.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/dialog/directives/dialog-close.directive.ts","webpack://@bitwarden/web-vault/../../libs/components/src/dialog/directives/dialog-title-container.directive.ts","webpack://@bitwarden/web-vault/../../libs/components/src/dialog/simple-dialog/simple-dialog.component.html","webpack://@bitwarden/web-vault/../../libs/components/src/dialog/simple-dialog/simple-dialog.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/form-control/form-control.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/components/src/form-control/form-control.component.html","webpack://@bitwarden/web-vault/../../libs/components/src/form-control/form-control.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/form-control/form-control.module.ts","webpack://@bitwarden/web-vault/../../libs/components/src/form-control/hint.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/form-control/label.directive.ts","webpack://@bitwarden/web-vault/../../libs/components/src/form-field/error-summary.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/form-field/form-field-control.ts","webpack://@bitwarden/web-vault/../../libs/components/src/form-field/error.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/form-field/form-field.component.html","webpack://@bitwarden/web-vault/../../libs/components/src/form-field/form-field.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/form-field/form-field.module.ts","webpack://@bitwarden/web-vault/../../libs/components/src/form-field/password-input-toggle.directive.ts","webpack://@bitwarden/web-vault/../../libs/components/src/form-field/prefix.directive.ts","webpack://@bitwarden/web-vault/../../libs/components/src/form-field/suffix.directive.ts","webpack://@bitwarden/web-vault/../../libs/components/src/icon-button/icon-button.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/icon-button/icon-button.component.html","webpack://@bitwarden/web-vault/../../libs/components/src/icon-button/icon-button.module.ts","webpack://@bitwarden/web-vault/../../libs/components/src/icon/icon.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/icon/icon.module.ts","webpack://@bitwarden/web-vault/../../libs/components/src/icon/icon.ts","webpack://@bitwarden/web-vault/../../libs/components/src/icon/icons/search.ts","webpack://@bitwarden/web-vault/../../libs/components/src/input/autofocus.directive.ts","webpack://@bitwarden/web-vault/../../libs/components/src/input/input.directive.ts","webpack://@bitwarden/web-vault/../../libs/components/src/input/input.module.ts","webpack://@bitwarden/web-vault/../../libs/components/src/layout/layout.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/layout/layout.component.html","webpack://@bitwarden/web-vault/../../libs/components/src/link/link.directive.ts","webpack://@bitwarden/web-vault/../../libs/components/src/link/link.module.ts","webpack://@bitwarden/web-vault/../../libs/components/src/menu/menu-divider.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/menu/menu-divider.component.html","webpack://@bitwarden/web-vault/../../libs/components/src/menu/menu-item.directive.ts","webpack://@bitwarden/web-vault/../../libs/components/src/menu/menu-trigger-for.directive.ts","webpack://@bitwarden/web-vault/../../libs/components/src/menu/menu.component.html","webpack://@bitwarden/web-vault/../../libs/components/src/menu/menu.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/menu/menu.module.ts","webpack://@bitwarden/web-vault/../../libs/components/src/multi-select/multi-select.component.html","webpack://@bitwarden/web-vault/../../libs/components/src/multi-select/multi-select.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/multi-select/multi-select.module.ts","webpack://@bitwarden/web-vault/../../libs/components/src/navigation/nav-base.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/navigation/nav-group.component.html","webpack://@bitwarden/web-vault/../../libs/components/src/navigation/nav-group.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/navigation/nav-item.component.html","webpack://@bitwarden/web-vault/../../libs/components/src/navigation/nav-item.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/navigation/navigation.module.ts","webpack://@bitwarden/web-vault/../../libs/components/src/no-items/no-items.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/no-items/no-items.component.html","webpack://@bitwarden/web-vault/../../libs/components/src/no-items/no-items.module.ts","webpack://@bitwarden/web-vault/../../libs/components/src/progress/progress.component.html","webpack://@bitwarden/web-vault/../../libs/components/src/progress/progress.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/progress/progress.module.ts","webpack://@bitwarden/web-vault/../../libs/components/src/radio-button/radio-input.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/radio-button/radio-button.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/radio-button/radio-button.component.html","webpack://@bitwarden/web-vault/../../libs/components/src/radio-button/radio-button.module.ts","webpack://@bitwarden/web-vault/../../libs/components/src/radio-button/radio-group.component.html","webpack://@bitwarden/web-vault/../../libs/components/src/radio-button/radio-group.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/search/search.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/search/search.component.html","webpack://@bitwarden/web-vault/../../libs/components/src/search/search.module.ts","webpack://@bitwarden/web-vault/../../libs/components/src/section/section.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/select/option.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/select/select.component.html","webpack://@bitwarden/web-vault/../../libs/components/src/select/select.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/select/select.module.ts","webpack://@bitwarden/web-vault/../../libs/components/src/shared/button-like.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/components/src/shared/i18n.pipe.ts","webpack://@bitwarden/web-vault/../../libs/components/src/shared/shared.module.ts","webpack://@bitwarden/web-vault/../../libs/components/src/table/cell.directive.ts","webpack://@bitwarden/web-vault/../../libs/components/src/table/row.directive.ts","webpack://@bitwarden/web-vault/../../libs/components/src/table/sortable.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/table/table-data-source.ts","webpack://@bitwarden/web-vault/../../libs/components/src/table/table.component.html","webpack://@bitwarden/web-vault/../../libs/components/src/table/table.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/table/table.module.ts","webpack://@bitwarden/web-vault/../../libs/components/src/tabs/shared/tab-header.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/tabs/shared/tab-list-container.directive.ts","webpack://@bitwarden/web-vault/../../libs/components/src/tabs/shared/tab-list-item.directive.ts","webpack://@bitwarden/web-vault/../../libs/components/src/tabs/tab-group/tab-body.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/tabs/tab-group/tab-group.component.html","webpack://@bitwarden/web-vault/../../libs/components/src/tabs/tab-group/tab-body.component.html","webpack://@bitwarden/web-vault/../../libs/components/src/tabs/tab-group/tab-group.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/tabs/tab-group/tab-label.directive.ts","webpack://@bitwarden/web-vault/../../libs/components/src/tabs/tab-group/tab.component.html","webpack://@bitwarden/web-vault/../../libs/components/src/tabs/tab-group/tab.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/tabs/tab-nav-bar/tab-link.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/tabs/tab-nav-bar/tab-link.component.html","webpack://@bitwarden/web-vault/../../libs/components/src/tabs/tab-nav-bar/tab-nav-bar.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/tabs/tab-nav-bar/tab-nav-bar.component.html","webpack://@bitwarden/web-vault/../../libs/components/src/toggle-group/toggle-group.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/toggle-group/toggle-group.component.html","webpack://@bitwarden/web-vault/../../libs/components/src/toggle-group/toggle.component.ts","webpack://@bitwarden/web-vault/../../libs/components/src/toggle-group/toggle.component.html","webpack://@bitwarden/web-vault/../../libs/components/src/typography/typography.directive.ts","webpack://@bitwarden/web-vault/../../libs/components/src/typography/typography.module.ts","webpack://@bitwarden/web-vault/../../libs/components/src/utils/function-to-observable.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/services/import-api.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/services/import-api.service.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/services/import.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/request/import-ciphers.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/request/import-organization-ciphers.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/models/request/kvp.request.ts","webpack://@bitwarden/web-vault/../../libs/common/src/vault/models/request/collection-with-id.request.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/models/import-result.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/base-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/ascendo-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/avast/avast-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/avast/avast-json-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/avira-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/blackberry-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/chrome-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/bitwarden/bitwarden-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/bitwarden/bitwarden-json-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/bitwarden/bitwarden-password-protected-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/blur-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/buttercup-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/clipperz-html-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/codebook-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/dashlane/dashlane-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/dashlane/dashlane-json-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/encryptr-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/enpass/enpass-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/enpass/enpass-json-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/firefox-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/fsecure/fsecure-fsk-types.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/fsecure/fsecure-fsk-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/gnome-json-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/kaspersky-txt-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/keepass2-xml-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/keepassx-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/keeper/keeper-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/lastpass-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/logmeonce-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/meldium-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/msecure-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/myki-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/nordpass-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/onepassword/types/onepassword-1pux-importer-types.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/onepassword/onepassword-1pif-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/onepassword/onepassword-1pux-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/onepassword/cipher-import-context.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/onepassword/onepassword-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/onepassword/onepassword-mac-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/onepassword/onepassword-win-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/padlock-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/passkeep-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/passky/passky-json-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/passman-json-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/passpack-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/passwordagent-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/passwordboss-json-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/passworddragon-xml-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/passwordsafe-xml-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/passwordwallet-txt-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/protonpass/types/protonpass-json-type.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/protonpass/protonpass-json-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/psono/psono-json-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/remembear-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/roboform-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/safari-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/safeincloud-xml-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/saferpass-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/securesafe-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/splashid-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/stickypassword-xml-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/truekey-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/upm-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/yoti-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/importers/zohovault-csv-importer.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/models/import-options.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/services/import.service.ts","webpack://@bitwarden/web-vault/../../libs/importer/src/services/import-collection.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/tools/export/vault-export/vault-export-core/src/services/vault-export.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/tools/export/vault-export/vault-export-core/src/services/export-helper.ts","webpack://@bitwarden/web-vault/../../libs/tools/export/vault-export/vault-export-core/src/services/vault-export.service.ts","webpack://@bitwarden/web-vault/../../libs/tools/export/vault-export/vault-export-core/src/services/org-vault-export.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/tools/export/vault-export/vault-export-core/src/services/base-vault-export.service.ts","webpack://@bitwarden/web-vault/../../libs/tools/export/vault-export/vault-export-core/src/services/org-vault-export.service.ts","webpack://@bitwarden/web-vault/../../libs/tools/export/vault-export/vault-export-core/src/services/individual-vault-export.service.abstraction.ts","webpack://@bitwarden/web-vault/../../libs/tools/export/vault-export/vault-export-core/src/services/individual-vault-export.service.ts","webpack://@bitwarden/web-vault/../../libs/vault/src/components/password-reprompt.component.ts","webpack://@bitwarden/web-vault/../../libs/vault/src/components/password-reprompt.component.html","webpack://@bitwarden/web-vault/../../libs/vault/src/services/password-reprompt.service.ts","webpack://@bitwarden/web-vault/webpack/bootstrap","webpack://@bitwarden/web-vault/webpack/runtime/compat get default export","webpack://@bitwarden/web-vault/webpack/runtime/define property getters","webpack://@bitwarden/web-vault/webpack/runtime/ensure chunk","webpack://@bitwarden/web-vault/webpack/runtime/get javascript chunk filename","webpack://@bitwarden/web-vault/webpack/runtime/get mini-css chunk filename","webpack://@bitwarden/web-vault/webpack/runtime/global","webpack://@bitwarden/web-vault/webpack/runtime/hasOwnProperty shorthand","webpack://@bitwarden/web-vault/webpack/runtime/make namespace object","webpack://@bitwarden/web-vault/webpack/runtime/node module decorator","webpack://@bitwarden/web-vault/webpack/runtime/publicPath","webpack://@bitwarden/web-vault/webpack/runtime/jsonp chunk loading","webpack://@bitwarden/web-vault/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"@bitwarden/web-vault:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","import { Directive } from \"@angular/core\";\n\nimport { EventResponse } from \"@bitwarden/common/models/response/event.response\";\nimport { ListResponse } from \"@bitwarden/common/models/response/list.response\";\nimport { EventView } from \"@bitwarden/common/models/view/event.view\";\nimport { FileDownloadService } from \"@bitwarden/common/platform/abstractions/file-download/file-download.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\n\nimport { EventService } from \"../../core\";\nimport { EventExportService } from \"../../tools/event-export\";\n\n@Directive()\nexport abstract class BaseEventsComponent {\n loading = true;\n loaded = false;\n events: EventView[];\n start: string;\n end: string;\n dirtyDates = true;\n continuationToken: string;\n refreshPromise: Promise;\n exportPromise: Promise;\n morePromise: Promise;\n\n abstract readonly exportFileName: string;\n\n constructor(\n protected eventService: EventService,\n protected i18nService: I18nService,\n protected exportService: EventExportService,\n protected platformUtilsService: PlatformUtilsService,\n protected logService: LogService,\n protected fileDownloadService: FileDownloadService,\n ) {\n const defaultDates = this.eventService.getDefaultDateFilters();\n this.start = defaultDates[0];\n this.end = defaultDates[1];\n }\n\n async exportEvents() {\n if (this.appApiPromiseUnfulfilled() || this.dirtyDates) {\n return;\n }\n\n this.loading = true;\n\n const dates = this.parseDates();\n if (dates == null) {\n return;\n }\n\n try {\n this.exportPromise = this.export(dates[0], dates[1]);\n\n await this.exportPromise;\n } catch (e) {\n this.logService.error(`Handled exception: ${e}`);\n }\n\n this.exportPromise = null;\n this.loading = false;\n }\n\n async loadEvents(clearExisting: boolean) {\n if (this.appApiPromiseUnfulfilled()) {\n return;\n }\n\n const dates = this.parseDates();\n if (dates == null) {\n return;\n }\n\n this.loading = true;\n let events: EventView[] = [];\n try {\n const promise = this.loadAndParseEvents(\n dates[0],\n dates[1],\n clearExisting ? null : this.continuationToken,\n );\n if (clearExisting) {\n this.refreshPromise = promise;\n } else {\n this.morePromise = promise;\n }\n const result = await promise;\n this.continuationToken = result.continuationToken;\n events = result.events;\n } catch (e) {\n this.logService.error(`Handled exception: ${e}`);\n }\n\n if (!clearExisting && this.events != null && this.events.length > 0) {\n this.events = this.events.concat(events);\n } else {\n this.events = events;\n }\n\n this.dirtyDates = false;\n this.loading = false;\n this.morePromise = null;\n this.refreshPromise = null;\n }\n\n protected abstract requestEvents(\n startDate: string,\n endDate: string,\n continuationToken: string,\n ): Promise>;\n protected abstract getUserName(r: EventResponse, userId: string): { name: string; email: string };\n\n protected async loadAndParseEvents(\n startDate: string,\n endDate: string,\n continuationToken: string,\n ) {\n const response = await this.requestEvents(startDate, endDate, continuationToken);\n\n const events = await Promise.all(\n response.data.map(async (r) => {\n const userId = r.actingUserId == null ? r.userId : r.actingUserId;\n const eventInfo = await this.eventService.getEventInfo(r);\n const user = this.getUserName(r, userId);\n const userName = user != null ? user.name : this.i18nService.t(\"unknown\");\n\n return new EventView({\n message: eventInfo.message,\n humanReadableMessage: eventInfo.humanReadableMessage,\n appIcon: eventInfo.appIcon,\n appName: eventInfo.appName,\n userId: userId,\n userName: userName,\n userEmail: user != null ? user.email : \"\",\n date: r.date,\n ip: r.ipAddress,\n type: r.type,\n installationId: r.installationId,\n systemUser: r.systemUser,\n serviceAccountId: r.serviceAccountId,\n });\n }),\n );\n return { continuationToken: response.continuationToken, events: events };\n }\n\n protected parseDates() {\n let dates: string[] = null;\n try {\n dates = this.eventService.formatDateFilters(this.start, this.end);\n } catch (e) {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"invalidDateRange\"),\n );\n return null;\n }\n return dates;\n }\n\n protected appApiPromiseUnfulfilled() {\n return this.refreshPromise != null || this.morePromise != null || this.exportPromise != null;\n }\n\n private async export(start: string, end: string) {\n let continuationToken = this.continuationToken;\n let events = [].concat(this.events);\n\n while (continuationToken != null) {\n const result = await this.loadAndParseEvents(start, end, continuationToken);\n continuationToken = result.continuationToken;\n events = events.concat(result.events);\n }\n\n const data = await this.exportService.getEventExport(events);\n const fileName = this.exportService.getFileName(this.exportFileName, \"csv\");\n this.fileDownloadService.download({\n fileName,\n blobData: data,\n blobOptions: { type: \"text/plain\" },\n });\n }\n}\n","
\n \n
\n","import { Component, EventEmitter, Input, OnInit, Output } from \"@angular/core\";\n\nimport { OrganizationManagementPreferencesService } from \"@bitwarden/common/admin-console/abstractions/organization-management-preferences/organization-management-preferences.service\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\n\n@Component({\n selector: \"app-user-confirm\",\n templateUrl: \"user-confirm.component.html\",\n})\nexport class UserConfirmComponent implements OnInit {\n @Input() name: string;\n @Input() userId: string;\n @Input() publicKey: Uint8Array;\n @Output() onConfirmedUser = new EventEmitter();\n\n dontAskAgain = false;\n loading = true;\n fingerprint: string;\n formPromise: Promise;\n\n constructor(\n private cryptoService: CryptoService,\n private logService: LogService,\n private organizationManagementPreferencesService: OrganizationManagementPreferencesService,\n ) {}\n\n async ngOnInit() {\n try {\n if (this.publicKey != null) {\n const fingerprint = await this.cryptoService.getFingerprint(this.userId, this.publicKey);\n if (fingerprint != null) {\n this.fingerprint = fingerprint.join(\"-\");\n }\n }\n } catch (e) {\n this.logService.error(e);\n }\n this.loading = false;\n }\n\n async submit() {\n if (this.loading) {\n return;\n }\n\n if (this.dontAskAgain) {\n await this.organizationManagementPreferencesService.autoConfirmFingerPrints.set(true);\n }\n\n this.onConfirmedUser.emit();\n }\n}\n","import { Directive, ViewChild, ViewContainerRef } from \"@angular/core\";\nimport { firstValueFrom } from \"rxjs\";\n\nimport { SearchPipe } from \"@bitwarden/angular/pipes/search.pipe\";\nimport { UserNamePipe } from \"@bitwarden/angular/pipes/user-name.pipe\";\nimport { ModalService } from \"@bitwarden/angular/services/modal.service\";\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { SearchService } from \"@bitwarden/common/abstractions/search.service\";\nimport { OrganizationManagementPreferencesService } from \"@bitwarden/common/admin-console/abstractions/organization-management-preferences/organization-management-preferences.service\";\nimport {\n OrganizationUserStatusType,\n OrganizationUserType,\n ProviderUserStatusType,\n ProviderUserType,\n} from \"@bitwarden/common/admin-console/enums\";\nimport { ProviderUserUserDetailsResponse } from \"@bitwarden/common/admin-console/models/response/provider/provider-user.response\";\nimport { ListResponse } from \"@bitwarden/common/models/response/list.response\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { ValidationService } from \"@bitwarden/common/platform/abstractions/validation.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\nimport { DialogService } from \"@bitwarden/components\";\n\nimport { OrganizationUserView } from \"../organizations/core/views/organization-user.view\";\nimport { UserConfirmComponent } from \"../organizations/manage/user-confirm.component\";\n\ntype StatusType = OrganizationUserStatusType | ProviderUserStatusType;\n\nconst MaxCheckedCount = 500;\n\n@Directive()\nexport abstract class BasePeopleComponent<\n UserType extends ProviderUserUserDetailsResponse | OrganizationUserView,\n> {\n @ViewChild(\"confirmTemplate\", { read: ViewContainerRef, static: true })\n confirmModalRef: ViewContainerRef;\n\n get allCount() {\n return this.activeUsers != null ? this.activeUsers.length : 0;\n }\n\n get invitedCount() {\n return this.statusMap.has(this.userStatusType.Invited)\n ? this.statusMap.get(this.userStatusType.Invited).length\n : 0;\n }\n\n get acceptedCount() {\n return this.statusMap.has(this.userStatusType.Accepted)\n ? this.statusMap.get(this.userStatusType.Accepted).length\n : 0;\n }\n\n get confirmedCount() {\n return this.statusMap.has(this.userStatusType.Confirmed)\n ? this.statusMap.get(this.userStatusType.Confirmed).length\n : 0;\n }\n\n get revokedCount() {\n return this.statusMap.has(this.userStatusType.Revoked)\n ? this.statusMap.get(this.userStatusType.Revoked).length\n : 0;\n }\n\n get showConfirmUsers(): boolean {\n return (\n this.activeUsers != null &&\n this.statusMap != null &&\n this.activeUsers.length > 1 &&\n this.confirmedCount > 0 &&\n this.confirmedCount < 3 &&\n this.acceptedCount > 0\n );\n }\n\n get showBulkConfirmUsers(): boolean {\n return this.acceptedCount > 0;\n }\n\n abstract userType: typeof OrganizationUserType | typeof ProviderUserType;\n abstract userStatusType: typeof OrganizationUserStatusType | typeof ProviderUserStatusType;\n\n loading = true;\n statusMap = new Map();\n status: StatusType;\n users: UserType[] = [];\n pagedUsers: UserType[] = [];\n searchText: string;\n actionPromise: Promise;\n\n protected allUsers: UserType[] = [];\n protected activeUsers: UserType[] = [];\n\n protected didScroll = false;\n protected pageSize = 100;\n\n private pagedUsersCount = 0;\n\n constructor(\n protected apiService: ApiService,\n private searchService: SearchService,\n protected i18nService: I18nService,\n protected platformUtilsService: PlatformUtilsService,\n protected cryptoService: CryptoService,\n protected validationService: ValidationService,\n protected modalService: ModalService,\n private logService: LogService,\n private searchPipe: SearchPipe,\n protected userNamePipe: UserNamePipe,\n protected dialogService: DialogService,\n protected organizationManagementPreferencesService: OrganizationManagementPreferencesService,\n ) {}\n\n abstract edit(user: UserType): void;\n abstract getUsers(): Promise | UserType[]>;\n abstract deleteUser(id: string): Promise;\n abstract revokeUser(id: string): Promise;\n abstract restoreUser(id: string): Promise;\n abstract reinviteUser(id: string): Promise;\n abstract confirmUser(user: UserType, publicKey: Uint8Array): Promise;\n\n async load() {\n const response = await this.getUsers();\n this.statusMap.clear();\n this.activeUsers = [];\n for (const status of Utils.iterateEnum(this.userStatusType)) {\n this.statusMap.set(status, []);\n }\n\n if (response instanceof ListResponse) {\n this.allUsers = response.data != null && response.data.length > 0 ? response.data : [];\n } else if (Array.isArray(response)) {\n this.allUsers = response;\n }\n\n this.allUsers.sort(\n Utils.getSortFunction(\n this.i18nService,\n \"email\",\n ),\n );\n this.allUsers.forEach((u) => {\n if (!this.statusMap.has(u.status)) {\n this.statusMap.set(u.status, [u]);\n } else {\n this.statusMap.get(u.status).push(u);\n }\n if (u.status !== this.userStatusType.Revoked) {\n this.activeUsers.push(u);\n }\n });\n this.filter(this.status);\n this.loading = false;\n }\n\n filter(status: StatusType) {\n this.status = status;\n if (this.status != null) {\n this.users = this.statusMap.get(this.status);\n } else {\n this.users = this.activeUsers;\n }\n // Reset checkbox selecton\n this.selectAll(false);\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.resetPaging();\n }\n\n loadMore() {\n if (!this.users || this.users.length <= this.pageSize) {\n return;\n }\n const pagedLength = this.pagedUsers.length;\n let pagedSize = this.pageSize;\n if (pagedLength === 0 && this.pagedUsersCount > this.pageSize) {\n pagedSize = this.pagedUsersCount;\n }\n if (this.users.length > pagedLength) {\n this.pagedUsers = this.pagedUsers.concat(\n this.users.slice(pagedLength, pagedLength + pagedSize),\n );\n }\n this.pagedUsersCount = this.pagedUsers.length;\n this.didScroll = this.pagedUsers.length > this.pageSize;\n }\n\n checkUser(user: UserType, select?: boolean) {\n (user as any).checked = select == null ? !(user as any).checked : select;\n }\n\n selectAll(select: boolean) {\n if (select) {\n this.selectAll(false);\n }\n\n const filteredUsers = this.searchPipe.transform(\n this.users,\n this.searchText,\n \"name\",\n \"email\",\n \"id\",\n );\n\n const selectCount =\n select && filteredUsers.length > MaxCheckedCount ? MaxCheckedCount : filteredUsers.length;\n for (let i = 0; i < selectCount; i++) {\n this.checkUser(filteredUsers[i], select);\n }\n }\n\n async resetPaging() {\n this.pagedUsers = [];\n this.loadMore();\n }\n\n invite() {\n this.edit(null);\n }\n\n protected async removeUserConfirmationDialog(user: UserType) {\n return this.dialogService.openSimpleDialog({\n title: this.userNamePipe.transform(user),\n content: { key: \"removeUserConfirmation\" },\n type: \"warning\",\n });\n }\n\n async remove(user: UserType) {\n const confirmed = await this.removeUserConfirmationDialog(user);\n if (!confirmed) {\n return false;\n }\n\n this.actionPromise = this.deleteUser(user.id);\n try {\n await this.actionPromise;\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"removedUserId\", this.userNamePipe.transform(user)),\n );\n this.removeUser(user);\n } catch (e) {\n this.validationService.showError(e);\n }\n this.actionPromise = null;\n }\n\n protected async revokeUserConfirmationDialog(user: UserType) {\n return this.dialogService.openSimpleDialog({\n title: { key: \"revokeAccess\", placeholders: [this.userNamePipe.transform(user)] },\n content: this.revokeWarningMessage(),\n acceptButtonText: { key: \"revokeAccess\" },\n type: \"warning\",\n });\n }\n\n async revoke(user: UserType) {\n const confirmed = await this.revokeUserConfirmationDialog(user);\n\n if (!confirmed) {\n return false;\n }\n\n this.actionPromise = this.revokeUser(user.id);\n try {\n await this.actionPromise;\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"revokedUserId\", this.userNamePipe.transform(user)),\n );\n await this.load();\n } catch (e) {\n this.validationService.showError(e);\n }\n this.actionPromise = null;\n }\n\n async restore(user: UserType) {\n this.actionPromise = this.restoreUser(user.id);\n try {\n await this.actionPromise;\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"restoredUserId\", this.userNamePipe.transform(user)),\n );\n await this.load();\n } catch (e) {\n this.validationService.showError(e);\n }\n this.actionPromise = null;\n }\n\n async reinvite(user: UserType) {\n if (this.actionPromise != null) {\n return;\n }\n\n this.actionPromise = this.reinviteUser(user.id);\n try {\n await this.actionPromise;\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"hasBeenReinvited\", this.userNamePipe.transform(user)),\n );\n } catch (e) {\n this.validationService.showError(e);\n }\n this.actionPromise = null;\n }\n\n async confirm(user: UserType) {\n function updateUser(self: BasePeopleComponent) {\n user.status = self.userStatusType.Confirmed;\n const mapIndex = self.statusMap.get(self.userStatusType.Accepted).indexOf(user);\n if (mapIndex > -1) {\n self.statusMap.get(self.userStatusType.Accepted).splice(mapIndex, 1);\n self.statusMap.get(self.userStatusType.Confirmed).push(user);\n }\n }\n\n const confirmUser = async (publicKey: Uint8Array) => {\n try {\n this.actionPromise = this.confirmUser(user, publicKey);\n await this.actionPromise;\n updateUser(this);\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"hasBeenConfirmed\", this.userNamePipe.transform(user)),\n );\n } catch (e) {\n this.validationService.showError(e);\n throw e;\n } finally {\n this.actionPromise = null;\n }\n };\n\n if (this.actionPromise != null) {\n return;\n }\n\n try {\n const publicKeyResponse = await this.apiService.getUserPublicKey(user.userId);\n const publicKey = Utils.fromB64ToArray(publicKeyResponse.publicKey);\n\n const autoConfirm = await firstValueFrom(\n this.organizationManagementPreferencesService.autoConfirmFingerPrints.state$,\n );\n if (autoConfirm == null || !autoConfirm) {\n const [modal] = await this.modalService.openViewRef(\n UserConfirmComponent,\n this.confirmModalRef,\n (comp) => {\n comp.name = this.userNamePipe.transform(user);\n comp.userId = user != null ? user.userId : null;\n comp.publicKey = publicKey;\n // eslint-disable-next-line rxjs/no-async-subscribe\n comp.onConfirmedUser.subscribe(async () => {\n try {\n comp.formPromise = confirmUser(publicKey);\n await comp.formPromise;\n modal.close();\n } catch (e) {\n this.logService.error(e);\n }\n });\n },\n );\n return;\n }\n\n try {\n const fingerprint = await this.cryptoService.getFingerprint(user.userId, publicKey);\n this.logService.info(`User's fingerprint: ${fingerprint.join(\"-\")}`);\n } catch (e) {\n this.logService.error(e);\n }\n await confirmUser(publicKey);\n } catch (e) {\n this.logService.error(`Handled exception: ${e}`);\n }\n }\n\n isSearching() {\n return this.searchService.isSearchable(this.searchText);\n }\n\n isPaging() {\n const searching = this.isSearching();\n if (searching && this.didScroll) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.resetPaging();\n }\n return !searching && this.users && this.users.length > this.pageSize;\n }\n\n protected revokeWarningMessage(): string {\n return this.i18nService.t(\"revokeUserConfirmation\");\n }\n\n protected getCheckedUsers() {\n return this.users.filter((u) => (u as any).checked);\n }\n\n protected removeUser(user: UserType) {\n let index = this.users.indexOf(user);\n if (index > -1) {\n this.users.splice(index, 1);\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.resetPaging();\n }\n\n index = this.allUsers.indexOf(user);\n if (index > -1) {\n this.allUsers.splice(index, 1);\n }\n\n if (this.statusMap.has(user.status)) {\n index = this.statusMap.get(user.status).indexOf(user);\n if (index > -1) {\n this.statusMap.get(user.status).splice(index, 1);\n }\n }\n }\n}\n","import { BasePolicy } from \"../organizations/policies\";\n\nexport class PolicyListService {\n private policies: BasePolicy[] = [];\n\n addPolicies(policies: BasePolicy[]) {\n this.policies.push(...policies);\n }\n\n getPolicies(): BasePolicy[] {\n return this.policies;\n }\n}\n","import { NgModule } from \"@angular/core\";\n\n@NgModule({})\nexport class CoreOrganizationModule {}\n","import { SelectionReadOnlyResponse } from \"@bitwarden/common/admin-console/models/response/selection-read-only.response\";\nimport { BaseResponse } from \"@bitwarden/common/models/response/base.response\";\n\nexport class GroupResponse extends BaseResponse {\n id: string;\n organizationId: string;\n name: string;\n /**\n * @deprecated\n * To be removed after Flexible Collections.\n **/\n accessAll: boolean;\n externalId: string;\n\n constructor(response: any) {\n super(response);\n this.id = this.getResponseProperty(\"Id\");\n this.organizationId = this.getResponseProperty(\"OrganizationId\");\n this.name = this.getResponseProperty(\"Name\");\n this.accessAll = this.getResponseProperty(\"AccessAll\");\n this.externalId = this.getResponseProperty(\"ExternalId\");\n }\n}\n\nexport class GroupDetailsResponse extends GroupResponse {\n collections: SelectionReadOnlyResponse[] = [];\n\n constructor(response: any) {\n super(response);\n const collections = this.getResponseProperty(\"Collections\");\n if (collections != null) {\n this.collections = collections.map((c: any) => new SelectionReadOnlyResponse(c));\n }\n }\n}\n","import { View } from \"@bitwarden/common/src/models/view/view\";\n\nimport { GroupDetailsResponse, GroupResponse } from \"../services/group/responses/group.response\";\n\nimport { CollectionAccessSelectionView } from \"./collection-access-selection.view\";\n\nexport class GroupView implements View {\n id: string;\n organizationId: string;\n name: string;\n /**\n * @deprecated\n * To be removed after Flexible Collections.\n * This will always return `false` if Flexible Collections is enabled.\n **/\n accessAll: boolean;\n externalId: string;\n collections: CollectionAccessSelectionView[] = [];\n members: string[] = [];\n\n static fromResponse(response: GroupResponse): GroupView {\n const view: GroupView = Object.assign(new GroupView(), response) as GroupView;\n\n if (response instanceof GroupDetailsResponse && response.collections != undefined) {\n view.collections = response.collections.map((c) => new CollectionAccessSelectionView(c));\n }\n\n return view;\n }\n}\n","import { SelectionReadOnlyRequest } from \"@bitwarden/common/admin-console/models/request/selection-read-only.request\";\n\nexport class GroupRequest {\n name: string;\n accessAll: boolean;\n collections: SelectionReadOnlyRequest[] = [];\n users: string[] = [];\n}\n","export class OrganizationGroupBulkRequest {\n ids: string[];\n\n constructor(ids: string[]) {\n this.ids = ids == null ? [] : ids;\n }\n}\n","import { Injectable } from \"@angular/core\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { SelectionReadOnlyRequest } from \"@bitwarden/common/admin-console/models/request/selection-read-only.request\";\nimport { ListResponse } from \"@bitwarden/common/models/response/list.response\";\nimport { ConfigServiceAbstraction } from \"@bitwarden/common/platform/abstractions/config/config.service.abstraction\";\n\nimport { CoreOrganizationModule } from \"../../core-organization.module\";\nimport { GroupView } from \"../../views/group.view\";\n\nimport { GroupRequest } from \"./requests/group.request\";\nimport { OrganizationGroupBulkRequest } from \"./requests/organization-group-bulk.request\";\nimport { GroupDetailsResponse, GroupResponse } from \"./responses/group.response\";\n\n@Injectable({\n providedIn: \"root\",\n})\nexport class GroupService {\n constructor(\n protected apiService: ApiService,\n protected configService: ConfigServiceAbstraction,\n ) {}\n\n async get(orgId: string, groupId: string): Promise {\n const r = await this.apiService.send(\n \"GET\",\n \"/organizations/\" + orgId + \"/groups/\" + groupId + \"/details\",\n null,\n true,\n true,\n );\n\n return GroupView.fromResponse(new GroupDetailsResponse(r));\n }\n\n async getAll(orgId: string): Promise {\n const r = await this.apiService.send(\n \"GET\",\n \"/organizations/\" + orgId + \"/groups\",\n null,\n true,\n true,\n );\n\n const listResponse = new ListResponse(r, GroupDetailsResponse);\n\n return Promise.all(listResponse.data?.map((gr) => GroupView.fromResponse(gr))) ?? [];\n }\n}\n\n@Injectable({ providedIn: CoreOrganizationModule })\nexport class InternalGroupService extends GroupService {\n constructor(\n protected apiService: ApiService,\n protected configService: ConfigServiceAbstraction,\n ) {\n super(apiService, configService);\n }\n\n async delete(orgId: string, groupId: string): Promise {\n await this.apiService.send(\n \"DELETE\",\n \"/organizations/\" + orgId + \"/groups/\" + groupId,\n null,\n true,\n false,\n );\n }\n\n async deleteMany(orgId: string, groupIds: string[]): Promise {\n await this.apiService.send(\n \"DELETE\",\n \"/organizations/\" + orgId + \"/groups\",\n new OrganizationGroupBulkRequest(groupIds),\n true,\n true,\n );\n }\n\n async save(group: GroupView): Promise {\n const request = new GroupRequest();\n request.name = group.name;\n request.accessAll = group.accessAll;\n request.users = group.members;\n request.collections = group.collections.map(\n (c) => new SelectionReadOnlyRequest(c.id, c.readOnly, c.hidePasswords, c.manage),\n );\n\n if (group.id == undefined) {\n return await this.postGroup(group.organizationId, request);\n } else {\n return await this.putGroup(group.organizationId, group.id, request);\n }\n }\n\n private async postGroup(organizationId: string, request: GroupRequest): Promise {\n const r = await this.apiService.send(\n \"POST\",\n \"/organizations/\" + organizationId + \"/groups\",\n request,\n true,\n true,\n );\n return GroupView.fromResponse(new GroupResponse(r));\n }\n\n private async putGroup(\n organizationId: string,\n id: string,\n request: GroupRequest,\n ): Promise {\n const r = await this.apiService.send(\n \"PUT\",\n \"/organizations/\" + organizationId + \"/groups/\" + id,\n request,\n true,\n true,\n );\n return GroupView.fromResponse(new GroupResponse(r));\n }\n}\n","import { OrganizationUserType } from \"../../../enums\";\nimport { PermissionsApi } from \"../../../models/api/permissions.api\";\nimport { SelectionReadOnlyRequest } from \"../../../models/request/selection-read-only.request\";\n\nexport class OrganizationUserUpdateRequest {\n type: OrganizationUserType;\n accessAll: boolean;\n accessSecretsManager: boolean;\n collections: SelectionReadOnlyRequest[] = [];\n groups: string[] = [];\n permissions: PermissionsApi;\n}\n","import { OrganizationUserType } from \"../../../enums\";\nimport { PermissionsApi } from \"../../../models/api/permissions.api\";\nimport { SelectionReadOnlyRequest } from \"../../../models/request/selection-read-only.request\";\n\nexport class OrganizationUserInviteRequest {\n emails: string[] = [];\n type: OrganizationUserType;\n accessAll: boolean;\n accessSecretsManager: boolean;\n collections: SelectionReadOnlyRequest[] = [];\n groups: string[];\n permissions: PermissionsApi;\n}\n","import {\n OrganizationUserStatusType,\n OrganizationUserType,\n} from \"@bitwarden/common/admin-console/enums\";\nimport { PermissionsApi } from \"@bitwarden/common/admin-console/models/api/permissions.api\";\n\nimport { CollectionAccessSelectionView } from \"./collection-access-selection.view\";\n\nexport class OrganizationUserAdminView {\n id: string;\n userId: string;\n organizationId: string;\n type: OrganizationUserType;\n status: OrganizationUserStatusType;\n externalId: string;\n /**\n * @deprecated\n * To be removed after Flexible Collections.\n * This will always return `false` if Flexible Collections is enabled.\n **/\n accessAll: boolean;\n permissions: PermissionsApi;\n resetPasswordEnrolled: boolean;\n hasMasterPassword: boolean;\n\n collections: CollectionAccessSelectionView[] = [];\n groups: string[] = [];\n\n accessSecretsManager: boolean;\n}\n","import { Injectable } from \"@angular/core\";\n\nimport { OrganizationUserService } from \"@bitwarden/common/admin-console/abstractions/organization-user/organization-user.service\";\nimport {\n OrganizationUserInviteRequest,\n OrganizationUserUpdateRequest,\n} from \"@bitwarden/common/admin-console/abstractions/organization-user/requests\";\nimport { OrganizationUserDetailsResponse } from \"@bitwarden/common/admin-console/abstractions/organization-user/responses\";\nimport { ConfigServiceAbstraction } from \"@bitwarden/common/platform/abstractions/config/config.service.abstraction\";\n\nimport { CoreOrganizationModule } from \"../core-organization.module\";\nimport { OrganizationUserAdminView } from \"../views/organization-user-admin-view\";\n\n@Injectable({ providedIn: CoreOrganizationModule })\nexport class UserAdminService {\n constructor(\n private configService: ConfigServiceAbstraction,\n private organizationUserService: OrganizationUserService,\n ) {}\n\n async get(\n organizationId: string,\n organizationUserId: string,\n ): Promise {\n const userResponse = await this.organizationUserService.getOrganizationUser(\n organizationId,\n organizationUserId,\n {\n includeGroups: true,\n },\n );\n\n if (userResponse == null) {\n return undefined;\n }\n\n const [view] = await this.decryptMany(organizationId, [userResponse]);\n\n return view;\n }\n\n async save(user: OrganizationUserAdminView): Promise {\n const request = new OrganizationUserUpdateRequest();\n request.accessAll = user.accessAll;\n request.permissions = user.permissions;\n request.type = user.type;\n request.collections = user.collections;\n request.groups = user.groups;\n request.accessSecretsManager = user.accessSecretsManager;\n\n await this.organizationUserService.putOrganizationUser(user.organizationId, user.id, request);\n }\n\n async invite(emails: string[], user: OrganizationUserAdminView): Promise {\n const request = new OrganizationUserInviteRequest();\n request.emails = emails;\n request.accessAll = user.accessAll;\n request.permissions = user.permissions;\n request.type = user.type;\n request.collections = user.collections;\n request.groups = user.groups;\n request.accessSecretsManager = user.accessSecretsManager;\n\n await this.organizationUserService.postOrganizationUserInvite(user.organizationId, request);\n }\n\n private async decryptMany(\n organizationId: string,\n users: OrganizationUserDetailsResponse[],\n ): Promise {\n const promises = users.map(async (u) => {\n const view = new OrganizationUserAdminView();\n\n view.id = u.id;\n view.organizationId = organizationId;\n view.userId = u.userId;\n view.type = u.type;\n view.status = u.status;\n view.externalId = u.externalId;\n view.accessAll = u.accessAll;\n view.permissions = u.permissions;\n view.resetPasswordEnrolled = u.resetPasswordEnrolled;\n view.collections = u.collections.map((c) => ({\n id: c.id,\n hidePasswords: c.hidePasswords,\n readOnly: c.readOnly,\n manage: c.manage,\n }));\n view.groups = u.groups;\n view.accessSecretsManager = u.accessSecretsManager;\n view.hasMasterPassword = u.hasMasterPassword;\n\n return view;\n });\n\n return await Promise.all(promises);\n }\n}\n","import { View } from \"@bitwarden/common/models/view/view\";\n\ninterface SelectionResponseLike {\n id: string;\n readOnly: boolean;\n hidePasswords: boolean;\n manage: boolean;\n}\n\nexport class CollectionAccessSelectionView extends View {\n readonly id: string;\n readonly readOnly: boolean;\n readonly hidePasswords: boolean;\n readonly manage: boolean;\n\n constructor(response?: SelectionResponseLike) {\n super();\n\n if (!response) {\n return;\n }\n\n this.id = response.id;\n this.readOnly = response.readOnly;\n this.hidePasswords = response.hidePasswords;\n this.manage = response.manage;\n }\n}\n","import { NgModule } from \"@angular/core\";\n\nimport { SharedModule } from \"../../../shared\";\n\nimport { OrganizationInformationComponent } from \"./organization-information.component\";\n\n@NgModule({\n imports: [SharedModule],\n declarations: [OrganizationInformationComponent],\n exports: [OrganizationInformationComponent],\n})\nexport class OrganizationCreateModule {}\n","
\n \n {{ \"organizationName\" | i18n }}\n \n \n
\n
\n

{{ \"generalInformation\" | i18n }}

\n
\n \n {{ \"organizationName\" | i18n }}\n \n \n \n {{ \"billingEmail\" | i18n }}\n \n \n \n {{ \"clientOwnerEmail\" | i18n }}\n \n \n
\n
\n \n {{ \"accountOwnedBusiness\" | i18n }}\n
\n \n {{ \"businessName\" | i18n }}\n \n \n
\n
\n
\n","import { Component, EventEmitter, Input, Output } from \"@angular/core\";\nimport { UntypedFormGroup } from \"@angular/forms\";\n\n@Component({\n selector: \"app-org-info\",\n templateUrl: \"organization-information.component.html\",\n})\nexport class OrganizationInformationComponent {\n @Input() nameOnly = false;\n @Input() createOrganization = true;\n @Input() isProvider = false;\n @Input() acceptingSponsorship = false;\n @Input() formGroup: UntypedFormGroup;\n @Output() changedBusinessOwned = new EventEmitter();\n}\n","import { Injectable } from \"@angular/core\";\nimport { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from \"@angular/router\";\n\nimport {\n canAccessOrgAdmin,\n OrganizationService,\n} from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { SyncService } from \"@bitwarden/common/vault/abstractions/sync/sync.service.abstraction\";\n\n@Injectable({\n providedIn: \"root\",\n})\nexport class OrganizationPermissionsGuard implements CanActivate {\n constructor(\n private router: Router,\n private organizationService: OrganizationService,\n private platformUtilsService: PlatformUtilsService,\n private i18nService: I18nService,\n private syncService: SyncService,\n ) {}\n\n async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {\n // TODO: We need to fix this issue once and for all.\n if ((await this.syncService.getLastSync()) == null) {\n await this.syncService.fullSync(false);\n }\n\n const org = await this.organizationService.get(route.params.organizationId);\n if (org == null) {\n return this.router.createUrlTree([\"/\"]);\n }\n\n if (!org.isOwner && !org.enabled) {\n this.platformUtilsService.showToast(\n \"error\",\n null,\n this.i18nService.t(\"organizationIsDisabled\"),\n );\n return this.router.createUrlTree([\"/\"]);\n }\n\n const permissionsCallback: (organization: Organization) => boolean =\n route.data?.organizationPermissions;\n const hasPermissions = permissionsCallback == null || permissionsCallback(org);\n\n if (!hasPermissions) {\n // Handle linkable ciphers for organizations the user only has view access to\n // https://bitwarden.atlassian.net/browse/EC-203\n const cipherId =\n state.root.queryParamMap.get(\"itemId\") || state.root.queryParamMap.get(\"cipherId\");\n if (cipherId) {\n return this.router.createUrlTree([\"/vault\"], {\n queryParams: {\n itemId: cipherId,\n },\n });\n }\n\n this.platformUtilsService.showToast(\"error\", null, this.i18nService.t(\"accessDenied\"));\n return canAccessOrgAdmin(org)\n ? this.router.createUrlTree([\"/organizations\", org.id])\n : this.router.createUrlTree([\"/\"]);\n }\n\n return true;\n }\n}\n","import { svgIcon } from \"@bitwarden/components\";\n\nexport const AdminConsoleLogo = svgIcon`\n\n`;\n","\n
\n\n \n \n {{ \"accessingUsingProvider\" | i18n: organization.providerName }}\n \n \n \n\n \n\n","import { CommonModule } from \"@angular/common\";\nimport { Component, OnDestroy, OnInit } from \"@angular/core\";\nimport { ActivatedRoute, RouterModule } from \"@angular/router\";\nimport { map, mergeMap, Observable, Subject, takeUntil } from \"rxjs\";\n\nimport { JslibModule } from \"@bitwarden/angular/jslib.module\";\nimport {\n canAccessBillingTab,\n canAccessGroupsTab,\n canAccessMembersTab,\n canAccessOrgAdmin,\n canAccessReportingTab,\n canAccessSettingsTab,\n canAccessVaultTab,\n getOrganizationById,\n OrganizationService,\n} from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\nimport { FeatureFlag } from \"@bitwarden/common/enums/feature-flag.enum\";\nimport { ConfigServiceAbstraction as ConfigService } from \"@bitwarden/common/platform/abstractions/config/config.service.abstraction\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { BannerModule, IconModule, LayoutComponent, NavigationModule } from \"@bitwarden/components\";\n\nimport { PaymentMethodWarningsModule } from \"../../../billing/shared\";\nimport { OrgSwitcherComponent } from \"../../../layouts/org-switcher/org-switcher.component\";\nimport { AdminConsoleLogo } from \"../../icons/admin-console-logo\";\n\n@Component({\n selector: \"app-organization-layout\",\n templateUrl: \"organization-layout.component.html\",\n standalone: true,\n imports: [\n CommonModule,\n RouterModule,\n JslibModule,\n LayoutComponent,\n IconModule,\n NavigationModule,\n OrgSwitcherComponent,\n BannerModule,\n PaymentMethodWarningsModule,\n ],\n})\nexport class OrganizationLayoutComponent implements OnInit, OnDestroy {\n protected readonly logo = AdminConsoleLogo;\n\n protected orgFilter = (org: Organization) => canAccessOrgAdmin(org);\n\n organization$: Observable;\n showPaymentAndHistory$: Observable;\n\n private _destroy = new Subject();\n\n protected showPaymentMethodWarningBanners$ = this.configService.getFeatureFlag$(\n FeatureFlag.ShowPaymentMethodWarningBanners,\n false,\n );\n\n constructor(\n private route: ActivatedRoute,\n private organizationService: OrganizationService,\n private platformUtilsService: PlatformUtilsService,\n private configService: ConfigService,\n ) {}\n\n async ngOnInit() {\n document.body.classList.remove(\"layout_frontend\");\n\n this.organization$ = this.route.params\n .pipe(takeUntil(this._destroy))\n .pipe(map((p) => p.organizationId))\n .pipe(\n mergeMap((id) => {\n return this.organizationService.organizations$\n .pipe(takeUntil(this._destroy))\n .pipe(getOrganizationById(id));\n }),\n );\n\n this.showPaymentAndHistory$ = this.organization$.pipe(\n map(\n (org) =>\n !this.platformUtilsService.isSelfHost() &&\n org?.canViewBillingHistory &&\n org?.canEditPaymentMethods,\n ),\n );\n }\n\n ngOnDestroy() {\n this._destroy.next();\n this._destroy.complete();\n }\n\n canShowVaultTab(organization: Organization): boolean {\n return canAccessVaultTab(organization);\n }\n\n canShowSettingsTab(organization: Organization): boolean {\n return canAccessSettingsTab(organization);\n }\n\n canShowMembersTab(organization: Organization): boolean {\n return canAccessMembersTab(organization);\n }\n\n canShowGroupsTab(organization: Organization): boolean {\n return canAccessGroupsTab(organization);\n }\n\n canShowReportsTab(organization: Organization): boolean {\n return canAccessReportingTab(organization);\n }\n\n canShowBillingTab(organization: Organization): boolean {\n return canAccessBillingTab(organization);\n }\n\n getReportTabLabel(organization: Organization): string {\n return organization.useEvents ? \"reporting\" : \"reports\";\n }\n}\n","\n \n {{ \"eventLogs\" | i18n }}\n {{ name }}\n \n
\n
\n
\n
\n \n \n \n \n
\n -\n
\n \n \n \n \n
\n \n
\n
\n
\n
\n {{ \"noEventsInList\" | i18n }}\n
\n \n \n \n {{ \"timestamp\" | i18n }}\n \n {{ \"client\" | i18n }}\n \n {{ \"member\" | i18n }}\n {{ \"event\" | i18n }}\n \n \n \n \n {{ r.date | date: \"medium\" }}\n \n \n {{ r.appName }}, {{ r.ip }}\n \n \n {{ r.userName }}\n \n \n \n \n \n \n {{ \"loadMore\" | i18n }}\n \n
\n \n \n \n
\n","import { DIALOG_DATA, DialogConfig } from \"@angular/cdk/dialog\";\nimport { Component, Inject, OnInit } from \"@angular/core\";\nimport { FormBuilder } from \"@angular/forms\";\n\nimport { UserNamePipe } from \"@bitwarden/angular/pipes/user-name.pipe\";\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { OrganizationUserService } from \"@bitwarden/common/admin-console/abstractions/organization-user/organization-user.service\";\nimport { EventResponse } from \"@bitwarden/common/models/response/event.response\";\nimport { ListResponse } from \"@bitwarden/common/models/response/list.response\";\nimport { EventView } from \"@bitwarden/common/models/view/event.view\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { ValidationService } from \"@bitwarden/common/platform/abstractions/validation.service\";\nimport { DialogService, TableDataSource } from \"@bitwarden/components\";\n\nimport { EventService } from \"../../../core\";\nimport { SharedModule } from \"../../../shared\";\n\nexport interface EntityEventsDialogParams {\n entity: \"user\" | \"cipher\";\n entityId: string;\n\n organizationId?: string;\n providerId?: string;\n showUser?: boolean;\n name?: string;\n}\n\n@Component({\n imports: [SharedModule],\n templateUrl: \"entity-events.component.html\",\n standalone: true,\n})\nexport class EntityEventsComponent implements OnInit {\n loading = true;\n continuationToken: string;\n protected dataSource = new TableDataSource();\n protected filterFormGroup = this.formBuilder.group({\n start: [\"\"],\n end: [\"\"],\n });\n\n private orgUsersUserIdMap = new Map();\n private orgUsersIdMap = new Map();\n\n get name() {\n return this.params.name;\n }\n\n get showUser() {\n return this.params.showUser ?? false;\n }\n\n constructor(\n @Inject(DIALOG_DATA) private params: EntityEventsDialogParams,\n private apiService: ApiService,\n private i18nService: I18nService,\n private eventService: EventService,\n private platformUtilsService: PlatformUtilsService,\n private userNamePipe: UserNamePipe,\n private logService: LogService,\n private organizationUserService: OrganizationUserService,\n private formBuilder: FormBuilder,\n private validationService: ValidationService,\n ) {}\n\n async ngOnInit() {\n const defaultDates = this.eventService.getDefaultDateFilters();\n this.filterFormGroup.setValue({\n start: defaultDates[0],\n end: defaultDates[1],\n });\n await this.load();\n }\n\n async load() {\n try {\n if (this.showUser) {\n const response = await this.organizationUserService.getAllUsers(this.params.organizationId);\n response.data.forEach((u) => {\n const name = this.userNamePipe.transform(u);\n this.orgUsersIdMap.set(u.id, { name: name, email: u.email });\n this.orgUsersUserIdMap.set(u.userId, { name: name, email: u.email });\n });\n }\n await this.loadEvents(true);\n } catch (e) {\n this.logService.error(e);\n this.validationService.showError(e);\n }\n\n this.loading = false;\n }\n\n loadMoreEvents = async () => {\n await this.loadEvents(false);\n };\n\n refreshEvents = async () => {\n await this.loadEvents(true);\n };\n\n private async loadEvents(clearExisting: boolean) {\n let dates: string[] = null;\n try {\n dates = this.eventService.formatDateFilters(\n this.filterFormGroup.value.start,\n this.filterFormGroup.value.end,\n );\n } catch (e) {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"invalidDateRange\"),\n );\n return;\n }\n\n let response: ListResponse;\n if (this.params.entity === \"user\" && this.params.providerId) {\n response = await this.apiService.getEventsProviderUser(\n this.params.providerId,\n this.params.entityId,\n dates[0],\n dates[1],\n clearExisting ? null : this.continuationToken,\n );\n } else if (this.params.entity === \"user\") {\n response = await this.apiService.getEventsOrganizationUser(\n this.params.organizationId,\n this.params.entityId,\n dates[0],\n dates[1],\n clearExisting ? null : this.continuationToken,\n );\n } else {\n response = await this.apiService.getEventsCipher(\n this.params.entityId,\n dates[0],\n dates[1],\n clearExisting ? null : this.continuationToken,\n );\n }\n\n this.continuationToken = response.continuationToken;\n const events: EventView[] = await Promise.all(\n response.data.map(async (r) => {\n const userId = r.actingUserId == null ? r.userId : r.actingUserId;\n const eventInfo = await this.eventService.getEventInfo(r);\n const user =\n this.showUser && userId != null && this.orgUsersUserIdMap.has(userId)\n ? this.orgUsersUserIdMap.get(userId)\n : null;\n\n return new EventView({\n message: eventInfo.message,\n humanReadableMessage: eventInfo.humanReadableMessage,\n appIcon: eventInfo.appIcon,\n appName: eventInfo.appName,\n userId: userId,\n userName: user != null ? user.name : this.showUser ? this.i18nService.t(\"unknown\") : null,\n userEmail: user != null ? user.email : this.showUser ? \"\" : null,\n date: r.date,\n ip: r.ipAddress,\n type: r.type,\n installationId: r.installationId,\n systemUser: r.systemUser,\n serviceAccountId: r.serviceAccountId,\n });\n }),\n );\n\n if (!clearExisting && this.dataSource.data != null && this.dataSource.data.length > 0) {\n this.dataSource.data = this.dataSource.data.concat(events);\n } else {\n this.dataSource.data = events;\n }\n }\n}\n\n/**\n * Strongly typed helper to open a EntityEventsComponent as a dialog\n * @param dialogService Instance of the dialog service that will be used to open the dialog\n * @param config Configuration for the dialog\n */\nexport const openEntityEventsDialog = (\n dialogService: DialogService,\n config: DialogConfig,\n) => {\n return dialogService.open(EntityEventsComponent, config);\n};\n","type OrganizationUserBulkRequestEntry = {\n id: string;\n key: string;\n};\n\nexport class OrganizationUserBulkConfirmRequest {\n keys: OrganizationUserBulkRequestEntry[];\n\n constructor(keys: OrganizationUserBulkRequestEntry[]) {\n this.keys = keys;\n }\n}\n","
\n
\n
\n
\n

\n {{ \"confirmUsers\" | i18n }}\n

\n \n ×\n \n
\n
\n
\n \n {{ \"loading\" | i18n }}\n
\n \n {{ \"noSelectedUsersApplicable\" | i18n }}\n \n \n {{ error }}\n \n \n

\n {{ \"fingerprintEnsureIntegrityVerify\" | i18n }}\n \n {{ \"learnMore\" | i18n }}\n

\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
{{ \"user\" | i18n }}{{ \"fingerprint\" | i18n }}
\n \n \n {{ user.email }}\n {{ user.name }}\n \n {{ fingerprints.get(user.id) }}\n
\n \n \n {{ user.email }}\n {{ user.name }}\n \n {{ \"bulkFilteredMessage\" | i18n }}\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
{{ \"user\" | i18n }}{{ \"status\" | i18n }}
\n \n \n {{ user.email }}\n {{ user.name }}\n \n {{ statuses.get(user.id) }}\n \n {{ \"bulkFilteredMessage\" | i18n }}\n
\n
\n
\n
\n \n \n {{ \"confirm\" | i18n }}\n \n \n
\n
\n
\n
\n","import { Component, Input, OnInit } from \"@angular/core\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { OrganizationUserService } from \"@bitwarden/common/admin-console/abstractions/organization-user/organization-user.service\";\nimport { OrganizationUserBulkConfirmRequest } from \"@bitwarden/common/admin-console/abstractions/organization-user/requests\";\nimport { OrganizationUserStatusType } from \"@bitwarden/common/admin-console/enums\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\nimport { SymmetricCryptoKey } from \"@bitwarden/common/platform/models/domain/symmetric-crypto-key\";\n\nimport { BulkUserDetails } from \"./bulk-status.component\";\n\n@Component({\n selector: \"app-bulk-confirm\",\n templateUrl: \"bulk-confirm.component.html\",\n})\nexport class BulkConfirmComponent implements OnInit {\n @Input() organizationId: string;\n @Input() users: BulkUserDetails[];\n\n excludedUsers: BulkUserDetails[];\n filteredUsers: BulkUserDetails[];\n publicKeys: Map = new Map();\n fingerprints: Map = new Map();\n statuses: Map = new Map();\n\n loading = true;\n done = false;\n error: string;\n\n constructor(\n protected cryptoService: CryptoService,\n protected apiService: ApiService,\n private organizationUserService: OrganizationUserService,\n private i18nService: I18nService,\n ) {}\n\n async ngOnInit() {\n this.excludedUsers = this.users.filter((u) => !this.isAccepted(u));\n this.filteredUsers = this.users.filter((u) => this.isAccepted(u));\n\n if (this.filteredUsers.length <= 0) {\n this.done = true;\n }\n\n const response = await this.getPublicKeys();\n\n for (const entry of response.data) {\n const publicKey = Utils.fromB64ToArray(entry.key);\n const fingerprint = await this.cryptoService.getFingerprint(entry.userId, publicKey);\n if (fingerprint != null) {\n this.publicKeys.set(entry.id, publicKey);\n this.fingerprints.set(entry.id, fingerprint.join(\"-\"));\n }\n }\n\n this.loading = false;\n }\n\n async submit() {\n this.loading = true;\n try {\n const key = await this.getCryptoKey();\n const userIdsWithKeys: any[] = [];\n for (const user of this.filteredUsers) {\n const publicKey = this.publicKeys.get(user.id);\n if (publicKey == null) {\n continue;\n }\n const encryptedKey = await this.cryptoService.rsaEncrypt(key.key, publicKey);\n userIdsWithKeys.push({\n id: user.id,\n key: encryptedKey.encryptedString,\n });\n }\n const response = await this.postConfirmRequest(userIdsWithKeys);\n\n response.data.forEach((entry) => {\n const error = entry.error !== \"\" ? entry.error : this.i18nService.t(\"bulkConfirmMessage\");\n this.statuses.set(entry.id, error);\n });\n\n this.done = true;\n } catch (e) {\n this.error = e.message;\n }\n this.loading = false;\n }\n\n protected isAccepted(user: BulkUserDetails) {\n return user.status === OrganizationUserStatusType.Accepted;\n }\n\n protected async getPublicKeys() {\n return await this.organizationUserService.postOrganizationUsersPublicKey(\n this.organizationId,\n this.filteredUsers.map((user) => user.id),\n );\n }\n\n protected getCryptoKey(): Promise {\n return this.cryptoService.getOrgKey(this.organizationId);\n }\n\n protected async postConfirmRequest(userIdsWithKeys: any[]) {\n const request = new OrganizationUserBulkConfirmRequest(userIdsWithKeys);\n return await this.organizationUserService.postOrganizationUserBulkConfirm(\n this.organizationId,\n request,\n );\n }\n}\n","
\n
\n
\n
\n

\n {{ \"removeUsers\" | i18n }}\n

\n \n ×\n \n
\n
\n \n {{ \"noSelectedUsersApplicable\" | i18n }}\n \n \n {{ error }}\n \n \n 0 && !error\">\n

{{ removeUsersWarning }}

\n

\n {{ \"removeMembersWithoutMasterPasswordWarning\" | i18n }}\n

\n
\n \n \n \n \n \n \n \n \n \n \n \n \n
{{ \"user\" | i18n }}{{ \"details\" | i18n }}
\n \n \n {{ user.email }}\n {{ user.name }}\n \n \n - \n \n \n {{ \"noMasterPassword\" | i18n }}\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
{{ \"user\" | i18n }}{{ \"status\" | i18n }}
\n \n \n {{ user.email }}\n {{ user.name }}\n \n {{ statuses.get(user.id) }}\n \n {{ \"bulkFilteredMessage\" | i18n }}\n
\n
\n
\n
\n 0\"\n [disabled]=\"loading\"\n (click)=\"submit()\"\n >\n \n {{ \"removeUsers\" | i18n }}\n \n \n
\n
\n
\n
\n","import { Component, Input } from \"@angular/core\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { OrganizationUserService } from \"@bitwarden/common/admin-console/abstractions/organization-user/organization-user.service\";\nimport { OrganizationUserStatusType } from \"@bitwarden/common/admin-console/enums\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\n\nimport { BulkUserDetails } from \"./bulk-status.component\";\n\n@Component({\n selector: \"app-bulk-remove\",\n templateUrl: \"bulk-remove.component.html\",\n})\nexport class BulkRemoveComponent {\n @Input() organizationId: string;\n @Input() set users(value: BulkUserDetails[]) {\n this._users = value;\n this.showNoMasterPasswordWarning = this._users.some(\n (u) => u.status > OrganizationUserStatusType.Invited && u.hasMasterPassword === false,\n );\n }\n\n get users(): BulkUserDetails[] {\n return this._users;\n }\n\n private _users: BulkUserDetails[];\n\n statuses: Map = new Map();\n\n loading = false;\n done = false;\n error: string;\n showNoMasterPasswordWarning = false;\n\n constructor(\n protected apiService: ApiService,\n protected i18nService: I18nService,\n private organizationUserService: OrganizationUserService,\n ) {}\n\n async submit() {\n this.loading = true;\n try {\n const response = await this.deleteUsers();\n\n response.data.forEach((entry) => {\n const error = entry.error !== \"\" ? entry.error : this.i18nService.t(\"bulkRemovedMessage\");\n this.statuses.set(entry.id, error);\n });\n this.done = true;\n } catch (e) {\n this.error = e.message;\n }\n\n this.loading = false;\n }\n\n protected async deleteUsers() {\n return await this.organizationUserService.deleteManyOrganizationUsers(\n this.organizationId,\n this.users.map((user) => user.id),\n );\n }\n\n protected get removeUsersWarning() {\n return this.i18nService.t(\"removeOrgUsersConfirmation\");\n }\n}\n","
\n
\n
\n
\n

\n {{ \"bulkConfirmStatus\" | i18n }}\n

\n \n ×\n \n
\n
\n
\n \n {{ \"loading\" | i18n }}\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
{{ \"user\" | i18n }}{{ \"status\" | i18n }}
\n \n \n {{ item.user.email }}\n {{ item.user.name }}\n \n {{ item.message }}\n \n {{ item.message }}\n
\n
\n
\n \n
\n
\n
\n
\n","import { Component } from \"@angular/core\";\n\nimport {\n OrganizationUserStatusType,\n ProviderUserStatusType,\n} from \"@bitwarden/common/admin-console/enums\";\n\nexport interface BulkUserDetails {\n id: string;\n name: string;\n email: string;\n status: OrganizationUserStatusType | ProviderUserStatusType;\n hasMasterPassword?: boolean;\n}\n\ntype BulkStatusEntry = {\n user: BulkUserDetails;\n error: boolean;\n message: string;\n};\n\n@Component({\n selector: \"app-bulk-status\",\n templateUrl: \"bulk-status.component.html\",\n})\nexport class BulkStatusComponent {\n users: BulkStatusEntry[];\n loading = false;\n}\n","import { Injectable } from \"@angular/core\";\n\nimport { OrganizationApiServiceAbstraction } from \"@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction\";\nimport { OrganizationService } from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport { OrganizationUserService } from \"@bitwarden/common/admin-console/abstractions/organization-user/organization-user.service\";\nimport {\n OrganizationUserResetPasswordRequest,\n OrganizationUserResetPasswordWithIdRequest,\n} from \"@bitwarden/common/admin-console/abstractions/organization-user/requests\";\nimport { KdfConfig } from \"@bitwarden/common/auth/models/domain/kdf-config\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { EncryptService } from \"@bitwarden/common/platform/abstractions/encrypt.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\nimport { EncryptedString, EncString } from \"@bitwarden/common/platform/models/domain/enc-string\";\nimport { SymmetricCryptoKey } from \"@bitwarden/common/platform/models/domain/symmetric-crypto-key\";\nimport { UserKey } from \"@bitwarden/common/types/key\";\n\n@Injectable({\n providedIn: \"root\",\n})\nexport class OrganizationUserResetPasswordService {\n constructor(\n private cryptoService: CryptoService,\n private encryptService: EncryptService,\n private organizationService: OrganizationService,\n private organizationUserService: OrganizationUserService,\n private organizationApiService: OrganizationApiServiceAbstraction,\n private i18nService: I18nService,\n ) {}\n\n /**\n * Returns the user key encrypted by the organization's public key.\n * Intended for use in enrollment\n * @param orgId desired organization\n */\n async buildRecoveryKey(orgId: string, userKey?: UserKey): Promise {\n // Retrieve Public Key\n const orgKeys = await this.organizationApiService.getKeys(orgId);\n if (orgKeys == null) {\n throw new Error(this.i18nService.t(\"resetPasswordOrgKeysError\"));\n }\n\n const publicKey = Utils.fromB64ToArray(orgKeys.publicKey);\n\n // RSA Encrypt user key with organization's public key\n userKey ??= await this.cryptoService.getUserKey();\n if (userKey == null) {\n throw new Error(\"No user key found\");\n }\n const encryptedKey = await this.cryptoService.rsaEncrypt(userKey.key, publicKey);\n\n return encryptedKey.encryptedString;\n }\n\n /**\n * Sets a user's master password through account recovery.\n * Intended for organization admins\n * @param newMasterPassword user's new master password\n * @param email user's email\n * @param orgUserId organization user's id\n * @param orgId organization id\n */\n async resetMasterPassword(\n newMasterPassword: string,\n email: string,\n orgUserId: string,\n orgId: string,\n ): Promise {\n const response = await this.organizationUserService.getOrganizationUserResetPasswordDetails(\n orgId,\n orgUserId,\n );\n\n if (response == null) {\n throw new Error(this.i18nService.t(\"resetPasswordDetailsError\"));\n }\n\n // Decrypt Organization's encrypted Private Key with org key\n const orgSymKey = await this.cryptoService.getOrgKey(orgId);\n if (orgSymKey == null) {\n throw new Error(\"No org key found\");\n }\n const decPrivateKey = await this.encryptService.decryptToBytes(\n new EncString(response.encryptedPrivateKey),\n orgSymKey,\n );\n\n // Decrypt User's Reset Password Key to get UserKey\n const decValue = await this.cryptoService.rsaDecrypt(response.resetPasswordKey, decPrivateKey);\n const existingUserKey = new SymmetricCryptoKey(decValue) as UserKey;\n\n // Create new master key and hash new password\n const newMasterKey = await this.cryptoService.makeMasterKey(\n newMasterPassword,\n email.trim().toLowerCase(),\n response.kdf,\n new KdfConfig(response.kdfIterations, response.kdfMemory, response.kdfParallelism),\n );\n const newMasterKeyHash = await this.cryptoService.hashMasterKey(\n newMasterPassword,\n newMasterKey,\n );\n\n // Create new encrypted user key for the User\n const newUserKey = await this.cryptoService.encryptUserKeyWithMasterKey(\n newMasterKey,\n existingUserKey,\n );\n\n // Create request\n const request = new OrganizationUserResetPasswordRequest();\n request.key = newUserKey[1].encryptedString;\n request.newMasterPasswordHash = newMasterKeyHash;\n\n // Change user's password\n await this.organizationUserService.putOrganizationUserResetPassword(orgId, orgUserId, request);\n }\n\n /**\n * Returns existing account recovery keys re-encrypted with the new user key.\n * @param newUserKey the new user key\n * @throws Error if new user key is null\n */\n async getRotatedKeys(\n newUserKey: UserKey,\n ): Promise {\n if (newUserKey == null) {\n throw new Error(\"New user key is required for rotation.\");\n }\n\n const allOrgs = await this.organizationService.getAll();\n\n if (!allOrgs) {\n return;\n }\n\n const requests: OrganizationUserResetPasswordWithIdRequest[] = [];\n for (const org of allOrgs) {\n // If not already enrolled, skip\n if (!org.resetPasswordEnrolled) {\n continue;\n }\n\n // Re-enroll - encrypt user key with organization public key\n const encryptedKey = await this.buildRecoveryKey(org.id, newUserKey);\n\n // Create/Execute request\n const request = new OrganizationUserResetPasswordWithIdRequest();\n request.organizationId = org.id;\n request.resetPasswordKey = encryptedKey;\n request.masterPasswordHash = \"ignored\";\n\n requests.push(request);\n }\n return requests;\n }\n\n /**\n * @deprecated Nov 6, 2023: Use new Key Rotation Service for posting rotated data.\n */\n async postLegacyRotation(\n userId: string,\n requests: OrganizationUserResetPasswordWithIdRequest[],\n ): Promise {\n if (requests == null) {\n return;\n }\n for (const request of requests) {\n await this.organizationUserService.putOrganizationUserResetPasswordEnrollment(\n request.organizationId,\n userId,\n request,\n );\n }\n }\n}\n","import { PolicyType } from \"../../enums\";\n\nexport class PolicyRequest {\n type: PolicyType;\n enabled: boolean;\n data: any;\n}\n","import { Directive, Input, OnInit } from \"@angular/core\";\nimport { UntypedFormControl, UntypedFormGroup } from \"@angular/forms\";\n\nimport { PolicyType } from \"@bitwarden/common/admin-console/enums\";\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\nimport { PolicyRequest } from \"@bitwarden/common/admin-console/models/request/policy.request\";\nimport { PolicyResponse } from \"@bitwarden/common/admin-console/models/response/policy.response\";\n\nexport abstract class BasePolicy {\n abstract name: string;\n abstract description: string;\n abstract type: PolicyType;\n abstract component: any;\n\n display(organization: Organization) {\n return true;\n }\n}\n\n@Directive()\nexport abstract class BasePolicyComponent implements OnInit {\n @Input() policyResponse: PolicyResponse;\n @Input() policy: BasePolicy;\n\n enabled = new UntypedFormControl(false);\n data: UntypedFormGroup = null;\n\n ngOnInit(): void {\n this.enabled.setValue(this.policyResponse.enabled);\n\n if (this.policyResponse.data != null) {\n this.loadData();\n }\n }\n\n loadData() {\n this.data.patchValue(this.policyResponse.data ?? {});\n }\n\n buildRequestData() {\n if (this.data != null) {\n return this.data.value;\n }\n\n return null;\n }\n\n buildRequest(policiesEnabledMap: Map) {\n const request = new PolicyRequest();\n request.enabled = this.enabled.value;\n request.type = this.policy.type;\n request.data = this.buildRequestData();\n\n return Promise.resolve(request);\n }\n}\n","import { NgModule } from \"@angular/core\";\n\nimport { LooseComponentsModule, SharedModule } from \"../../../shared\";\n\nimport { DisableSendPolicyComponent } from \"./disable-send.component\";\nimport { MasterPasswordPolicyComponent } from \"./master-password.component\";\nimport { PasswordGeneratorPolicyComponent } from \"./password-generator.component\";\nimport { PersonalOwnershipPolicyComponent } from \"./personal-ownership.component\";\nimport { PoliciesComponent } from \"./policies.component\";\nimport { PolicyEditComponent } from \"./policy-edit.component\";\nimport { RequireSsoPolicyComponent } from \"./require-sso.component\";\nimport { ResetPasswordPolicyComponent } from \"./reset-password.component\";\nimport { SendOptionsPolicyComponent } from \"./send-options.component\";\nimport { SingleOrgPolicyComponent } from \"./single-org.component\";\nimport { TwoFactorAuthenticationPolicyComponent } from \"./two-factor-authentication.component\";\n\n@NgModule({\n imports: [SharedModule, LooseComponentsModule],\n declarations: [\n DisableSendPolicyComponent,\n MasterPasswordPolicyComponent,\n PasswordGeneratorPolicyComponent,\n PersonalOwnershipPolicyComponent,\n RequireSsoPolicyComponent,\n ResetPasswordPolicyComponent,\n SendOptionsPolicyComponent,\n SingleOrgPolicyComponent,\n TwoFactorAuthenticationPolicyComponent,\n PoliciesComponent,\n PolicyEditComponent,\n ],\n exports: [\n DisableSendPolicyComponent,\n MasterPasswordPolicyComponent,\n PasswordGeneratorPolicyComponent,\n PersonalOwnershipPolicyComponent,\n RequireSsoPolicyComponent,\n ResetPasswordPolicyComponent,\n SendOptionsPolicyComponent,\n SingleOrgPolicyComponent,\n TwoFactorAuthenticationPolicyComponent,\n PoliciesComponent,\n PolicyEditComponent,\n ],\n})\nexport class PoliciesModule {}\n","import { Component } from \"@angular/core\";\n\nimport { PolicyType } from \"@bitwarden/common/admin-console/enums\";\n\nimport { BasePolicy, BasePolicyComponent } from \"./base-policy.component\";\n\nexport class DisableSendPolicy extends BasePolicy {\n name = \"disableSend\";\n description = \"disableSendPolicyDesc\";\n type = PolicyType.DisableSend;\n component = DisableSendPolicyComponent;\n}\n\n@Component({\n selector: \"policy-disable-send\",\n templateUrl: \"disable-send.component.html\",\n})\nexport class DisableSendPolicyComponent extends BasePolicyComponent {}\n","\n {{ \"disableSendExemption\" | i18n }}\n\n\n
\n
\n \n \n
\n
\n","\n {{ \"keyConnectorPolicyRestriction\" | i18n }}\n\n\n
\n \n \n {{ \"turnOn\" | i18n }}\n \n\n \n \n {{ \"enforceOnLoginDesc\" | i18n }}\n \n\n
\n \n {{ \"minComplexityScore\" | i18n }}\n \n \n \n \n \n {{ \"minLength\" | i18n }}\n \n \n
\n\n \n \n A-Z\n \n \n \n a-z\n \n \n \n 0-9\n \n \n \n !@#$%^&*\n \n
\n","import { Component } from \"@angular/core\";\nimport { FormBuilder, FormGroup, Validators } from \"@angular/forms\";\n\nimport { ControlsOf } from \"@bitwarden/angular/types/controls-of\";\nimport { OrganizationService } from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport { PolicyType } from \"@bitwarden/common/admin-console/enums\";\nimport { MasterPasswordPolicyOptions } from \"@bitwarden/common/admin-console/models/domain/master-password-policy-options\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\n\nimport { BasePolicy, BasePolicyComponent } from \"./base-policy.component\";\n\nexport class MasterPasswordPolicy extends BasePolicy {\n name = \"masterPassPolicyTitle\";\n description = \"masterPassPolicyDesc\";\n type = PolicyType.MasterPassword;\n component = MasterPasswordPolicyComponent;\n}\n\n@Component({\n selector: \"policy-master-password\",\n templateUrl: \"master-password.component.html\",\n})\nexport class MasterPasswordPolicyComponent extends BasePolicyComponent {\n MinPasswordLength = Utils.minimumPasswordLength;\n\n data: FormGroup> = this.formBuilder.group({\n minComplexity: [null],\n minLength: [this.MinPasswordLength, [Validators.min(Utils.minimumPasswordLength)]],\n requireUpper: [false],\n requireLower: [false],\n requireNumbers: [false],\n requireSpecial: [false],\n enforceOnLogin: [false],\n });\n\n passwordScores: { name: string; value: number }[];\n showKeyConnectorInfo = false;\n\n constructor(\n private formBuilder: FormBuilder,\n i18nService: I18nService,\n private organizationService: OrganizationService,\n ) {\n super();\n\n this.passwordScores = [\n { name: \"-- \" + i18nService.t(\"select\") + \" --\", value: null },\n { name: i18nService.t(\"weak\") + \" (0)\", value: 0 },\n { name: i18nService.t(\"weak\") + \" (1)\", value: 1 },\n { name: i18nService.t(\"weak\") + \" (2)\", value: 2 },\n { name: i18nService.t(\"good\") + \" (3)\", value: 3 },\n { name: i18nService.t(\"strong\") + \" (4)\", value: 4 },\n ];\n }\n\n async ngOnInit() {\n super.ngOnInit();\n const organization = await this.organizationService.get(this.policyResponse.organizationId);\n this.showKeyConnectorInfo = organization.keyConnectorEnabled;\n }\n}\n","
\n
\n
\n \n \n
\n
\n\n
\n
\n \n \n \n \n
\n
\n

{{ \"password\" | i18n }}

\n
\n
\n \n \n
\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n

{{ \"passphrase\" | i18n }}

\n
\n
\n \n \n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n","import { Component } from \"@angular/core\";\nimport { UntypedFormBuilder } from \"@angular/forms\";\n\nimport { PolicyType } from \"@bitwarden/common/admin-console/enums\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\n\nimport { BasePolicy, BasePolicyComponent } from \"./base-policy.component\";\n\nexport class PasswordGeneratorPolicy extends BasePolicy {\n name = \"passwordGenerator\";\n description = \"passwordGeneratorPolicyDesc\";\n type = PolicyType.PasswordGenerator;\n component = PasswordGeneratorPolicyComponent;\n}\n\n@Component({\n selector: \"policy-password-generator\",\n templateUrl: \"password-generator.component.html\",\n})\nexport class PasswordGeneratorPolicyComponent extends BasePolicyComponent {\n data = this.formBuilder.group({\n defaultType: [null],\n minLength: [null],\n useUpper: [null],\n useLower: [null],\n useNumbers: [null],\n useSpecial: [null],\n minNumbers: [null],\n minSpecial: [null],\n minNumberWords: [null],\n capitalize: [null],\n includeNumber: [null],\n });\n\n defaultTypes: { name: string; value: string }[];\n\n constructor(\n private formBuilder: UntypedFormBuilder,\n i18nService: I18nService,\n ) {\n super();\n\n this.defaultTypes = [\n { name: i18nService.t(\"userPreference\"), value: null },\n { name: i18nService.t(\"password\"), value: \"password\" },\n { name: i18nService.t(\"passphrase\"), value: \"passphrase\" },\n ];\n }\n}\n","import { Component } from \"@angular/core\";\n\nimport { PolicyType } from \"@bitwarden/common/admin-console/enums\";\n\nimport { BasePolicy, BasePolicyComponent } from \"./base-policy.component\";\n\nexport class PersonalOwnershipPolicy extends BasePolicy {\n name = \"personalOwnership\";\n description = \"personalOwnershipPolicyDesc\";\n type = PolicyType.PersonalOwnership;\n component = PersonalOwnershipPolicyComponent;\n}\n\n@Component({\n selector: \"policy-personal-ownership\",\n templateUrl: \"personal-ownership.component.html\",\n})\nexport class PersonalOwnershipPolicyComponent extends BasePolicyComponent {}\n","\n {{ \"personalOwnershipExemption\" | i18n }}\n\n\n
\n
\n \n \n
\n
\n","import { Component } from \"@angular/core\";\n\nimport { PolicyType } from \"@bitwarden/common/admin-console/enums\";\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\nimport { PolicyRequest } from \"@bitwarden/common/admin-console/models/request/policy.request\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\n\nimport { BasePolicy, BasePolicyComponent } from \"./base-policy.component\";\n\nexport class RequireSsoPolicy extends BasePolicy {\n name = \"requireSso\";\n description = \"requireSsoPolicyDesc\";\n type = PolicyType.RequireSso;\n component = RequireSsoPolicyComponent;\n\n display(organization: Organization) {\n return organization.useSso;\n }\n}\n\n@Component({\n selector: \"policy-require-sso\",\n templateUrl: \"require-sso.component.html\",\n})\nexport class RequireSsoPolicyComponent extends BasePolicyComponent {\n constructor(private i18nService: I18nService) {\n super();\n }\n\n buildRequest(policiesEnabledMap: Map): Promise {\n const singleOrgEnabled = policiesEnabledMap.get(PolicyType.SingleOrg) ?? false;\n if (this.enabled.value && !singleOrgEnabled) {\n throw new Error(this.i18nService.t(\"requireSsoPolicyReqError\"));\n }\n\n return super.buildRequest(policiesEnabledMap);\n }\n}\n","\n {{ \"requireSsoPolicyReq\" | i18n }}\n\n\n {{ \"requireSsoExemption\" | i18n }}\n\n\n
\n
\n \n \n
\n
\n","\n {{ \"keyConnectorPolicyRestriction\" | i18n }}\n\n\n\n {{ \"accountRecoverySingleOrgRequirementDesc\" | i18n }}\n\n\n\n {{ \"accountRecoveryPolicyWarning\" | i18n }}\n\n\n\n \n {{ \"turnOn\" | i18n }}\n\n\n\n \n \n {{ \"resetPasswordPolicyAutoEnrollCheckbox\" | i18n }}\n \n\n","import { Component } from \"@angular/core\";\nimport { FormBuilder } from \"@angular/forms\";\n\nimport { OrganizationService } from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport { PolicyType } from \"@bitwarden/common/admin-console/enums\";\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\n\nimport { BasePolicy, BasePolicyComponent } from \"./base-policy.component\";\n\nexport class ResetPasswordPolicy extends BasePolicy {\n name = \"accountRecoveryPolicy\";\n description = \"accountRecoveryPolicyDesc\";\n type = PolicyType.ResetPassword;\n component = ResetPasswordPolicyComponent;\n\n display(organization: Organization) {\n return organization.useResetPassword;\n }\n}\n\n@Component({\n selector: \"policy-reset-password\",\n templateUrl: \"reset-password.component.html\",\n})\nexport class ResetPasswordPolicyComponent extends BasePolicyComponent {\n data = this.formBuilder.group({\n autoEnrollEnabled: false,\n });\n showKeyConnectorInfo = false;\n\n constructor(\n private formBuilder: FormBuilder,\n private organizationService: OrganizationService,\n ) {\n super();\n }\n\n async ngOnInit() {\n super.ngOnInit();\n const organization = await this.organizationService.get(this.policyResponse.organizationId);\n this.showKeyConnectorInfo = organization.keyConnectorEnabled;\n }\n}\n","import { Component } from \"@angular/core\";\nimport { UntypedFormBuilder } from \"@angular/forms\";\n\nimport { PolicyType } from \"@bitwarden/common/admin-console/enums\";\n\nimport { BasePolicy, BasePolicyComponent } from \"./base-policy.component\";\n\nexport class SendOptionsPolicy extends BasePolicy {\n name = \"sendOptions\";\n description = \"sendOptionsPolicyDesc\";\n type = PolicyType.SendOptions;\n component = SendOptionsPolicyComponent;\n}\n\n@Component({\n selector: \"policy-send-options\",\n templateUrl: \"send-options.component.html\",\n})\nexport class SendOptionsPolicyComponent extends BasePolicyComponent {\n data = this.formBuilder.group({\n disableHideEmail: false,\n });\n\n constructor(private formBuilder: UntypedFormBuilder) {\n super();\n }\n}\n","\n {{ \"sendOptionsExemption\" | i18n }}\n\n\n
\n
\n \n \n
\n
\n\n
\n

{{ \"options\" | i18n }}

\n
\n \n \n
\n
\n","import { Component } from \"@angular/core\";\n\nimport { PolicyType } from \"@bitwarden/common/admin-console/enums\";\nimport { PolicyRequest } from \"@bitwarden/common/admin-console/models/request/policy.request\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\n\nimport { BasePolicy, BasePolicyComponent } from \"./base-policy.component\";\n\nexport class SingleOrgPolicy extends BasePolicy {\n name = \"singleOrg\";\n description = \"singleOrgDesc\";\n type = PolicyType.SingleOrg;\n component = SingleOrgPolicyComponent;\n}\n\n@Component({\n selector: \"policy-single-org\",\n templateUrl: \"single-org.component.html\",\n})\nexport class SingleOrgPolicyComponent extends BasePolicyComponent {\n constructor(private i18nService: I18nService) {\n super();\n }\n\n buildRequest(policiesEnabledMap: Map): Promise {\n if (!this.enabled.value) {\n if (policiesEnabledMap.get(PolicyType.RequireSso) ?? false) {\n throw new Error(\n this.i18nService.t(\"disableRequiredError\", this.i18nService.t(\"requireSso\")),\n );\n }\n\n if (policiesEnabledMap.get(PolicyType.MaximumVaultTimeout) ?? false) {\n throw new Error(\n this.i18nService.t(\n \"disableRequiredError\",\n this.i18nService.t(\"maximumVaultTimeoutLabel\"),\n ),\n );\n }\n }\n\n return super.buildRequest(policiesEnabledMap);\n }\n}\n","\n {{ \"singleOrgPolicyWarning\" | i18n }}\n\n\n
\n
\n \n \n
\n
\n","import { Component } from \"@angular/core\";\n\nimport { PolicyType } from \"@bitwarden/common/admin-console/enums\";\n\nimport { BasePolicy, BasePolicyComponent } from \"./base-policy.component\";\n\nexport class TwoFactorAuthenticationPolicy extends BasePolicy {\n name = \"twoStepLoginPolicyTitle\";\n description = \"twoStepLoginPolicyDesc\";\n type = PolicyType.TwoFactorAuthentication;\n component = TwoFactorAuthenticationPolicyComponent;\n}\n\n@Component({\n selector: \"policy-two-factor-authentication\",\n templateUrl: \"two-factor-authentication.component.html\",\n})\nexport class TwoFactorAuthenticationPolicyComponent extends BasePolicyComponent {}\n","\n {{ \"twoStepLoginPolicyWarning\" | i18n }}\n\n\n
\n
\n \n \n
\n
\n","
\n
\n \n
\n

\n {{ \"editPolicy\" | i18n }} - {{ policy.name | i18n }}\n

\n \n ×\n \n
\n\n
\n
\n \n {{ \"loading\" | i18n }}\n
\n
\n

{{ policy.description | i18n }}

\n \n
\n
\n
\n \n \n
\n \n
\n
\n","import {\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n Output,\n ViewChild,\n ViewContainerRef,\n} from \"@angular/core\";\n\nimport { PolicyApiServiceAbstraction } from \"@bitwarden/common/admin-console/abstractions/policy/policy-api.service.abstraction\";\nimport { PolicyType } from \"@bitwarden/common/admin-console/enums\";\nimport { PolicyRequest } from \"@bitwarden/common/admin-console/models/request/policy.request\";\nimport { PolicyResponse } from \"@bitwarden/common/admin-console/models/response/policy.response\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\n\nimport { BasePolicy, BasePolicyComponent } from \"../policies\";\n\n@Component({\n selector: \"app-policy-edit\",\n templateUrl: \"policy-edit.component.html\",\n})\nexport class PolicyEditComponent {\n @Input() policy: BasePolicy;\n @Input() organizationId: string;\n @Input() policiesEnabledMap: Map = new Map();\n @Output() onSavedPolicy = new EventEmitter();\n\n @ViewChild(\"policyForm\", { read: ViewContainerRef, static: true })\n policyFormRef: ViewContainerRef;\n\n policyType = PolicyType;\n loading = true;\n enabled = false;\n formPromise: Promise;\n defaultTypes: any[];\n policyComponent: BasePolicyComponent;\n\n private policyResponse: PolicyResponse;\n\n constructor(\n private policyApiService: PolicyApiServiceAbstraction,\n private i18nService: I18nService,\n private platformUtilsService: PlatformUtilsService,\n private cdr: ChangeDetectorRef,\n private logService: LogService,\n ) {}\n\n async ngAfterViewInit() {\n await this.load();\n this.loading = false;\n\n this.policyComponent = this.policyFormRef.createComponent(this.policy.component)\n .instance as BasePolicyComponent;\n this.policyComponent.policy = this.policy;\n this.policyComponent.policyResponse = this.policyResponse;\n\n this.cdr.detectChanges();\n }\n\n async load() {\n try {\n this.policyResponse = await this.policyApiService.getPolicy(\n this.organizationId,\n this.policy.type,\n );\n } catch (e) {\n if (e.statusCode === 404) {\n this.policyResponse = new PolicyResponse({ Enabled: false });\n } else {\n throw e;\n }\n }\n }\n\n async submit() {\n let request: PolicyRequest;\n try {\n request = await this.policyComponent.buildRequest(this.policiesEnabledMap);\n } catch (e) {\n this.platformUtilsService.showToast(\"error\", null, e.message);\n return;\n }\n\n try {\n this.formPromise = this.policyApiService.putPolicy(\n this.organizationId,\n this.policy.type,\n request,\n );\n await this.formPromise;\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"editedPolicyId\", this.i18nService.t(this.policy.name)),\n );\n this.onSavedPolicy.emit();\n } catch (e) {\n this.logService.error(e);\n }\n }\n}\n","\n\n\n \n \n {{ \"loading\" | i18n }}\n \n \n \n \n \n \n \n
\n {{ p.name | i18n }}\n {{\n \"on\" | i18n\n }}\n {{ p.description | i18n }}\n
\n \n
\n","import { Component, OnInit, ViewChild, ViewContainerRef } from \"@angular/core\";\nimport { ActivatedRoute, Router } from \"@angular/router\";\nimport { first } from \"rxjs/operators\";\n\nimport { ModalService } from \"@bitwarden/angular/services/modal.service\";\nimport { OrganizationService } from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport { PolicyApiServiceAbstraction } from \"@bitwarden/common/admin-console/abstractions/policy/policy-api.service.abstraction\";\nimport { PolicyType } from \"@bitwarden/common/admin-console/enums\";\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\nimport { PolicyResponse } from \"@bitwarden/common/admin-console/models/response/policy.response\";\n\nimport { PolicyListService } from \"../../core/policy-list.service\";\nimport { BasePolicy } from \"../policies\";\n\nimport { PolicyEditComponent } from \"./policy-edit.component\";\n\n@Component({\n selector: \"app-org-policies\",\n templateUrl: \"policies.component.html\",\n})\n// eslint-disable-next-line rxjs-angular/prefer-takeuntil\nexport class PoliciesComponent implements OnInit {\n @ViewChild(\"editTemplate\", { read: ViewContainerRef, static: true })\n editModalRef: ViewContainerRef;\n\n loading = true;\n organizationId: string;\n policies: BasePolicy[];\n organization: Organization;\n\n private orgPolicies: PolicyResponse[];\n protected policiesEnabledMap: Map = new Map();\n\n constructor(\n private route: ActivatedRoute,\n private modalService: ModalService,\n private organizationService: OrganizationService,\n private policyApiService: PolicyApiServiceAbstraction,\n private policyListService: PolicyListService,\n private router: Router,\n ) {}\n\n async ngOnInit() {\n // eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe\n this.route.parent.parent.params.subscribe(async (params) => {\n this.organizationId = params.organizationId;\n this.organization = await this.organizationService.get(this.organizationId);\n this.policies = this.policyListService.getPolicies();\n\n await this.load();\n\n // Handle policies component launch from Event message\n /* eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe, rxjs/no-nested-subscribe */\n this.route.queryParams.pipe(first()).subscribe(async (qParams) => {\n if (qParams.policyId != null) {\n const policyIdFromEvents: string = qParams.policyId;\n for (const orgPolicy of this.orgPolicies) {\n if (orgPolicy.id === policyIdFromEvents) {\n for (let i = 0; i < this.policies.length; i++) {\n if (this.policies[i].type === orgPolicy.type) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.edit(this.policies[i]);\n break;\n }\n }\n break;\n }\n }\n }\n });\n });\n }\n\n async load() {\n const response = await this.policyApiService.getPolicies(this.organizationId);\n this.orgPolicies = response.data != null && response.data.length > 0 ? response.data : [];\n this.orgPolicies.forEach((op) => {\n this.policiesEnabledMap.set(op.type, op.enabled);\n });\n\n this.loading = false;\n }\n\n async edit(policy: BasePolicy) {\n const [modal] = await this.modalService.openViewRef(\n PolicyEditComponent,\n this.editModalRef,\n (comp) => {\n comp.policy = policy;\n comp.organizationId = this.organizationId;\n comp.policiesEnabledMap = this.policiesEnabledMap;\n // eslint-disable-next-line rxjs-angular/prefer-takeuntil\n comp.onSavedPolicy.subscribe(() => {\n modal.close();\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.load();\n });\n },\n );\n }\n}\n","import { DIALOG_DATA, DialogConfig, DialogRef } from \"@angular/cdk/dialog\";\nimport { Component, Inject, OnDestroy, OnInit } from \"@angular/core\";\nimport { FormBuilder, FormControl, Validators } from \"@angular/forms\";\nimport { combineLatest, Subject, takeUntil } from \"rxjs\";\n\nimport { OrganizationApiServiceAbstraction } from \"@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction\";\nimport { OrganizationService } from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\nimport { UserVerificationService } from \"@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction\";\nimport { Verification } from \"@bitwarden/common/auth/types/verification\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\nimport { CipherService } from \"@bitwarden/common/vault/abstractions/cipher.service\";\nimport { CipherType } from \"@bitwarden/common/vault/enums\";\nimport { CipherView } from \"@bitwarden/common/vault/models/view/cipher.view\";\nimport { DialogService } from \"@bitwarden/components\";\n\nimport { UserVerificationModule } from \"../../../../auth/shared/components/user-verification\";\nimport { SharedModule } from \"../../../../shared/shared.module\";\n\nclass CountBasedLocalizationKey {\n singular: string;\n plural: string;\n\n getKey(count: number) {\n return count == 1 ? this.singular : this.plural;\n }\n\n constructor(singular: string, plural: string) {\n this.singular = singular;\n this.plural = plural;\n }\n}\n\nclass OrganizationContentSummaryItem {\n count: number;\n\n get localizationKey(): string {\n return this.localizationKeyOptions.getKey(this.count);\n }\n\n private localizationKeyOptions: CountBasedLocalizationKey;\n\n constructor(count: number, localizationKeyOptions: CountBasedLocalizationKey) {\n this.count = count;\n this.localizationKeyOptions = localizationKeyOptions;\n }\n}\n\nclass OrganizationContentSummary {\n totalItemCount = 0;\n itemCountByType: OrganizationContentSummaryItem[] = [];\n}\n\nexport interface DeleteOrganizationDialogParams {\n organizationId: string;\n\n requestType: \"InvalidFamiliesForEnterprise\" | \"RegularDelete\";\n}\n\nexport enum DeleteOrganizationDialogResult {\n Deleted = \"deleted\",\n Canceled = \"canceled\",\n}\n\n@Component({\n selector: \"app-delete-organization\",\n standalone: true,\n imports: [SharedModule, UserVerificationModule],\n templateUrl: \"delete-organization-dialog.component.html\",\n})\nexport class DeleteOrganizationDialogComponent implements OnInit, OnDestroy {\n private destroy$ = new Subject();\n\n loaded: boolean;\n deleteOrganizationRequestType: \"InvalidFamiliesForEnterprise\" | \"RegularDelete\" = \"RegularDelete\";\n organization: Organization;\n organizationContentSummary: OrganizationContentSummary = new OrganizationContentSummary();\n secret: Verification;\n\n protected formGroup = this.formBuilder.group({\n secret: new FormControl(null, [Validators.required]),\n });\n formPromise: Promise;\n\n constructor(\n @Inject(DIALOG_DATA) private params: DeleteOrganizationDialogParams,\n private dialogRef: DialogRef,\n private i18nService: I18nService,\n private platformUtilsService: PlatformUtilsService,\n private userVerificationService: UserVerificationService,\n private cipherService: CipherService,\n private organizationService: OrganizationService,\n private organizationApiService: OrganizationApiServiceAbstraction,\n private formBuilder: FormBuilder,\n ) {}\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n async ngOnInit(): Promise {\n this.deleteOrganizationRequestType = this.params.requestType;\n\n combineLatest([\n this.organizationService.get$(this.params.organizationId),\n this.cipherService.getAllFromApiForOrganization(this.params.organizationId),\n ])\n .pipe(takeUntil(this.destroy$))\n .subscribe(([organization, ciphers]) => {\n this.organization = organization;\n this.organizationContentSummary = this.buildOrganizationContentSummary(ciphers);\n this.loaded = true;\n });\n }\n\n protected submit = async () => {\n await this.userVerificationService\n .buildRequest(this.formGroup.value.secret)\n .then((request) => this.organizationApiService.delete(this.organization.id, request));\n\n this.platformUtilsService.showToast(\n \"success\",\n this.i18nService.t(\"organizationDeleted\"),\n this.i18nService.t(\"organizationDeletedDesc\"),\n );\n this.dialogRef.close(DeleteOrganizationDialogResult.Deleted);\n };\n\n private buildOrganizationContentSummary(ciphers: CipherView[]): OrganizationContentSummary {\n const organizationContentSummary = new OrganizationContentSummary();\n const organizationItems = ciphers.filter((item) => item.deletedDate == null);\n\n if (organizationItems.length < 1) {\n return organizationContentSummary;\n }\n\n organizationContentSummary.totalItemCount = organizationItems.length;\n for (const cipherType of Utils.iterateEnum(CipherType)) {\n const count = this.getOrganizationItemCountByType(organizationItems, cipherType);\n if (count > 0) {\n organizationContentSummary.itemCountByType.push(\n new OrganizationContentSummaryItem(\n count,\n this.getOrganizationItemLocalizationKeysByType(CipherType[cipherType]),\n ),\n );\n }\n }\n\n return organizationContentSummary;\n }\n\n private getOrganizationItemCountByType(items: CipherView[], type: CipherType) {\n return items.filter((item) => item.type == type).length;\n }\n\n private getOrganizationItemLocalizationKeysByType(type: string): CountBasedLocalizationKey {\n return new CountBasedLocalizationKey(`type${type}`, `type${type}Plural`);\n }\n}\n\n/**\n * Strongly typed helper to open a Delete Organization dialog\n * @param dialogService Instance of the dialog service that will be used to open the dialog\n * @param config Configuration for the dialog\n */\nexport function openDeleteOrganizationDialog(\n dialogService: DialogService,\n config: DialogConfig,\n) {\n return dialogService.open(\n DeleteOrganizationDialogComponent,\n config,\n );\n}\n","
\n \n {{ \"deleteOrganization\" | i18n }}\n
\n {{\n \"deletingOrganizationIsPermanentWarning\" | i18n: organization?.name\n }}\n

\n \n {{ \"orgCreatedSponsorshipInvalid\" | i18n }}\n \n \n 0\">\n {{ \"deletingOrganizationContentWarning\" | i18n: organization?.name }}\n

    \n
  • \n {{ type.count }} {{ type.localizationKey | i18n }}\n
  • \n
\n {{ \"deletingOrganizationActiveUserAccountsWarning\" | i18n }}\n \n \n

\n \n
\n
\n \n \n
\n
\n
\n","import { Pipe, PipeTransform } from \"@angular/core\";\n\nimport { OrganizationUserType } from \"@bitwarden/common/admin-console/enums\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\n\n@Pipe({\n name: \"userType\",\n})\nexport class UserTypePipe implements PipeTransform {\n constructor(private i18nService: I18nService) {}\n\n transform(value?: OrganizationUserType, unknownText?: string): string {\n if (value == null) {\n return unknownText ?? this.i18nService.t(\"unknown\");\n }\n switch (value) {\n case OrganizationUserType.Owner:\n return this.i18nService.t(\"owner\");\n case OrganizationUserType.Admin:\n return this.i18nService.t(\"admin\");\n case OrganizationUserType.User:\n return this.i18nService.t(\"user\");\n case OrganizationUserType.Manager:\n return this.i18nService.t(\"manager\");\n case OrganizationUserType.Custom:\n return this.i18nService.t(\"custom\");\n }\n }\n}\n","\n\n
\n \n {{ \"permission\" | i18n }}\n \n \n \n \n \n\n \n {{ selectorLabelText }}\n \n {{ selectorHelpText }}\n \n
\n\n\n \n \n {{ columnHeader }}\n \n
\n {{ \"permission\" | i18n }}\n
\n \n {{ \"role\" | i18n }}\n {{ \"group\" | i18n }}\n \n \n
\n \n \n \n
\n \n
\n
\n {{ item.labelName }}\n \n {{ \"invited\" | i18n }}\n \n
\n
\n {{ $any(item).email }}\n
\n
\n
\n\n
\n \n {{ item.labelName }}\n
\n \n\n \n \n \n\n \n \n {{ \"canEdit\" | i18n }}\n \n \n\n \n {{ permissionLabelId(item.readonlyPermission) | i18n }}\n \n \n \n\n \n {{ $any(item).role | userType: \"-\" }}\n \n\n \n {{ $any(item).viaGroupName ?? \"-\" }}\n \n\n \n \n \n \n \n {{ emptySelectionText }}\n \n
\n
\n","import { Component, forwardRef, Input, OnDestroy, OnInit } from \"@angular/core\";\nimport {\n ControlValueAccessor,\n FormBuilder,\n FormControl,\n FormGroup,\n NG_VALUE_ACCESSOR,\n} from \"@angular/forms\";\nimport { Subject, takeUntil } from \"rxjs\";\n\nimport { ControlsOf } from \"@bitwarden/angular/types/controls-of\";\nimport { FormSelectionList } from \"@bitwarden/angular/utils/form-selection-list\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { SelectItemView } from \"@bitwarden/components/src/multi-select/models/select-item-view\";\n\nimport {\n AccessItemType,\n AccessItemValue,\n AccessItemView,\n CollectionPermission,\n getPermissionList,\n Permission,\n} from \"./access-selector.models\";\n\nexport enum PermissionMode {\n /**\n * No permission controls or column present. No permission values are emitted.\n */\n Hidden = \"hidden\",\n\n /**\n * No permission controls. Column rendered an if available on an item. No permission values are emitted\n */\n Readonly = \"readonly\",\n\n /**\n * Permission Controls and column present. Permission values are emitted.\n */\n Edit = \"edit\",\n}\n\n@Component({\n selector: \"bit-access-selector\",\n templateUrl: \"access-selector.component.html\",\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => AccessSelectorComponent),\n multi: true,\n },\n ],\n})\nexport class AccessSelectorComponent implements ControlValueAccessor, OnInit, OnDestroy {\n private destroy$ = new Subject();\n private notifyOnChange: (v: unknown) => void;\n private notifyOnTouch: () => void;\n private pauseChangeNotification: boolean;\n\n /**\n * Updates the enabled/disabled state of provided row form group based on the item's readonly state.\n * If a row is enabled, it also updates the enabled/disabled state of the permission control\n * based on the item's accessAllItems state and the current value of `permissionMode`.\n * @param controlRow - The form group for the row to update\n * @param item - The access item that is represented by the row\n */\n private updateRowControlDisableState = (\n controlRow: FormGroup>,\n item: AccessItemView,\n ) => {\n // Disable entire row form group if readonly\n if (item.readonly) {\n controlRow.disable();\n } else {\n controlRow.enable();\n\n // The enable() above also enables the permission control, so we need to disable it again\n // Disable permission control if accessAllItems is enabled or not in Edit mode\n if (item.accessAllItems || this.permissionMode != PermissionMode.Edit) {\n controlRow.controls.permission.disable();\n }\n }\n };\n\n /**\n * Updates the enabled/disabled state of ALL row form groups based on each item's readonly state.\n */\n private updateAllRowControlDisableStates = () => {\n this.selectionList.forEachControlItem((controlRow, item) => {\n this.updateRowControlDisableState(controlRow as FormGroup>, item);\n });\n };\n\n /**\n * The internal selection list that tracks the value of this form control / component.\n * It's responsible for keeping items sorted and synced with the rendered form controls\n * @protected\n */\n protected selectionList = new FormSelectionList((item) => {\n const permissionControl = this.formBuilder.control(this.initialPermission);\n\n const fg = this.formBuilder.group>({\n id: new FormControl(item.id),\n type: new FormControl(item.type),\n permission: permissionControl,\n });\n\n this.updateRowControlDisableState(fg, item);\n\n return fg;\n }, this._itemComparator.bind(this));\n\n /**\n * Internal form group for this component.\n * @protected\n */\n protected formGroup = this.formBuilder.group({\n items: this.selectionList.formArray,\n });\n\n protected itemType = AccessItemType;\n protected permissionList: Permission[];\n protected initialPermission = CollectionPermission.View;\n\n disabled: boolean;\n\n /**\n * List of all selectable items that. Sorted internally.\n */\n @Input()\n get items(): AccessItemView[] {\n return this.selectionList.allItems;\n }\n\n set items(val: AccessItemView[]) {\n const selected = (this.selectionList.formArray.getRawValue() ?? []).concat(\n val.filter((m) => m.readonly),\n );\n this.selectionList.populateItems(\n val.map((m) => {\n m.icon = m.icon ?? this.itemIcon(m); // Ensure an icon is set\n return m;\n }),\n selected,\n );\n }\n\n /**\n * Permission mode that controls if the permission form controls and column should be present.\n */\n @Input()\n get permissionMode(): PermissionMode {\n return this._permissionMode;\n }\n\n set permissionMode(value: PermissionMode) {\n this._permissionMode = value;\n // Update any internal permission controls\n this.updateAllRowControlDisableStates();\n }\n private _permissionMode: PermissionMode = PermissionMode.Hidden;\n\n /**\n * Column header for the selected items table\n */\n @Input() columnHeader: string;\n\n /**\n * Label used for the ng selector\n */\n @Input() selectorLabelText: string;\n\n /**\n * Helper text displayed under the ng selector\n */\n @Input() selectorHelpText: string;\n\n /**\n * Text that is shown in the table when no items are selected\n */\n @Input() emptySelectionText: string;\n\n /**\n * Flag for if the member roles column should be present\n */\n @Input() showMemberRoles: boolean;\n\n /**\n * Flag for if the group column should be present\n */\n @Input() showGroupColumn: boolean;\n\n /**\n * Enable Flexible Collections changes (feature flag)\n */\n @Input() set flexibleCollectionsEnabled(value: boolean) {\n this._flexibleCollectionsEnabled = value;\n this.permissionList = getPermissionList(value);\n }\n\n /**\n * Hide the multi-select so that new items cannot be added\n */\n @Input() hideMultiSelect = false;\n\n private _flexibleCollectionsEnabled: boolean;\n\n constructor(\n private readonly formBuilder: FormBuilder,\n private readonly i18nService: I18nService,\n ) {}\n\n /** Required for NG_VALUE_ACCESSOR */\n registerOnChange(fn: any): void {\n this.notifyOnChange = fn;\n }\n\n /** Required for NG_VALUE_ACCESSOR */\n registerOnTouched(fn: any): void {\n this.notifyOnTouch = fn;\n }\n\n /** Required for NG_VALUE_ACCESSOR */\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n\n // Keep the internal FormGroup in sync\n if (this.disabled) {\n this.formGroup.disable();\n } else {\n this.formGroup.enable();\n\n // The enable() above automatically enables all the row controls,\n // so we need to disable the readonly ones again\n this.updateAllRowControlDisableStates();\n }\n }\n\n /** Required for NG_VALUE_ACCESSOR */\n writeValue(selectedItems: AccessItemValue[]): void {\n // Modifying the selection list, mistakenly fires valueChanges in the\n // internal form array, so we need to know to pause external notification\n this.pauseChangeNotification = true;\n\n // Always clear the internal selection list on a new value\n this.selectionList.deselectAll();\n\n // We need to also select any read only items to appear in the table\n this.selectionList.selectItems(this.items.filter((m) => m.readonly).map((m) => m.id));\n\n // If the new value is null, then we're done\n if (selectedItems == null) {\n this.pauseChangeNotification = false;\n return;\n }\n\n // Unable to handle other value types, throw\n if (!Array.isArray(selectedItems)) {\n throw new Error(\"The access selector component only supports Array form values!\");\n }\n\n // Iterate and internally select each item\n for (const value of selectedItems) {\n this.selectionList.selectItem(value.id, value);\n }\n\n this.pauseChangeNotification = false;\n }\n\n async ngOnInit() {\n this.permissionList = getPermissionList(this._flexibleCollectionsEnabled);\n // Watch the internal formArray for changes and propagate them\n this.selectionList.formArray.valueChanges.pipe(takeUntil(this.destroy$)).subscribe((v) => {\n if (!this.notifyOnChange || this.pauseChangeNotification) {\n return;\n }\n // Disabled form arrays emit values for disabled controls, we override this to emit an empty array to avoid\n // emitting values for disabled controls that are \"readonly\" in the table\n if (this.selectionList.formArray.disabled) {\n this.notifyOnChange([]);\n return;\n }\n this.notifyOnChange(v);\n });\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n protected handleBlur() {\n if (!this.notifyOnTouch) {\n return;\n }\n\n this.notifyOnTouch();\n }\n\n protected selectItems(items: SelectItemView[]) {\n this.pauseChangeNotification = true;\n this.selectionList.selectItems(items.map((i) => i.id));\n this.pauseChangeNotification = false;\n if (this.notifyOnChange != undefined) {\n this.notifyOnChange(this.selectionList.formArray.value);\n }\n }\n\n protected itemIcon(item: AccessItemView) {\n switch (item.type) {\n case AccessItemType.Collection:\n return \"bwi-collection\";\n case AccessItemType.Group:\n return \"bwi-users\";\n case AccessItemType.Member:\n return \"bwi-user\";\n }\n }\n\n protected permissionLabelId(perm: CollectionPermission) {\n return this.permissionList.find((p) => p.perm == perm)?.labelId;\n }\n\n protected accessAllLabelId(item: AccessItemView) {\n return item.type == AccessItemType.Group ? \"groupAccessAll\" : \"memberAccessAll\";\n }\n\n protected canEditItemPermission(item: AccessItemView) {\n return this.permissionMode == PermissionMode.Edit && !item.readonly && !item.accessAllItems;\n }\n\n private _itemComparator(a: AccessItemView, b: AccessItemView) {\n return (\n a.type - b.type ||\n this.i18nService.collator.compare(a.listName, b.listName) ||\n this.i18nService.collator.compare(a.labelName, b.labelName) ||\n Number(b.readonly) - Number(a.readonly)\n );\n }\n}\n","import { OrganizationUserUserDetailsResponse } from \"@bitwarden/common/admin-console/abstractions/organization-user/responses\";\nimport {\n OrganizationUserStatusType,\n OrganizationUserType,\n} from \"@bitwarden/common/admin-console/enums\";\nimport { SelectItemView } from \"@bitwarden/components\";\n\nimport { CollectionAccessSelectionView, GroupView } from \"../../../core\";\n\n/**\n * Permission options that replace/correspond with manage, readOnly, and hidePassword server fields.\n */\nexport enum CollectionPermission {\n View = \"view\",\n ViewExceptPass = \"viewExceptPass\",\n Edit = \"edit\",\n EditExceptPass = \"editExceptPass\",\n Manage = \"manage\",\n}\n\nexport enum AccessItemType {\n Collection,\n Group,\n Member,\n}\n\n/**\n * A \"generic\" type that describes an item that can be selected from a\n * ng-select list and have its collection permission modified.\n *\n * Currently, it supports Collections, Groups, and Members. Members require some additional\n * details to render in the AccessSelectorComponent so their type is defined separately\n * and then joined back with the base type.\n *\n */\nexport type AccessItemView = SelectItemView & {\n /**\n * Flag that this group/member can access all items.\n * This will disable the permission editor for this item.\n */\n accessAllItems?: boolean;\n\n /**\n * Flag that this item cannot be modified.\n * This will disable the permission editor and will keep\n * the item always selected.\n */\n readonly?: boolean;\n\n /**\n * Optional permission that will be rendered for this\n * item if it set to readonly.\n */\n readonlyPermission?: CollectionPermission;\n} & (\n | {\n type: AccessItemType.Collection;\n viaGroupName?: string;\n }\n | {\n type: AccessItemType.Group;\n }\n | {\n type: AccessItemType.Member; // Members have a few extra details required to display, so they're added here\n email: string;\n role: OrganizationUserType;\n status: OrganizationUserStatusType;\n }\n );\n\n/**\n * A type that is emitted as a value for the ngControl\n */\nexport type AccessItemValue = {\n id: string;\n permission?: CollectionPermission;\n type: AccessItemType;\n};\n\nexport type Permission = {\n perm: CollectionPermission;\n labelId: string;\n};\n\nexport const getPermissionList = (flexibleCollectionsEnabled: boolean): Permission[] => {\n const permissions = [\n { perm: CollectionPermission.View, labelId: \"canView\" },\n { perm: CollectionPermission.ViewExceptPass, labelId: \"canViewExceptPass\" },\n { perm: CollectionPermission.Edit, labelId: \"canEdit\" },\n { perm: CollectionPermission.EditExceptPass, labelId: \"canEditExceptPass\" },\n ];\n if (flexibleCollectionsEnabled) {\n permissions.push({ perm: CollectionPermission.Manage, labelId: \"canManage\" });\n }\n\n return permissions;\n};\n\n/**\n * Converts the CollectionAccessSelectionView interface to one of the new CollectionPermission values\n * for the dropdown in the AccessSelectorComponent\n * @param value\n */\nexport const convertToPermission = (value: CollectionAccessSelectionView) => {\n if (value.manage) {\n return CollectionPermission.Manage;\n } else if (value.readOnly) {\n return value.hidePasswords ? CollectionPermission.ViewExceptPass : CollectionPermission.View;\n } else {\n return value.hidePasswords ? CollectionPermission.EditExceptPass : CollectionPermission.Edit;\n }\n};\n\n/**\n * Converts an AccessItemValue back into a CollectionAccessView class using the CollectionPermission\n * to determine the values for `manage`, `readOnly`, and `hidePassword`\n * @param value\n */\nexport const convertToSelectionView = (value: AccessItemValue) => {\n return new CollectionAccessSelectionView({\n id: value.id,\n readOnly: readOnly(value.permission),\n hidePasswords: hidePassword(value.permission),\n manage: value.permission === CollectionPermission.Manage,\n });\n};\n\nconst readOnly = (perm: CollectionPermission) =>\n [CollectionPermission.View, CollectionPermission.ViewExceptPass].includes(perm);\n\nconst hidePassword = (perm: CollectionPermission) =>\n [CollectionPermission.ViewExceptPass, CollectionPermission.EditExceptPass].includes(perm);\n\nexport function mapGroupToAccessItemView(group: GroupView): AccessItemView {\n return {\n id: group.id,\n type: AccessItemType.Group,\n listName: group.name,\n labelName: group.name,\n accessAllItems: group.accessAll,\n readonly: group.accessAll,\n };\n}\n\n// TODO: Use view when user apis are migrated to a service\nexport function mapUserToAccessItemView(user: OrganizationUserUserDetailsResponse): AccessItemView {\n return {\n id: user.id,\n type: AccessItemType.Member,\n email: user.email,\n role: user.type,\n listName: user.name?.length > 0 ? `${user.name} (${user.email})` : user.email,\n labelName: user.name ?? user.email,\n status: user.status,\n accessAllItems: user.accessAll,\n readonly: user.accessAll,\n };\n}\n","import { NgModule } from \"@angular/core\";\n\nimport { SharedModule } from \"../../../../../shared\";\n\nimport { AccessSelectorComponent } from \"./access-selector.component\";\nimport { UserTypePipe } from \"./user-type.pipe\";\n\n@NgModule({\n imports: [SharedModule],\n declarations: [AccessSelectorComponent, UserTypePipe],\n exports: [AccessSelectorComponent],\n})\nexport class AccessSelectorModule {}\n","import { ChallengeResponse } from \"@bitwarden/common/auth/models/response/two-factor-web-authn.response\";\n\nexport class CredentialCreateOptionsView {\n constructor(\n readonly options: ChallengeResponse,\n readonly token: string,\n ) {}\n}\n","import { CredentialCreateOptionsView } from \"./credential-create-options.view\";\n\n/**\n * Represents a WebAuthn credential that has been created by an authenticator but not yet saved to the server.\n */\nexport class PendingWebauthnLoginCredentialView {\n constructor(\n readonly createOptions: CredentialCreateOptionsView,\n readonly deviceResponse: PublicKeyCredential,\n readonly supportsPrf: boolean,\n ) {}\n}\n","import { WebauthnLoginCredentialPrfStatus } from \"../enums/webauthn-login-credential-prf-status.enum\";\n\nexport class WebauthnLoginCredentialView {\n constructor(\n readonly id: string,\n readonly name: string,\n readonly prfStatus: WebauthnLoginCredentialPrfStatus,\n ) {}\n}\n","import { inject, Injectable } from \"@angular/core\";\n\nimport { RotateableKeySet } from \"@bitwarden/auth/common\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { EncryptService } from \"@bitwarden/common/platform/abstractions/encrypt.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\nimport { SymmetricCryptoKey } from \"@bitwarden/common/platform/models/domain/symmetric-crypto-key\";\n\n@Injectable({ providedIn: \"root\" })\nexport class RotateableKeySetService {\n private readonly cryptoService = inject(CryptoService);\n private readonly encryptService = inject(EncryptService);\n\n /**\n * Create a new rotateable key set for the current user, using the provided external key.\n * For more information on rotateable key sets, see {@link RotateableKeySet}\n *\n * @param externalKey The `ExternalKey` used to encrypt {@link RotateableKeySet.encryptedPrivateKey}\n * @returns RotateableKeySet containing the current users `UserKey`\n */\n async createKeySet(\n externalKey: ExternalKey,\n ): Promise> {\n const [publicKey, encryptedPrivateKey] = await this.cryptoService.makeKeyPair(externalKey);\n\n const userKey = await this.cryptoService.getUserKey();\n const rawPublicKey = Utils.fromB64ToArray(publicKey);\n const encryptedUserKey = await this.cryptoService.rsaEncrypt(userKey.key, rawPublicKey);\n const encryptedPublicKey = await this.encryptService.encrypt(rawPublicKey, userKey);\n return new RotateableKeySet(encryptedUserKey, encryptedPublicKey, encryptedPrivateKey);\n }\n}\n","import { WebAuthnLoginAssertionResponseRequest } from \"@bitwarden/common/auth/services/webauthn-login/request/webauthn-login-assertion-response.request\";\n\n/**\n * Request sent to the server to save a newly created prf key set for a credential.\n */\nexport class EnableCredentialEncryptionRequest {\n /**\n * The response received from the authenticator.\n */\n deviceResponse: WebAuthnLoginAssertionResponseRequest;\n\n /**\n * An encrypted token containing information the server needs to verify the credential.\n */\n token: string;\n\n /** Used for vault encryption. See {@link RotateableKeySet.encryptedUserKey } */\n encryptedUserKey?: string;\n\n /** Used for vault encryption. See {@link RotateableKeySet.encryptedPublicKey } */\n encryptedPublicKey?: string;\n\n /** Used for vault encryption. See {@link RotateableKeySet.encryptedPrivateKey } */\n encryptedPrivateKey?: string;\n}\n","import { WebauthnLoginAttestationResponseRequest } from \"./webauthn-login-attestation-response.request\";\n\n/**\n * Request sent to the server to save a newly created webauthn login credential.\n */\nexport class SaveCredentialRequest {\n /**\n * The response received from the authenticator.\n * This contains all information needed for future authentication flows.\n */\n deviceResponse: WebauthnLoginAttestationResponseRequest;\n\n /** Nickname chosen by the user to identify this credential */\n name: string;\n\n /**\n * Token required by the server to complete the creation.\n * It contains encrypted information that the server needs to verify the credential.\n */\n token: string;\n\n /**\n * True if the credential was created with PRF support.\n */\n supportsPrf: boolean;\n\n /** Used for vault encryption. See {@link RotateableKeySet.encryptedUserKey } */\n encryptedUserKey?: string;\n\n /** Used for vault encryption. See {@link RotateableKeySet.encryptedPublicKey } */\n encryptedPublicKey?: string;\n\n /** Used for vault encryption. See {@link RotateableKeySet.encryptedPrivateKey } */\n encryptedPrivateKey?: string;\n}\n","import { Utils } from \"@bitwarden/common/platform/misc/utils\";\n\n/**\n * An abstract class that represents responses received from the webauthn authenticator.\n * It contains data that is commonly returned during different types of authenticator interactions.\n */\nexport abstract class WebauthnLoginAuthenticatorResponseRequest {\n id: string;\n rawId: string;\n type: string;\n extensions: Record;\n\n constructor(credential: PublicKeyCredential) {\n this.id = credential.id;\n this.rawId = Utils.fromBufferToB64(credential.rawId);\n this.type = credential.type;\n this.extensions = {}; // Extensions are handled client-side\n }\n}\n","import { Utils } from \"@bitwarden/common/platform/misc/utils\";\n\nimport { WebauthnLoginAuthenticatorResponseRequest } from \"./webauthn-login-authenticator-response.request\";\n\n/**\n * The response received from an authenticator after a successful attestation.\n * This request is used to save newly created webauthn login credentials to the server.\n */\nexport class WebauthnLoginAttestationResponseRequest extends WebauthnLoginAuthenticatorResponseRequest {\n response: {\n attestationObject: string;\n clientDataJson: string;\n };\n\n constructor(credential: PublicKeyCredential) {\n super(credential);\n\n if (!(credential.response instanceof AuthenticatorAttestationResponse)) {\n throw new Error(\"Invalid authenticator response\");\n }\n\n this.response = {\n attestationObject: Utils.fromBufferToB64(credential.response.attestationObject),\n clientDataJson: Utils.fromBufferToB64(credential.response.clientDataJSON),\n };\n }\n}\n","import { ChallengeResponse } from \"@bitwarden/common/auth/models/response/two-factor-web-authn.response\";\nimport { BaseResponse } from \"@bitwarden/common/models/response/base.response\";\n\n/**\n * Options provided by the server to be used during attestation (i.e. creation of a new webauthn credential)\n */\nexport class WebauthnLoginCredentialCreateOptionsResponse extends BaseResponse {\n /** Options to be provided to the webauthn authenticator */\n options: ChallengeResponse;\n\n /**\n * Contains an encrypted version of the {@link options}.\n * Used by the server to validate the attestation response of newly created credentials.\n */\n token: string;\n\n constructor(response: unknown) {\n super(response);\n this.options = new ChallengeResponse(this.getResponseProperty(\"options\"));\n this.token = this.getResponseProperty(\"token\");\n }\n}\n","import { Injectable } from \"@angular/core\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { SecretVerificationRequest } from \"@bitwarden/common/auth/models/request/secret-verification.request\";\nimport { CredentialAssertionOptionsResponse } from \"@bitwarden/common/auth/services/webauthn-login/response/credential-assertion-options.response\";\nimport { ListResponse } from \"@bitwarden/common/models/response/list.response\";\n\nimport { EnableCredentialEncryptionRequest } from \"./request/enable-credential-encryption.request\";\nimport { SaveCredentialRequest } from \"./request/save-credential.request\";\nimport { WebauthnLoginCredentialCreateOptionsResponse } from \"./response/webauthn-login-credential-create-options.response\";\nimport { WebauthnLoginCredentialResponse } from \"./response/webauthn-login-credential.response\";\n\n@Injectable({ providedIn: \"root\" })\nexport class WebAuthnLoginAdminApiService {\n constructor(private apiService: ApiService) {}\n\n async getCredentialCreateOptions(\n request: SecretVerificationRequest,\n ): Promise {\n const response = await this.apiService.send(\n \"POST\",\n \"/webauthn/attestation-options\",\n request,\n true,\n true,\n );\n return new WebauthnLoginCredentialCreateOptionsResponse(response);\n }\n\n async getCredentialAssertionOptions(\n request: SecretVerificationRequest,\n ): Promise {\n const response = await this.apiService.send(\n \"POST\",\n \"/webauthn/assertion-options\",\n request,\n true,\n true,\n );\n return new CredentialAssertionOptionsResponse(response);\n }\n\n async saveCredential(request: SaveCredentialRequest): Promise {\n await this.apiService.send(\"POST\", \"/webauthn\", request, true, true);\n return true;\n }\n\n getCredentials(): Promise> {\n return this.apiService.send(\"GET\", \"/webauthn\", null, true, true);\n }\n\n async deleteCredential(credentialId: string, request: SecretVerificationRequest): Promise {\n await this.apiService.send(\"POST\", `/webauthn/${credentialId}/delete`, request, true, true);\n }\n\n async updateCredential(request: EnableCredentialEncryptionRequest): Promise {\n await this.apiService.send(\"PUT\", `/webauthn`, request, true, true);\n }\n}\n","import { Injectable, Optional } from \"@angular/core\";\nimport { BehaviorSubject, filter, from, map, Observable, shareReplay, switchMap, tap } from \"rxjs\";\n\nimport { PrfKeySet } from \"@bitwarden/auth/common\";\nimport { UserVerificationService } from \"@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction\";\nimport { WebAuthnLoginPrfCryptoServiceAbstraction } from \"@bitwarden/common/auth/abstractions/webauthn/webauthn-login-prf-crypto.service.abstraction\";\nimport { WebAuthnLoginCredentialAssertionOptionsView } from \"@bitwarden/common/auth/models/view/webauthn-login/webauthn-login-credential-assertion-options.view\";\nimport { WebAuthnLoginCredentialAssertionView } from \"@bitwarden/common/auth/models/view/webauthn-login/webauthn-login-credential-assertion.view\";\nimport { Verification } from \"@bitwarden/common/auth/types/verification\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\n\nimport { CredentialCreateOptionsView } from \"../../views/credential-create-options.view\";\nimport { PendingWebauthnLoginCredentialView } from \"../../views/pending-webauthn-login-credential.view\";\nimport { WebauthnLoginCredentialView } from \"../../views/webauthn-login-credential.view\";\nimport { RotateableKeySetService } from \"../rotateable-key-set.service\";\n\nimport { EnableCredentialEncryptionRequest } from \"./request/enable-credential-encryption.request\";\nimport { SaveCredentialRequest } from \"./request/save-credential.request\";\nimport { WebauthnLoginAttestationResponseRequest } from \"./request/webauthn-login-attestation-response.request\";\nimport { WebAuthnLoginAdminApiService } from \"./webauthn-login-admin-api.service\";\n\n@Injectable({ providedIn: \"root\" })\n/**\n * Service for managing WebAuthnLogin credentials.\n */\nexport class WebauthnLoginAdminService {\n static readonly MaxCredentialCount = 5;\n\n private navigatorCredentials: CredentialsContainer;\n private _refresh$ = new BehaviorSubject(undefined);\n private _loading$ = new BehaviorSubject(true);\n private readonly credentials$ = this._refresh$.pipe(\n tap(() => this._loading$.next(true)),\n switchMap(() => this.fetchCredentials$()),\n tap(() => this._loading$.next(false)),\n shareReplay({ bufferSize: 1, refCount: true }),\n );\n\n /**\n * An Observable that emits a boolean indicating whether the service is currently fetching\n * WebAuthnLogin credentials from the server.\n */\n readonly loading$ = this._loading$.asObservable();\n\n constructor(\n private apiService: WebAuthnLoginAdminApiService,\n private userVerificationService: UserVerificationService,\n private rotateableKeySetService: RotateableKeySetService,\n private webAuthnLoginPrfCryptoService: WebAuthnLoginPrfCryptoServiceAbstraction,\n @Optional() navigatorCredentials?: CredentialsContainer,\n @Optional() private logService?: LogService,\n ) {\n // Default parameters don't work when used with Angular DI\n this.navigatorCredentials = navigatorCredentials ?? navigator.credentials;\n }\n\n /**\n * Get the credential assertion options needed for initiating the WebAuthnLogin credential update process.\n * The options contains assertion options and other data for the authenticator.\n * This method requires user verification.\n *\n * @param verification User verification data to be used for the request.\n * @returns The credential assertion options and a token to be used for the credential update request.\n */\n async getCredentialAssertOptions(\n verification: Verification,\n ): Promise {\n const request = await this.userVerificationService.buildRequest(verification);\n const response = await this.apiService.getCredentialAssertionOptions(request);\n return new WebAuthnLoginCredentialAssertionOptionsView(response.options, response.token);\n }\n\n /**\n * Get the credential attestation options needed for initiating the WebAuthnLogin credential creation process.\n * The options contains a challenge and other data for the authenticator.\n * This method requires user verification.\n *\n * @param verification User verification data to be used for the request.\n * @returns The credential attestation options and a token to be used for the credential creation request.\n */\n\n async getCredentialAttestationOptions(\n verification: Verification,\n ): Promise {\n const request = await this.userVerificationService.buildRequest(verification);\n const response = await this.apiService.getCredentialCreateOptions(request);\n return new CredentialCreateOptionsView(response.options, response.token);\n }\n\n /**\n * Create a credential using the given options. This triggers the browsers WebAuthn API to create a credential.\n *\n * @param credentialOptions Options received from the server using `getCredentialCreateOptions`.\n * @returns A pending credential that can be saved to server directly or be used to create a key set.\n */\n async createCredential(\n credentialOptions: CredentialCreateOptionsView,\n ): Promise {\n const nativeOptions: CredentialCreationOptions = {\n publicKey: credentialOptions.options,\n };\n // TODO: Remove `any` when typescript typings add support for PRF\n nativeOptions.publicKey.extensions = {\n prf: {},\n } as any;\n\n try {\n const response = await this.navigatorCredentials.create(nativeOptions);\n if (!(response instanceof PublicKeyCredential)) {\n return undefined;\n }\n // TODO: Remove `any` when typescript typings add support for PRF\n const supportsPrf = Boolean((response.getClientExtensionResults() as any).prf?.enabled);\n return new PendingWebauthnLoginCredentialView(credentialOptions, response, supportsPrf);\n } catch (error) {\n this.logService?.error(error);\n return undefined;\n }\n }\n\n /**\n * Create a key set from the given pending credential. The credential must support PRF.\n * This will trigger the browsers WebAuthn API to generate a PRF-output.\n *\n * @param pendingCredential A credential created using `createCredential`.\n * @returns A key set that can be saved to the server. Undefined is returned if the credential doesn't support PRF.\n */\n async createKeySet(\n pendingCredential: PendingWebauthnLoginCredentialView,\n ): Promise {\n const nativeOptions: CredentialRequestOptions = {\n publicKey: {\n challenge: pendingCredential.createOptions.options.challenge,\n allowCredentials: [{ id: pendingCredential.deviceResponse.rawId, type: \"public-key\" }],\n rpId: pendingCredential.createOptions.options.rp.id,\n timeout: pendingCredential.createOptions.options.timeout,\n userVerification:\n pendingCredential.createOptions.options.authenticatorSelection.userVerification,\n // TODO: Remove `any` when typescript typings add support for PRF\n extensions: {\n prf: { eval: { first: await this.webAuthnLoginPrfCryptoService.getLoginWithPrfSalt() } },\n } as any,\n },\n };\n\n try {\n const response = await this.navigatorCredentials.get(nativeOptions);\n if (!(response instanceof PublicKeyCredential)) {\n return undefined;\n }\n\n // TODO: Remove `any` when typescript typings add support for PRF\n const prfResult = (response.getClientExtensionResults() as any).prf?.results?.first;\n\n if (prfResult === undefined) {\n return undefined;\n }\n\n const symmetricPrfKey =\n await this.webAuthnLoginPrfCryptoService.createSymmetricKeyFromPrf(prfResult);\n return await this.rotateableKeySetService.createKeySet(symmetricPrfKey);\n } catch (error) {\n this.logService?.error(error);\n return undefined;\n }\n }\n\n /**\n * Save a pending credential to the server. This will also save the key set if it is provided.\n *\n * @param name User provided name for the credential.\n * @param credential A pending credential created using `createCredential`.\n * @param prfKeySet A key set created using `createKeySet`.\n */\n async saveCredential(\n name: string,\n credential: PendingWebauthnLoginCredentialView,\n prfKeySet?: PrfKeySet,\n ) {\n const request = new SaveCredentialRequest();\n request.deviceResponse = new WebauthnLoginAttestationResponseRequest(credential.deviceResponse);\n request.token = credential.createOptions.token;\n request.name = name;\n request.supportsPrf = credential.supportsPrf;\n request.encryptedUserKey = prfKeySet?.encryptedUserKey.encryptedString;\n request.encryptedPublicKey = prfKeySet?.encryptedPublicKey.encryptedString;\n request.encryptedPrivateKey = prfKeySet?.encryptedPrivateKey.encryptedString;\n await this.apiService.saveCredential(request);\n this.refresh();\n }\n\n /**\n * Enable encryption for a credential that has already been saved to the server.\n * This will update the KeySet associated with the credential in the database.\n * We short circuit the process here incase the WebAuthnLoginCredential doesn't support PRF or\n * if there was a problem with the Credential Assertion.\n *\n * @param assertionOptions Options received from the server using `getCredentialAssertOptions`.\n * @returns void\n */\n async enableCredentialEncryption(\n assertionOptions: WebAuthnLoginCredentialAssertionView,\n ): Promise {\n if (assertionOptions === undefined || assertionOptions?.prfKey === undefined) {\n throw new Error(\"invalid credential\");\n }\n\n const prfKeySet: PrfKeySet = await this.rotateableKeySetService.createKeySet(\n assertionOptions.prfKey,\n );\n\n const request = new EnableCredentialEncryptionRequest();\n request.token = assertionOptions.token;\n request.deviceResponse = assertionOptions.deviceResponse;\n request.encryptedUserKey = prfKeySet.encryptedUserKey.encryptedString;\n request.encryptedPublicKey = prfKeySet.encryptedPublicKey.encryptedString;\n request.encryptedPrivateKey = prfKeySet.encryptedPrivateKey.encryptedString;\n await this.apiService.updateCredential(request);\n this.refresh();\n }\n\n /**\n * List of webauthn credentials saved on the server.\n *\n * **Note:**\n * - Subscribing might trigger a network request if the credentials haven't been fetched yet.\n * - The observable is shared and will not create unnecessary duplicate requests.\n * - The observable will automatically re-fetch if the user adds or removes a credential.\n * - The observable is lazy and will only fetch credentials when subscribed to.\n * - Don't subscribe to this in the constructor of a long-running service, as it will keep the observable alive.\n */\n getCredentials$(): Observable {\n return this.credentials$;\n }\n\n /**\n * Subscribe to a single credential by id.\n *\n * @param credentialId The id of the credential to subscribe to.\n * @returns An observable that emits the credential with the given id.\n */\n getCredential$(credentialId: string): Observable {\n return this.credentials$.pipe(\n map((credentials) => credentials.find((c) => c.id === credentialId)),\n filter((c) => c !== undefined),\n );\n }\n\n /**\n * Delete a credential from the server. This method requires user verification.\n *\n * @param credentialId The id of the credential to delete.\n * @param verification User verification data to be used for the request.\n * @returns A promise that resolves when the credential has been deleted.\n */\n async deleteCredential(credentialId: string, verification: Verification): Promise {\n const request = await this.userVerificationService.buildRequest(verification);\n await this.apiService.deleteCredential(credentialId, request);\n this.refresh();\n }\n\n private fetchCredentials$(): Observable {\n return from(this.apiService.getCredentials()).pipe(\n map((response) =>\n response.data.map(\n (credential) =>\n new WebauthnLoginCredentialView(credential.id, credential.name, credential.prfStatus),\n ),\n ),\n );\n }\n\n private refresh() {\n this._refresh$.next();\n }\n}\n","import { NgModule } from \"@angular/core\";\n\nimport { EmergencyAccessApiService } from \"./services/emergency-access-api.service\";\nimport { EmergencyAccessService } from \"./services/emergency-access.service\";\n\n@NgModule({\n declarations: [],\n imports: [],\n providers: [EmergencyAccessApiService, EmergencyAccessService],\n})\nexport class EmergencyAccessModule {}\n","export enum EmergencyAccessStatusType {\n Invited = 0,\n Accepted = 1,\n Confirmed = 2,\n RecoveryInitiated = 3,\n RecoveryApproved = 4,\n}\n","import { BaseResponse } from \"@bitwarden/common/models/response/base.response\";\nimport { KdfType } from \"@bitwarden/common/platform/enums\";\nimport { CipherResponse } from \"@bitwarden/common/vault/models/response/cipher.response\";\n\nimport { EmergencyAccessStatusType } from \"../enums/emergency-access-status-type\";\nimport { EmergencyAccessType } from \"../enums/emergency-access-type\";\n\nexport class EmergencyAccessGranteeDetailsResponse extends BaseResponse {\n id: string;\n granteeId: string;\n name: string;\n email: string;\n type: EmergencyAccessType;\n status: EmergencyAccessStatusType;\n waitTimeDays: number;\n creationDate: string;\n avatarColor: string;\n\n constructor(response: any) {\n super(response);\n this.id = this.getResponseProperty(\"Id\");\n this.granteeId = this.getResponseProperty(\"GranteeId\");\n this.name = this.getResponseProperty(\"Name\");\n this.email = this.getResponseProperty(\"Email\");\n this.type = this.getResponseProperty(\"Type\");\n this.status = this.getResponseProperty(\"Status\");\n this.waitTimeDays = this.getResponseProperty(\"WaitTimeDays\");\n this.creationDate = this.getResponseProperty(\"CreationDate\");\n this.avatarColor = this.getResponseProperty(\"AvatarColor\");\n }\n}\n\nexport class EmergencyAccessGrantorDetailsResponse extends BaseResponse {\n id: string;\n grantorId: string;\n name: string;\n email: string;\n type: EmergencyAccessType;\n status: EmergencyAccessStatusType;\n waitTimeDays: number;\n creationDate: string;\n avatarColor: string;\n\n constructor(response: any) {\n super(response);\n this.id = this.getResponseProperty(\"Id\");\n this.grantorId = this.getResponseProperty(\"GrantorId\");\n this.name = this.getResponseProperty(\"Name\");\n this.email = this.getResponseProperty(\"Email\");\n this.type = this.getResponseProperty(\"Type\");\n this.status = this.getResponseProperty(\"Status\");\n this.waitTimeDays = this.getResponseProperty(\"WaitTimeDays\");\n this.creationDate = this.getResponseProperty(\"CreationDate\");\n this.avatarColor = this.getResponseProperty(\"AvatarColor\");\n }\n}\n\nexport class EmergencyAccessTakeoverResponse extends BaseResponse {\n keyEncrypted: string;\n kdf: KdfType;\n kdfIterations: number;\n kdfMemory?: number;\n kdfParallelism?: number;\n\n constructor(response: any) {\n super(response);\n\n this.keyEncrypted = this.getResponseProperty(\"KeyEncrypted\");\n this.kdf = this.getResponseProperty(\"Kdf\");\n this.kdfIterations = this.getResponseProperty(\"KdfIterations\");\n this.kdfMemory = this.getResponseProperty(\"KdfMemory\");\n this.kdfParallelism = this.getResponseProperty(\"KdfParallelism\");\n }\n}\n\nexport class EmergencyAccessViewResponse extends BaseResponse {\n keyEncrypted: string;\n ciphers: CipherResponse[] = [];\n\n constructor(response: any) {\n super(response);\n\n this.keyEncrypted = this.getResponseProperty(\"KeyEncrypted\");\n\n const ciphers = this.getResponseProperty(\"Ciphers\");\n if (ciphers != null) {\n this.ciphers = ciphers.map((c: any) => new CipherResponse(c));\n }\n }\n}\n","import { Injectable } from \"@angular/core\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { PolicyResponse } from \"@bitwarden/common/admin-console/models/response/policy.response\";\nimport { ListResponse } from \"@bitwarden/common/models/response/list.response\";\n\nimport { EmergencyAccessAcceptRequest } from \"../request/emergency-access-accept.request\";\nimport { EmergencyAccessConfirmRequest } from \"../request/emergency-access-confirm.request\";\nimport { EmergencyAccessInviteRequest } from \"../request/emergency-access-invite.request\";\nimport { EmergencyAccessPasswordRequest } from \"../request/emergency-access-password.request\";\nimport { EmergencyAccessUpdateRequest } from \"../request/emergency-access-update.request\";\nimport {\n EmergencyAccessGranteeDetailsResponse,\n EmergencyAccessGrantorDetailsResponse,\n EmergencyAccessTakeoverResponse,\n EmergencyAccessViewResponse,\n} from \"../response/emergency-access.response\";\n\n@Injectable()\nexport class EmergencyAccessApiService {\n constructor(private apiService: ApiService) {}\n\n async getEmergencyAccessTrusted(): Promise> {\n const r = await this.apiService.send(\"GET\", \"/emergency-access/trusted\", null, true, true);\n return new ListResponse(r, EmergencyAccessGranteeDetailsResponse);\n }\n\n async getEmergencyAccessGranted(): Promise> {\n const r = await this.apiService.send(\"GET\", \"/emergency-access/granted\", null, true, true);\n return new ListResponse(r, EmergencyAccessGrantorDetailsResponse);\n }\n\n async getEmergencyAccess(id: string): Promise {\n const r = await this.apiService.send(\"GET\", \"/emergency-access/\" + id, null, true, true);\n return new EmergencyAccessGranteeDetailsResponse(r);\n }\n\n async getEmergencyGrantorPolicies(id: string): Promise> {\n const r = await this.apiService.send(\n \"GET\",\n \"/emergency-access/\" + id + \"/policies\",\n null,\n true,\n true,\n );\n return new ListResponse(r, PolicyResponse);\n }\n\n putEmergencyAccess(id: string, request: EmergencyAccessUpdateRequest): Promise {\n return this.apiService.send(\"PUT\", \"/emergency-access/\" + id, request, true, false);\n }\n\n deleteEmergencyAccess(id: string): Promise {\n return this.apiService.send(\"DELETE\", \"/emergency-access/\" + id, null, true, false);\n }\n\n postEmergencyAccessInvite(request: EmergencyAccessInviteRequest): Promise {\n return this.apiService.send(\"POST\", \"/emergency-access/invite\", request, true, false);\n }\n\n postEmergencyAccessReinvite(id: string): Promise {\n return this.apiService.send(\"POST\", \"/emergency-access/\" + id + \"/reinvite\", null, true, false);\n }\n\n postEmergencyAccessAccept(id: string, request: EmergencyAccessAcceptRequest): Promise {\n return this.apiService.send(\n \"POST\",\n \"/emergency-access/\" + id + \"/accept\",\n request,\n true,\n false,\n );\n }\n\n postEmergencyAccessConfirm(id: string, request: EmergencyAccessConfirmRequest): Promise {\n return this.apiService.send(\n \"POST\",\n \"/emergency-access/\" + id + \"/confirm\",\n request,\n true,\n false,\n );\n }\n\n postEmergencyAccessInitiate(id: string): Promise {\n return this.apiService.send(\"POST\", \"/emergency-access/\" + id + \"/initiate\", null, true, false);\n }\n\n postEmergencyAccessApprove(id: string): Promise {\n return this.apiService.send(\"POST\", \"/emergency-access/\" + id + \"/approve\", null, true, false);\n }\n\n postEmergencyAccessReject(id: string): Promise {\n return this.apiService.send(\"POST\", \"/emergency-access/\" + id + \"/reject\", null, true, false);\n }\n\n async postEmergencyAccessTakeover(id: string): Promise {\n const r = await this.apiService.send(\n \"POST\",\n \"/emergency-access/\" + id + \"/takeover\",\n null,\n true,\n true,\n );\n return new EmergencyAccessTakeoverResponse(r);\n }\n\n async postEmergencyAccessPassword(\n id: string,\n request: EmergencyAccessPasswordRequest,\n ): Promise {\n await this.apiService.send(\n \"POST\",\n \"/emergency-access/\" + id + \"/password\",\n request,\n true,\n true,\n );\n }\n\n async postEmergencyAccessView(id: string): Promise {\n const r = await this.apiService.send(\n \"POST\",\n \"/emergency-access/\" + id + \"/view\",\n null,\n true,\n true,\n );\n return new EmergencyAccessViewResponse(r);\n }\n}\n","export class EmergencyAccessAcceptRequest {\n token: string;\n}\n","export class EmergencyAccessConfirmRequest {\n key: string;\n}\n","import { EmergencyAccessType } from \"../enums/emergency-access-type\";\n\nexport class EmergencyAccessInviteRequest {\n email: string;\n type: EmergencyAccessType;\n waitTimeDays: number;\n}\n","export class EmergencyAccessPasswordRequest {\n newMasterPasswordHash: string;\n key: string;\n}\n","import { EmergencyAccessType } from \"../enums/emergency-access-type\";\n\nexport class EmergencyAccessUpdateRequest {\n type: EmergencyAccessType;\n waitTimeDays: number;\n keyEncrypted?: string;\n}\n\nexport class EmergencyAccessWithIdRequest extends EmergencyAccessUpdateRequest {\n id: string;\n}\n","import { Injectable } from \"@angular/core\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { PolicyData } from \"@bitwarden/common/admin-console/models/data/policy.data\";\nimport { Policy } from \"@bitwarden/common/admin-console/models/domain/policy\";\nimport { KdfConfig } from \"@bitwarden/common/auth/models/domain/kdf-config\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { EncryptService } from \"@bitwarden/common/platform/abstractions/encrypt.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\nimport { EncryptedString } from \"@bitwarden/common/platform/models/domain/enc-string\";\nimport { SymmetricCryptoKey } from \"@bitwarden/common/platform/models/domain/symmetric-crypto-key\";\nimport { UserKey } from \"@bitwarden/common/types/key\";\nimport { CipherService } from \"@bitwarden/common/vault/abstractions/cipher.service\";\nimport { Cipher } from \"@bitwarden/common/vault/models/domain/cipher\";\nimport { CipherView } from \"@bitwarden/common/vault/models/view/cipher.view\";\n\nimport { EmergencyAccessStatusType } from \"../enums/emergency-access-status-type\";\nimport { EmergencyAccessType } from \"../enums/emergency-access-type\";\nimport { GranteeEmergencyAccess, GrantorEmergencyAccess } from \"../models/emergency-access\";\nimport { EmergencyAccessAcceptRequest } from \"../request/emergency-access-accept.request\";\nimport { EmergencyAccessConfirmRequest } from \"../request/emergency-access-confirm.request\";\nimport { EmergencyAccessInviteRequest } from \"../request/emergency-access-invite.request\";\nimport { EmergencyAccessPasswordRequest } from \"../request/emergency-access-password.request\";\nimport {\n EmergencyAccessUpdateRequest,\n EmergencyAccessWithIdRequest,\n} from \"../request/emergency-access-update.request\";\n\nimport { EmergencyAccessApiService } from \"./emergency-access-api.service\";\n\n@Injectable()\nexport class EmergencyAccessService {\n constructor(\n private emergencyAccessApiService: EmergencyAccessApiService,\n private apiService: ApiService,\n private cryptoService: CryptoService,\n private encryptService: EncryptService,\n private cipherService: CipherService,\n private logService: LogService,\n ) {}\n\n /**\n * Gets an emergency access by id.\n * @param id emergency access id\n */\n getEmergencyAccess(id: string): Promise {\n return this.emergencyAccessApiService.getEmergencyAccess(id);\n }\n\n /**\n * Gets all emergency access that the user has been granted.\n */\n async getEmergencyAccessTrusted(): Promise {\n return (await this.emergencyAccessApiService.getEmergencyAccessTrusted()).data;\n }\n\n /**\n * Gets all emergency access that the user has granted.\n */\n async getEmergencyAccessGranted(): Promise {\n return (await this.emergencyAccessApiService.getEmergencyAccessGranted()).data;\n }\n\n /**\n * Returns policies that apply to the grantor.\n * Intended for grantee.\n * @param id emergency access id\n */\n async getGrantorPolicies(id: string): Promise {\n const response = await this.emergencyAccessApiService.getEmergencyGrantorPolicies(id);\n let policies: Policy[];\n if (response.data != null && response.data.length > 0) {\n policies = response.data.map((policyResponse) => new Policy(new PolicyData(policyResponse)));\n }\n return policies;\n }\n\n /**\n * Invites the email address to be an emergency contact.\n * Step 1 of the 3 step setup flow.\n * Intended for grantor.\n * @param email email address of trusted emergency contact\n * @param type type of emergency access\n * @param waitTimeDays number of days to wait before granting access\n */\n async invite(email: string, type: EmergencyAccessType, waitTimeDays: number): Promise {\n const request = new EmergencyAccessInviteRequest();\n request.email = email.trim();\n request.type = type;\n request.waitTimeDays = waitTimeDays;\n\n await this.emergencyAccessApiService.postEmergencyAccessInvite(request);\n }\n\n /**\n * Sends another email for an existing emergency access invitation.\n * Intended for grantor.\n * @param id emergency access id\n */\n reinvite(id: string): Promise {\n return this.emergencyAccessApiService.postEmergencyAccessReinvite(id);\n }\n\n /**\n * Edits an existing emergency access.\n * Intended for grantor.\n * @param id emergency access id\n * @param type type of emergency access\n * @param waitTimeDays number of days to wait before granting access\n */\n async update(id: string, type: EmergencyAccessType, waitTimeDays: number) {\n const request = new EmergencyAccessUpdateRequest();\n request.type = type;\n request.waitTimeDays = waitTimeDays;\n\n await this.emergencyAccessApiService.putEmergencyAccess(id, request);\n }\n\n /**\n * Accepts an emergency access invitation.\n * Step 2 of the 3 step setup flow.\n * Intended for grantee.\n * @param id emergency access id\n * @param token secret token provided in email\n */\n async accept(id: string, token: string): Promise {\n const request = new EmergencyAccessAcceptRequest();\n request.token = token;\n\n await this.emergencyAccessApiService.postEmergencyAccessAccept(id, request);\n }\n\n /**\n * Encrypts user key with grantee's public key and sends to bitwarden.\n * Step 3 of the 3 step setup flow.\n * Intended for grantor.\n * @param id emergency access id\n * @param token secret token provided in email\n */\n async confirm(id: string, granteeId: string) {\n const userKey = await this.cryptoService.getUserKey();\n if (!userKey) {\n throw new Error(\"No user key found\");\n }\n const publicKeyResponse = await this.apiService.getUserPublicKey(granteeId);\n const publicKey = Utils.fromB64ToArray(publicKeyResponse.publicKey);\n\n try {\n this.logService.debug(\n \"User's fingerprint: \" +\n (await this.cryptoService.getFingerprint(granteeId, publicKey)).join(\"-\"),\n );\n } catch {\n // Ignore errors since it's just a debug message\n }\n\n const request = new EmergencyAccessConfirmRequest();\n request.key = await this.encryptKey(userKey, publicKey);\n await this.emergencyAccessApiService.postEmergencyAccessConfirm(id, request);\n }\n\n /**\n * Deletes an existing emergency access.\n * Intended for either grantor or grantee.\n * @param id emergency access id\n */\n delete(id: string): Promise {\n return this.emergencyAccessApiService.deleteEmergencyAccess(id);\n }\n\n /**\n * Requests access to grantor's vault.\n * Intended for grantee.\n * @param id emergency access id\n */\n requestAccess(id: string): Promise {\n return this.emergencyAccessApiService.postEmergencyAccessInitiate(id);\n }\n\n /**\n * Approves access to grantor's vault.\n * Intended for grantor.\n * @param id emergency access id\n */\n approve(id: string): Promise {\n return this.emergencyAccessApiService.postEmergencyAccessApprove(id);\n }\n\n /**\n * Rejects access to grantor's vault.\n * Intended for grantor.\n * @param id emergency access id\n */\n reject(id: string): Promise {\n return this.emergencyAccessApiService.postEmergencyAccessReject(id);\n }\n\n /**\n * Gets the grantor ciphers for an emergency access in view mode.\n * Intended for grantee.\n * @param id emergency access id\n */\n async getViewOnlyCiphers(id: string): Promise {\n const response = await this.emergencyAccessApiService.postEmergencyAccessView(id);\n\n const grantorKeyBuffer = await this.cryptoService.rsaDecrypt(response.keyEncrypted);\n const grantorUserKey = new SymmetricCryptoKey(grantorKeyBuffer) as UserKey;\n\n const ciphers = await this.encryptService.decryptItems(\n response.ciphers.map((c) => new Cipher(c)),\n grantorUserKey,\n );\n return ciphers.sort(this.cipherService.getLocaleSortingFunction());\n }\n\n /**\n * Changes the password for an emergency access.\n * Intended for grantee.\n * @param id emergency access id\n * @param masterPassword new master password\n * @param email email address of grantee (must be consistent or login will fail)\n */\n async takeover(id: string, masterPassword: string, email: string) {\n const takeoverResponse = await this.emergencyAccessApiService.postEmergencyAccessTakeover(id);\n\n const grantorKeyBuffer = await this.cryptoService.rsaDecrypt(takeoverResponse.keyEncrypted);\n if (grantorKeyBuffer == null) {\n throw new Error(\"Failed to decrypt grantor key\");\n }\n\n const grantorUserKey = new SymmetricCryptoKey(grantorKeyBuffer) as UserKey;\n\n const masterKey = await this.cryptoService.makeMasterKey(\n masterPassword,\n email,\n takeoverResponse.kdf,\n new KdfConfig(\n takeoverResponse.kdfIterations,\n takeoverResponse.kdfMemory,\n takeoverResponse.kdfParallelism,\n ),\n );\n const masterKeyHash = await this.cryptoService.hashMasterKey(masterPassword, masterKey);\n\n const encKey = await this.cryptoService.encryptUserKeyWithMasterKey(masterKey, grantorUserKey);\n\n const request = new EmergencyAccessPasswordRequest();\n request.newMasterPasswordHash = masterKeyHash;\n request.key = encKey[1].encryptedString;\n\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.emergencyAccessApiService.postEmergencyAccessPassword(id, request);\n }\n\n /**\n * Returns existing emergency access keys re-encrypted with new user key.\n * Intended for grantor.\n * @param newUserKey the new user key\n */\n async getRotatedKeys(newUserKey: UserKey): Promise {\n const requests: EmergencyAccessWithIdRequest[] = [];\n const existingEmergencyAccess =\n await this.emergencyAccessApiService.getEmergencyAccessTrusted();\n\n if (!existingEmergencyAccess || existingEmergencyAccess.data.length === 0) {\n return requests;\n }\n\n // Any Invited or Accepted requests won't have the key yet, so we don't need to update them\n const allowedStatuses = new Set([\n EmergencyAccessStatusType.Confirmed,\n EmergencyAccessStatusType.RecoveryInitiated,\n EmergencyAccessStatusType.RecoveryApproved,\n ]);\n const filteredAccesses = existingEmergencyAccess.data.filter((d) =>\n allowedStatuses.has(d.status),\n );\n\n for (const details of filteredAccesses) {\n // Get public key of grantee\n const publicKeyResponse = await this.apiService.getUserPublicKey(details.granteeId);\n const publicKey = Utils.fromB64ToArray(publicKeyResponse.publicKey);\n\n // Encrypt new user key with public key\n const encryptedKey = await this.encryptKey(newUserKey, publicKey);\n\n const updateRequest = new EmergencyAccessWithIdRequest();\n updateRequest.id = details.id;\n updateRequest.type = details.type;\n updateRequest.waitTimeDays = details.waitTimeDays;\n updateRequest.keyEncrypted = encryptedKey;\n requests.push(updateRequest);\n }\n return requests;\n }\n\n private async encryptKey(userKey: UserKey, publicKey: Uint8Array): Promise {\n return (await this.cryptoService.rsaEncrypt(userKey.key, publicKey)).encryptedString;\n }\n\n /**\n * @deprecated Nov 6, 2023: Use new Key Rotation Service for posting rotated data.\n */\n async postLegacyRotation(requests: EmergencyAccessWithIdRequest[]): Promise {\n if (requests == null) {\n return;\n }\n for (const request of requests) {\n await this.emergencyAccessApiService.putEmergencyAccess(request.id, request);\n }\n }\n}\n","import { inject } from \"@angular/core\";\nimport { CanActivateFn, Router } from \"@angular/router\";\n\nimport { AuthService } from \"@bitwarden/common/auth/abstractions/auth.service\";\nimport { AuthenticationStatus } from \"@bitwarden/common/auth/enums/authentication-status\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\n\nimport { RouterService } from \"../../core/router.service\";\n\n/**\n * Guard to persist and apply deep links to handle users who are not unlocked.\n * @returns returns true. If user is not Unlocked will store URL to state for redirect once\n * user is unlocked/Authenticated.\n */\nexport function deepLinkGuard(): CanActivateFn {\n return async (route, routerState) => {\n // Inject Services\n const authService = inject(AuthService);\n const router = inject(Router);\n const routerService = inject(RouterService);\n\n // Fetch State\n const currentUrl = routerState.url;\n const transientPreviousUrl = routerService.getPreviousUrl();\n const authStatus = await authService.getAuthStatus();\n\n // Evaluate State\n /** before anything else, check if the user is already unlocked. */\n if (authStatus === AuthenticationStatus.Unlocked) {\n const persistedPreLoginUrl = await routerService.getAndClearLoginRedirectUrl();\n if (!Utils.isNullOrEmpty(persistedPreLoginUrl)) {\n return router.navigateByUrl(persistedPreLoginUrl);\n }\n return true;\n }\n /**\n * At this point the user is either `locked` or `loggedOut`, it doesn't matter.\n * We opt to persist the currentUrl over the transient previousUrl. This supports\n * the case where a user is locked out of their vault and they deep link from\n * the \"lock\" page.\n *\n * When the user is locked out of their vault the currentUrl contains \"lock\" so it will\n * not be persisted, the previousUrl will be persisted instead.\n */\n if (isValidUrl(currentUrl)) {\n await routerService.persistLoginRedirectUrl(currentUrl);\n } else if (isValidUrl(transientPreviousUrl)) {\n await routerService.persistLoginRedirectUrl(transientPreviousUrl);\n }\n return true;\n };\n\n function isValidUrl(url: string | null | undefined): boolean {\n return !Utils.isNullOrEmpty(url) && !url?.toLocaleLowerCase().includes(\"/lock\");\n }\n}\n","import { inject, Injectable } from \"@angular/core\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\n\nimport { UpdateKeyRequest } from \"./request/update-key.request\";\n\n@Injectable()\nexport class UserKeyRotationApiService {\n readonly apiService = inject(ApiService);\n\n postUserKeyUpdate(request: UpdateKeyRequest): Promise {\n return this.apiService.send(\"POST\", \"/accounts/key\", request, true, false);\n }\n}\n","import { NgModule } from \"@angular/core\";\n\nimport { UserKeyRotationApiService } from \"./user-key-rotation-api.service\";\nimport { UserKeyRotationService } from \"./user-key-rotation.service\";\n\n@NgModule({\n providers: [UserKeyRotationService, UserKeyRotationApiService],\n})\nexport class UserKeyRotationModule {}\n","import { OrganizationUserResetPasswordWithIdRequest } from \"@bitwarden/common/admin-console/abstractions/organization-user/requests\";\nimport { SendWithIdRequest } from \"@bitwarden/common/src/tools/send/models/request/send-with-id.request\";\nimport { CipherWithIdRequest } from \"@bitwarden/common/src/vault/models/request/cipher-with-id.request\";\nimport { FolderWithIdRequest } from \"@bitwarden/common/src/vault/models/request/folder-with-id.request\";\n\nimport { EmergencyAccessWithIdRequest } from \"../../emergency-access/request/emergency-access-update.request\";\n\nexport class UpdateKeyRequest {\n masterPasswordHash: string;\n key: string;\n privateKey: string;\n ciphers: CipherWithIdRequest[] = [];\n folders: FolderWithIdRequest[] = [];\n sends: SendWithIdRequest[] = [];\n emergencyAccessKeys: EmergencyAccessWithIdRequest[] = [];\n resetPasswordKeys: OrganizationUserResetPasswordWithIdRequest[] = [];\n}\n","import { Injectable } from \"@angular/core\";\nimport { firstValueFrom } from \"rxjs\";\n\nimport { DeviceTrustCryptoServiceAbstraction } from \"@bitwarden/common/auth/abstractions/device-trust-crypto.service.abstraction\";\nimport { FeatureFlag } from \"@bitwarden/common/enums/feature-flag.enum\";\nimport { ConfigServiceAbstraction } from \"@bitwarden/common/platform/abstractions/config/config.service.abstraction\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { EncryptService } from \"@bitwarden/common/platform/abstractions/encrypt.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { EncryptedString } from \"@bitwarden/common/platform/models/domain/enc-string\";\nimport { SendService } from \"@bitwarden/common/tools/send/services/send.service.abstraction\";\nimport { UserKey } from \"@bitwarden/common/types/key\";\nimport { CipherService } from \"@bitwarden/common/vault/abstractions/cipher.service\";\nimport { FolderService } from \"@bitwarden/common/vault/abstractions/folder/folder.service.abstraction\";\nimport { CipherWithIdRequest } from \"@bitwarden/common/vault/models/request/cipher-with-id.request\";\nimport { FolderWithIdRequest } from \"@bitwarden/common/vault/models/request/folder-with-id.request\";\n\nimport { OrganizationUserResetPasswordService } from \"../../admin-console/organizations/members/services/organization-user-reset-password/organization-user-reset-password.service\";\nimport { EmergencyAccessService } from \"../emergency-access\";\n\nimport { UpdateKeyRequest } from \"./request/update-key.request\";\nimport { UserKeyRotationApiService } from \"./user-key-rotation-api.service\";\n\n@Injectable()\nexport class UserKeyRotationService {\n constructor(\n private apiService: UserKeyRotationApiService,\n private cipherService: CipherService,\n private folderService: FolderService,\n private sendService: SendService,\n private emergencyAccessService: EmergencyAccessService,\n private resetPasswordService: OrganizationUserResetPasswordService,\n private deviceTrustCryptoService: DeviceTrustCryptoServiceAbstraction,\n private cryptoService: CryptoService,\n private encryptService: EncryptService,\n private stateService: StateService,\n private configService: ConfigServiceAbstraction,\n ) {}\n\n /**\n * Creates a new user key and re-encrypts all required data with the it.\n * @param masterPassword current master password (used for validation)\n */\n async rotateUserKeyAndEncryptedData(masterPassword: string): Promise {\n if (!masterPassword) {\n throw new Error(\"Invalid master password\");\n }\n\n // Create master key to validate the master password\n const masterKey = await this.cryptoService.makeMasterKey(\n masterPassword,\n await this.stateService.getEmail(),\n await this.stateService.getKdfType(),\n await this.stateService.getKdfConfig(),\n );\n\n if (!masterKey) {\n throw new Error(\"Master key could not be created\");\n }\n\n // Set master key again in case it was lost (could be lost on refresh)\n await this.cryptoService.setMasterKey(masterKey);\n const [newUserKey, newEncUserKey] = await this.cryptoService.makeUserKey(masterKey);\n\n if (!newUserKey || !newEncUserKey) {\n throw new Error(\"User key could not be created\");\n }\n\n // Create new request\n const request = new UpdateKeyRequest();\n\n // Add new user key\n request.key = newEncUserKey.encryptedString;\n\n // Add master key hash\n const masterPasswordHash = await this.cryptoService.hashMasterKey(masterPassword, masterKey);\n request.masterPasswordHash = masterPasswordHash;\n\n // Add re-encrypted data\n request.privateKey = await this.encryptPrivateKey(newUserKey);\n request.ciphers = await this.encryptCiphers(newUserKey);\n request.folders = await this.encryptFolders(newUserKey);\n request.sends = await this.sendService.getRotatedKeys(newUserKey);\n request.emergencyAccessKeys = await this.emergencyAccessService.getRotatedKeys(newUserKey);\n request.resetPasswordKeys = await this.resetPasswordService.getRotatedKeys(newUserKey);\n\n if (await this.configService.getFeatureFlag(FeatureFlag.KeyRotationImprovements)) {\n await this.apiService.postUserKeyUpdate(request);\n } else {\n await this.rotateUserKeyAndEncryptedDataLegacy(request);\n }\n\n await this.deviceTrustCryptoService.rotateDevicesTrust(newUserKey, masterPasswordHash);\n }\n\n private async encryptPrivateKey(newUserKey: UserKey): Promise {\n const privateKey = await this.cryptoService.getPrivateKey();\n if (!privateKey) {\n return;\n }\n return (await this.encryptService.encrypt(privateKey, newUserKey)).encryptedString;\n }\n\n private async encryptCiphers(newUserKey: UserKey): Promise {\n const ciphers = await this.cipherService.getAllDecrypted();\n if (!ciphers) {\n // Must return an empty array for backwards compatibility\n return [];\n }\n return await Promise.all(\n ciphers.map(async (cipher) => {\n const encryptedCipher = await this.cipherService.encrypt(cipher, newUserKey);\n return new CipherWithIdRequest(encryptedCipher);\n }),\n );\n }\n\n private async encryptFolders(newUserKey: UserKey): Promise {\n const folders = await firstValueFrom(this.folderService.folderViews$);\n if (!folders) {\n // Must return an empty array for backwards compatibility\n return [];\n }\n return await Promise.all(\n folders.map(async (folder) => {\n const encryptedFolder = await this.folderService.encrypt(folder, newUserKey);\n return new FolderWithIdRequest(encryptedFolder);\n }),\n );\n }\n\n private async rotateUserKeyAndEncryptedDataLegacy(request: UpdateKeyRequest): Promise {\n // Update keys, ciphers, folders, and sends\n await this.apiService.postUserKeyUpdate(request);\n\n // Update emergency access keys\n await this.emergencyAccessService.postLegacyRotation(request.emergencyAccessKeys);\n\n // Update account recovery keys\n const userId = await this.stateService.getUserId();\n await this.resetPasswordService.postLegacyRotation(userId, request.resetPasswordKeys);\n }\n}\n","import { NgModule } from \"@angular/core\";\n\nimport { PasswordCalloutComponent } from \"@bitwarden/auth/angular\";\n\nimport { SharedModule } from \"../../shared\";\n\nimport { RegisterFormComponent } from \"./register-form.component\";\n\n@NgModule({\n imports: [SharedModule, PasswordCalloutComponent],\n declarations: [RegisterFormComponent],\n exports: [RegisterFormComponent],\n})\nexport class RegisterFormModule {}\n","import { Component } from \"@angular/core\";\n\nimport { JslibModule } from \"@bitwarden/angular/jslib.module\";\nimport { TypographyModule } from \"@bitwarden/components\";\n\n/**\n * Component for the Danger Zone section of the Account/Organization Settings page.\n */\n@Component({\n selector: \"app-danger-zone\",\n templateUrl: \"danger-zone.component.html\",\n standalone: true,\n imports: [TypographyModule, JslibModule],\n})\nexport class DangerZoneComponent {}\n","

{{ \"dangerZone\" | i18n }}

\n\n
\n

{{ \"dangerZoneDesc\" | i18n }}

\n\n
\n \n
\n
\n","export class UpdateProfileRequest {\n name: string;\n masterPasswordHint: string;\n culture = \"en-US\"; // deprecated\n\n constructor(name: string, masterPasswordHint: string) {\n this.name = name;\n this.masterPasswordHint = masterPasswordHint ? masterPasswordHint : null;\n }\n}\n","import { Component, EventEmitter, Input, Output } from \"@angular/core\";\n\n@Component({\n selector: \"selectable-avatar\",\n template: `\n \n \n `,\n})\nexport class SelectableAvatarComponent {\n @Input() id: string;\n @Input() text: string;\n @Input() title: string;\n @Input() color: string;\n @Input() border = false;\n @Input() selected = false;\n @Output() select = new EventEmitter();\n\n onFire() {\n this.select.emit(this.color);\n }\n\n get classList() {\n return [\"tw-rounded-full tw-inline-block\"]\n .concat([\"tw-cursor-pointer\", \"tw-outline\", \"tw-outline-solid\", \"tw-outline-offset-1\"])\n .concat(\n this.selected\n ? [\"tw-outline-[3px]\", \"tw-outline-primary-500\"]\n : [\n \"tw-outline-0\",\n \"hover:tw-outline-1\",\n \"hover:tw-outline-primary-300\",\n \"focus:tw-outline-2\",\n \"focus:tw-outline-primary-500\",\n ],\n );\n }\n}\n","\n\n
\n
\n
\n
\n

{{ \"customizeAvatar\" | i18n }}

\n \n ×\n \n
\n
\n
\n \n {{ \"loading\" | i18n }}\n
\n \n {{ error }}\n \n

{{ \"pickAnAvatarColor\" | i18n }}

\n
\n \n \n \n \n \n \n \n \n \n \n
\n
\n
\n \n \n {{ \"save\" | i18n }}\n \n \n
\n
\n
\n
\n","import {\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ViewChild,\n ViewEncapsulation,\n} from \"@angular/core\";\nimport { BehaviorSubject, debounceTime, firstValueFrom, Subject, takeUntil } from \"rxjs\";\n\nimport { AvatarService } from \"@bitwarden/common/auth/abstractions/avatar.service\";\nimport { ProfileResponse } from \"@bitwarden/common/models/response/profile.response\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\n\n@Component({\n selector: \"app-change-avatar\",\n templateUrl: \"change-avatar.component.html\",\n encapsulation: ViewEncapsulation.None,\n})\nexport class ChangeAvatarComponent implements OnInit, OnDestroy {\n @Input() profile: ProfileResponse;\n\n @Output() changeColor: EventEmitter = new EventEmitter();\n @Output() onSaved = new EventEmitter();\n\n @ViewChild(\"colorPicker\") colorPickerElement: ElementRef;\n\n loading = false;\n error: string;\n defaultColorPalette: NamedAvatarColor[] = [\n { name: \"brightBlue\", color: \"#16cbfc\" },\n { name: \"green\", color: \"#94cc4b\" },\n { name: \"orange\", color: \"#ffb520\" },\n { name: \"lavender\", color: \"#e5beed\" },\n { name: \"yellow\", color: \"#fcff41\" },\n { name: \"indigo\", color: \"#acbdf7\" },\n { name: \"teal\", color: \"#8ecdc5\" },\n { name: \"salmon\", color: \"#ffa3a3\" },\n { name: \"pink\", color: \"#ffa2d4\" },\n ];\n customColorSelected = false;\n currentSelection: string;\n\n protected customColor$ = new BehaviorSubject(null);\n protected customTextColor$ = new BehaviorSubject(\"#000000\");\n private destroy$ = new Subject();\n\n constructor(\n private i18nService: I18nService,\n private platformUtilsService: PlatformUtilsService,\n private logService: LogService,\n private avatarService: AvatarService,\n ) {}\n\n async ngOnInit() {\n //localize the default colors\n this.defaultColorPalette.forEach((c) => (c.name = this.i18nService.t(c.name)));\n\n this.customColor$\n .pipe(debounceTime(200), takeUntil(this.destroy$))\n .subscribe((color: string | null) => {\n if (color == null) {\n return;\n }\n this.customTextColor$.next(Utils.pickTextColorBasedOnBgColor(color));\n this.customColorSelected = true;\n this.currentSelection = color;\n });\n\n await this.setSelection(await firstValueFrom(this.avatarService.avatarColor$));\n }\n\n async showCustomPicker() {\n this.customColorSelected = true;\n this.colorPickerElement.nativeElement.click();\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.setSelection(this.customColor$.value);\n }\n\n async generateAvatarColor() {\n Utils.stringToColor(this.profile.name.toString());\n }\n\n async submit() {\n try {\n if (Utils.validateHexColor(this.currentSelection) || this.currentSelection == null) {\n await this.avatarService.setAvatarColor(this.currentSelection);\n this.changeColor.emit(this.currentSelection);\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"avatarUpdated\"));\n } else {\n this.platformUtilsService.showToast(\"error\", null, this.i18nService.t(\"errorOccurred\"));\n }\n } catch (e) {\n this.logService.error(e);\n this.platformUtilsService.showToast(\"error\", null, this.i18nService.t(\"errorOccurred\"));\n }\n }\n\n async ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n async setSelection(color: string | null) {\n this.defaultColorPalette.filter((x) => x.selected).forEach((c) => (c.selected = false));\n\n if (color == null) {\n return;\n }\n\n color = color.toLowerCase();\n\n this.customColorSelected = false;\n //Allow for toggle\n if (this.currentSelection === color) {\n this.currentSelection = null;\n } else {\n const selectedColorIndex = this.defaultColorPalette.findIndex((c) => c.color === color);\n if (selectedColorIndex !== -1) {\n this.defaultColorPalette[selectedColorIndex].selected = true;\n this.currentSelection = color;\n } else {\n this.customColor$.next(color);\n }\n }\n }\n}\n\nexport class NamedAvatarColor {\n name: string;\n color: string;\n selected? = false;\n}\n","
\n \n {{ \"loading\" | i18n }}\n
\n\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n
\n \n \n \n \n Customize\n \n
\n \n \n
\n
\n \n\n\n","import { ViewChild, ViewContainerRef, Component, OnDestroy, OnInit } from \"@angular/core\";\nimport { Subject, takeUntil } from \"rxjs\";\n\nimport { ModalService } from \"@bitwarden/angular/services/modal.service\";\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { UpdateProfileRequest } from \"@bitwarden/common/auth/models/request/update-profile.request\";\nimport { ProfileResponse } from \"@bitwarden/common/models/response/profile.response\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\n\nimport { ChangeAvatarComponent } from \"./change-avatar.component\";\n\n@Component({\n selector: \"app-profile\",\n templateUrl: \"profile.component.html\",\n})\nexport class ProfileComponent implements OnInit, OnDestroy {\n loading = true;\n profile: ProfileResponse;\n fingerprintMaterial: string;\n\n formPromise: Promise;\n @ViewChild(\"avatarModalTemplate\", { read: ViewContainerRef, static: true })\n avatarModalRef: ViewContainerRef;\n private destroy$ = new Subject();\n\n constructor(\n private apiService: ApiService,\n private i18nService: I18nService,\n private platformUtilsService: PlatformUtilsService,\n private logService: LogService,\n private stateService: StateService,\n private modalService: ModalService,\n ) {}\n\n async ngOnInit() {\n this.profile = await this.apiService.getProfile();\n this.loading = false;\n this.fingerprintMaterial = await this.stateService.getUserId();\n }\n\n async ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n async openChangeAvatar() {\n const modalOpened = await this.modalService.openViewRef(\n ChangeAvatarComponent,\n this.avatarModalRef,\n (modal) => {\n modal.profile = this.profile;\n modal.changeColor.pipe(takeUntil(this.destroy$)).subscribe(() => {\n modalOpened[0].close();\n });\n },\n );\n }\n\n async submit() {\n try {\n const request = new UpdateProfileRequest(this.profile.name, this.profile.masterPasswordHint);\n this.formPromise = this.apiService.putProfile(request);\n await this.formPromise;\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"accountUpdated\"));\n } catch (e) {\n this.logService.error(e);\n }\n }\n}\n","
\n
\n \n
\n

{{ apiKeyTitle | i18n }}

\n \n ×\n \n
\n
\n

{{ apiKeyDescription | i18n }}

\n \n \n\n {{ apiKeyWarning | i18n }}\n \n

\n client_id:
\n {{ clientId }}\n

\n

\n client_secret:
\n {{ clientSecret }}\n

\n

\n scope:
\n {{ scope }}\n

\n

\n grant_type:
\n {{ grantType }}\n

\n \n
\n
\n \n \n {{ (isRotation ? \"rotateApiKey\" : \"viewApiKey\") | i18n }}\n \n \n
\n \n
\n
\n","import { Component } from \"@angular/core\";\n\nimport { UserVerificationService } from \"@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction\";\nimport { SecretVerificationRequest } from \"@bitwarden/common/auth/models/request/secret-verification.request\";\nimport { ApiKeyResponse } from \"@bitwarden/common/auth/models/response/api-key.response\";\nimport { Verification } from \"@bitwarden/common/auth/types/verification\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\n\n@Component({\n selector: \"app-api-key\",\n templateUrl: \"api-key.component.html\",\n})\nexport class ApiKeyComponent {\n keyType: string;\n isRotation: boolean;\n postKey: (entityId: string, request: SecretVerificationRequest) => Promise;\n entityId: string;\n scope: string;\n grantType: string;\n apiKeyTitle: string;\n apiKeyWarning: string;\n apiKeyDescription: string;\n\n masterPassword: Verification;\n formPromise: Promise;\n clientId: string;\n clientSecret: string;\n\n constructor(\n private userVerificationService: UserVerificationService,\n private logService: LogService,\n ) {}\n\n async submit() {\n try {\n this.formPromise = this.userVerificationService\n .buildRequest(this.masterPassword)\n .then((request) => this.postKey(this.entityId, request));\n const response = await this.formPromise;\n this.clientSecret = response.apiKey;\n this.clientId = `${this.keyType}.${this.entityId}`;\n } catch (e) {\n this.logService.error(e);\n }\n }\n}\n","import { TwoFactorProviderType } from \"../../enums/two-factor-provider-type\";\n\nimport { SecretVerificationRequest } from \"./secret-verification.request\";\n\nexport class TwoFactorProviderRequest extends SecretVerificationRequest {\n type: TwoFactorProviderType;\n}\n","import { Directive, EventEmitter, Output } from \"@angular/core\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { UserVerificationService } from \"@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction\";\nimport { TwoFactorProviderType } from \"@bitwarden/common/auth/enums/two-factor-provider-type\";\nimport { VerificationType } from \"@bitwarden/common/auth/enums/verification-type\";\nimport { SecretVerificationRequest } from \"@bitwarden/common/auth/models/request/secret-verification.request\";\nimport { TwoFactorProviderRequest } from \"@bitwarden/common/auth/models/request/two-factor-provider.request\";\nimport { AuthResponseBase } from \"@bitwarden/common/auth/types/auth-response\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { DialogService } from \"@bitwarden/components\";\n\n@Directive()\nexport abstract class TwoFactorBaseComponent {\n @Output() onUpdated = new EventEmitter();\n\n type: TwoFactorProviderType;\n organizationId: string;\n twoFactorProviderType = TwoFactorProviderType;\n enabled = false;\n authed = false;\n\n protected hashedSecret: string;\n protected verificationType: VerificationType;\n protected componentName = \"\";\n\n constructor(\n protected apiService: ApiService,\n protected i18nService: I18nService,\n protected platformUtilsService: PlatformUtilsService,\n protected logService: LogService,\n protected userVerificationService: UserVerificationService,\n protected dialogService: DialogService,\n ) {}\n\n protected auth(authResponse: AuthResponseBase) {\n this.hashedSecret = authResponse.secret;\n this.verificationType = authResponse.verificationType;\n this.authed = true;\n }\n\n protected async enable(enableFunction: () => Promise) {\n try {\n await enableFunction();\n this.onUpdated.emit(true);\n } catch (e) {\n this.logService.error(e);\n }\n }\n\n protected async disable(promise: Promise) {\n const confirmed = await this.dialogService.openSimpleDialog({\n title: { key: \"disable\" },\n content: { key: \"twoStepDisableDesc\" },\n type: \"warning\",\n });\n\n if (!confirmed) {\n return;\n }\n\n try {\n const request = await this.buildRequestModel(TwoFactorProviderRequest);\n request.type = this.type;\n if (this.organizationId != null) {\n promise = this.apiService.putTwoFactorOrganizationDisable(this.organizationId, request);\n } else {\n promise = this.apiService.putTwoFactorDisable(request);\n }\n await promise;\n this.enabled = false;\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"twoStepDisabled\"));\n this.onUpdated.emit(false);\n } catch (e) {\n this.logService.error(e);\n }\n }\n\n protected async buildRequestModel(\n requestClass: new () => T,\n ) {\n return this.userVerificationService.buildRequest(\n {\n secret: this.hashedSecret,\n type: this.verificationType,\n },\n requestClass,\n true,\n );\n }\n}\n","import { SecretVerificationRequest } from \"./secret-verification.request\";\n\nexport class UpdateTwoFactorDuoRequest extends SecretVerificationRequest {\n integrationKey: string;\n secretKey: string;\n host: string;\n}\n","
\n
\n
\n
\n

\n {{ \"twoStepLogin\" | i18n }}\n Duo\n

\n \n ×\n \n
\n \n \n \n
\n \n \n {{ \"twoStepLoginProviderEnabled\" | i18n }}\n \n \"Duo\n {{ \"twoFactorDuoIntegrationKey\" | i18n }}: {{ ikey }}\n
\n {{ \"twoFactorDuoSecretKey\" | i18n }}: {{ skey }}\n
\n {{ \"twoFactorDuoApiHostname\" | i18n }}: {{ host }}\n
\n \n \"Duo\n

{{ \"twoFactorDuoDesc\" | i18n }}

\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n
\n \n \n
\n \n
\n
\n
\n","import { Component } from \"@angular/core\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { UserVerificationService } from \"@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction\";\nimport { TwoFactorProviderType } from \"@bitwarden/common/auth/enums/two-factor-provider-type\";\nimport { UpdateTwoFactorDuoRequest } from \"@bitwarden/common/auth/models/request/update-two-factor-duo.request\";\nimport { TwoFactorDuoResponse } from \"@bitwarden/common/auth/models/response/two-factor-duo.response\";\nimport { AuthResponse } from \"@bitwarden/common/auth/types/auth-response\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { DialogService } from \"@bitwarden/components\";\n\nimport { TwoFactorBaseComponent } from \"./two-factor-base.component\";\n\n@Component({\n selector: \"app-two-factor-duo\",\n templateUrl: \"two-factor-duo.component.html\",\n})\nexport class TwoFactorDuoComponent extends TwoFactorBaseComponent {\n type = TwoFactorProviderType.Duo;\n ikey: string;\n skey: string;\n host: string;\n formPromise: Promise;\n\n override componentName = \"app-two-factor-duo\";\n\n constructor(\n apiService: ApiService,\n i18nService: I18nService,\n platformUtilsService: PlatformUtilsService,\n logService: LogService,\n userVerificationService: UserVerificationService,\n dialogService: DialogService,\n ) {\n super(\n apiService,\n i18nService,\n platformUtilsService,\n logService,\n userVerificationService,\n dialogService,\n );\n }\n\n auth(authResponse: AuthResponse) {\n super.auth(authResponse);\n this.processResponse(authResponse.response);\n }\n\n submit() {\n if (this.enabled) {\n return super.disable(this.formPromise);\n } else {\n return this.enable();\n }\n }\n\n protected async enable() {\n const request = await this.buildRequestModel(UpdateTwoFactorDuoRequest);\n request.integrationKey = this.ikey;\n request.secretKey = this.skey;\n request.host = this.host;\n\n return super.enable(async () => {\n if (this.organizationId != null) {\n this.formPromise = this.apiService.putTwoFactorOrganizationDuo(\n this.organizationId,\n request,\n );\n } else {\n this.formPromise = this.apiService.putTwoFactorDuo(request);\n }\n const response = await this.formPromise;\n await this.processResponse(response);\n });\n }\n\n private processResponse(response: TwoFactorDuoResponse) {\n this.ikey = response.integrationKey;\n this.skey = response.secretKey;\n this.host = response.host;\n this.enabled = response.enabled;\n }\n}\n","import { SecretVerificationRequest } from \"./secret-verification.request\";\n\nexport class UpdateTwoFactorAuthenticatorRequest extends SecretVerificationRequest {\n token: string;\n key: string;\n}\n","
\n
\n
\n
\n

\n {{ \"twoStepLogin\" | i18n }}\n {{ \"authenticatorAppTitle\" | i18n }}\n

\n \n ×\n \n
\n \n \n \n
\n \n \"Authenticator\n

{{ \"twoStepAuthenticatorDesc\" | i18n }}

\n

\n 1. {{ \"twoStepAuthenticatorDownloadApp\" | i18n }}\n

\n
\n \n \n

{{ \"twoStepLoginProviderEnabled\" | i18n }}

\n {{ \"twoStepAuthenticatorReaddDesc\" | i18n }}\n
\n \"Authenticator\n

{{ \"twoStepAuthenticatorNeedApp\" | i18n }}

\n
\n
    \n
  • \n {{ \"iosDevices\" | i18n }}:\n Authy\n
  • \n
  • \n {{ \"androidDevices\" | i18n }}:\n Authy\n
  • \n
  • \n {{ \"windowsDevices\" | i18n }}:\n Microsoft Authenticator\n
  • \n
\n

{{ \"twoStepAuthenticatorAppsRecommended\" | i18n }}

\n

\n 2. {{ \"twoStepAuthenticatorScanCode\" | i18n }}\n

\n
\n

\n
\n {{ key }}\n

\n \n \n \n \n
\n
\n \n \n
\n \n
\n
\n
\n","import { Component, OnDestroy, OnInit } from \"@angular/core\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { UserVerificationService } from \"@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction\";\nimport { TwoFactorProviderType } from \"@bitwarden/common/auth/enums/two-factor-provider-type\";\nimport { UpdateTwoFactorAuthenticatorRequest } from \"@bitwarden/common/auth/models/request/update-two-factor-authenticator.request\";\nimport { TwoFactorAuthenticatorResponse } from \"@bitwarden/common/auth/models/response/two-factor-authenticator.response\";\nimport { AuthResponse } from \"@bitwarden/common/auth/types/auth-response\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\nimport { DialogService } from \"@bitwarden/components\";\n\nimport { TwoFactorBaseComponent } from \"./two-factor-base.component\";\n\n// NOTE: There are additional options available but these are just the ones we are current using.\n// See: https://github.com/neocotic/qrious#examples\ninterface QRiousOptions {\n element: HTMLElement;\n value: string;\n size: number;\n}\n\ndeclare global {\n interface Window {\n QRious: new (options: QRiousOptions) => unknown;\n }\n}\n\n@Component({\n selector: \"app-two-factor-authenticator\",\n templateUrl: \"two-factor-authenticator.component.html\",\n})\nexport class TwoFactorAuthenticatorComponent\n extends TwoFactorBaseComponent\n implements OnInit, OnDestroy\n{\n type = TwoFactorProviderType.Authenticator;\n key: string;\n token: string;\n formPromise: Promise;\n\n override componentName = \"app-two-factor-authenticator\";\n private qrScript: HTMLScriptElement;\n\n constructor(\n apiService: ApiService,\n i18nService: I18nService,\n userVerificationService: UserVerificationService,\n platformUtilsService: PlatformUtilsService,\n logService: LogService,\n private stateService: StateService,\n dialogService: DialogService,\n ) {\n super(\n apiService,\n i18nService,\n platformUtilsService,\n logService,\n userVerificationService,\n dialogService,\n );\n this.qrScript = window.document.createElement(\"script\");\n this.qrScript.src = \"scripts/qrious.min.js\";\n this.qrScript.async = true;\n }\n\n ngOnInit() {\n window.document.body.appendChild(this.qrScript);\n }\n\n ngOnDestroy() {\n window.document.body.removeChild(this.qrScript);\n }\n\n auth(authResponse: AuthResponse) {\n super.auth(authResponse);\n return this.processResponse(authResponse.response);\n }\n\n submit() {\n if (this.enabled) {\n return super.disable(this.formPromise);\n } else {\n return this.enable();\n }\n }\n\n protected async enable() {\n const request = await this.buildRequestModel(UpdateTwoFactorAuthenticatorRequest);\n request.token = this.token;\n request.key = this.key;\n\n return super.enable(async () => {\n this.formPromise = this.apiService.putTwoFactorAuthenticator(request);\n const response = await this.formPromise;\n await this.processResponse(response);\n });\n }\n\n private async processResponse(response: TwoFactorAuthenticatorResponse) {\n this.token = null;\n this.enabled = response.enabled;\n this.key = response.key;\n const email = await this.stateService.getEmail();\n window.setTimeout(() => {\n new window.QRious({\n element: document.getElementById(\"qr\"),\n value:\n \"otpauth://totp/Bitwarden:\" +\n Utils.encodeRFC3986URIComponent(email) +\n \"?secret=\" +\n encodeURIComponent(this.key) +\n \"&issuer=Bitwarden\",\n size: 160,\n });\n }, 100);\n }\n}\n","import { SecretVerificationRequest } from \"./secret-verification.request\";\n\nexport class UpdateTwoFactorEmailRequest extends SecretVerificationRequest {\n token: string;\n email: string;\n}\n","
\n
\n
\n
\n

\n {{ \"twoStepLogin\" | i18n }}\n {{ \"emailTitle\" | i18n }}\n

\n \n ×\n \n
\n \n \n \n
\n \n \n {{ \"twoStepLoginProviderEnabled\" | i18n }}\n \n {{ \"email\" | i18n }}: {{ email }}\n \n \n

\n {{ \"twoFactorEmailDesc\" | i18n }}\n \"Email\n

\n
\n \n \n
\n
\n \n \n {{ \"sendEmail\" | i18n }}\n \n \n {{ \"verificationCodeEmailSent\" | i18n: sentEmail }}\n \n
\n
\n \n \n
\n
\n
\n
\n \n \n
\n \n
\n
\n
\n","import { Component } from \"@angular/core\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { UserVerificationService } from \"@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction\";\nimport { TwoFactorProviderType } from \"@bitwarden/common/auth/enums/two-factor-provider-type\";\nimport { TwoFactorEmailRequest } from \"@bitwarden/common/auth/models/request/two-factor-email.request\";\nimport { UpdateTwoFactorEmailRequest } from \"@bitwarden/common/auth/models/request/update-two-factor-email.request\";\nimport { TwoFactorEmailResponse } from \"@bitwarden/common/auth/models/response/two-factor-email.response\";\nimport { AuthResponse } from \"@bitwarden/common/auth/types/auth-response\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { DialogService } from \"@bitwarden/components\";\n\nimport { TwoFactorBaseComponent } from \"./two-factor-base.component\";\n\n@Component({\n selector: \"app-two-factor-email\",\n templateUrl: \"two-factor-email.component.html\",\n})\nexport class TwoFactorEmailComponent extends TwoFactorBaseComponent {\n type = TwoFactorProviderType.Email;\n email: string;\n token: string;\n sentEmail: string;\n formPromise: Promise;\n emailPromise: Promise;\n\n override componentName = \"app-two-factor-email\";\n\n constructor(\n apiService: ApiService,\n i18nService: I18nService,\n platformUtilsService: PlatformUtilsService,\n logService: LogService,\n userVerificationService: UserVerificationService,\n private stateService: StateService,\n dialogService: DialogService,\n ) {\n super(\n apiService,\n i18nService,\n platformUtilsService,\n logService,\n userVerificationService,\n dialogService,\n );\n }\n\n auth(authResponse: AuthResponse) {\n super.auth(authResponse);\n return this.processResponse(authResponse.response);\n }\n\n submit() {\n if (this.enabled) {\n return super.disable(this.formPromise);\n } else {\n return this.enable();\n }\n }\n\n async sendEmail() {\n try {\n const request = await this.buildRequestModel(TwoFactorEmailRequest);\n request.email = this.email;\n this.emailPromise = this.apiService.postTwoFactorEmailSetup(request);\n await this.emailPromise;\n this.sentEmail = this.email;\n } catch (e) {\n this.logService.error(e);\n }\n }\n\n protected async enable() {\n const request = await this.buildRequestModel(UpdateTwoFactorEmailRequest);\n request.email = this.email;\n request.token = this.token;\n\n return super.enable(async () => {\n this.formPromise = this.apiService.putTwoFactorEmail(request);\n const response = await this.formPromise;\n await this.processResponse(response);\n });\n }\n\n private async processResponse(response: TwoFactorEmailResponse) {\n this.token = null;\n this.email = response.email;\n this.enabled = response.enabled;\n if (!this.enabled && (this.email == null || this.email === \"\")) {\n this.email = await this.stateService.getEmail();\n }\n }\n}\n","
\n
\n
\n
\n

\n {{ \"twoStepLogin\" | i18n }}\n {{ \"recoveryCodeTitle\" | i18n }}\n

\n \n ×\n \n
\n \n \n \n
\n \n

{{ \"twoFactorRecoveryYourCode\" | i18n }}:

\n {{ code }}\n
\n \n {{ \"twoFactorRecoveryNoCode\" | i18n }}\n \n
\n
\n \n \n
\n
\n
\n
\n
\n","import { Component } from \"@angular/core\";\n\nimport { TwoFactorProviderType } from \"@bitwarden/common/auth/enums/two-factor-provider-type\";\nimport { TwoFactorRecoverResponse } from \"@bitwarden/common/auth/models/response/two-factor-recover.response\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\n\n@Component({\n selector: \"app-two-factor-recovery\",\n templateUrl: \"two-factor-recovery.component.html\",\n})\nexport class TwoFactorRecoveryComponent {\n type = -1;\n code: string;\n authed: boolean;\n twoFactorProviderType = TwoFactorProviderType;\n\n constructor(private i18nService: I18nService) {}\n\n auth(authResponse: any) {\n this.authed = true;\n this.processResponse(authResponse.response);\n }\n\n print() {\n const w = window.open();\n w.document.write(\n '
' +\n \"

\" +\n this.i18nService.t(\"twoFactorRecoveryYourCode\") +\n \":

\" +\n \"\" +\n this.code +\n \"
\" +\n '

' +\n new Date() +\n \"

\",\n );\n w.onafterprint = () => w.close();\n w.print();\n }\n\n private formatString(s: string) {\n if (s == null) {\n return null;\n }\n return s\n .replace(/(.{4})/g, \"$1 \")\n .trim()\n .toUpperCase();\n }\n\n private processResponse(response: TwoFactorRecoverResponse) {\n this.code = this.formatString(response.code);\n }\n}\n","import { SecretVerificationRequest } from \"./secret-verification.request\";\n\nexport class UpdateTwoFactorWebAuthnDeleteRequest extends SecretVerificationRequest {\n id: number;\n}\n","import { SecretVerificationRequest } from \"./secret-verification.request\";\n\nexport class UpdateTwoFactorWebAuthnRequest extends SecretVerificationRequest {\n deviceResponse: PublicKeyCredential;\n name: string;\n id: number;\n}\n","
\n
\n
\n
\n

\n {{ \"twoStepLogin\" | i18n }}\n {{ \"webAuthnTitle\" | i18n }}\n

\n \n ×\n \n
\n \n \n \n
\n \n {{ \"twoStepLoginProviderEnabled\" | i18n }}\n \n \n

{{ \"twoFactorWebAuthnWarning\" | i18n }}

\n
    \n
  • {{ \"twoFactorWebAuthnSupportWeb\" | i18n }}
  • \n
\n
\n \"FIDO2\n
    \n \n \n {{ \"webAuthnkeyX\" | i18n: i + 1 }}\n {{ k.name }}\n \n \n {{ \"webAuthnMigrated\" | i18n }}\n \n \n 1 && k.configured\">\n \n -\n {{ \"remove\" | i18n }}\n \n \n
\n
\n

{{ \"twoFactorWebAuthnAdd\" | i18n }}:

\n
    \n
  1. {{ \"twoFactorU2fGiveName\" | i18n }}
  2. \n
  3. {{ \"twoFactorU2fPlugInReadKey\" | i18n }}
  4. \n
  5. {{ \"twoFactorU2fTouchButton\" | i18n }}
  6. \n
  7. {{ \"twoFactorU2fSaveForm\" | i18n }}
  8. \n
\n
\n
\n \n \n
\n
\n \n {{ \"readKey\" | i18n }}\n \n \n \n \n \n \n \n {{ \"twoFactorU2fWaiting\" | i18n }}...\n \n \n \n {{ \"twoFactorU2fClickSave\" | i18n }}\n \n \n \n {{ \"twoFactorU2fProblemReadingTryAgain\" | i18n }}\n \n \n
\n
\n \n \n {{ \"save\" | i18n }}\n \n \n \n {{ \"disableAllKeys\" | i18n }}\n \n \n
\n \n
\n
\n
\n","import { Component, NgZone } from \"@angular/core\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { UserVerificationService } from \"@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction\";\nimport { TwoFactorProviderType } from \"@bitwarden/common/auth/enums/two-factor-provider-type\";\nimport { SecretVerificationRequest } from \"@bitwarden/common/auth/models/request/secret-verification.request\";\nimport { UpdateTwoFactorWebAuthnDeleteRequest } from \"@bitwarden/common/auth/models/request/update-two-factor-web-authn-delete.request\";\nimport { UpdateTwoFactorWebAuthnRequest } from \"@bitwarden/common/auth/models/request/update-two-factor-web-authn.request\";\nimport {\n ChallengeResponse,\n TwoFactorWebAuthnResponse,\n} from \"@bitwarden/common/auth/models/response/two-factor-web-authn.response\";\nimport { AuthResponse } from \"@bitwarden/common/auth/types/auth-response\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { DialogService } from \"@bitwarden/components\";\n\nimport { TwoFactorBaseComponent } from \"./two-factor-base.component\";\n\ninterface Key {\n id: number;\n name: string;\n configured: boolean;\n migrated?: boolean;\n removePromise: Promise | null;\n}\n\n@Component({\n selector: \"app-two-factor-webauthn\",\n templateUrl: \"two-factor-webauthn.component.html\",\n})\nexport class TwoFactorWebAuthnComponent extends TwoFactorBaseComponent {\n type = TwoFactorProviderType.WebAuthn;\n name: string;\n keys: Key[];\n keyIdAvailable: number = null;\n keysConfiguredCount = 0;\n webAuthnError: boolean;\n webAuthnListening: boolean;\n webAuthnResponse: PublicKeyCredential;\n challengePromise: Promise;\n formPromise: Promise;\n\n override componentName = \"app-two-factor-webauthn\";\n\n constructor(\n apiService: ApiService,\n i18nService: I18nService,\n platformUtilsService: PlatformUtilsService,\n private ngZone: NgZone,\n logService: LogService,\n userVerificationService: UserVerificationService,\n dialogService: DialogService,\n ) {\n super(\n apiService,\n i18nService,\n platformUtilsService,\n logService,\n userVerificationService,\n dialogService,\n );\n }\n\n auth(authResponse: AuthResponse) {\n super.auth(authResponse);\n this.processResponse(authResponse.response);\n }\n\n async submit() {\n if (this.webAuthnResponse == null || this.keyIdAvailable == null) {\n // Should never happen.\n return Promise.reject();\n }\n const request = await this.buildRequestModel(UpdateTwoFactorWebAuthnRequest);\n request.deviceResponse = this.webAuthnResponse;\n request.id = this.keyIdAvailable;\n request.name = this.name;\n\n return super.enable(async () => {\n this.formPromise = this.apiService.putTwoFactorWebAuthn(request);\n const response = await this.formPromise;\n await this.processResponse(response);\n });\n }\n\n disable() {\n return super.disable(this.formPromise);\n }\n\n async remove(key: Key) {\n if (this.keysConfiguredCount <= 1 || key.removePromise != null) {\n return;\n }\n const name = key.name != null ? key.name : this.i18nService.t(\"webAuthnkeyX\", key.id as any);\n\n const confirmed = await this.dialogService.openSimpleDialog({\n title: name,\n content: { key: \"removeU2fConfirmation\" },\n type: \"warning\",\n });\n\n if (!confirmed) {\n return;\n }\n const request = await this.buildRequestModel(UpdateTwoFactorWebAuthnDeleteRequest);\n request.id = key.id;\n try {\n key.removePromise = this.apiService.deleteTwoFactorWebAuthn(request);\n const response = await key.removePromise;\n key.removePromise = null;\n await this.processResponse(response);\n } catch (e) {\n this.logService.error(e);\n }\n }\n\n async readKey() {\n if (this.keyIdAvailable == null) {\n return;\n }\n const request = await this.buildRequestModel(SecretVerificationRequest);\n try {\n this.challengePromise = this.apiService.getTwoFactorWebAuthnChallenge(request);\n const challenge = await this.challengePromise;\n this.readDevice(challenge);\n } catch (e) {\n this.logService.error(e);\n }\n }\n\n private readDevice(webAuthnChallenge: ChallengeResponse) {\n // eslint-disable-next-line\n console.log(\"listening for key...\");\n this.resetWebAuthn(true);\n\n navigator.credentials\n .create({\n publicKey: webAuthnChallenge,\n })\n .then((data: PublicKeyCredential) => {\n this.ngZone.run(() => {\n this.webAuthnListening = false;\n this.webAuthnResponse = data;\n });\n })\n .catch((err) => {\n // eslint-disable-next-line\n console.error(err);\n this.resetWebAuthn(false);\n // TODO: Should we display the actual error?\n this.webAuthnError = true;\n });\n }\n\n private resetWebAuthn(listening = false) {\n this.webAuthnResponse = null;\n this.webAuthnError = false;\n this.webAuthnListening = listening;\n }\n\n private processResponse(response: TwoFactorWebAuthnResponse) {\n this.resetWebAuthn();\n this.keys = [];\n this.keyIdAvailable = null;\n this.name = null;\n this.keysConfiguredCount = 0;\n for (let i = 1; i <= 5; i++) {\n if (response.keys != null) {\n const key = response.keys.filter((k) => k.id === i);\n if (key.length > 0) {\n this.keysConfiguredCount++;\n this.keys.push({\n id: i,\n name: key[0].name,\n configured: true,\n migrated: key[0].migrated,\n removePromise: null,\n });\n continue;\n }\n }\n this.keys.push({ id: i, name: null, configured: false, removePromise: null });\n if (this.keyIdAvailable == null) {\n this.keyIdAvailable = i;\n }\n }\n this.enabled = response.enabled;\n }\n}\n","import { SecretVerificationRequest } from \"./secret-verification.request\";\n\nexport class UpdateTwoFactorYubioOtpRequest extends SecretVerificationRequest {\n key1: string;\n key2: string;\n key3: string;\n key4: string;\n key5: string;\n nfc: boolean;\n}\n","
\n
\n
\n
\n

\n {{ \"twoStepLogin\" | i18n }}\n YubiKey\n

\n \n ×\n \n
\n \n \n \n
\n \n {{ \"twoStepLoginProviderEnabled\" | i18n }}\n \n \n

{{ \"twoFactorYubikeyWarning\" | i18n }}

\n
    \n
  • {{ \"twoFactorYubikeySupportUsb\" | i18n }}
  • \n
  • {{ \"twoFactorYubikeySupportMobile\" | i18n }}
  • \n
\n
\n \"YubiKey\n

{{ \"twoFactorYubikeyAdd\" | i18n }}:

\n
    \n
  1. {{ \"twoFactorYubikeyPlugIn\" | i18n }}
  2. \n
  3. {{ \"twoFactorYubikeySelectKey\" | i18n }}
  4. \n
  5. {{ \"twoFactorYubikeyTouchButton\" | i18n }}
  6. \n
  7. {{ \"twoFactorYubikeySaveForm\" | i18n }}
  8. \n
\n
\n
\n
\n \n \n
\n {{ k.existingKey }}\n \n \n \n
\n
\n
\n {{ \"nfcSupport\" | i18n }}\n
\n \n \n
\n {{ \"twoFactorYubikeySupportsNfcDesc\" | i18n }}\n
\n
\n \n \n \n {{ \"disableAllKeys\" | i18n }}\n \n \n
\n \n
\n
\n
\n","import { Component } from \"@angular/core\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { UserVerificationService } from \"@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction\";\nimport { TwoFactorProviderType } from \"@bitwarden/common/auth/enums/two-factor-provider-type\";\nimport { UpdateTwoFactorYubioOtpRequest } from \"@bitwarden/common/auth/models/request/update-two-factor-yubio-otp.request\";\nimport { TwoFactorYubiKeyResponse } from \"@bitwarden/common/auth/models/response/two-factor-yubi-key.response\";\nimport { AuthResponse } from \"@bitwarden/common/auth/types/auth-response\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { DialogService } from \"@bitwarden/components\";\n\nimport { TwoFactorBaseComponent } from \"./two-factor-base.component\";\n\ninterface Key {\n key: string;\n existingKey: string;\n}\n\n@Component({\n selector: \"app-two-factor-yubikey\",\n templateUrl: \"two-factor-yubikey.component.html\",\n})\nexport class TwoFactorYubiKeyComponent extends TwoFactorBaseComponent {\n type = TwoFactorProviderType.Yubikey;\n keys: Key[];\n nfc = false;\n\n formPromise: Promise;\n disablePromise: Promise;\n\n override componentName = \"app-two-factor-yubikey\";\n\n constructor(\n apiService: ApiService,\n i18nService: I18nService,\n platformUtilsService: PlatformUtilsService,\n logService: LogService,\n userVerificationService: UserVerificationService,\n dialogService: DialogService,\n ) {\n super(\n apiService,\n i18nService,\n platformUtilsService,\n logService,\n userVerificationService,\n dialogService,\n );\n }\n\n auth(authResponse: AuthResponse) {\n super.auth(authResponse);\n this.processResponse(authResponse.response);\n }\n\n async submit() {\n const request = await this.buildRequestModel(UpdateTwoFactorYubioOtpRequest);\n request.key1 = this.keys != null && this.keys.length > 0 ? this.keys[0].key : null;\n request.key2 = this.keys != null && this.keys.length > 1 ? this.keys[1].key : null;\n request.key3 = this.keys != null && this.keys.length > 2 ? this.keys[2].key : null;\n request.key4 = this.keys != null && this.keys.length > 3 ? this.keys[3].key : null;\n request.key5 = this.keys != null && this.keys.length > 4 ? this.keys[4].key : null;\n request.nfc = this.nfc;\n\n return super.enable(async () => {\n this.formPromise = this.apiService.putTwoFactorYubiKey(request);\n const response = await this.formPromise;\n await this.processResponse(response);\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"yubikeysUpdated\"));\n });\n }\n\n disable() {\n return super.disable(this.disablePromise);\n }\n\n remove(key: Key) {\n key.existingKey = null;\n key.key = null;\n }\n\n private processResponse(response: TwoFactorYubiKeyResponse) {\n this.enabled = response.enabled;\n this.keys = [\n { key: response.key1, existingKey: this.padRight(response.key1) },\n { key: response.key2, existingKey: this.padRight(response.key2) },\n { key: response.key3, existingKey: this.padRight(response.key3) },\n { key: response.key4, existingKey: this.padRight(response.key4) },\n { key: response.key5, existingKey: this.padRight(response.key5) },\n ];\n this.nfc = response.nfc || !response.enabled;\n }\n\n private padRight(str: string, character = \"•\", size = 44) {\n if (str == null || character == null || str.length >= size) {\n return str;\n }\n const max = (size - str.length) / character.length;\n for (let i = 0; i < max; i++) {\n str += character;\n }\n return str;\n }\n}\n","\n\n\n
\n

{{ \"twoStepLogin\" | i18n }}

\n

{{ \"twoStepLoginEnforcement\" | i18n }}

\n
\n\n

{{ \"twoStepLoginDesc\" | i18n }}

\n \n

\n \n {{ \"twoStepLoginEnterpriseDescStart\" | i18n }}\n {{ \"twoStepLoginPolicy\" | i18n }}.\n
\n {{ \"twoStepLoginOrganizationDuoDesc\" | i18n }}\n
\n
\n

{{ \"twoStepLoginOrganizationSsoDesc\" | i18n }}

\n
\n \n {{ \"twoStepLoginTeamsDesc\" | i18n }}\n
\n {{ \"twoStepLoginOrganizationDuoDesc\" | i18n }}\n
\n

\n \n \n

{{ \"twoStepLoginRecoveryWarning\" | i18n }}

\n \n
\n

\n {{ \"providers\" | i18n }}\n \n \n {{ \"loading\" | i18n }}\n \n

\n \n {{ \"twoStepLoginPolicyUserWarning\" | i18n }}\n \n
    \n
  • \n
    \n \n
    \n
    \n

    \n {{ p.name }}\n \n \n {{ \"enabled\" | i18n }}\n \n \n

    \n {{ p.description }}\n
    \n
    \n \n {{ \"manage\" | i18n }}\n \n
    \n
  • \n
\n
\n\n\n\n\n\n\n\n","import { Component, OnDestroy, OnInit, Type, ViewChild, ViewContainerRef } from \"@angular/core\";\nimport { firstValueFrom, Observable, Subject, takeUntil } from \"rxjs\";\n\nimport { ModalRef } from \"@bitwarden/angular/components/modal/modal.ref\";\nimport { ModalService } from \"@bitwarden/angular/services/modal.service\";\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { PolicyService } from \"@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction\";\nimport { PolicyType } from \"@bitwarden/common/admin-console/enums\";\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\nimport { TwoFactorProviderType } from \"@bitwarden/common/auth/enums/two-factor-provider-type\";\nimport { TwoFactorProviders } from \"@bitwarden/common/auth/services/two-factor.service\";\nimport { BillingAccountProfileStateService } from \"@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service\";\nimport { ProductType } from \"@bitwarden/common/enums\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\n\nimport { TwoFactorAuthenticatorComponent } from \"./two-factor-authenticator.component\";\nimport { TwoFactorDuoComponent } from \"./two-factor-duo.component\";\nimport { TwoFactorEmailComponent } from \"./two-factor-email.component\";\nimport { TwoFactorRecoveryComponent } from \"./two-factor-recovery.component\";\nimport { TwoFactorWebAuthnComponent } from \"./two-factor-webauthn.component\";\nimport { TwoFactorYubiKeyComponent } from \"./two-factor-yubikey.component\";\n\n@Component({\n selector: \"app-two-factor-setup\",\n templateUrl: \"two-factor-setup.component.html\",\n})\nexport class TwoFactorSetupComponent implements OnInit, OnDestroy {\n @ViewChild(\"recoveryTemplate\", { read: ViewContainerRef, static: true })\n recoveryModalRef: ViewContainerRef;\n @ViewChild(\"authenticatorTemplate\", { read: ViewContainerRef, static: true })\n authenticatorModalRef: ViewContainerRef;\n @ViewChild(\"yubikeyTemplate\", { read: ViewContainerRef, static: true })\n yubikeyModalRef: ViewContainerRef;\n @ViewChild(\"duoTemplate\", { read: ViewContainerRef, static: true }) duoModalRef: ViewContainerRef;\n @ViewChild(\"emailTemplate\", { read: ViewContainerRef, static: true })\n emailModalRef: ViewContainerRef;\n @ViewChild(\"webAuthnTemplate\", { read: ViewContainerRef, static: true })\n webAuthnModalRef: ViewContainerRef;\n\n organizationId: string;\n organization: Organization;\n providers: any[] = [];\n canAccessPremium$: Observable;\n showPolicyWarning = false;\n loading = true;\n modal: ModalRef;\n formPromise: Promise;\n\n tabbedHeader = true;\n\n protected destroy$ = new Subject();\n private twoFactorAuthPolicyAppliesToActiveUser: boolean;\n\n constructor(\n protected apiService: ApiService,\n protected modalService: ModalService,\n protected messagingService: MessagingService,\n protected policyService: PolicyService,\n billingAccountProfileStateService: BillingAccountProfileStateService,\n ) {\n this.canAccessPremium$ = billingAccountProfileStateService.hasPremiumFromAnySource$;\n }\n\n async ngOnInit() {\n for (const key in TwoFactorProviders) {\n // eslint-disable-next-line\n if (!TwoFactorProviders.hasOwnProperty(key)) {\n continue;\n }\n\n const p = (TwoFactorProviders as any)[key];\n if (this.filterProvider(p.type)) {\n continue;\n }\n\n this.providers.push({\n type: p.type,\n name: p.name,\n description: p.description,\n enabled: false,\n premium: p.premium,\n sort: p.sort,\n });\n }\n\n this.providers.sort((a: any, b: any) => a.sort - b.sort);\n\n this.policyService\n .policyAppliesToActiveUser$(PolicyType.TwoFactorAuthentication)\n .pipe(takeUntil(this.destroy$))\n .subscribe((policyAppliesToActiveUser) => {\n this.twoFactorAuthPolicyAppliesToActiveUser = policyAppliesToActiveUser;\n });\n\n await this.load();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n async load() {\n this.loading = true;\n const providerList = await this.getTwoFactorProviders();\n providerList.data.forEach((p) => {\n this.providers.forEach((p2) => {\n if (p.type === p2.type) {\n p2.enabled = p.enabled;\n }\n });\n });\n this.evaluatePolicies();\n this.loading = false;\n }\n\n async manage(type: TwoFactorProviderType) {\n switch (type) {\n case TwoFactorProviderType.Authenticator: {\n const authComp = await this.openModal(\n this.authenticatorModalRef,\n TwoFactorAuthenticatorComponent,\n );\n // eslint-disable-next-line rxjs-angular/prefer-takeuntil\n authComp.onUpdated.subscribe((enabled: boolean) => {\n this.updateStatus(enabled, TwoFactorProviderType.Authenticator);\n });\n break;\n }\n case TwoFactorProviderType.Yubikey: {\n const yubiComp = await this.openModal(this.yubikeyModalRef, TwoFactorYubiKeyComponent);\n // eslint-disable-next-line rxjs-angular/prefer-takeuntil\n yubiComp.onUpdated.subscribe((enabled: boolean) => {\n this.updateStatus(enabled, TwoFactorProviderType.Yubikey);\n });\n break;\n }\n case TwoFactorProviderType.Duo: {\n const duoComp = await this.openModal(this.duoModalRef, TwoFactorDuoComponent);\n // eslint-disable-next-line rxjs-angular/prefer-takeuntil\n duoComp.onUpdated.subscribe((enabled: boolean) => {\n this.updateStatus(enabled, TwoFactorProviderType.Duo);\n });\n break;\n }\n case TwoFactorProviderType.Email: {\n const emailComp = await this.openModal(this.emailModalRef, TwoFactorEmailComponent);\n // eslint-disable-next-line rxjs-angular/prefer-takeuntil\n emailComp.onUpdated.subscribe((enabled: boolean) => {\n this.updateStatus(enabled, TwoFactorProviderType.Email);\n });\n break;\n }\n case TwoFactorProviderType.WebAuthn: {\n const webAuthnComp = await this.openModal(\n this.webAuthnModalRef,\n TwoFactorWebAuthnComponent,\n );\n // eslint-disable-next-line rxjs-angular/prefer-takeuntil\n webAuthnComp.onUpdated.subscribe((enabled: boolean) => {\n this.updateStatus(enabled, TwoFactorProviderType.WebAuthn);\n });\n break;\n }\n default:\n break;\n }\n }\n\n recoveryCode() {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.openModal(this.recoveryModalRef, TwoFactorRecoveryComponent);\n }\n\n async premiumRequired() {\n if (!(await firstValueFrom(this.canAccessPremium$))) {\n this.messagingService.send(\"premiumRequired\");\n return;\n }\n }\n\n protected getTwoFactorProviders() {\n return this.apiService.getTwoFactorProviders();\n }\n\n protected filterProvider(type: TwoFactorProviderType) {\n return type === TwoFactorProviderType.OrganizationDuo;\n }\n\n protected async openModal(ref: ViewContainerRef, type: Type): Promise {\n const [modal, childComponent] = await this.modalService.openViewRef(type, ref);\n this.modal = modal;\n\n return childComponent;\n }\n\n protected updateStatus(enabled: boolean, type: TwoFactorProviderType) {\n if (!enabled && this.modal != null) {\n this.modal.close();\n }\n this.providers.forEach((p) => {\n if (p.type === type) {\n p.enabled = enabled;\n }\n });\n this.evaluatePolicies();\n }\n\n private evaluatePolicies() {\n if (this.organizationId == null && this.providers.filter((p) => p.enabled).length === 1) {\n this.showPolicyWarning = this.twoFactorAuthPolicyAppliesToActiveUser;\n } else {\n this.showPolicyWarning = false;\n }\n }\n\n get isEnterpriseOrg() {\n return this.organization?.planProductType === ProductType.Enterprise;\n }\n}\n","import { Component, EventEmitter, Input, Output } from \"@angular/core\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { UserVerificationService } from \"@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction\";\nimport { TwoFactorProviderType } from \"@bitwarden/common/auth/enums/two-factor-provider-type\";\nimport { VerificationType } from \"@bitwarden/common/auth/enums/verification-type\";\nimport { SecretVerificationRequest } from \"@bitwarden/common/auth/models/request/secret-verification.request\";\nimport { AuthResponse } from \"@bitwarden/common/auth/types/auth-response\";\nimport { TwoFactorResponse } from \"@bitwarden/common/auth/types/two-factor-response\";\nimport { Verification } from \"@bitwarden/common/auth/types/verification\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\n\n@Component({\n selector: \"app-two-factor-verify\",\n templateUrl: \"two-factor-verify.component.html\",\n})\nexport class TwoFactorVerifyComponent {\n @Input() type: TwoFactorProviderType;\n @Input() organizationId: string;\n @Output() onAuthed = new EventEmitter>();\n\n secret: Verification;\n formPromise: Promise;\n\n constructor(\n private apiService: ApiService,\n private logService: LogService,\n private userVerificationService: UserVerificationService,\n ) {}\n\n async submit() {\n let hashedSecret: string;\n\n try {\n this.formPromise = this.userVerificationService.buildRequest(this.secret).then((request) => {\n hashedSecret =\n this.secret.type === VerificationType.MasterPassword\n ? request.masterPasswordHash\n : request.otp;\n return this.apiCall(request);\n });\n\n const response = await this.formPromise;\n this.onAuthed.emit({\n response: response,\n secret: hashedSecret,\n verificationType: this.secret.type,\n });\n } catch (e) {\n this.logService.error(e);\n }\n }\n\n private apiCall(request: SecretVerificationRequest): Promise {\n switch (this.type) {\n case -1 as TwoFactorProviderType:\n return this.apiService.getTwoFactorRecover(request);\n case TwoFactorProviderType.Duo:\n case TwoFactorProviderType.OrganizationDuo:\n if (this.organizationId != null) {\n return this.apiService.getTwoFactorOrganizationDuo(this.organizationId, request);\n } else {\n return this.apiService.getTwoFactorDuo(request);\n }\n case TwoFactorProviderType.Email:\n return this.apiService.getTwoFactorEmail(request);\n case TwoFactorProviderType.WebAuthn:\n return this.apiService.getTwoFactorWebAuthn(request);\n case TwoFactorProviderType.Authenticator:\n return this.apiService.getTwoFactorAuthenticator(request);\n case TwoFactorProviderType.Yubikey:\n return this.apiService.getTwoFactorYubiKey(request);\n }\n }\n}\n","
\n
\n \n \n
\n
\n \n \n
\n
\n","import { NgModule } from \"@angular/core\";\nimport { FormsModule, ReactiveFormsModule } from \"@angular/forms\";\n\nimport { SharedModule } from \"../../../../shared/shared.module\";\n\nimport { UserVerificationPromptComponent } from \"./user-verification-prompt.component\";\nimport { UserVerificationComponent } from \"./user-verification.component\";\n\n@NgModule({\n imports: [SharedModule, FormsModule, ReactiveFormsModule],\n declarations: [UserVerificationComponent, UserVerificationPromptComponent],\n exports: [UserVerificationComponent, UserVerificationPromptComponent],\n})\nexport class UserVerificationModule {}\n","import { Directive } from \"@angular/core\";\nimport { FormBuilder } from \"@angular/forms\";\n\nimport { UserVerificationService } from \"@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction\";\nimport { Verification } from \"@bitwarden/common/auth/types/verification\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\n\nimport { ModalRef } from \"../../components/modal/modal.ref\";\n\nexport interface UserVerificationPromptParams {\n confirmDescription: string;\n confirmButtonText: string;\n modalTitle: string;\n}\n\n/**\n * Used to verify the user's identity (using their master password or email-based OTP for Key Connector users). You can customize all of the text in the modal.\n * @deprecated Jan 24, 2024: Use new libs/auth UserVerificationDialogComponent instead.\n */\n@Directive()\nexport class UserVerificationPromptComponent {\n confirmDescription = this.config.confirmDescription;\n confirmButtonText = this.config.confirmButtonText;\n modalTitle = this.config.modalTitle;\n\n formGroup = this.formBuilder.group({\n secret: this.formBuilder.control(null),\n });\n\n protected invalidSecret = false;\n\n constructor(\n private modalRef: ModalRef,\n protected config: UserVerificationPromptParams,\n protected userVerificationService: UserVerificationService,\n private formBuilder: FormBuilder,\n private platformUtilsService: PlatformUtilsService,\n private i18nService: I18nService,\n ) {}\n\n get secret() {\n return this.formGroup.controls.secret;\n }\n\n submit = async () => {\n this.formGroup.markAllAsTouched();\n\n if (this.formGroup.invalid) {\n return;\n }\n\n try {\n //Incorrect secret will throw an invalid password error.\n await this.userVerificationService.verifyUser(this.secret.value);\n this.invalidSecret = false;\n } catch (e) {\n this.invalidSecret = true;\n this.platformUtilsService.showToast(\"error\", this.i18nService.t(\"error\"), e.message);\n return;\n }\n\n this.close(true);\n };\n\n close(success: boolean) {\n this.modalRef.close(success);\n }\n}\n","import { DialogConfig, DialogRef, DIALOG_DATA } from \"@angular/cdk/dialog\";\nimport { Component, Inject } from \"@angular/core\";\nimport { FormBuilder } from \"@angular/forms\";\n\nimport {\n UserVerificationPromptComponent as BaseUserVerificationPrompt,\n UserVerificationPromptParams,\n} from \"@bitwarden/angular/auth/components/user-verification-prompt.component\";\nimport { UserVerificationService } from \"@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { DialogService } from \"@bitwarden/components\";\n\n/**\n * @deprecated Jan 24, 2024: Use new libs/auth UserVerificationDialogComponent instead.\n */\n@Component({\n templateUrl: \"user-verification-prompt.component.html\",\n})\nexport class UserVerificationPromptComponent extends BaseUserVerificationPrompt {\n constructor(\n @Inject(DIALOG_DATA) data: UserVerificationPromptParams,\n private dialogRef: DialogRef,\n userVerificationService: UserVerificationService,\n formBuilder: FormBuilder,\n platformUtilsService: PlatformUtilsService,\n i18nService: I18nService,\n ) {\n super(null, data, userVerificationService, formBuilder, platformUtilsService, i18nService);\n }\n\n override close(success: boolean) {\n this.dialogRef.close(success);\n }\n}\n\n/**\n * Strongly typed helper to open a UserVerificationPrompt\n * @param dialogService Instance of the dialog service that will be used to open the dialog\n * @param config Configuration for the dialog\n */\nexport const openUserVerificationPrompt = (\n dialogService: DialogService,\n config: DialogConfig,\n) => {\n return dialogService.open(\n UserVerificationPromptComponent,\n config,\n );\n};\n","
\n \n {{ modalTitle | i18n }}\n \n

{{ confirmDescription | i18n }}

\n \n
\n \n \n \n \n
\n
\n","import { Directive, EventEmitter, Input, OnDestroy, OnInit, Output } from \"@angular/core\";\nimport { ControlValueAccessor, FormControl, Validators } from \"@angular/forms\";\nimport { Subject, takeUntil } from \"rxjs\";\n\nimport { UserVerificationService } from \"@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction\";\nimport { VerificationType } from \"@bitwarden/common/auth/enums/verification-type\";\nimport { Verification } from \"@bitwarden/common/auth/types/verification\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\n\n/**\n * Used for general-purpose user verification throughout the app.\n * Collects the user's master password, or if they are not using a password, prompts for an OTP via email.\n * This is exposed to the parent component via the ControlValueAccessor interface (e.g. bind it to a FormControl).\n * Use UserVerificationService to verify the user's input.\n *\n * @deprecated Jan 24, 2024: Use new libs/auth UserVerificationDialogComponent or UserVerificationFormInputComponent instead.\n * Each client specific component should eventually be converted over to use one of these new components.\n */\n@Directive({\n selector: \"app-user-verification\",\n})\n// eslint-disable-next-line rxjs-angular/prefer-takeuntil\nexport class UserVerificationComponent implements ControlValueAccessor, OnInit, OnDestroy {\n private _invalidSecret = false;\n @Input()\n get invalidSecret() {\n return this._invalidSecret;\n }\n set invalidSecret(value: boolean) {\n this._invalidSecret = value;\n this.invalidSecretChange.emit(value);\n\n // ISSUE: This is pretty hacky but unfortunately there is no way of knowing if the parent\n // control has been marked as touched, see: https://github.com/angular/angular/issues/10887\n // When that functionality has been added we should also look into forwarding reactive form\n // controls errors so that we don't need a separate input/output `invalidSecret`.\n if (value) {\n this.secret.markAsTouched();\n }\n this.secret.updateValueAndValidity({ emitEvent: false });\n }\n @Output() invalidSecretChange = new EventEmitter();\n\n hasMasterPassword = true;\n disableRequestOTP = false;\n sentCode = false;\n\n secret = new FormControl(\"\", [\n Validators.required,\n () => {\n if (this.invalidSecret) {\n return {\n invalidSecret: {\n message: this.hasMasterPassword\n ? this.i18nService.t(\"incorrectPassword\")\n : this.i18nService.t(\"incorrectCode\"),\n },\n };\n }\n },\n ]);\n\n private onChange: (value: Verification) => void;\n private destroy$ = new Subject();\n\n constructor(\n private cryptoService: CryptoService,\n private userVerificationService: UserVerificationService,\n private i18nService: I18nService,\n ) {}\n\n async ngOnInit() {\n this.hasMasterPassword = await this.userVerificationService.hasMasterPasswordAndMasterKeyHash();\n this.processChanges(this.secret.value);\n\n this.secret.valueChanges\n .pipe(takeUntil(this.destroy$))\n .subscribe((secret: string) => this.processChanges(secret));\n }\n\n requestOTP = async () => {\n if (!this.hasMasterPassword) {\n this.disableRequestOTP = true;\n try {\n await this.userVerificationService.requestOTP();\n this.sentCode = true;\n } finally {\n this.disableRequestOTP = false;\n }\n }\n };\n\n writeValue(obj: any): void {\n this.secret.setValue(obj);\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n // Not implemented\n }\n\n setDisabledState?(isDisabled: boolean): void {\n this.disableRequestOTP = isDisabled;\n if (isDisabled) {\n this.secret.disable();\n } else {\n this.secret.enable();\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n protected processChanges(secret: string) {\n this.invalidSecret = false;\n\n if (this.onChange == null) {\n return;\n }\n\n this.onChange({\n type: this.hasMasterPassword ? VerificationType.MasterPassword : VerificationType.OTP,\n secret: Utils.isNullOrWhitespace(secret) ? null : secret,\n });\n }\n}\n","\n \n {{ \"masterPass\" | i18n }}\n \n \n {{ \"confirmIdentity\" | i18n }}\n \n\n\n
\n \n \n \n \n {{ \"codeSent\" | i18n }}\n \n
\n\n \n {{ \"verificationCode\" | i18n }}\n \n {{ \"confirmIdentity\" | i18n }}\n \n
\n","import { animate, style, transition, trigger } from \"@angular/animations\";\nimport { Component } from \"@angular/core\";\nimport { NG_VALUE_ACCESSOR } from \"@angular/forms\";\n\nimport { UserVerificationComponent as BaseComponent } from \"@bitwarden/angular/auth/components/user-verification.component\";\n\n/**\n * @deprecated Jan 24, 2024: Use new libs/auth UserVerificationDialogComponent or UserVerificationFormInputComponent instead.\n * Each client specific component should eventually be converted over to use one of these new components.\n */\n@Component({\n selector: \"app-user-verification\",\n templateUrl: \"user-verification.component.html\",\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n multi: true,\n useExisting: UserVerificationComponent,\n },\n ],\n animations: [\n trigger(\"sent\", [\n transition(\":enter\", [style({ opacity: 0 }), animate(\"100ms\", style({ opacity: 1 }))]),\n ]),\n ],\n})\nexport class UserVerificationComponent extends BaseComponent {}\n","import { Component, EventEmitter, Input, OnInit, Output, ViewChild } from \"@angular/core\";\nimport { FormBuilder, Validators } from \"@angular/forms\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport {\n BillingInformation,\n OrganizationBillingServiceAbstraction as OrganizationBillingService,\n OrganizationInformation,\n PaymentInformation,\n PlanInformation,\n} from \"@bitwarden/common/billing/abstractions/organization-billing.service\";\nimport { PaymentMethodType, PlanType } from \"@bitwarden/common/billing/enums\";\nimport { PlanResponse } from \"@bitwarden/common/billing/models/response/plan.response\";\nimport { ProductType } from \"@bitwarden/common/enums\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\n\nimport { BillingSharedModule, PaymentComponent, TaxInfoComponent } from \"../../shared\";\n\nexport type TrialOrganizationType = Exclude;\n\nexport interface OrganizationInfo {\n name: string;\n email: string;\n type: TrialOrganizationType;\n}\n\nexport interface OrganizationCreatedEvent {\n organizationId: string;\n planDescription: string;\n}\n\nenum SubscriptionCadence {\n Annual,\n Monthly,\n}\n\nexport enum SubscriptionProduct {\n PasswordManager,\n SecretsManager,\n}\n\n@Component({\n selector: \"app-trial-billing-step\",\n templateUrl: \"trial-billing-step.component.html\",\n imports: [BillingSharedModule],\n standalone: true,\n})\nexport class TrialBillingStepComponent implements OnInit {\n @ViewChild(PaymentComponent) paymentComponent: PaymentComponent;\n @ViewChild(TaxInfoComponent) taxInfoComponent: TaxInfoComponent;\n @Input() organizationInfo: OrganizationInfo;\n @Input() subscriptionProduct: SubscriptionProduct = SubscriptionProduct.PasswordManager;\n @Output() steppedBack = new EventEmitter();\n @Output() organizationCreated = new EventEmitter();\n\n loading = true;\n\n annualCadence = SubscriptionCadence.Annual;\n monthlyCadence = SubscriptionCadence.Monthly;\n\n formGroup = this.formBuilder.group({\n cadence: [SubscriptionCadence.Annual, Validators.required],\n });\n formPromise: Promise;\n\n applicablePlans: PlanResponse[];\n annualPlan?: PlanResponse;\n monthlyPlan?: PlanResponse;\n\n constructor(\n private apiService: ApiService,\n private i18nService: I18nService,\n private formBuilder: FormBuilder,\n private messagingService: MessagingService,\n private organizationBillingService: OrganizationBillingService,\n private platformUtilsService: PlatformUtilsService,\n ) {}\n\n async ngOnInit(): Promise {\n const plans = await this.apiService.getPlans();\n this.applicablePlans = plans.data.filter(this.isApplicable);\n this.annualPlan = this.findPlanFor(SubscriptionCadence.Annual);\n this.monthlyPlan = this.findPlanFor(SubscriptionCadence.Monthly);\n this.loading = false;\n }\n\n async submit(): Promise {\n this.formPromise = this.createOrganization();\n\n const organizationId = await this.formPromise;\n const planDescription = this.getPlanDescription();\n\n this.platformUtilsService.showToast(\n \"success\",\n this.i18nService.t(\"organizationCreated\"),\n this.i18nService.t(\"organizationReadyToGo\"),\n );\n\n this.organizationCreated.emit({\n organizationId,\n planDescription,\n });\n\n this.messagingService.send(\"organizationCreated\", organizationId);\n }\n\n protected changedCountry() {\n this.paymentComponent.hideBank = this.taxInfoComponent.taxInfo.country !== \"US\";\n if (\n this.paymentComponent.hideBank &&\n this.paymentComponent.method === PaymentMethodType.BankAccount\n ) {\n this.paymentComponent.method = PaymentMethodType.Card;\n this.paymentComponent.changeMethod();\n }\n }\n\n protected getPriceFor(cadence: SubscriptionCadence): number {\n const plan = this.findPlanFor(cadence);\n return this.subscriptionProduct === SubscriptionProduct.PasswordManager\n ? plan.PasswordManager.basePrice === 0\n ? plan.PasswordManager.seatPrice\n : plan.PasswordManager.basePrice\n : plan.SecretsManager.basePrice === 0\n ? plan.SecretsManager.seatPrice\n : plan.SecretsManager.basePrice;\n }\n\n protected stepBack() {\n this.steppedBack.emit();\n }\n\n private async createOrganization(): Promise {\n const planResponse = this.findPlanFor(this.formGroup.value.cadence);\n const paymentMethod = await this.paymentComponent.createPaymentToken();\n\n const organization: OrganizationInformation = {\n name: this.organizationInfo.name,\n billingEmail: this.organizationInfo.email,\n initiationPath:\n this.subscriptionProduct === SubscriptionProduct.PasswordManager\n ? \"Password Manager trial from marketing website\"\n : \"Secrets Manager trial from marketing website\",\n };\n\n const plan: PlanInformation = {\n type: planResponse.type,\n passwordManagerSeats: 1,\n };\n\n if (this.subscriptionProduct === SubscriptionProduct.SecretsManager) {\n plan.subscribeToSecretsManager = true;\n plan.isFromSecretsManagerTrial = true;\n plan.secretsManagerSeats = 1;\n }\n\n const payment: PaymentInformation = {\n paymentMethod,\n billing: this.getBillingInformationFromTaxInfoComponent(),\n };\n\n const response = await this.organizationBillingService.purchaseSubscription({\n organization,\n plan,\n payment,\n });\n\n return response.id;\n }\n\n private productTypeToPlanTypeMap: {\n [productType in TrialOrganizationType]: {\n [cadence in SubscriptionCadence]?: PlanType;\n };\n } = {\n [ProductType.Enterprise]: {\n [SubscriptionCadence.Annual]: PlanType.EnterpriseAnnually,\n [SubscriptionCadence.Monthly]: PlanType.EnterpriseMonthly,\n },\n [ProductType.Families]: {\n [SubscriptionCadence.Annual]: PlanType.FamiliesAnnually,\n // No monthly option for Families plan\n },\n [ProductType.Teams]: {\n [SubscriptionCadence.Annual]: PlanType.TeamsAnnually,\n [SubscriptionCadence.Monthly]: PlanType.TeamsMonthly,\n },\n [ProductType.TeamsStarter]: {\n // No annual option for Teams Starter plan\n [SubscriptionCadence.Monthly]: PlanType.TeamsStarter,\n },\n };\n\n private findPlanFor(cadence: SubscriptionCadence): PlanResponse | null {\n const productType = this.organizationInfo.type;\n const planType = this.productTypeToPlanTypeMap[productType]?.[cadence];\n return planType ? this.applicablePlans.find((plan) => plan.type === planType) : null;\n }\n\n private getBillingInformationFromTaxInfoComponent(): BillingInformation {\n return {\n postalCode: this.taxInfoComponent.taxInfo.postalCode,\n country: this.taxInfoComponent.taxInfo.country,\n taxId: this.taxInfoComponent.taxInfo.taxId,\n addressLine1: this.taxInfoComponent.taxInfo.line1,\n addressLine2: this.taxInfoComponent.taxInfo.line2,\n city: this.taxInfoComponent.taxInfo.city,\n state: this.taxInfoComponent.taxInfo.state,\n };\n }\n\n private getPlanDescription(): string {\n const plan = this.findPlanFor(this.formGroup.value.cadence);\n const price =\n this.subscriptionProduct === SubscriptionProduct.PasswordManager\n ? plan.PasswordManager.basePrice === 0\n ? plan.PasswordManager.seatPrice\n : plan.PasswordManager.basePrice\n : plan.SecretsManager.basePrice === 0\n ? plan.SecretsManager.seatPrice\n : plan.SecretsManager.basePrice;\n\n switch (this.formGroup.value.cadence) {\n case SubscriptionCadence.Annual:\n return `${this.i18nService.t(\"annual\")} ($${price}/${this.i18nService.t(\"yr\")})`;\n case SubscriptionCadence.Monthly:\n return `${this.i18nService.t(\"monthly\")} ($${price}/${this.i18nService.t(\"monthAbbr\")})`;\n }\n }\n\n private isApplicable(plan: PlanResponse): boolean {\n const hasCorrectProductType =\n plan.product === ProductType.Enterprise ||\n plan.product === ProductType.Families ||\n plan.product === ProductType.Teams ||\n plan.product === ProductType.TeamsStarter;\n const notDisabledOrLegacy = !plan.disabled && !plan.legacyYear;\n return hasCorrectProductType && notDisabledOrLegacy;\n }\n}\n","\n \n {{ \"loading\" | i18n }}\n\n\n
\n
\n

{{ \"billingPlanLabel\" | i18n }}

\n
\n \n
\n
\n \n
\n
\n
\n

{{ \"paymentType\" | i18n }}

\n \n \n
\n
\n \n \n
\n
\n\n","import { PlanType } from \"../../../billing/enums\";\n\nimport { OrganizationKeysRequest } from \"./organization-keys.request\";\n\nexport class OrganizationUpgradeRequest {\n businessName: string;\n planType: PlanType;\n additionalSeats: number;\n additionalStorageGb: number;\n premiumAccessAddon: boolean;\n billingAddressCountry: string;\n billingAddressPostalCode: string;\n keys: OrganizationKeysRequest;\n\n useSecretsManager: boolean;\n additionalSmSeats: number;\n additionalServiceAccounts: number;\n}\n","import { OrganizationCreateRequest } from \"../../../models/request/organization-create.request\";\n\nexport class ProviderOrganizationCreateRequest {\n constructor(\n public clientOwnerEmail: string,\n public organizationCreateRequest: OrganizationCreateRequest,\n ) {}\n}\n","\n \n {{ \"loading\" | i18n }}\n\n\n

{{ \"uploadLicenseFileOrg\" | i18n }}

\n
\n
\n \n \n {{\n \"licenseFileDesc\" | i18n: \"bitwarden_organization_license.json\"\n }}\n
\n \n
\n
\n\n \n

{{ \"chooseYourPlan\" | i18n }}

\n
\n \n \n
\n
\n \n

{{ \"users\" | i18n }}

\n
\n
\n \n \n {{ \"userSeatsHowManyDesc\" | i18n }}\n
\n
\n \n

{{ \"addons\" | i18n }}

\n \n
\n \n \n {{\n \"userSeatsAdditionalDesc\"\n | i18n\n : selectedPlan.PasswordManager.baseSeats\n : (seatPriceMonthly(selectedPlan) | currency: \"$\")\n }}\n
\n
\n
\n
\n \n \n {{\n \"additionalStorageIntervalDesc\"\n | i18n\n : \"1 GB\"\n : (additionalStoragePriceMonthly(selectedPlan) | currency: \"$\")\n : (\"month\" | i18n)\n }}\n
\n
\n
\n
\n
\n \n \n
\n {{\n \"premiumAccessDesc\" | i18n: (3.33 | currency: \"$\") : (\"month\" | i18n)\n }}\n
\n
\n

{{ \"summary\" | i18n }}

\n
\n \n \n
\n \n\n \n
\n \n
\n\n \n
\n

\n {{ (createOrganization ? \"paymentInformation\" : \"billingInformation\") | i18n }}\n

\n \n {{ paymentDesc }}\n \n \n \n
\n
\n {{ \"passwordManagerPlanPrice\" | i18n }}: {{ passwordManagerSubtotal | currency: \"USD $\" }}\n
\n \n {{ \"secretsManagerPlanPrice\" | i18n }}: {{ secretsManagerSubtotal | currency: \"USD $\" }}\n
\n
\n \n {{ \"estimatedTax\" | i18n }}: {{ taxCharges | currency: \"USD $\" }}\n \n
\n
\n

\n {{ \"total\" | i18n }}: {{ total | currency: \"USD $\" }}/{{\n selectedPlanInterval | i18n\n }}\n

\n
\n \n \n \n
\n
\n {{ \"singleOrgBlockCreateMessage\" | i18n }}\n
\n
\n \n {{ \"submit\" | i18n }}\n \n \n
\n\n","import {\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ViewChild,\n} from \"@angular/core\";\nimport { FormBuilder, Validators } from \"@angular/forms\";\nimport { Router } from \"@angular/router\";\nimport { Subject, takeUntil } from \"rxjs\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { OrganizationApiServiceAbstraction } from \"@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction\";\nimport { OrganizationService } from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport { PolicyService } from \"@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction\";\nimport { PolicyType } from \"@bitwarden/common/admin-console/enums\";\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\nimport { OrganizationCreateRequest } from \"@bitwarden/common/admin-console/models/request/organization-create.request\";\nimport { OrganizationKeysRequest } from \"@bitwarden/common/admin-console/models/request/organization-keys.request\";\nimport { OrganizationUpgradeRequest } from \"@bitwarden/common/admin-console/models/request/organization-upgrade.request\";\nimport { ProviderOrganizationCreateRequest } from \"@bitwarden/common/admin-console/models/request/provider/provider-organization-create.request\";\nimport { ProviderResponse } from \"@bitwarden/common/admin-console/models/response/provider/provider.response\";\nimport { PaymentMethodType, PlanType } from \"@bitwarden/common/billing/enums\";\nimport { PaymentRequest } from \"@bitwarden/common/billing/models/request/payment.request\";\nimport { BillingResponse } from \"@bitwarden/common/billing/models/response/billing.response\";\nimport { OrganizationSubscriptionResponse } from \"@bitwarden/common/billing/models/response/organization-subscription.response\";\nimport { PlanResponse } from \"@bitwarden/common/billing/models/response/plan.response\";\nimport { ProductType } from \"@bitwarden/common/enums\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { EncString } from \"@bitwarden/common/platform/models/domain/enc-string\";\nimport { SymmetricCryptoKey } from \"@bitwarden/common/platform/models/domain/symmetric-crypto-key\";\nimport { OrgKey } from \"@bitwarden/common/types/key\";\nimport { SyncService } from \"@bitwarden/common/vault/abstractions/sync/sync.service.abstraction\";\n\nimport { OrganizationCreateModule } from \"../../admin-console/organizations/create/organization-create.module\";\nimport { BillingSharedModule, secretsManagerSubscribeFormFactory } from \"../shared\";\nimport { PaymentComponent } from \"../shared/payment.component\";\nimport { TaxInfoComponent } from \"../shared/tax-info.component\";\n\ninterface OnSuccessArgs {\n organizationId: string;\n}\n\nconst Allowed2020PlanTypes = [\n PlanType.TeamsMonthly2020,\n PlanType.TeamsAnnually2020,\n PlanType.EnterpriseAnnually2020,\n PlanType.EnterpriseMonthly2020,\n];\n\n@Component({\n selector: \"app-organization-plans\",\n templateUrl: \"organization-plans.component.html\",\n standalone: true,\n imports: [BillingSharedModule, OrganizationCreateModule],\n})\nexport class OrganizationPlansComponent implements OnInit, OnDestroy {\n @ViewChild(PaymentComponent) paymentComponent: PaymentComponent;\n @ViewChild(TaxInfoComponent) taxComponent: TaxInfoComponent;\n\n @Input() organizationId: string;\n @Input() showFree = true;\n @Input() showCancel = false;\n @Input() acceptingSponsorship = false;\n @Input() currentPlan: PlanResponse;\n\n @Input()\n get product(): ProductType {\n return this._product;\n }\n\n set product(product: ProductType) {\n this._product = product;\n this.formGroup?.controls?.product?.setValue(product);\n }\n\n private _product = ProductType.Free;\n\n @Input()\n get plan(): PlanType {\n return this._plan;\n }\n\n set plan(plan: PlanType) {\n this._plan = plan;\n this.formGroup?.controls?.plan?.setValue(plan);\n }\n\n private _plan = PlanType.Free;\n @Input() providerId?: string;\n @Output() onSuccess = new EventEmitter();\n @Output() onCanceled = new EventEmitter();\n @Output() onTrialBillingSuccess = new EventEmitter();\n\n loading = true;\n selfHosted = false;\n productTypes = ProductType;\n formPromise: Promise;\n singleOrgPolicyAppliesToActiveUser = false;\n isInTrialFlow = false;\n discount = 0;\n\n secretsManagerSubscription = secretsManagerSubscribeFormFactory(this.formBuilder);\n\n formGroup = this.formBuilder.group({\n name: [\"\"],\n billingEmail: [\"\", [Validators.email]],\n businessOwned: [false],\n premiumAccessAddon: [false],\n additionalStorage: [0, [Validators.min(0), Validators.max(99)]],\n additionalSeats: [0, [Validators.min(0), Validators.max(100000)]],\n clientOwnerEmail: [\"\", [Validators.email]],\n businessName: [\"\"],\n plan: [this.plan],\n product: [this.product],\n secretsManager: this.secretsManagerSubscription,\n });\n\n passwordManagerPlans: PlanResponse[];\n secretsManagerPlans: PlanResponse[];\n organization: Organization;\n sub: OrganizationSubscriptionResponse;\n billing: BillingResponse;\n provider: ProviderResponse;\n\n private destroy$ = new Subject();\n\n constructor(\n private apiService: ApiService,\n private i18nService: I18nService,\n private platformUtilsService: PlatformUtilsService,\n private cryptoService: CryptoService,\n private router: Router,\n private syncService: SyncService,\n private policyService: PolicyService,\n private organizationService: OrganizationService,\n private logService: LogService,\n private messagingService: MessagingService,\n private formBuilder: FormBuilder,\n private organizationApiService: OrganizationApiServiceAbstraction,\n ) {\n this.selfHosted = platformUtilsService.isSelfHost();\n }\n\n async ngOnInit() {\n if (this.organizationId) {\n this.organization = await this.organizationService.get(this.organizationId);\n this.billing = await this.organizationApiService.getBilling(this.organizationId);\n this.sub = await this.organizationApiService.getSubscription(this.organizationId);\n }\n\n if (!this.selfHosted) {\n const plans = await this.apiService.getPlans();\n this.passwordManagerPlans = plans.data.filter((plan) => !!plan.PasswordManager);\n this.secretsManagerPlans = plans.data.filter((plan) => !!plan.SecretsManager);\n\n if (this.product === ProductType.Enterprise || this.product === ProductType.Teams) {\n this.formGroup.controls.businessOwned.setValue(true);\n }\n }\n\n if (this.currentPlan && this.currentPlan.product !== ProductType.Enterprise) {\n const upgradedPlan = this.passwordManagerPlans.find((plan) =>\n this.currentPlan.product === ProductType.Free\n ? plan.type === PlanType.FamiliesAnnually\n : plan.upgradeSortOrder == this.currentPlan.upgradeSortOrder + 1,\n );\n\n this.plan = upgradedPlan.type;\n this.product = upgradedPlan.product;\n }\n\n if (this.hasProvider) {\n this.formGroup.controls.businessOwned.setValue(true);\n this.changedOwnedBusiness();\n this.provider = await this.apiService.getProvider(this.providerId);\n const providerDefaultPlan = this.passwordManagerPlans.find(\n (plan) => plan.type === PlanType.TeamsAnnually,\n );\n this.plan = providerDefaultPlan.type;\n this.product = providerDefaultPlan.product;\n }\n\n if (!this.createOrganization) {\n this.upgradeFlowPrefillForm();\n } else {\n this.formGroup.controls.name.addValidators([Validators.required, Validators.maxLength(50)]);\n this.formGroup.controls.billingEmail.addValidators(Validators.required);\n }\n\n this.policyService\n .policyAppliesToActiveUser$(PolicyType.SingleOrg)\n .pipe(takeUntil(this.destroy$))\n .subscribe((policyAppliesToActiveUser) => {\n this.singleOrgPolicyAppliesToActiveUser = policyAppliesToActiveUser;\n });\n\n if (!this.selfHosted) {\n this.changedProduct();\n }\n\n this.loading = false;\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n get singleOrgPolicyBlock() {\n return this.singleOrgPolicyAppliesToActiveUser && !this.hasProvider;\n }\n\n get createOrganization() {\n return this.organizationId == null;\n }\n\n get upgradeRequiresPaymentMethod() {\n return (\n this.organization?.planProductType === ProductType.Free &&\n !this.showFree &&\n !this.billing?.paymentSource\n );\n }\n\n get selectedPlan() {\n return this.passwordManagerPlans.find(\n (plan) => plan.type === this.formGroup.controls.plan.value,\n );\n }\n\n get selectedSecretsManagerPlan() {\n return this.secretsManagerPlans.find(\n (plan) => plan.type === this.formGroup.controls.plan.value,\n );\n }\n\n get selectedPlanInterval() {\n return this.selectedPlan.isAnnual ? \"year\" : \"month\";\n }\n\n isProviderQualifiedFor2020Plan() {\n const targetDate = new Date(\"2023-11-06\");\n\n if (!this.provider || !this.provider.creationDate) {\n return false;\n }\n\n const creationDate = new Date(this.provider.creationDate);\n return creationDate < targetDate;\n }\n\n get selectableProducts() {\n if (this.acceptingSponsorship) {\n const familyPlan = this.passwordManagerPlans.find(\n (plan) => plan.type === PlanType.FamiliesAnnually,\n );\n this.discount = familyPlan.PasswordManager.basePrice;\n return [familyPlan];\n }\n\n const businessOwnedIsChecked = this.formGroup.controls.businessOwned.value;\n\n const result = this.passwordManagerPlans.filter(\n (plan) =>\n plan.type !== PlanType.Custom &&\n (!businessOwnedIsChecked || plan.canBeUsedByBusiness) &&\n (this.showFree || plan.product !== ProductType.Free) &&\n (plan.isAnnual ||\n plan.product === ProductType.Free ||\n plan.product === ProductType.TeamsStarter) &&\n (!this.currentPlan || this.currentPlan.upgradeSortOrder < plan.upgradeSortOrder) &&\n (!this.hasProvider || plan.product !== ProductType.TeamsStarter) &&\n ((!this.isProviderQualifiedFor2020Plan() && this.planIsEnabled(plan)) ||\n (this.isProviderQualifiedFor2020Plan() && Allowed2020PlanTypes.includes(plan.type))),\n );\n\n result.sort((planA, planB) => planA.displaySortOrder - planB.displaySortOrder);\n\n return result;\n }\n\n get selectablePlans() {\n const selectedProductType = this.formGroup.controls.product.value;\n const result =\n this.passwordManagerPlans?.filter(\n (plan) =>\n plan.product === selectedProductType &&\n ((!this.isProviderQualifiedFor2020Plan() && this.planIsEnabled(plan)) ||\n (this.isProviderQualifiedFor2020Plan() && Allowed2020PlanTypes.includes(plan.type))),\n ) || [];\n\n result.sort((planA, planB) => planA.displaySortOrder - planB.displaySortOrder);\n return result;\n }\n\n get hasProvider() {\n return this.providerId != null;\n }\n\n additionalStoragePriceMonthly(selectedPlan: PlanResponse) {\n if (!selectedPlan.isAnnual) {\n return selectedPlan.PasswordManager.additionalStoragePricePerGb;\n }\n return selectedPlan.PasswordManager.additionalStoragePricePerGb / 12;\n }\n\n seatPriceMonthly(selectedPlan: PlanResponse) {\n if (!selectedPlan.isAnnual) {\n return selectedPlan.PasswordManager.seatPrice;\n }\n return selectedPlan.PasswordManager.seatPrice / 12;\n }\n\n additionalStorageTotal(plan: PlanResponse): number {\n if (!plan.PasswordManager.hasAdditionalStorageOption) {\n return 0;\n }\n\n return (\n plan.PasswordManager.additionalStoragePricePerGb *\n Math.abs(this.formGroup.controls.additionalStorage.value || 0)\n );\n }\n\n passwordManagerSeatTotal(plan: PlanResponse, seats: number): number {\n if (!plan.PasswordManager.hasAdditionalSeatsOption) {\n return 0;\n }\n\n return plan.PasswordManager.seatPrice * Math.abs(seats || 0);\n }\n\n secretsManagerSeatTotal(plan: PlanResponse, seats: number): number {\n if (!plan.SecretsManager.hasAdditionalSeatsOption) {\n return 0;\n }\n\n return plan.SecretsManager.seatPrice * Math.abs(seats || 0);\n }\n\n additionalServiceAccountTotal(plan: PlanResponse): number {\n if (!plan.SecretsManager.hasAdditionalServiceAccountOption) {\n return 0;\n }\n\n return (\n plan.SecretsManager.additionalPricePerServiceAccount *\n Math.abs(this.secretsManagerForm.value.additionalServiceAccounts || 0)\n );\n }\n\n get passwordManagerSubtotal() {\n let subTotal = this.selectedPlan.PasswordManager.basePrice;\n if (\n this.selectedPlan.PasswordManager.hasAdditionalSeatsOption &&\n this.formGroup.controls.additionalSeats.value\n ) {\n subTotal += this.passwordManagerSeatTotal(\n this.selectedPlan,\n this.formGroup.value.additionalSeats,\n );\n }\n if (\n this.selectedPlan.PasswordManager.hasAdditionalStorageOption &&\n this.formGroup.controls.additionalStorage.value\n ) {\n subTotal += this.additionalStorageTotal(this.selectedPlan);\n }\n if (\n this.selectedPlan.PasswordManager.hasPremiumAccessOption &&\n this.formGroup.controls.premiumAccessAddon.value\n ) {\n subTotal += this.selectedPlan.PasswordManager.premiumAccessOptionPrice;\n }\n return subTotal - this.discount;\n }\n\n get secretsManagerSubtotal() {\n const plan = this.selectedSecretsManagerPlan;\n const formValues = this.secretsManagerForm.value;\n\n if (!this.planOffersSecretsManager || !formValues.enabled) {\n return 0;\n }\n\n return (\n plan.SecretsManager.basePrice +\n this.secretsManagerSeatTotal(plan, formValues.userSeats) +\n this.additionalServiceAccountTotal(plan)\n );\n }\n\n get freeTrial() {\n return this.selectedPlan.trialPeriodDays != null;\n }\n\n get taxCharges() {\n return this.taxComponent != null && this.taxComponent.taxRate != null\n ? (this.taxComponent.taxRate / 100) *\n (this.passwordManagerSubtotal + this.secretsManagerSubtotal)\n : 0;\n }\n\n get total() {\n return this.passwordManagerSubtotal + this.secretsManagerSubtotal + this.taxCharges || 0;\n }\n\n get paymentDesc() {\n if (this.acceptingSponsorship) {\n return this.i18nService.t(\"paymentSponsored\");\n } else if (this.freeTrial && this.createOrganization) {\n return this.i18nService.t(\"paymentChargedWithTrial\");\n } else {\n return this.i18nService.t(\"paymentCharged\", this.i18nService.t(this.selectedPlanInterval));\n }\n }\n\n get secretsManagerForm() {\n return this.formGroup.controls.secretsManager;\n }\n\n get planOffersSecretsManager() {\n return this.selectedSecretsManagerPlan != null;\n }\n\n changedProduct() {\n const selectedPlan = this.selectablePlans[0];\n\n this.setPlanType(selectedPlan.type);\n this.handlePremiumAddonAccess(selectedPlan.PasswordManager.hasPremiumAccessOption);\n this.handleAdditionalStorage(selectedPlan.PasswordManager.hasAdditionalStorageOption);\n this.handleAdditionalSeats(selectedPlan.PasswordManager.hasAdditionalSeatsOption);\n this.handleSecretsManagerForm();\n }\n\n setPlanType(planType: PlanType) {\n this.formGroup.controls.plan.setValue(planType);\n }\n\n handlePremiumAddonAccess(hasPremiumAccessOption: boolean) {\n this.formGroup.controls.premiumAccessAddon.setValue(!hasPremiumAccessOption);\n }\n\n handleAdditionalStorage(selectedPlanHasAdditionalStorageOption: boolean) {\n if (!selectedPlanHasAdditionalStorageOption || !this.currentPlan) {\n this.formGroup.controls.additionalStorage.setValue(0);\n return;\n }\n\n if (this.organization?.maxStorageGb) {\n this.formGroup.controls.additionalStorage.setValue(\n this.organization.maxStorageGb - this.currentPlan.PasswordManager.baseStorageGb,\n );\n }\n }\n\n handleAdditionalSeats(selectedPlanHasAdditionalSeatsOption: boolean) {\n if (!selectedPlanHasAdditionalSeatsOption) {\n this.formGroup.controls.additionalSeats.setValue(0);\n return;\n }\n\n if (this.currentPlan && !this.currentPlan.PasswordManager.hasAdditionalSeatsOption) {\n this.formGroup.controls.additionalSeats.setValue(this.currentPlan.PasswordManager.baseSeats);\n return;\n }\n\n if (this.organization) {\n this.formGroup.controls.additionalSeats.setValue(this.organization.seats);\n return;\n }\n\n this.formGroup.controls.additionalSeats.setValue(1);\n }\n\n handleSecretsManagerForm() {\n if (this.planOffersSecretsManager) {\n this.secretsManagerForm.enable();\n }\n\n if (this.organization?.useSecretsManager) {\n this.secretsManagerForm.controls.enabled.setValue(true);\n }\n\n if (this.secretsManagerForm.controls.enabled.value) {\n this.secretsManagerForm.controls.userSeats.setValue(this.sub?.smSeats || 1);\n this.secretsManagerForm.controls.additionalServiceAccounts.setValue(\n this.sub?.smServiceAccounts - this.currentPlan.SecretsManager?.baseServiceAccount || 0,\n );\n }\n\n this.secretsManagerForm.updateValueAndValidity();\n }\n\n changedOwnedBusiness() {\n if (!this.formGroup.controls.businessOwned.value || this.selectedPlan.canBeUsedByBusiness) {\n return;\n }\n this.formGroup.controls.product.setValue(ProductType.TeamsStarter);\n this.formGroup.controls.plan.setValue(PlanType.TeamsStarter);\n this.changedProduct();\n }\n\n changedCountry() {\n this.paymentComponent.hideBank = this.taxComponent.taxInfo.country !== \"US\";\n // Bank Account payments are only available for US customers\n if (\n this.paymentComponent.hideBank &&\n this.paymentComponent.method === PaymentMethodType.BankAccount\n ) {\n this.paymentComponent.method = PaymentMethodType.Card;\n this.paymentComponent.changeMethod();\n }\n }\n\n cancel() {\n this.onCanceled.emit();\n }\n\n async submit() {\n if (this.singleOrgPolicyBlock) {\n return;\n }\n\n try {\n const doSubmit = async (): Promise => {\n let orgId: string = null;\n if (this.createOrganization) {\n const orgKey = await this.cryptoService.makeOrgKey();\n const key = orgKey[0].encryptedString;\n const collection = await this.cryptoService.encrypt(\n this.i18nService.t(\"defaultCollection\"),\n orgKey[1],\n );\n const collectionCt = collection.encryptedString;\n const orgKeys = await this.cryptoService.makeKeyPair(orgKey[1]);\n\n if (this.selfHosted) {\n orgId = await this.createSelfHosted(key, collectionCt, orgKeys);\n } else {\n orgId = await this.createCloudHosted(key, collectionCt, orgKeys, orgKey[1]);\n }\n\n this.platformUtilsService.showToast(\n \"success\",\n this.i18nService.t(\"organizationCreated\"),\n this.i18nService.t(\"organizationReadyToGo\"),\n );\n } else {\n orgId = await this.updateOrganization(orgId);\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"organizationUpgraded\"),\n );\n }\n\n await this.apiService.refreshIdentityToken();\n await this.syncService.fullSync(true);\n\n if (!this.acceptingSponsorship && !this.isInTrialFlow) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/organizations/\" + orgId]);\n }\n\n if (this.isInTrialFlow) {\n this.onTrialBillingSuccess.emit({\n orgId: orgId,\n subLabelText: this.billingSubLabelText(),\n });\n }\n\n return orgId;\n };\n\n this.formPromise = doSubmit();\n const organizationId = await this.formPromise;\n this.onSuccess.emit({ organizationId: organizationId });\n this.messagingService.send(\"organizationCreated\", organizationId);\n } catch (e) {\n this.logService.error(e);\n }\n }\n\n private async updateOrganization(orgId: string) {\n const request = new OrganizationUpgradeRequest();\n request.businessName = this.formGroup.controls.businessOwned.value\n ? this.formGroup.controls.businessName.value\n : null;\n request.additionalSeats = this.formGroup.controls.additionalSeats.value;\n request.additionalStorageGb = this.formGroup.controls.additionalStorage.value;\n request.premiumAccessAddon =\n this.selectedPlan.PasswordManager.hasPremiumAccessOption &&\n this.formGroup.controls.premiumAccessAddon.value;\n request.planType = this.selectedPlan.type;\n request.billingAddressCountry = this.taxComponent.taxInfo.country;\n request.billingAddressPostalCode = this.taxComponent.taxInfo.postalCode;\n\n // Secrets Manager\n this.buildSecretsManagerRequest(request);\n\n if (this.upgradeRequiresPaymentMethod) {\n const tokenResult = await this.paymentComponent.createPaymentToken();\n const paymentRequest = new PaymentRequest();\n paymentRequest.paymentToken = tokenResult[0];\n paymentRequest.paymentMethodType = tokenResult[1];\n paymentRequest.country = this.taxComponent.taxInfo.country;\n paymentRequest.postalCode = this.taxComponent.taxInfo.postalCode;\n await this.organizationApiService.updatePayment(this.organizationId, paymentRequest);\n }\n\n // Backfill pub/priv key if necessary\n if (!this.organization.hasPublicAndPrivateKeys) {\n const orgShareKey = await this.cryptoService.getOrgKey(this.organizationId);\n const orgKeys = await this.cryptoService.makeKeyPair(orgShareKey);\n request.keys = new OrganizationKeysRequest(orgKeys[0], orgKeys[1].encryptedString);\n }\n\n const result = await this.organizationApiService.upgrade(this.organizationId, request);\n if (!result.success && result.paymentIntentClientSecret != null) {\n await this.paymentComponent.handleStripeCardPayment(result.paymentIntentClientSecret, null);\n }\n return this.organizationId;\n }\n\n private async createCloudHosted(\n key: string,\n collectionCt: string,\n orgKeys: [string, EncString],\n orgKey: SymmetricCryptoKey,\n ) {\n const request = new OrganizationCreateRequest();\n request.key = key;\n request.collectionName = collectionCt;\n request.name = this.formGroup.controls.name.value;\n request.billingEmail = this.formGroup.controls.billingEmail.value;\n request.initiationPath = \"New organization creation in-product\";\n request.keys = new OrganizationKeysRequest(orgKeys[0], orgKeys[1].encryptedString);\n\n if (this.selectedPlan.type === PlanType.Free) {\n request.planType = PlanType.Free;\n } else {\n const tokenResult = await this.paymentComponent.createPaymentToken();\n\n request.paymentToken = tokenResult[0];\n request.paymentMethodType = tokenResult[1];\n request.businessName = this.formGroup.controls.businessOwned.value\n ? this.formGroup.controls.businessName.value\n : null;\n request.additionalSeats = this.formGroup.controls.additionalSeats.value;\n request.additionalStorageGb = this.formGroup.controls.additionalStorage.value;\n request.premiumAccessAddon =\n this.selectedPlan.PasswordManager.hasPremiumAccessOption &&\n this.formGroup.controls.premiumAccessAddon.value;\n request.planType = this.selectedPlan.type;\n request.billingAddressPostalCode = this.taxComponent.taxInfo.postalCode;\n request.billingAddressCountry = this.taxComponent.taxInfo.country;\n if (this.taxComponent.taxInfo.includeTaxId) {\n request.taxIdNumber = this.taxComponent.taxInfo.taxId;\n request.billingAddressLine1 = this.taxComponent.taxInfo.line1;\n request.billingAddressLine2 = this.taxComponent.taxInfo.line2;\n request.billingAddressCity = this.taxComponent.taxInfo.city;\n request.billingAddressState = this.taxComponent.taxInfo.state;\n }\n }\n\n // Secrets Manager\n this.buildSecretsManagerRequest(request);\n\n if (this.hasProvider) {\n const providerRequest = new ProviderOrganizationCreateRequest(\n this.formGroup.controls.clientOwnerEmail.value,\n request,\n );\n const providerKey = await this.cryptoService.getProviderKey(this.providerId);\n providerRequest.organizationCreateRequest.key = (\n await this.cryptoService.encrypt(orgKey.key, providerKey)\n ).encryptedString;\n const orgId = (\n await this.apiService.postProviderCreateOrganization(this.providerId, providerRequest)\n ).organizationId;\n\n return orgId;\n } else {\n return (await this.organizationApiService.create(request)).id;\n }\n }\n\n private async createSelfHosted(key: string, collectionCt: string, orgKeys: [string, EncString]) {\n const fileEl = document.getElementById(\"file\") as HTMLInputElement;\n const files = fileEl.files;\n if (files == null || files.length === 0) {\n throw new Error(this.i18nService.t(\"selectFile\"));\n }\n\n const fd = new FormData();\n fd.append(\"license\", files[0]);\n fd.append(\"key\", key);\n fd.append(\"collectionName\", collectionCt);\n const response = await this.organizationApiService.createLicense(fd);\n const orgId = response.id;\n\n await this.apiService.refreshIdentityToken();\n\n // Org Keys live outside of the OrganizationLicense - add the keys to the org here\n const request = new OrganizationKeysRequest(orgKeys[0], orgKeys[1].encryptedString);\n await this.organizationApiService.updateKeys(orgId, request);\n\n return orgId;\n }\n\n private billingSubLabelText(): string {\n const selectedPlan = this.selectedPlan;\n const price =\n selectedPlan.PasswordManager.basePrice === 0\n ? selectedPlan.PasswordManager.seatPrice\n : selectedPlan.PasswordManager.basePrice;\n let text = \"\";\n\n if (selectedPlan.isAnnual) {\n text += `${this.i18nService.t(\"annual\")} ($${price}/${this.i18nService.t(\"yr\")})`;\n } else {\n text += `${this.i18nService.t(\"monthly\")} ($${price}/${this.i18nService.t(\"monthAbbr\")})`;\n }\n\n return text;\n }\n\n private buildSecretsManagerRequest(\n request: OrganizationCreateRequest | OrganizationUpgradeRequest,\n ): void {\n const formValues = this.secretsManagerForm.value;\n\n request.useSecretsManager = this.planOffersSecretsManager && formValues.enabled;\n\n if (!request.useSecretsManager) {\n return;\n }\n\n if (this.selectedSecretsManagerPlan.SecretsManager.hasAdditionalSeatsOption) {\n request.additionalSmSeats = formValues.userSeats;\n }\n\n if (this.selectedSecretsManagerPlan.SecretsManager.hasAdditionalServiceAccountOption) {\n request.additionalServiceAccounts = formValues.additionalServiceAccounts;\n }\n }\n\n private upgradeFlowPrefillForm() {\n if (this.acceptingSponsorship) {\n this.formGroup.controls.product.setValue(ProductType.Families);\n this.changedProduct();\n return;\n }\n\n if (this.currentPlan && this.currentPlan.product !== ProductType.Enterprise) {\n const upgradedPlan = this.passwordManagerPlans.find((plan) =>\n this.currentPlan.product === ProductType.Free\n ? plan.type === PlanType.FamiliesAnnually\n : plan.upgradeSortOrder == this.currentPlan.upgradeSortOrder + 1,\n );\n\n this.plan = upgradedPlan.type;\n this.product = upgradedPlan.product;\n this.changedProduct();\n }\n }\n\n private planIsEnabled(plan: PlanResponse) {\n return !plan.disabled && !plan.legacyYear;\n }\n}\n","export class StorageRequest {\n storageGbAdjustment: number;\n}\n","
\n
\n \n

{{ (add ? \"addStorage\" : \"removeStorage\") | i18n }}

\n
\n
\n \n \n
\n
\n
\n {{ \"total\" | i18n }}: {{ storageAdjustment || 0 }} GB ×\n {{ storageGbPrice | currency: \"$\" }} = {{ adjustedStorageTotal | currency: \"$\" }} /{{\n interval | i18n\n }}\n
\n \n \n \n {{ (add ? \"storageAddNote\" : \"storageRemoveNote\") | i18n }}\n \n
\n
\n\n","import { Component, EventEmitter, Input, Output, ViewChild } from \"@angular/core\";\nimport { ActivatedRoute, Router } from \"@angular/router\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { OrganizationApiServiceAbstraction } from \"@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction\";\nimport { PaymentResponse } from \"@bitwarden/common/billing/models/response/payment.response\";\nimport { StorageRequest } from \"@bitwarden/common/models/request/storage.request\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\n\nimport { PaymentComponent } from \"./payment.component\";\n\n@Component({\n selector: \"app-adjust-storage\",\n templateUrl: \"adjust-storage.component.html\",\n})\nexport class AdjustStorageComponent {\n @Input() storageGbPrice = 0;\n @Input() add = true;\n @Input() organizationId: string;\n @Input() interval = \"year\";\n @Output() onAdjusted = new EventEmitter();\n @Output() onCanceled = new EventEmitter();\n\n @ViewChild(PaymentComponent, { static: true }) paymentComponent: PaymentComponent;\n\n storageAdjustment = 0;\n formPromise: Promise;\n\n constructor(\n private apiService: ApiService,\n private i18nService: I18nService,\n private platformUtilsService: PlatformUtilsService,\n private router: Router,\n private activatedRoute: ActivatedRoute,\n private logService: LogService,\n private organizationApiService: OrganizationApiServiceAbstraction,\n ) {}\n\n async submit() {\n try {\n const request = new StorageRequest();\n request.storageGbAdjustment = this.storageAdjustment;\n if (!this.add) {\n request.storageGbAdjustment *= -1;\n }\n\n let paymentFailed = false;\n const action = async () => {\n let response: Promise;\n if (this.organizationId == null) {\n response = this.formPromise = this.apiService.postAccountStorage(request);\n } else {\n response = this.formPromise = this.organizationApiService.updateStorage(\n this.organizationId,\n request,\n );\n }\n const result = await response;\n if (result != null && result.paymentIntentClientSecret != null) {\n try {\n await this.paymentComponent.handleStripeCardPayment(\n result.paymentIntentClientSecret,\n null,\n );\n } catch {\n paymentFailed = true;\n }\n }\n };\n this.formPromise = action();\n await this.formPromise;\n this.onAdjusted.emit(this.storageAdjustment);\n if (paymentFailed) {\n this.platformUtilsService.showToast(\n \"warning\",\n null,\n this.i18nService.t(\"couldNotChargeCardPayInvoice\"),\n { timeout: 10000 },\n );\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"../billing\"], { relativeTo: this.activatedRoute });\n } else {\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"adjustedStorage\", request.storageGbAdjustment.toString()),\n );\n }\n } catch (e) {\n this.logService.error(e);\n }\n }\n\n cancel() {\n this.onCanceled.emit();\n }\n\n get adjustedStorageTotal(): number {\n return this.storageGbPrice * this.storageAdjustment;\n }\n}\n","export class BitPayInvoiceRequest {\n userId: string;\n organizationId: string;\n credit: boolean;\n amount: number;\n returnUrl: string;\n name: string;\n email: string;\n}\n","
\n
\n \n

{{ \"addCredit\" | i18n }}

\n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
$USD
\n \n
\n
\n
\n {{ \"creditDelayed\" | i18n }}\n
\n \n \n
\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n","import {\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnInit,\n Output,\n ViewChild,\n} from \"@angular/core\";\nimport { firstValueFrom } from \"rxjs\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { OrganizationService } from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport { PaymentMethodType } from \"@bitwarden/common/billing/enums\";\nimport { BitPayInvoiceRequest } from \"@bitwarden/common/billing/models/request/bit-pay-invoice.request\";\nimport { ConfigServiceAbstraction } from \"@bitwarden/common/platform/abstractions/config/config.service.abstraction\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\n\nexport type PayPalConfig = {\n businessId?: string;\n buttonAction?: string;\n};\n\n@Component({\n selector: \"app-add-credit\",\n templateUrl: \"add-credit.component.html\",\n})\nexport class AddCreditComponent implements OnInit {\n @Input() creditAmount: string;\n @Input() showOptions = true;\n @Input() method = PaymentMethodType.PayPal;\n @Input() organizationId: string;\n @Output() onAdded = new EventEmitter();\n @Output() onCanceled = new EventEmitter();\n\n @ViewChild(\"ppButtonForm\", { read: ElementRef, static: true }) ppButtonFormRef: ElementRef;\n\n paymentMethodType = PaymentMethodType;\n ppButtonFormAction: string;\n ppButtonBusinessId: string;\n ppButtonCustomField: string;\n ppLoading = false;\n subject: string;\n returnUrl: string;\n formPromise: Promise;\n\n private userId: string;\n private name: string;\n private email: string;\n private region: string;\n\n constructor(\n private stateService: StateService,\n private apiService: ApiService,\n private platformUtilsService: PlatformUtilsService,\n private organizationService: OrganizationService,\n private logService: LogService,\n private configService: ConfigServiceAbstraction,\n ) {\n const payPalConfig = process.env.PAYPAL_CONFIG as PayPalConfig;\n this.ppButtonFormAction = payPalConfig.buttonAction;\n this.ppButtonBusinessId = payPalConfig.businessId;\n }\n\n async ngOnInit() {\n if (this.organizationId != null) {\n if (this.creditAmount == null) {\n this.creditAmount = \"20.00\";\n }\n this.ppButtonCustomField = \"organization_id:\" + this.organizationId;\n const org = await this.organizationService.get(this.organizationId);\n if (org != null) {\n this.subject = org.name;\n this.name = org.name;\n }\n } else {\n if (this.creditAmount == null) {\n this.creditAmount = \"10.00\";\n }\n this.userId = await this.stateService.getUserId();\n this.subject = await this.stateService.getEmail();\n this.email = this.subject;\n this.ppButtonCustomField = \"user_id:\" + this.userId;\n }\n this.region = await firstValueFrom(this.configService.cloudRegion$);\n this.ppButtonCustomField += \",account_credit:1\";\n this.ppButtonCustomField += `,region:${this.region}`;\n this.returnUrl = window.location.href;\n }\n\n async submit() {\n if (this.creditAmount == null || this.creditAmount === \"\") {\n return;\n }\n\n if (this.method === PaymentMethodType.PayPal) {\n this.ppButtonFormRef.nativeElement.submit();\n this.ppLoading = true;\n return;\n }\n if (this.method === PaymentMethodType.BitPay) {\n try {\n const req = new BitPayInvoiceRequest();\n req.email = this.email;\n req.name = this.name;\n req.credit = true;\n req.amount = this.creditAmountNumber;\n req.organizationId = this.organizationId;\n req.userId = this.userId;\n req.returnUrl = this.returnUrl;\n this.formPromise = this.apiService.postBitPayInvoice(req);\n const bitPayUrl: string = await this.formPromise;\n this.platformUtilsService.launchUri(bitPayUrl);\n } catch (e) {\n this.logService.error(e);\n }\n return;\n }\n try {\n this.onAdded.emit();\n } catch (e) {\n this.logService.error(e);\n }\n }\n\n cancel() {\n this.onCanceled.emit();\n }\n\n formatAmount() {\n try {\n if (this.creditAmount != null && this.creditAmount !== \"\") {\n const floatAmount = Math.abs(parseFloat(this.creditAmount));\n if (floatAmount > 0) {\n this.creditAmount = parseFloat((Math.round(floatAmount * 100) / 100).toString())\n .toFixed(2)\n .toString();\n return;\n }\n }\n } catch (e) {\n this.logService.error(e);\n }\n this.creditAmount = \"\";\n }\n\n get creditAmountNumber(): number {\n if (this.creditAmount != null && this.creditAmount !== \"\") {\n try {\n return parseFloat(this.creditAmount);\n } catch (e) {\n this.logService.error(e);\n }\n }\n return null;\n }\n}\n","import { Component, EventEmitter, Input, Output, ViewChild } from \"@angular/core\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { OrganizationApiServiceAbstraction } from \"@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction\";\nimport { PaymentMethodWarningsServiceAbstraction as PaymentMethodWarningService } from \"@bitwarden/common/billing/abstractions/payment-method-warnings-service.abstraction\";\nimport { PaymentMethodType } from \"@bitwarden/common/billing/enums\";\nimport { PaymentRequest } from \"@bitwarden/common/billing/models/request/payment.request\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\n\nimport { PaymentComponent } from \"./payment.component\";\nimport { TaxInfoComponent } from \"./tax-info.component\";\n\n@Component({\n selector: \"app-adjust-payment\",\n templateUrl: \"adjust-payment.component.html\",\n})\nexport class AdjustPaymentComponent {\n @ViewChild(PaymentComponent, { static: true }) paymentComponent: PaymentComponent;\n @ViewChild(TaxInfoComponent, { static: true }) taxInfoComponent: TaxInfoComponent;\n\n @Input() currentType?: PaymentMethodType;\n @Input() organizationId: string;\n @Output() onAdjusted = new EventEmitter();\n @Output() onCanceled = new EventEmitter();\n\n paymentMethodType = PaymentMethodType;\n formPromise: Promise;\n\n constructor(\n private apiService: ApiService,\n private i18nService: I18nService,\n private platformUtilsService: PlatformUtilsService,\n private logService: LogService,\n private organizationApiService: OrganizationApiServiceAbstraction,\n private paymentMethodWarningService: PaymentMethodWarningService,\n ) {}\n\n async submit() {\n try {\n const request = new PaymentRequest();\n this.formPromise = this.paymentComponent.createPaymentToken().then((result) => {\n request.paymentToken = result[0];\n request.paymentMethodType = result[1];\n request.postalCode = this.taxInfoComponent.taxInfo.postalCode;\n request.country = this.taxInfoComponent.taxInfo.country;\n if (this.organizationId == null) {\n return this.apiService.postAccountPayment(request);\n } else {\n request.taxId = this.taxInfoComponent.taxInfo.taxId;\n request.state = this.taxInfoComponent.taxInfo.state;\n request.line1 = this.taxInfoComponent.taxInfo.line1;\n request.line2 = this.taxInfoComponent.taxInfo.line2;\n request.city = this.taxInfoComponent.taxInfo.city;\n request.state = this.taxInfoComponent.taxInfo.state;\n return this.organizationApiService.updatePayment(this.organizationId, request);\n }\n });\n await this.formPromise;\n if (this.organizationId) {\n await this.paymentMethodWarningService.removeSubscriptionRisk(this.organizationId);\n }\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"updatedPaymentMethod\"),\n );\n this.onAdjusted.emit();\n } catch (e) {\n this.logService.error(e);\n }\n }\n\n cancel() {\n this.onCanceled.emit();\n }\n\n changeCountry() {\n if (this.taxInfoComponent.taxInfo.country === \"US\") {\n this.paymentComponent.hideBank = !this.organizationId;\n } else {\n this.paymentComponent.hideBank = true;\n if (this.paymentComponent.method === PaymentMethodType.BankAccount) {\n this.paymentComponent.method = PaymentMethodType.Card;\n this.paymentComponent.changeMethod();\n }\n }\n }\n}\n","
\n
\n \n

\n {{ (currentType != null ? \"changePaymentMethod\" : \"addPaymentMethod\") | i18n }}\n

\n \n \n \n \n
\n
\n","export class VerifyBankRequest {\n amount1: number;\n amount2: number;\n}\n","\n \n \n {{ \"refresh\" | i18n }}\n \n\n\n\n
\n \n

{{ \"paymentMethod\" | i18n }}

\n
\n\n \n \n {{ \"loading\" | i18n }}\n \n \n

{{ (isCreditBalance ? \"accountCredit\" : \"accountBalance\") | i18n }}

\n

\n {{ creditOrBalance | currency: \"$\" }}\n

\n

{{ \"creditAppliedDesc\" | i18n }}

\n \n {{ \"addCredit\" | i18n }}\n \n \n \n

{{ \"paymentMethod\" | i18n }}

\n

{{ \"noPaymentMethod\" | i18n }}

\n \n \n

{{ \"verifyBankAccountDesc\" | i18n }} {{ \"verifyBankAccountFailureWarning\" | i18n }}

\n \n \n {{ \"amountX\" | i18n: \"1\" }}\n \n $0.\n \n \n {{ \"amountX\" | i18n: \"2\" }}\n \n $0.\n \n \n \n {{ \"verifyBankAccount\" | i18n }}\n \n \n \n

\n \n {{ paymentSource.description }}\n

\n
\n \n {{ (paymentSource ? \"changePaymentMethod\" : \"addPaymentMethod\") | i18n }}\n \n \n \n

{{ \"paymentChargedWithUnpaidSubscription\" | i18n }}

\n \n

{{ \"taxInformation\" | i18n }}

\n

{{ \"taxInformationDesc\" | i18n }}

\n
\n \n {{ \"loading\" | i18n }}\n
\n \n \n \n \n {{ \"save\" | i18n }}\n \n \n
\n
\n
\n","import { Component, OnInit, ViewChild } from \"@angular/core\";\nimport { FormBuilder, FormControl, Validators } from \"@angular/forms\";\nimport { ActivatedRoute, Router } from \"@angular/router\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { OrganizationApiServiceAbstraction } from \"@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction\";\nimport { PaymentMethodType } from \"@bitwarden/common/billing/enums\";\nimport { BillingPaymentResponse } from \"@bitwarden/common/billing/models/response/billing-payment.response\";\nimport { OrganizationSubscriptionResponse } from \"@bitwarden/common/billing/models/response/organization-subscription.response\";\nimport { SubscriptionResponse } from \"@bitwarden/common/billing/models/response/subscription.response\";\nimport { VerifyBankRequest } from \"@bitwarden/common/models/request/verify-bank.request\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { DialogService } from \"@bitwarden/components\";\n\nimport { TaxInfoComponent } from \"./tax-info.component\";\n\n@Component({\n templateUrl: \"payment-method.component.html\",\n})\n// eslint-disable-next-line rxjs-angular/prefer-takeuntil\nexport class PaymentMethodComponent implements OnInit {\n @ViewChild(TaxInfoComponent) taxInfo: TaxInfoComponent;\n\n loading = false;\n firstLoaded = false;\n showAdjustPayment = false;\n showAddCredit = false;\n billing: BillingPaymentResponse;\n org: OrganizationSubscriptionResponse;\n sub: SubscriptionResponse;\n paymentMethodType = PaymentMethodType;\n organizationId: string;\n isUnpaid = false;\n\n verifyBankPromise: Promise;\n taxFormPromise: Promise;\n\n verifyBankForm = this.formBuilder.group({\n amount1: new FormControl(null, [\n Validators.required,\n Validators.max(99),\n Validators.min(0),\n ]),\n amount2: new FormControl(null, [\n Validators.required,\n Validators.max(99),\n Validators.min(0),\n ]),\n });\n\n constructor(\n protected apiService: ApiService,\n protected organizationApiService: OrganizationApiServiceAbstraction,\n protected i18nService: I18nService,\n protected platformUtilsService: PlatformUtilsService,\n private router: Router,\n private logService: LogService,\n private route: ActivatedRoute,\n private formBuilder: FormBuilder,\n private dialogService: DialogService,\n ) {}\n\n async ngOnInit() {\n // eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe\n this.route.params.subscribe(async (params) => {\n if (params.organizationId) {\n this.organizationId = params.organizationId;\n } else if (this.platformUtilsService.isSelfHost()) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/settings/subscription\"]);\n return;\n }\n\n await this.load();\n this.firstLoaded = true;\n });\n }\n\n async load() {\n if (this.loading) {\n return;\n }\n this.loading = true;\n\n if (this.forOrganization) {\n const billingPromise = this.organizationApiService.getBilling(this.organizationId);\n const organizationSubscriptionPromise = this.organizationApiService.getSubscription(\n this.organizationId,\n );\n\n [this.billing, this.org] = await Promise.all([\n billingPromise,\n organizationSubscriptionPromise,\n ]);\n } else {\n const billingPromise = this.apiService.getUserBillingPayment();\n const subPromise = this.apiService.getUserSubscription();\n\n [this.billing, this.sub] = await Promise.all([billingPromise, subPromise]);\n }\n\n this.isUnpaid = this.subscription?.status === \"unpaid\" ?? false;\n\n this.loading = false;\n }\n\n addCredit() {\n this.showAddCredit = true;\n }\n\n closeAddCredit(load: boolean) {\n this.showAddCredit = false;\n if (load) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.load();\n }\n }\n\n changePayment() {\n this.showAdjustPayment = true;\n }\n\n closePayment(load: boolean) {\n this.showAdjustPayment = false;\n if (load) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.load();\n }\n }\n\n async verifyBank() {\n if (this.loading || !this.forOrganization) {\n return;\n }\n\n try {\n const request = new VerifyBankRequest();\n request.amount1 = this.verifyBankForm.value.amount1;\n request.amount2 = this.verifyBankForm.value.amount2;\n this.verifyBankPromise = this.organizationApiService.verifyBank(this.organizationId, request);\n await this.verifyBankPromise;\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"verifiedBankAccount\"),\n );\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.load();\n } catch (e) {\n this.logService.error(e);\n }\n }\n\n async submitTaxInfo() {\n this.taxFormPromise = this.taxInfo.submitTaxInfo();\n await this.taxFormPromise;\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"taxInfoUpdated\"));\n }\n\n get isCreditBalance() {\n return this.billing == null || this.billing.balance <= 0;\n }\n\n get creditOrBalance() {\n return Math.abs(this.billing != null ? this.billing.balance : 0);\n }\n\n get paymentSource() {\n return this.billing != null ? this.billing.paymentSource : null;\n }\n\n get forOrganization() {\n return this.organizationId != null;\n }\n\n get headerClass() {\n return this.forOrganization ? [\"page-header\"] : [\"tabbed-header\"];\n }\n\n get paymentSourceClasses() {\n if (this.paymentSource == null) {\n return [];\n }\n switch (this.paymentSource.type) {\n case PaymentMethodType.Card:\n return [\"bwi-credit-card\"];\n case PaymentMethodType.BankAccount:\n return [\"bwi-bank\"];\n case PaymentMethodType.Check:\n return [\"bwi-money\"];\n case PaymentMethodType.PayPal:\n return [\"bwi-paypal text-primary\"];\n default:\n return [];\n }\n }\n\n get subscription() {\n return this.sub?.subscription ?? this.org?.subscription ?? null;\n }\n}\n","import { NgModule } from \"@angular/core\";\n\nimport { HeaderModule } from \"../../layouts/header/header.module\";\nimport { SharedModule } from \"../../shared\";\n\nimport { AddCreditComponent } from \"./add-credit.component\";\nimport { AdjustPaymentComponent } from \"./adjust-payment.component\";\nimport { AdjustStorageComponent } from \"./adjust-storage.component\";\nimport { BillingHistoryComponent } from \"./billing-history.component\";\nimport { OffboardingSurveyComponent } from \"./offboarding-survey.component\";\nimport { PaymentMethodComponent } from \"./payment-method.component\";\nimport { PaymentComponent } from \"./payment.component\";\nimport { SecretsManagerSubscribeComponent } from \"./sm-subscribe.component\";\nimport { TaxInfoComponent } from \"./tax-info.component\";\nimport { UpdateLicenseComponent } from \"./update-license.component\";\n\n@NgModule({\n imports: [SharedModule, PaymentComponent, TaxInfoComponent, HeaderModule],\n declarations: [\n AddCreditComponent,\n AdjustPaymentComponent,\n AdjustStorageComponent,\n BillingHistoryComponent,\n PaymentMethodComponent,\n SecretsManagerSubscribeComponent,\n UpdateLicenseComponent,\n OffboardingSurveyComponent,\n ],\n exports: [\n SharedModule,\n PaymentComponent,\n TaxInfoComponent,\n AdjustStorageComponent,\n BillingHistoryComponent,\n SecretsManagerSubscribeComponent,\n UpdateLicenseComponent,\n OffboardingSurveyComponent,\n ],\n})\nexport class BillingSharedModule {}\n","import { NgModule } from \"@angular/core\";\n\nimport { BannerModule } from \"@bitwarden/components\";\n\nimport { SharedModule } from \"../../../shared\";\n\nimport { PaymentMethodWarningsComponent } from \"./payment-method-warnings.component\";\n\n@NgModule({\n imports: [BannerModule, SharedModule],\n declarations: [PaymentMethodWarningsComponent],\n exports: [PaymentMethodWarningsComponent],\n})\nexport class PaymentMethodWarningsModule {}\n","\n \n {{ \"maintainYourSubscription\" | i18n: warning.organizationName }}\n {{ \"addAPaymentMethod\" | i18n }}.\n \n\n","import { Component } from \"@angular/core\";\nimport { map, Observable } from \"rxjs\";\n\nimport { PaymentMethodWarningsServiceAbstraction as PaymentMethodWarningService } from \"@bitwarden/common/billing/abstractions/payment-method-warnings-service.abstraction\";\n\ntype Warning = {\n organizationId: string;\n organizationName: string;\n};\n\n@Component({\n selector: \"app-payment-method-warnings\",\n templateUrl: \"payment-method-warnings.component.html\",\n})\nexport class PaymentMethodWarningsComponent {\n constructor(private paymentMethodWarningService: PaymentMethodWarningService) {}\n\n protected warnings$: Observable =\n this.paymentMethodWarningService.paymentMethodWarnings$.pipe(\n map((warnings) =>\n Object.entries(warnings ?? [])\n .filter(([_, warning]) => warning.risksSubscriptionFailure && !warning.acknowledged)\n .map(([organizationId, { organizationName }]) => ({\n organizationId,\n organizationName,\n })),\n ),\n );\n\n protected async closeWarning(organizationId: string): Promise {\n await this.paymentMethodWarningService.acknowledge(organizationId);\n }\n}\n","
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n\n
\n
\n \n
\n
\n
\n \n
\n
\n \n
\n
\n
\n
\n \n \n \n \n
\n
\n
\n
\n
\n\n \n {{ \"verifyBankAccountInitialDesc\" | i18n }} {{ \"verifyBankAccountFailureWarning\" | i18n }}\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n \n \n \n \n
\n
\n
\n\n
\n
\n {{ \"paypalClickSubmit\" | i18n }}\n
\n
\n\n \n {{ \"makeSureEnoughCredit\" | i18n }}\n \n\n","import { Component, Input, OnDestroy, OnInit } from \"@angular/core\";\nimport { Subject, takeUntil } from \"rxjs\";\n\nimport { AbstractThemingService } from \"@bitwarden/angular/platform/services/theming/theming.service.abstraction\";\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { PaymentMethodType } from \"@bitwarden/common/billing/enums\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\n\nimport { SharedModule } from \"../../shared\";\n\n@Component({\n selector: \"app-payment\",\n templateUrl: \"payment.component.html\",\n standalone: true,\n imports: [SharedModule],\n})\nexport class PaymentComponent implements OnInit, OnDestroy {\n @Input() showMethods = true;\n @Input() showOptions = true;\n @Input() method = PaymentMethodType.Card;\n @Input() hideBank = false;\n @Input() hidePaypal = false;\n @Input() hideCredit = false;\n @Input() trialFlow = false;\n\n private destroy$ = new Subject();\n\n bank: any = {\n routing_number: null,\n account_number: null,\n account_holder_name: null,\n account_holder_type: \"\",\n currency: \"USD\",\n country: \"US\",\n };\n\n paymentMethodType = PaymentMethodType;\n\n private btScript: HTMLScriptElement;\n private btInstance: any = null;\n private stripeScript: HTMLScriptElement;\n private stripe: any = null;\n private stripeElements: any = null;\n private stripeCardNumberElement: any = null;\n private stripeCardExpiryElement: any = null;\n private stripeCardCvcElement: any = null;\n private StripeElementStyle: any;\n private StripeElementClasses: any;\n\n constructor(\n private apiService: ApiService,\n private logService: LogService,\n private themingService: AbstractThemingService,\n ) {\n this.stripeScript = window.document.createElement(\"script\");\n this.stripeScript.src = \"https://js.stripe.com/v3/?advancedFraudSignals=false\";\n this.stripeScript.async = true;\n this.stripeScript.onload = () => {\n this.stripe = (window as any).Stripe(process.env.STRIPE_KEY);\n this.stripeElements = this.stripe.elements();\n this.setStripeElement();\n };\n this.btScript = window.document.createElement(\"script\");\n this.btScript.src = `scripts/dropin.js?cache=${process.env.CACHE_TAG}`;\n this.btScript.async = true;\n this.StripeElementStyle = {\n base: {\n color: null,\n fontFamily:\n '\"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif, ' +\n '\"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"',\n fontSize: \"14px\",\n fontSmoothing: \"antialiased\",\n \"::placeholder\": {\n color: null,\n },\n },\n invalid: {\n color: null,\n },\n };\n this.StripeElementClasses = {\n focus: \"is-focused\",\n empty: \"is-empty\",\n invalid: \"is-invalid\",\n };\n }\n\n async ngOnInit() {\n if (!this.showOptions) {\n this.hidePaypal = this.method !== PaymentMethodType.PayPal;\n this.hideBank = this.method !== PaymentMethodType.BankAccount;\n this.hideCredit = this.method !== PaymentMethodType.Credit;\n }\n this.subscribeToTheme();\n window.document.head.appendChild(this.stripeScript);\n if (!this.hidePaypal) {\n window.document.head.appendChild(this.btScript);\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n window.document.head.removeChild(this.stripeScript);\n window.setTimeout(() => {\n Array.from(window.document.querySelectorAll(\"iframe\")).forEach((el) => {\n if (el.src != null && el.src.indexOf(\"stripe\") > -1) {\n try {\n window.document.body.removeChild(el);\n } catch (e) {\n this.logService.error(e);\n }\n }\n });\n }, 500);\n if (!this.hidePaypal) {\n window.document.head.removeChild(this.btScript);\n window.setTimeout(() => {\n Array.from(window.document.head.querySelectorAll(\"script\")).forEach((el) => {\n if (el.src != null && el.src.indexOf(\"paypal\") > -1) {\n try {\n window.document.head.removeChild(el);\n } catch (e) {\n this.logService.error(e);\n }\n }\n });\n const btStylesheet = window.document.head.querySelector(\"#braintree-dropin-stylesheet\");\n if (btStylesheet != null) {\n try {\n window.document.head.removeChild(btStylesheet);\n } catch (e) {\n this.logService.error(e);\n }\n }\n }, 500);\n }\n }\n\n changeMethod() {\n this.btInstance = null;\n\n if (this.method === PaymentMethodType.PayPal) {\n window.setTimeout(() => {\n (window as any).braintree.dropin.create(\n {\n authorization: process.env.BRAINTREE_KEY,\n container: \"#bt-dropin-container\",\n paymentOptionPriority: [\"paypal\"],\n paypal: {\n flow: \"vault\",\n buttonStyle: {\n label: \"pay\",\n size: \"medium\",\n shape: \"pill\",\n color: \"blue\",\n tagline: \"false\",\n },\n },\n },\n (createErr: any, instance: any) => {\n if (createErr != null) {\n // eslint-disable-next-line\n console.error(createErr);\n return;\n }\n this.btInstance = instance;\n },\n );\n }, 250);\n } else {\n this.setStripeElement();\n }\n }\n\n createPaymentToken(): Promise<[string, PaymentMethodType]> {\n return new Promise((resolve, reject) => {\n if (this.method === PaymentMethodType.Credit) {\n resolve([null, this.method]);\n } else if (this.method === PaymentMethodType.PayPal) {\n this.btInstance\n .requestPaymentMethod()\n .then((payload: any) => {\n resolve([payload.nonce, this.method]);\n })\n .catch((err: any) => {\n reject(err.message);\n });\n } else if (\n this.method === PaymentMethodType.Card ||\n this.method === PaymentMethodType.BankAccount\n ) {\n if (this.method === PaymentMethodType.Card) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.apiService\n .postSetupPayment()\n .then((clientSecret) =>\n this.stripe.handleCardSetup(clientSecret, this.stripeCardNumberElement),\n )\n .then((result: any) => {\n if (result.error) {\n reject(result.error.message);\n } else if (result.setupIntent && result.setupIntent.status === \"succeeded\") {\n resolve([result.setupIntent.payment_method, this.method]);\n } else {\n reject();\n }\n });\n } else {\n this.stripe.createToken(\"bank_account\", this.bank).then((result: any) => {\n if (result.error) {\n reject(result.error.message);\n } else if (result.token && result.token.id != null) {\n resolve([result.token.id, this.method]);\n } else {\n reject();\n }\n });\n }\n }\n });\n }\n\n handleStripeCardPayment(clientSecret: string, successCallback: () => Promise): Promise {\n return new Promise((resolve, reject) => {\n if (this.showMethods && this.stripeCardNumberElement == null) {\n reject();\n return;\n }\n const handleCardPayment = () =>\n this.showMethods\n ? this.stripe.handleCardSetup(clientSecret, this.stripeCardNumberElement)\n : this.stripe.handleCardSetup(clientSecret);\n return handleCardPayment().then(async (result: any) => {\n if (result.error) {\n reject(result.error.message);\n } else if (result.paymentIntent && result.paymentIntent.status === \"succeeded\") {\n if (successCallback != null) {\n await successCallback();\n }\n resolve();\n } else {\n reject();\n }\n });\n });\n }\n\n private setStripeElement() {\n window.setTimeout(() => {\n if (this.showMethods && this.method === PaymentMethodType.Card) {\n if (this.stripeCardNumberElement == null) {\n this.stripeCardNumberElement = this.stripeElements.create(\"cardNumber\", {\n style: this.StripeElementStyle,\n classes: this.StripeElementClasses,\n placeholder: \"\",\n });\n }\n if (this.stripeCardExpiryElement == null) {\n this.stripeCardExpiryElement = this.stripeElements.create(\"cardExpiry\", {\n style: this.StripeElementStyle,\n classes: this.StripeElementClasses,\n });\n }\n if (this.stripeCardCvcElement == null) {\n this.stripeCardCvcElement = this.stripeElements.create(\"cardCvc\", {\n style: this.StripeElementStyle,\n classes: this.StripeElementClasses,\n placeholder: \"\",\n });\n }\n this.stripeCardNumberElement.mount(\"#stripe-card-number-element\");\n this.stripeCardExpiryElement.mount(\"#stripe-card-expiry-element\");\n this.stripeCardCvcElement.mount(\"#stripe-card-cvc-element\");\n }\n }, 50);\n }\n\n private subscribeToTheme() {\n this.themingService.theme$.pipe(takeUntil(this.destroy$)).subscribe(() => {\n const style = getComputedStyle(document.documentElement);\n this.StripeElementStyle.base.color = `rgb(${style.getPropertyValue(\"--color-text-main\")})`;\n this.StripeElementStyle.base[\"::placeholder\"].color = `rgb(${style.getPropertyValue(\n \"--color-text-muted\",\n )})`;\n this.StripeElementStyle.invalid.color = `rgb(${style.getPropertyValue(\"--color-text-main\")})`;\n this.StripeElementStyle.invalid.borderColor = `rgb(${style.getPropertyValue(\n \"--color-danger-500\",\n )})`;\n });\n }\n}\n","
\n

{{ \"moreFromBitwarden\" | i18n }}

\n
\n
\n \n
\n
\n \n

{{ \"secretsManagerForPlan\" | i18n: planName }}

\n
\n {{ \"secretsManagerForPlanDesc\" | i18n }}\n
    \n
  • {{ \"limitedUsers\" | i18n: maxUsers }}
  • \n
  • {{ \"unlimitedSecrets\" | i18n }}
  • \n
  • \n {{ \"projectsIncluded\" | i18n: maxProjects }}\n
  • \n \n
  • {{ \"unlimitedProjects\" | i18n }}
  • \n
    \n
  • {{ \"serviceAccountsIncluded\" | i18n: serviceAccountsIncluded }}
  • \n
  • \n {{\n \"additionalServiceAccountCost\" | i18n: (monthlyCostPerServiceAccount | currency: \"$\")\n }}\n
  • \n
\n
\n\n
\n \n {{ \"costPerUser\" | i18n: (monthlyCostPerUser | currency: \"$\") }} /{{ \"month\" | i18n }}\n \n \n {{ \"freeForever\" | i18n }}\n \n
\n\n \n \n {{ \"subscribeToSecretsManager\" | i18n }}\n {{ \"addSecretsManagerUpgradeDesc\" | i18n }}\n \n\n \n
\n \n {{ \"userSeats\" | i18n }}\n \n {{ \"userSeatsHowManyDesc\" | i18n }}\n \n
\n
\n \n {{ \"additionalServiceAccounts\" | i18n }}\n \n \n {{ \"includedServiceAccounts\" | i18n: serviceAccountsIncluded }}\n {{\n \"addAdditionalServiceAccounts\" | i18n: (monthlyCostPerServiceAccount | currency: \"$\")\n }}\n \n \n
\n\n \n
\n
\n\n","import { Component, Input, OnDestroy, OnInit } from \"@angular/core\";\nimport { FormBuilder, FormGroup, Validators } from \"@angular/forms\";\nimport { Subject, startWith, takeUntil } from \"rxjs\";\n\nimport { ControlsOf } from \"@bitwarden/angular/types/controls-of\";\nimport { BillingCustomerDiscount } from \"@bitwarden/common/billing/models/response/organization-subscription.response\";\nimport { PlanResponse } from \"@bitwarden/common/billing/models/response/plan.response\";\nimport { ProductType } from \"@bitwarden/common/enums\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\n\nimport { SecretsManagerLogo } from \"../../layouts/secrets-manager-logo\";\n\nexport interface SecretsManagerSubscription {\n enabled: boolean;\n userSeats: number;\n additionalServiceAccounts: number;\n}\n\nexport const secretsManagerSubscribeFormFactory = (\n formBuilder: FormBuilder,\n): FormGroup> =>\n formBuilder.group({\n enabled: [false],\n userSeats: [1, [Validators.required, Validators.min(1), Validators.max(100000)]],\n additionalServiceAccounts: [\n 0,\n [Validators.required, Validators.min(0), Validators.max(100000)],\n ],\n });\n\n@Component({\n selector: \"sm-subscribe\",\n templateUrl: \"sm-subscribe.component.html\",\n})\nexport class SecretsManagerSubscribeComponent implements OnInit, OnDestroy {\n @Input() formGroup: FormGroup>;\n @Input() upgradeOrganization: boolean;\n @Input() showSubmitButton = false;\n @Input() selectedPlan: PlanResponse;\n @Input() customerDiscount: BillingCustomerDiscount;\n\n logo = SecretsManagerLogo;\n productTypes = ProductType;\n\n private destroy$ = new Subject();\n\n constructor(private i18nService: I18nService) {}\n\n ngOnInit() {\n this.formGroup.controls.enabled.valueChanges\n .pipe(startWith(this.formGroup.value.enabled), takeUntil(this.destroy$))\n .subscribe((enabled) => {\n if (enabled) {\n this.formGroup.controls.userSeats.enable();\n this.formGroup.controls.additionalServiceAccounts.enable();\n } else {\n this.formGroup.controls.userSeats.disable();\n this.formGroup.controls.additionalServiceAccounts.disable();\n }\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n discountPrice = (price: number) => {\n const discount =\n !!this.customerDiscount && this.customerDiscount.active\n ? price * (this.customerDiscount.percentOff / 100)\n : 0;\n\n return price - discount;\n };\n\n get product() {\n return this.selectedPlan.product;\n }\n\n get planName() {\n switch (this.product) {\n case ProductType.Free:\n return this.i18nService.t(\"free2PersonOrganization\");\n case ProductType.Teams:\n case ProductType.TeamsStarter:\n return this.i18nService.t(\"planNameTeams\");\n case ProductType.Enterprise:\n return this.i18nService.t(\"planNameEnterprise\");\n }\n }\n\n get serviceAccountsIncluded() {\n return this.selectedPlan.SecretsManager.baseServiceAccount;\n }\n\n get monthlyCostPerServiceAccount() {\n return this.selectedPlan.isAnnual\n ? this.discountPrice(this.selectedPlan.SecretsManager.additionalPricePerServiceAccount) / 12\n : this.discountPrice(this.selectedPlan.SecretsManager.additionalPricePerServiceAccount);\n }\n\n get maxUsers() {\n return this.selectedPlan.SecretsManager.maxSeats;\n }\n\n get maxProjects() {\n return this.selectedPlan.SecretsManager.maxProjects;\n }\n\n get monthlyCostPerUser() {\n return this.selectedPlan.isAnnual\n ? this.discountPrice(this.selectedPlan.SecretsManager.seatPrice) / 12\n : this.discountPrice(this.selectedPlan.SecretsManager.seatPrice);\n }\n}\n","
\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
\n
\n \n \n
\n
\n \n
\n \n \n
\n
\n\n\n
\n
\n \n \n
\n
\n\n\n
\n
\n \n \n
\n
\n
\n
\n \n \n
\n
\n
\n
\n \n \n
\n
\n
\n
\n \n \n
\n
\n\n","import { Component, EventEmitter, Input, Output } from \"@angular/core\";\nimport { ActivatedRoute } from \"@angular/router\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { OrganizationApiServiceAbstraction } from \"@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction\";\nimport { OrganizationTaxInfoUpdateRequest } from \"@bitwarden/common/billing/models/request/organization-tax-info-update.request\";\nimport { TaxInfoUpdateRequest } from \"@bitwarden/common/billing/models/request/tax-info-update.request\";\nimport { TaxInfoResponse } from \"@bitwarden/common/billing/models/response/tax-info.response\";\nimport { TaxRateResponse } from \"@bitwarden/common/billing/models/response/tax-rate.response\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\n\nimport { SharedModule } from \"../../shared\";\n\ntype TaxInfoView = Omit & {\n includeTaxId: boolean;\n [key: string]: unknown;\n};\n\n@Component({\n selector: \"app-tax-info\",\n templateUrl: \"tax-info.component.html\",\n standalone: true,\n imports: [SharedModule],\n})\n// eslint-disable-next-line rxjs-angular/prefer-takeuntil\nexport class TaxInfoComponent {\n @Input() trialFlow = false;\n @Output() onCountryChanged = new EventEmitter();\n\n loading = true;\n organizationId: string;\n taxInfo: TaxInfoView = {\n taxId: null,\n line1: null,\n line2: null,\n city: null,\n state: null,\n postalCode: null,\n country: \"US\",\n includeTaxId: false,\n };\n\n taxRates: TaxRateResponse[];\n\n private pristine: TaxInfoView = {\n taxId: null,\n line1: null,\n line2: null,\n city: null,\n state: null,\n postalCode: null,\n country: \"US\",\n includeTaxId: false,\n };\n\n constructor(\n private apiService: ApiService,\n private route: ActivatedRoute,\n private logService: LogService,\n private organizationApiService: OrganizationApiServiceAbstraction,\n ) {}\n\n async ngOnInit() {\n // eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe\n this.route.parent.parent.params.subscribe(async (params) => {\n this.organizationId = params.organizationId;\n if (this.organizationId) {\n try {\n const taxInfo = await this.organizationApiService.getTaxInfo(this.organizationId);\n if (taxInfo) {\n this.taxInfo.taxId = taxInfo.taxId;\n this.taxInfo.state = taxInfo.state;\n this.taxInfo.line1 = taxInfo.line1;\n this.taxInfo.line2 = taxInfo.line2;\n this.taxInfo.city = taxInfo.city;\n this.taxInfo.state = taxInfo.state;\n this.taxInfo.postalCode = taxInfo.postalCode;\n this.taxInfo.country = taxInfo.country || \"US\";\n this.taxInfo.includeTaxId =\n this.countrySupportsTax(this.taxInfo.country) &&\n (!!taxInfo.taxId ||\n !!taxInfo.line1 ||\n !!taxInfo.line2 ||\n !!taxInfo.city ||\n !!taxInfo.state);\n }\n } catch (e) {\n this.logService.error(e);\n }\n } else {\n try {\n const taxInfo = await this.apiService.getTaxInfo();\n if (taxInfo) {\n this.taxInfo.postalCode = taxInfo.postalCode;\n this.taxInfo.country = taxInfo.country || \"US\";\n }\n } catch (e) {\n this.logService.error(e);\n }\n }\n this.pristine = Object.assign({}, this.taxInfo);\n // If not the default (US) then trigger onCountryChanged\n if (this.taxInfo.country !== \"US\") {\n this.onCountryChanged.emit();\n }\n });\n\n try {\n const taxRates = await this.apiService.getTaxRates();\n if (taxRates) {\n this.taxRates = taxRates.data;\n }\n } catch (e) {\n this.logService.error(e);\n } finally {\n this.loading = false;\n }\n }\n\n get taxRate() {\n if (this.taxRates != null) {\n const localTaxRate = this.taxRates.find(\n (x) => x.country === this.taxInfo.country && x.postalCode === this.taxInfo.postalCode,\n );\n return localTaxRate?.rate ?? null;\n }\n }\n\n getTaxInfoRequest(): TaxInfoUpdateRequest {\n if (this.organizationId) {\n const request = new OrganizationTaxInfoUpdateRequest();\n request.country = this.taxInfo.country;\n request.postalCode = this.taxInfo.postalCode;\n\n if (this.taxInfo.includeTaxId) {\n request.taxId = this.taxInfo.taxId;\n request.line1 = this.taxInfo.line1;\n request.line2 = this.taxInfo.line2;\n request.city = this.taxInfo.city;\n request.state = this.taxInfo.state;\n } else {\n request.taxId = null;\n request.line1 = null;\n request.line2 = null;\n request.city = null;\n request.state = null;\n }\n return request;\n } else {\n const request = new TaxInfoUpdateRequest();\n request.postalCode = this.taxInfo.postalCode;\n request.country = this.taxInfo.country;\n return request;\n }\n }\n\n submitTaxInfo(): Promise {\n if (!this.hasChanged()) {\n return new Promise((resolve) => {\n resolve();\n });\n }\n const request = this.getTaxInfoRequest();\n return this.organizationId\n ? this.organizationApiService.updateTaxInfo(\n this.organizationId,\n request as OrganizationTaxInfoUpdateRequest,\n )\n : this.apiService.putTaxInfo(request);\n }\n\n changeCountry() {\n if (!this.countrySupportsTax(this.taxInfo.country)) {\n this.taxInfo.includeTaxId = false;\n this.taxInfo.taxId = null;\n this.taxInfo.line1 = null;\n this.taxInfo.line2 = null;\n this.taxInfo.city = null;\n this.taxInfo.state = null;\n }\n this.onCountryChanged.emit();\n }\n\n countrySupportsTax(countryCode: string) {\n return this.taxSupportedCountryCodes.includes(countryCode);\n }\n\n private hasChanged(): boolean {\n for (const key in this.taxInfo) {\n // eslint-disable-next-line\n if (this.pristine.hasOwnProperty(key) && this.pristine[key] !== this.taxInfo[key]) {\n return true;\n }\n }\n return false;\n }\n\n private taxSupportedCountryCodes: string[] = [\n \"CN\",\n \"FR\",\n \"DE\",\n \"CA\",\n \"GB\",\n \"AU\",\n \"IN\",\n \"AD\",\n \"AR\",\n \"AT\",\n \"BE\",\n \"BO\",\n \"BR\",\n \"BG\",\n \"CL\",\n \"CO\",\n \"CR\",\n \"HR\",\n \"CY\",\n \"CZ\",\n \"DK\",\n \"DO\",\n \"EC\",\n \"EG\",\n \"SV\",\n \"EE\",\n \"FI\",\n \"GE\",\n \"GR\",\n \"HK\",\n \"HU\",\n \"IS\",\n \"ID\",\n \"IQ\",\n \"IE\",\n \"IL\",\n \"IT\",\n \"JP\",\n \"KE\",\n \"KR\",\n \"LV\",\n \"LI\",\n \"LT\",\n \"LU\",\n \"MY\",\n \"MT\",\n \"MX\",\n \"NL\",\n \"NZ\",\n \"NO\",\n \"PE\",\n \"PH\",\n \"PL\",\n \"PT\",\n \"RO\",\n \"RU\",\n \"SA\",\n \"RS\",\n \"SG\",\n \"SK\",\n \"SI\",\n \"ZA\",\n \"ES\",\n \"SE\",\n \"CH\",\n \"TW\",\n \"TH\",\n \"TR\",\n \"UA\",\n \"AE\",\n \"UY\",\n \"VE\",\n \"VN\",\n ];\n}\n","import { Directive, OnInit } from \"@angular/core\";\nimport { ActivatedRoute, Params, Router } from \"@angular/router\";\nimport { Subject } from \"rxjs\";\nimport { first, switchMap, takeUntil } from \"rxjs/operators\";\n\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\n\n@Directive()\nexport abstract class BaseAcceptComponent implements OnInit {\n loading = true;\n authed = false;\n email: string;\n actionPromise: Promise;\n\n protected requiredParameters: string[] = [];\n protected failedShortMessage = \"inviteAcceptFailedShort\";\n protected failedMessage = \"inviteAcceptFailed\";\n\n private destroy$ = new Subject();\n\n constructor(\n protected router: Router,\n protected platformUtilService: PlatformUtilsService,\n protected i18nService: I18nService,\n protected route: ActivatedRoute,\n protected stateService: StateService,\n ) {}\n\n abstract authedHandler(qParams: Params): Promise;\n abstract unauthedHandler(qParams: Params): Promise;\n\n ngOnInit() {\n this.route.queryParams\n .pipe(\n first(),\n switchMap(async (qParams) => {\n let error = this.requiredParameters.some(\n (e) => qParams?.[e] == null || qParams[e] === \"\",\n );\n let errorMessage: string = null;\n if (!error) {\n this.authed = await this.stateService.getIsAuthenticated();\n this.email = qParams.email;\n\n if (this.authed) {\n try {\n await this.authedHandler(qParams);\n } catch (e) {\n error = true;\n errorMessage = e.message;\n }\n } else {\n await this.unauthedHandler(qParams);\n }\n }\n\n if (error) {\n const message =\n errorMessage != null\n ? this.i18nService.t(this.failedShortMessage, errorMessage)\n : this.i18nService.t(this.failedMessage);\n this.platformUtilService.showToast(\"error\", null, message, { timeout: 10000 });\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/\"]);\n }\n\n this.loading = false;\n }),\n takeUntil(this.destroy$),\n )\n .subscribe();\n }\n}\n","import { Component, Input, OnDestroy } from \"@angular/core\";\nimport { Subject } from \"rxjs\";\n\nimport { AvatarService } from \"@bitwarden/common/auth/abstractions/avatar.service\";\n\nimport { SharedModule } from \"../shared\";\n\ntype SizeTypes = \"xlarge\" | \"large\" | \"default\" | \"small\" | \"xsmall\";\n@Component({\n selector: \"dynamic-avatar\",\n standalone: true,\n imports: [SharedModule],\n template: `\n \n \n `,\n})\nexport class DynamicAvatarComponent implements OnDestroy {\n @Input() border = false;\n @Input() id: string;\n @Input() text: string;\n @Input() title: string;\n @Input() size: SizeTypes = \"default\";\n private destroy$ = new Subject();\n\n color$ = this.avatarService.avatarColor$;\n\n constructor(private avatarService: AvatarService) {\n if (this.text) {\n this.text = this.text.toUpperCase();\n }\n }\n\n async ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n}\n","
\n \n \n \n {{ region.domain }}\n \n \n
\n {{ \"server\" | i18n }}:\n \n {{ currentRegion?.domain }}\n \n
\n
\n","import { Component, OnInit } from \"@angular/core\";\nimport { Router } from \"@angular/router\";\n\nimport {\n EnvironmentService,\n RegionConfig,\n} from \"@bitwarden/common/platform/abstractions/environment.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\n\n@Component({\n selector: \"environment-selector\",\n templateUrl: \"environment-selector.component.html\",\n})\nexport class EnvironmentSelectorComponent implements OnInit {\n constructor(\n private platformUtilsService: PlatformUtilsService,\n private environmentService: EnvironmentService,\n private router: Router,\n ) {}\n\n protected availableRegions = this.environmentService.availableRegions();\n protected currentRegion?: RegionConfig;\n\n protected showRegionSelector = false;\n protected routeAndParams: string;\n\n async ngOnInit() {\n this.showRegionSelector = !this.platformUtilsService.isSelfHost();\n this.routeAndParams = `/#${this.router.url}`;\n\n const host = Utils.getHost(window.location.href);\n this.currentRegion = this.availableRegions.find((r) => Utils.getHost(r.urls.webVault) === host);\n }\n}\n","import { NgModule } from \"@angular/core\";\n\nimport { SharedModule } from \"../../../app/shared\";\n\nimport { EnvironmentSelectorComponent } from \"./environment-selector.component\";\n\n@NgModule({\n imports: [SharedModule],\n declarations: [EnvironmentSelectorComponent],\n exports: [EnvironmentSelectorComponent],\n})\nexport class EnvironmentSelectorModule {}\n","import { BaseResponse } from \"../../../models/response/base.response\";\n\nexport class ApiKeyResponse extends BaseResponse {\n apiKey: string;\n revisionDate: Date;\n\n constructor(response: any) {\n super(response);\n this.apiKey = this.getResponseProperty(\"ApiKey\");\n this.revisionDate = new Date(this.getResponseProperty(\"RevisionDate\"));\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\nimport { SsoConfigApi } from \"../api/sso-config.api\";\n\nexport class OrganizationSsoResponse extends BaseResponse {\n enabled: boolean;\n identifier: string;\n data: SsoConfigApi;\n urls: SsoUrls;\n\n constructor(response: any) {\n super(response);\n this.enabled = this.getResponseProperty(\"Enabled\");\n this.identifier = this.getResponseProperty(\"Identifier\");\n this.data =\n this.getResponseProperty(\"Data\") != null\n ? new SsoConfigApi(this.getResponseProperty(\"Data\"))\n : null;\n this.urls = new SsoUrls(this.getResponseProperty(\"Urls\"));\n }\n}\n\nclass SsoUrls extends BaseResponse {\n callbackPath: string;\n signedOutCallbackPath: string;\n spEntityId: string;\n spEntityIdStatic: string;\n spMetadataUrl: string;\n spAcsUrl: string;\n\n constructor(response: any) {\n super(response);\n this.callbackPath = this.getResponseProperty(\"CallbackPath\");\n this.signedOutCallbackPath = this.getResponseProperty(\"SignedOutCallbackPath\");\n this.spEntityId = this.getResponseProperty(\"SpEntityId\");\n this.spEntityIdStatic = this.getResponseProperty(\"SpEntityIdStatic\");\n this.spMetadataUrl = this.getResponseProperty(\"SpMetadataUrl\");\n this.spAcsUrl = this.getResponseProperty(\"SpAcsUrl\");\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\nimport { PaymentMethodType, TransactionType } from \"../../enums\";\n\nexport class BillingResponse extends BaseResponse {\n balance: number;\n paymentSource: BillingSourceResponse;\n invoices: BillingInvoiceResponse[] = [];\n transactions: BillingTransactionResponse[] = [];\n\n constructor(response: any) {\n super(response);\n this.balance = this.getResponseProperty(\"Balance\");\n const paymentSource = this.getResponseProperty(\"PaymentSource\");\n const transactions = this.getResponseProperty(\"Transactions\");\n const invoices = this.getResponseProperty(\"Invoices\");\n this.paymentSource = paymentSource == null ? null : new BillingSourceResponse(paymentSource);\n if (transactions != null) {\n this.transactions = transactions.map((t: any) => new BillingTransactionResponse(t));\n }\n if (invoices != null) {\n this.invoices = invoices.map((i: any) => new BillingInvoiceResponse(i));\n }\n }\n\n get hasNoHistory() {\n return this.invoices.length == 0 && this.transactions.length == 0;\n }\n}\n\nexport class BillingSourceResponse extends BaseResponse {\n type: PaymentMethodType;\n cardBrand: string;\n description: string;\n needsVerification: boolean;\n\n constructor(response: any) {\n super(response);\n this.type = this.getResponseProperty(\"Type\");\n this.cardBrand = this.getResponseProperty(\"CardBrand\");\n this.description = this.getResponseProperty(\"Description\");\n this.needsVerification = this.getResponseProperty(\"NeedsVerification\");\n }\n}\n\nexport class BillingInvoiceResponse extends BaseResponse {\n url: string;\n pdfUrl: string;\n number: string;\n paid: boolean;\n date: string;\n amount: number;\n\n constructor(response: any) {\n super(response);\n this.url = this.getResponseProperty(\"Url\");\n this.pdfUrl = this.getResponseProperty(\"PdfUrl\");\n this.number = this.getResponseProperty(\"Number\");\n this.paid = this.getResponseProperty(\"Paid\");\n this.date = this.getResponseProperty(\"Date\");\n this.amount = this.getResponseProperty(\"Amount\");\n }\n}\n\nexport class BillingTransactionResponse extends BaseResponse {\n createdDate: string;\n amount: number;\n refunded: boolean;\n partiallyRefunded: boolean;\n refundedAmount: number;\n type: TransactionType;\n paymentMethodType: PaymentMethodType;\n details: string;\n\n constructor(response: any) {\n super(response);\n this.createdDate = this.getResponseProperty(\"CreatedDate\");\n this.amount = this.getResponseProperty(\"Amount\");\n this.refunded = this.getResponseProperty(\"Refunded\");\n this.partiallyRefunded = this.getResponseProperty(\"PartiallyRefunded\");\n this.refundedAmount = this.getResponseProperty(\"RefundedAmount\");\n this.type = this.getResponseProperty(\"Type\");\n this.paymentMethodType = this.getResponseProperty(\"PaymentMethodType\");\n this.details = this.getResponseProperty(\"Details\");\n }\n}\n","import { ProductType } from \"../../../enums\";\nimport { BaseResponse } from \"../../../models/response/base.response\";\nimport { PlanType } from \"../../enums\";\n\nexport class PlanResponse extends BaseResponse {\n type: PlanType;\n product: ProductType;\n name: string;\n isAnnual: boolean;\n nameLocalizationKey: string;\n descriptionLocalizationKey: string;\n canBeUsedByBusiness: boolean;\n trialPeriodDays: number;\n hasSelfHost: boolean;\n hasPolicies: boolean;\n hasGroups: boolean;\n hasDirectory: boolean;\n hasEvents: boolean;\n hasTotp: boolean;\n has2fa: boolean;\n hasApi: boolean;\n hasSso: boolean;\n hasResetPassword: boolean;\n usersGetPremium: boolean;\n upgradeSortOrder: number;\n displaySortOrder: number;\n legacyYear: number;\n disabled: boolean;\n PasswordManager: PasswordManagerPlanFeaturesResponse;\n SecretsManager: SecretsManagerPlanFeaturesResponse;\n\n constructor(response: any) {\n super(response);\n this.type = this.getResponseProperty(\"Type\");\n this.product = this.getResponseProperty(\"Product\");\n this.name = this.getResponseProperty(\"Name\");\n this.isAnnual = this.getResponseProperty(\"IsAnnual\");\n this.nameLocalizationKey = this.getResponseProperty(\"NameLocalizationKey\");\n this.descriptionLocalizationKey = this.getResponseProperty(\"DescriptionLocalizationKey\");\n this.canBeUsedByBusiness = this.getResponseProperty(\"CanBeUsedByBusiness\");\n this.trialPeriodDays = this.getResponseProperty(\"TrialPeriodDays\");\n this.hasSelfHost = this.getResponseProperty(\"HasSelfHost\");\n this.hasPolicies = this.getResponseProperty(\"HasPolicies\");\n this.hasGroups = this.getResponseProperty(\"HasGroups\");\n this.hasDirectory = this.getResponseProperty(\"HasDirectory\");\n this.hasEvents = this.getResponseProperty(\"HasEvents\");\n this.hasTotp = this.getResponseProperty(\"HasTotp\");\n this.has2fa = this.getResponseProperty(\"Has2fa\");\n this.hasApi = this.getResponseProperty(\"HasApi\");\n this.hasSso = this.getResponseProperty(\"HasSso\");\n this.hasResetPassword = this.getResponseProperty(\"HasResetPassword\");\n this.usersGetPremium = this.getResponseProperty(\"UsersGetPremium\");\n this.upgradeSortOrder = this.getResponseProperty(\"UpgradeSortOrder\");\n this.displaySortOrder = this.getResponseProperty(\"DisplaySortOrder\");\n this.legacyYear = this.getResponseProperty(\"LegacyYear\");\n this.disabled = this.getResponseProperty(\"Disabled\");\n const passwordManager = this.getResponseProperty(\"PasswordManager\");\n const secretsManager = this.getResponseProperty(\"SecretsManager\");\n this.PasswordManager =\n passwordManager == null ? null : new PasswordManagerPlanFeaturesResponse(passwordManager);\n this.SecretsManager =\n secretsManager == null ? null : new SecretsManagerPlanFeaturesResponse(secretsManager);\n }\n}\n\nexport class SecretsManagerPlanFeaturesResponse extends BaseResponse {\n // Seats\n stripeSeatPlanId: string;\n baseSeats: number;\n basePrice: number;\n seatPrice: number;\n hasAdditionalSeatsOption: boolean;\n maxAdditionalSeats: number;\n maxSeats: number;\n\n // Service accounts\n stripeServiceAccountPlanId: string;\n additionalPricePerServiceAccount: number;\n baseServiceAccount: number;\n maxServiceAccount: number;\n hasAdditionalServiceAccountOption: boolean;\n maxAdditionalServiceAccounts: number;\n\n // Features\n maxProjects: number;\n\n constructor(response: any) {\n super(response);\n this.stripeSeatPlanId = this.getResponseProperty(\"StripeSeatPlanId\");\n this.baseSeats = this.getResponseProperty(\"BaseSeats\");\n this.basePrice = this.getResponseProperty(\"BasePrice\");\n this.seatPrice = this.getResponseProperty(\"SeatPrice\");\n this.hasAdditionalSeatsOption = this.getResponseProperty(\"HasAdditionalSeatsOption\");\n this.maxAdditionalSeats = this.getResponseProperty(\"MaxAdditionalSeats\");\n this.maxSeats = this.getResponseProperty(\"MaxSeats\");\n this.stripeServiceAccountPlanId = this.getResponseProperty(\"StripeServiceAccountPlanId\");\n this.additionalPricePerServiceAccount = this.getResponseProperty(\n \"AdditionalPricePerServiceAccount\",\n );\n this.baseServiceAccount = this.getResponseProperty(\"BaseServiceAccount\");\n this.maxServiceAccount = this.getResponseProperty(\"MaxServiceAccount\");\n this.hasAdditionalServiceAccountOption = this.getResponseProperty(\n \"HasAdditionalServiceAccountOption\",\n );\n this.maxAdditionalServiceAccounts = this.getResponseProperty(\"MaxAdditionalServiceAccounts\");\n this.maxProjects = this.getResponseProperty(\"MaxProjects\");\n }\n}\n\nexport class PasswordManagerPlanFeaturesResponse extends BaseResponse {\n // Seats\n stripePlanId: string;\n stripeSeatPlanId: string;\n stripePremiumAccessPlanId: string;\n basePrice: number;\n seatPrice: number;\n premiumAccessOptionPrice: number;\n baseSeats: number;\n maxAdditionalSeats: number;\n maxSeats: number;\n hasPremiumAccessOption: boolean;\n\n // Storage\n additionalStoragePricePerGb: number;\n stripeStoragePlanId: string;\n baseStorageGb: number;\n hasAdditionalStorageOption: boolean;\n maxAdditionalStorage: number;\n hasAdditionalSeatsOption: boolean;\n\n // Feature\n maxCollections: number;\n\n constructor(response: any) {\n super(response);\n this.stripePlanId = this.getResponseProperty(\"StripePlanId\");\n this.stripeSeatPlanId = this.getResponseProperty(\"StripeSeatPlanId\");\n this.stripeStoragePlanId = this.getResponseProperty(\"StripeStoragePlanId\");\n this.stripePremiumAccessPlanId = this.getResponseProperty(\"StripePremiumAccessPlanId\");\n this.basePrice = this.getResponseProperty(\"BasePrice\");\n this.seatPrice = this.getResponseProperty(\"SeatPrice\");\n this.baseSeats = this.getResponseProperty(\"BaseSeats\");\n this.maxAdditionalSeats = this.getResponseProperty(\"MaxAdditionalSeats\");\n this.premiumAccessOptionPrice = this.getResponseProperty(\"PremiumAccessOptionPrice\");\n this.maxSeats = this.getResponseProperty(\"MaxSeats\");\n this.additionalStoragePricePerGb = this.getResponseProperty(\"AdditionalStoragePricePerGb\");\n this.hasAdditionalSeatsOption = this.getResponseProperty(\"HasAdditionalSeatsOption\");\n this.baseStorageGb = this.getResponseProperty(\"BaseStorageGb\");\n this.maxCollections = this.getResponseProperty(\"MaxCollections\");\n this.hasAdditionalStorageOption = this.getResponseProperty(\"HasAdditionalStorageOption\");\n this.maxAdditionalStorage = this.getResponseProperty(\"MaxAdditionalStorage\");\n this.hasPremiumAccessOption = this.getResponseProperty(\"HasPremiumAccessOption\");\n }\n}\n","import { PlanType } from \"../../../billing/enums\";\nimport { PlanResponse } from \"../../../billing/models/response/plan.response\";\nimport { BaseResponse } from \"../../../models/response/base.response\";\n\nexport class OrganizationResponse extends BaseResponse {\n id: string;\n name: string;\n businessName: string;\n businessAddress1: string;\n businessAddress2: string;\n businessAddress3: string;\n businessCountry: string;\n businessTaxNumber: string;\n billingEmail: string;\n plan: PlanResponse;\n planType: PlanType;\n seats: number;\n maxAutoscaleSeats: number;\n maxCollections: number;\n maxStorageGb: number;\n useGroups: boolean;\n useDirectory: boolean;\n useEvents: boolean;\n useTotp: boolean;\n use2fa: boolean;\n useApi: boolean;\n useResetPassword: boolean;\n useSecretsManager: boolean;\n hasPublicAndPrivateKeys: boolean;\n usePasswordManager: boolean;\n smSeats?: number;\n smServiceAccounts?: number;\n maxAutoscaleSmSeats?: number;\n maxAutoscaleSmServiceAccounts?: number;\n limitCollectionCreationDeletion: boolean;\n allowAdminAccessToAllCollectionItems: boolean;\n flexibleCollections: boolean;\n\n constructor(response: any) {\n super(response);\n this.id = this.getResponseProperty(\"Id\");\n this.name = this.getResponseProperty(\"Name\");\n this.businessName = this.getResponseProperty(\"BusinessName\");\n this.businessAddress1 = this.getResponseProperty(\"BusinessAddress1\");\n this.businessAddress2 = this.getResponseProperty(\"BusinessAddress2\");\n this.businessAddress3 = this.getResponseProperty(\"BusinessAddress3\");\n this.businessCountry = this.getResponseProperty(\"BusinessCountry\");\n this.businessTaxNumber = this.getResponseProperty(\"BusinessTaxNumber\");\n this.billingEmail = this.getResponseProperty(\"BillingEmail\");\n\n const plan = this.getResponseProperty(\"Plan\");\n this.plan = plan == null ? null : new PlanResponse(plan);\n\n this.planType = this.getResponseProperty(\"PlanType\");\n this.seats = this.getResponseProperty(\"Seats\");\n this.maxAutoscaleSeats = this.getResponseProperty(\"MaxAutoscaleSeats\");\n this.maxCollections = this.getResponseProperty(\"MaxCollections\");\n this.maxStorageGb = this.getResponseProperty(\"MaxStorageGb\");\n this.useGroups = this.getResponseProperty(\"UseGroups\");\n this.useDirectory = this.getResponseProperty(\"UseDirectory\");\n this.useEvents = this.getResponseProperty(\"UseEvents\");\n this.useTotp = this.getResponseProperty(\"UseTotp\");\n this.use2fa = this.getResponseProperty(\"Use2fa\");\n this.useApi = this.getResponseProperty(\"UseApi\");\n this.useResetPassword = this.getResponseProperty(\"UseResetPassword\");\n this.useSecretsManager = this.getResponseProperty(\"UseSecretsManager\");\n this.hasPublicAndPrivateKeys = this.getResponseProperty(\"HasPublicAndPrivateKeys\");\n this.usePasswordManager = this.getResponseProperty(\"UsePasswordManager\");\n this.smSeats = this.getResponseProperty(\"SmSeats\");\n this.smServiceAccounts = this.getResponseProperty(\"SmServiceAccounts\");\n this.maxAutoscaleSmSeats = this.getResponseProperty(\"MaxAutoscaleSmSeats\");\n this.maxAutoscaleSmServiceAccounts = this.getResponseProperty(\"MaxAutoscaleSmServiceAccounts\");\n this.limitCollectionCreationDeletion = this.getResponseProperty(\n \"LimitCollectionCreationDeletion\",\n );\n this.allowAdminAccessToAllCollectionItems = this.getResponseProperty(\n \"AllowAdminAccessToAllCollectionItems\",\n );\n this.flexibleCollections = this.getResponseProperty(\"FlexibleCollections\");\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\n\nexport class SubscriptionResponse extends BaseResponse {\n storageName: string;\n storageGb: number;\n maxStorageGb: number;\n subscription: BillingSubscriptionResponse;\n upcomingInvoice: BillingSubscriptionUpcomingInvoiceResponse;\n license: any;\n expiration: string;\n\n constructor(response: any) {\n super(response);\n this.storageName = this.getResponseProperty(\"StorageName\");\n this.storageGb = this.getResponseProperty(\"StorageGb\");\n this.maxStorageGb = this.getResponseProperty(\"MaxStorageGb\");\n this.license = this.getResponseProperty(\"License\");\n this.expiration = this.getResponseProperty(\"Expiration\");\n const subscription = this.getResponseProperty(\"Subscription\");\n const upcomingInvoice = this.getResponseProperty(\"UpcomingInvoice\");\n this.subscription = subscription == null ? null : new BillingSubscriptionResponse(subscription);\n this.upcomingInvoice =\n upcomingInvoice == null\n ? null\n : new BillingSubscriptionUpcomingInvoiceResponse(upcomingInvoice);\n }\n}\n\nexport class BillingSubscriptionResponse extends BaseResponse {\n trialStartDate: string;\n trialEndDate: string;\n periodStartDate: string;\n periodEndDate: string;\n cancelledDate: string;\n cancelAtEndDate: boolean;\n status: string;\n cancelled: boolean;\n items: BillingSubscriptionItemResponse[] = [];\n\n constructor(response: any) {\n super(response);\n this.trialStartDate = this.getResponseProperty(\"TrialStartDate\");\n this.trialEndDate = this.getResponseProperty(\"TrialEndDate\");\n this.periodStartDate = this.getResponseProperty(\"PeriodStartDate\");\n this.periodEndDate = this.getResponseProperty(\"PeriodEndDate\");\n this.cancelledDate = this.getResponseProperty(\"CancelledDate\");\n this.cancelAtEndDate = this.getResponseProperty(\"CancelAtEndDate\");\n this.status = this.getResponseProperty(\"Status\");\n this.cancelled = this.getResponseProperty(\"Cancelled\");\n const items = this.getResponseProperty(\"Items\");\n if (items != null) {\n this.items = items.map((i: any) => new BillingSubscriptionItemResponse(i));\n }\n }\n}\n\nexport class BillingSubscriptionItemResponse extends BaseResponse {\n productId: string;\n name: string;\n amount: number;\n quantity: number;\n interval: string;\n sponsoredSubscriptionItem: boolean;\n addonSubscriptionItem: boolean;\n productName: string;\n\n constructor(response: any) {\n super(response);\n this.productId = this.getResponseProperty(\"ProductId\");\n this.name = this.getResponseProperty(\"Name\");\n this.amount = this.getResponseProperty(\"Amount\");\n this.quantity = this.getResponseProperty(\"Quantity\");\n this.interval = this.getResponseProperty(\"Interval\");\n this.sponsoredSubscriptionItem = this.getResponseProperty(\"SponsoredSubscriptionItem\");\n this.addonSubscriptionItem = this.getResponseProperty(\"AddonSubscriptionItem\");\n }\n}\n\nexport class BillingSubscriptionUpcomingInvoiceResponse extends BaseResponse {\n date: string;\n amount?: number;\n\n constructor(response: any) {\n super(response);\n this.date = this.getResponseProperty(\"Date\");\n this.amount = this.getResponseProperty(\"Amount\");\n }\n}\n","import { OrganizationResponse } from \"../../../admin-console/models/response/organization.response\";\nimport { BaseResponse } from \"../../../models/response/base.response\";\n\nimport {\n BillingSubscriptionResponse,\n BillingSubscriptionUpcomingInvoiceResponse,\n} from \"./subscription.response\";\n\nexport class OrganizationSubscriptionResponse extends OrganizationResponse {\n storageName: string;\n storageGb: number;\n subscription: BillingSubscriptionResponse;\n upcomingInvoice: BillingSubscriptionUpcomingInvoiceResponse;\n customerDiscount: BillingCustomerDiscount;\n expiration: string;\n expirationWithoutGracePeriod: string;\n\n constructor(response: any) {\n super(response);\n this.storageName = this.getResponseProperty(\"StorageName\");\n this.storageGb = this.getResponseProperty(\"StorageGb\");\n const subscription = this.getResponseProperty(\"Subscription\");\n this.subscription = subscription == null ? null : new BillingSubscriptionResponse(subscription);\n const upcomingInvoice = this.getResponseProperty(\"UpcomingInvoice\");\n this.upcomingInvoice =\n upcomingInvoice == null\n ? null\n : new BillingSubscriptionUpcomingInvoiceResponse(upcomingInvoice);\n const customerDiscount = this.getResponseProperty(\"CustomerDiscount\");\n this.customerDiscount =\n customerDiscount == null ? null : new BillingCustomerDiscount(customerDiscount);\n this.expiration = this.getResponseProperty(\"Expiration\");\n this.expirationWithoutGracePeriod = this.getResponseProperty(\"ExpirationWithoutGracePeriod\");\n }\n}\n\nexport class BillingCustomerDiscount extends BaseResponse {\n id: string;\n active: boolean;\n percentOff?: number;\n appliesTo: string[];\n\n constructor(response: any) {\n super(response);\n this.id = this.getResponseProperty(\"Id\");\n this.active = this.getResponseProperty(\"Active\");\n this.percentOff = this.getResponseProperty(\"PercentOff\");\n this.appliesTo = this.getResponseProperty(\"AppliesTo\");\n }\n}\n","import { ProductType } from \"../../../enums\";\nimport { BaseResponse } from \"../../../models/response/base.response\";\nimport { OrganizationUserStatusType, OrganizationUserType, ProviderType } from \"../../enums\";\nimport { PermissionsApi } from \"../api/permissions.api\";\n\nexport class ProfileOrganizationResponse extends BaseResponse {\n id: string;\n name: string;\n usePolicies: boolean;\n useGroups: boolean;\n useDirectory: boolean;\n useEvents: boolean;\n useTotp: boolean;\n use2fa: boolean;\n useApi: boolean;\n useSso: boolean;\n useKeyConnector: boolean;\n useScim: boolean;\n useCustomPermissions: boolean;\n useResetPassword: boolean;\n useSecretsManager: boolean;\n usePasswordManager: boolean;\n useActivateAutofillPolicy: boolean;\n selfHost: boolean;\n usersGetPremium: boolean;\n seats: number;\n maxCollections: number;\n maxStorageGb?: number;\n key: string;\n hasPublicAndPrivateKeys: boolean;\n status: OrganizationUserStatusType;\n type: OrganizationUserType;\n enabled: boolean;\n ssoBound: boolean;\n identifier: string;\n permissions: PermissionsApi;\n resetPasswordEnrolled: boolean;\n userId: string;\n providerId: string;\n providerName: string;\n providerType?: ProviderType;\n familySponsorshipFriendlyName: string;\n familySponsorshipAvailable: boolean;\n planProductType: ProductType;\n keyConnectorEnabled: boolean;\n keyConnectorUrl: string;\n familySponsorshipLastSyncDate?: Date;\n familySponsorshipValidUntil?: Date;\n familySponsorshipToDelete?: boolean;\n accessSecretsManager: boolean;\n limitCollectionCreationDeletion: boolean;\n allowAdminAccessToAllCollectionItems: boolean;\n flexibleCollections: boolean;\n\n constructor(response: any) {\n super(response);\n this.id = this.getResponseProperty(\"Id\");\n this.name = this.getResponseProperty(\"Name\");\n this.usePolicies = this.getResponseProperty(\"UsePolicies\");\n this.useGroups = this.getResponseProperty(\"UseGroups\");\n this.useDirectory = this.getResponseProperty(\"UseDirectory\");\n this.useEvents = this.getResponseProperty(\"UseEvents\");\n this.useTotp = this.getResponseProperty(\"UseTotp\");\n this.use2fa = this.getResponseProperty(\"Use2fa\");\n this.useApi = this.getResponseProperty(\"UseApi\");\n this.useSso = this.getResponseProperty(\"UseSso\");\n this.useKeyConnector = this.getResponseProperty(\"UseKeyConnector\") ?? false;\n this.useScim = this.getResponseProperty(\"UseScim\") ?? false;\n this.useCustomPermissions = this.getResponseProperty(\"UseCustomPermissions\") ?? false;\n this.useResetPassword = this.getResponseProperty(\"UseResetPassword\");\n this.useSecretsManager = this.getResponseProperty(\"UseSecretsManager\");\n this.usePasswordManager = this.getResponseProperty(\"UsePasswordManager\");\n this.useActivateAutofillPolicy = this.getResponseProperty(\"UseActivateAutofillPolicy\");\n this.selfHost = this.getResponseProperty(\"SelfHost\");\n this.usersGetPremium = this.getResponseProperty(\"UsersGetPremium\");\n this.seats = this.getResponseProperty(\"Seats\");\n this.maxCollections = this.getResponseProperty(\"MaxCollections\");\n this.maxStorageGb = this.getResponseProperty(\"MaxStorageGb\");\n this.key = this.getResponseProperty(\"Key\");\n this.hasPublicAndPrivateKeys = this.getResponseProperty(\"HasPublicAndPrivateKeys\");\n this.status = this.getResponseProperty(\"Status\");\n this.type = this.getResponseProperty(\"Type\");\n this.enabled = this.getResponseProperty(\"Enabled\");\n this.ssoBound = this.getResponseProperty(\"SsoBound\");\n this.identifier = this.getResponseProperty(\"Identifier\");\n this.permissions = new PermissionsApi(this.getResponseProperty(\"permissions\"));\n this.resetPasswordEnrolled = this.getResponseProperty(\"ResetPasswordEnrolled\");\n this.userId = this.getResponseProperty(\"UserId\");\n this.providerId = this.getResponseProperty(\"ProviderId\");\n this.providerName = this.getResponseProperty(\"ProviderName\");\n this.providerType = this.getResponseProperty(\"ProviderType\");\n this.familySponsorshipFriendlyName = this.getResponseProperty(\"FamilySponsorshipFriendlyName\");\n this.familySponsorshipAvailable = this.getResponseProperty(\"FamilySponsorshipAvailable\");\n this.planProductType = this.getResponseProperty(\"PlanProductType\");\n this.keyConnectorEnabled = this.getResponseProperty(\"KeyConnectorEnabled\") ?? false;\n this.keyConnectorUrl = this.getResponseProperty(\"KeyConnectorUrl\");\n const familySponsorshipLastSyncDateString = this.getResponseProperty(\n \"FamilySponsorshipLastSyncDate\",\n );\n if (familySponsorshipLastSyncDateString) {\n this.familySponsorshipLastSyncDate = new Date(familySponsorshipLastSyncDateString);\n }\n const familySponsorshipValidUntilString = this.getResponseProperty(\n \"FamilySponsorshipValidUntil\",\n );\n if (familySponsorshipValidUntilString) {\n this.familySponsorshipValidUntil = new Date(familySponsorshipValidUntilString);\n }\n this.familySponsorshipToDelete = this.getResponseProperty(\"FamilySponsorshipToDelete\");\n this.accessSecretsManager = this.getResponseProperty(\"AccessSecretsManager\");\n this.limitCollectionCreationDeletion = this.getResponseProperty(\n \"LimitCollectionCreationDeletion\",\n );\n this.allowAdminAccessToAllCollectionItems = this.getResponseProperty(\n \"AllowAdminAccessToAllCollectionItems\",\n );\n this.flexibleCollections = this.getResponseProperty(\"FlexibleCollections\");\n }\n}\n","import { ProfileOrganizationResponse } from \"./profile-organization.response\";\n\nexport class ProfileProviderOrganizationResponse extends ProfileOrganizationResponse {\n constructor(response: any) {\n super(response);\n this.keyConnectorEnabled = false;\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\nimport { ProviderUserStatusType, ProviderUserType } from \"../../enums\";\nimport { PermissionsApi } from \"../api/permissions.api\";\n\nexport class ProfileProviderResponse extends BaseResponse {\n id: string;\n name: string;\n key: string;\n status: ProviderUserStatusType;\n type: ProviderUserType;\n enabled: boolean;\n permissions: PermissionsApi;\n userId: string;\n useEvents: boolean;\n\n constructor(response: any) {\n super(response);\n this.id = this.getResponseProperty(\"Id\");\n this.name = this.getResponseProperty(\"Name\");\n this.key = this.getResponseProperty(\"Key\");\n this.status = this.getResponseProperty(\"Status\");\n this.type = this.getResponseProperty(\"Type\");\n this.enabled = this.getResponseProperty(\"Enabled\");\n this.permissions = new PermissionsApi(this.getResponseProperty(\"permissions\"));\n this.userId = this.getResponseProperty(\"UserId\");\n this.useEvents = this.getResponseProperty(\"UseEvents\");\n }\n}\n","import { ProfileOrganizationResponse } from \"../../admin-console/models/response/profile-organization.response\";\nimport { ProfileProviderOrganizationResponse } from \"../../admin-console/models/response/profile-provider-organization.response\";\nimport { ProfileProviderResponse } from \"../../admin-console/models/response/profile-provider.response\";\n\nimport { BaseResponse } from \"./base.response\";\n\nexport class ProfileResponse extends BaseResponse {\n id: string;\n name: string;\n email: string;\n emailVerified: boolean;\n masterPasswordHint: string;\n premiumPersonally: boolean;\n premiumFromOrganization: boolean;\n culture: string;\n twoFactorEnabled: boolean;\n key: string;\n avatarColor: string;\n creationDate: string;\n privateKey: string;\n securityStamp: string;\n forcePasswordReset: boolean;\n usesKeyConnector: boolean;\n organizations: ProfileOrganizationResponse[] = [];\n providers: ProfileProviderResponse[] = [];\n providerOrganizations: ProfileProviderOrganizationResponse[] = [];\n\n constructor(response: any) {\n super(response);\n this.id = this.getResponseProperty(\"Id\");\n this.name = this.getResponseProperty(\"Name\");\n this.email = this.getResponseProperty(\"Email\");\n this.emailVerified = this.getResponseProperty(\"EmailVerified\");\n this.masterPasswordHint = this.getResponseProperty(\"MasterPasswordHint\");\n this.premiumPersonally = this.getResponseProperty(\"Premium\");\n this.premiumFromOrganization = this.getResponseProperty(\"PremiumFromOrganization\");\n this.culture = this.getResponseProperty(\"Culture\");\n this.twoFactorEnabled = this.getResponseProperty(\"TwoFactorEnabled\");\n this.key = this.getResponseProperty(\"Key\");\n this.avatarColor = this.getResponseProperty(\"AvatarColor\");\n this.creationDate = this.getResponseProperty(\"CreationDate\");\n this.privateKey = this.getResponseProperty(\"PrivateKey\");\n this.securityStamp = this.getResponseProperty(\"SecurityStamp\");\n this.forcePasswordReset = this.getResponseProperty(\"ForcePasswordReset\") ?? false;\n this.usesKeyConnector = this.getResponseProperty(\"UsesKeyConnector\") ?? false;\n\n const organizations = this.getResponseProperty(\"Organizations\");\n if (organizations != null) {\n this.organizations = organizations.map((o: any) => new ProfileOrganizationResponse(o));\n }\n const providers = this.getResponseProperty(\"Providers\");\n if (providers != null) {\n this.providers = providers.map((o: any) => new ProfileProviderResponse(o));\n }\n const providerOrganizations = this.getResponseProperty(\"ProviderOrganizations\");\n if (providerOrganizations != null) {\n this.providerOrganizations = providerOrganizations.map(\n (o: any) => new ProfileProviderOrganizationResponse(o),\n );\n }\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\nimport { ProfileResponse } from \"../../../models/response/profile.response\";\n\nexport class PaymentResponse extends BaseResponse {\n userProfile: ProfileResponse;\n paymentIntentClientSecret: string;\n success: boolean;\n\n constructor(response: any) {\n super(response);\n const userProfile = this.getResponseProperty(\"UserProfile\");\n if (userProfile != null) {\n this.userProfile = new ProfileResponse(userProfile);\n }\n this.paymentIntentClientSecret = this.getResponseProperty(\"PaymentIntentClientSecret\");\n this.success = this.getResponseProperty(\"Success\");\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\n\nexport class TaxInfoResponse extends BaseResponse {\n taxId: string;\n taxIdType: string;\n line1: string;\n line2: string;\n city: string;\n state: string;\n country: string;\n postalCode: string;\n\n constructor(response: any) {\n super(response);\n this.taxId = this.getResponseProperty(\"TaxIdNumber\");\n this.taxIdType = this.getResponseProperty(\"TaxIdType\");\n this.line1 = this.getResponseProperty(\"Line1\");\n this.line2 = this.getResponseProperty(\"Line2\");\n this.city = this.getResponseProperty(\"City\");\n this.state = this.getResponseProperty(\"State\");\n this.postalCode = this.getResponseProperty(\"PostalCode\");\n this.country = this.getResponseProperty(\"Country\");\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\nimport { OrganizationApiKeyType } from \"../../enums\";\n\nexport class OrganizationApiKeyInformationResponse extends BaseResponse {\n keyType: OrganizationApiKeyType;\n\n constructor(response: any) {\n super(response);\n this.keyType = this.getResponseProperty(\"KeyType\");\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\n\nexport class OrganizationAutoEnrollStatusResponse extends BaseResponse {\n id: string;\n resetPasswordEnabled: boolean;\n\n constructor(response: any) {\n super(response);\n this.id = this.getResponseProperty(\"Id\");\n this.resetPasswordEnabled = this.getResponseProperty(\"ResetPasswordEnabled\");\n }\n}\n","import { BaseResponse } from \"./base.response\";\n\nexport class KeysResponse extends BaseResponse {\n privateKey: string;\n publicKey: string;\n\n constructor(response: any) {\n super(response);\n this.privateKey = this.getResponseProperty(\"PrivateKey\");\n this.publicKey = this.getResponseProperty(\"PublicKey\");\n }\n}\n","import { KeysResponse } from \"../../../models/response/keys.response\";\n\nexport class OrganizationKeysResponse extends KeysResponse {\n constructor(response: any) {\n super(response);\n }\n}\n","import { map, Observable, firstValueFrom } from \"rxjs\";\nimport { Jsonify } from \"type-fest\";\n\nimport { ORGANIZATIONS_DISK, StateProvider, UserKeyDefinition } from \"../../../platform/state\";\nimport { UserId } from \"../../../types/guid\";\nimport { InternalOrganizationServiceAbstraction } from \"../../abstractions/organization/organization.service.abstraction\";\nimport { OrganizationData } from \"../../models/data/organization.data\";\nimport { Organization } from \"../../models/domain/organization\";\n\n/**\n * The `KeyDefinition` for accessing organization lists in application state.\n * @todo Ideally this wouldn't require a `fromJSON()` call, but `OrganizationData`\n * has some properties that contain functions. This should probably get\n * cleaned up.\n */\nexport const ORGANIZATIONS = UserKeyDefinition.record(\n ORGANIZATIONS_DISK,\n \"organizations\",\n {\n deserializer: (obj: Jsonify) => OrganizationData.fromJSON(obj),\n clearOn: [\"logout\"],\n },\n);\n\n/**\n * Filter out organizations from an observable that __do not__ offer a\n * families-for-enterprise sponsorship to members.\n * @returns a function that can be used in `Observable` pipes,\n * like `organizationService.organizations$`\n */\nfunction mapToExcludeOrganizationsWithoutFamilySponsorshipSupport() {\n return map((orgs) => orgs.filter((o) => o.canManageSponsorships));\n}\n\n/**\n * Filter out organizations from an observable that the organization user\n * __is not__ a direct member of. This will exclude organizations only\n * accessible as a provider.\n * @returns a function that can be used in `Observable` pipes,\n * like `organizationService.organizations$`\n */\nfunction mapToExcludeProviderOrganizations() {\n return map((orgs) => orgs.filter((o) => o.isMember));\n}\n\n/**\n * Map an observable stream of organizations down to a boolean indicating\n * if any organizations exist (`orgs.length > 0`).\n * @returns a function that can be used in `Observable` pipes,\n * like `organizationService.organizations$`\n */\nfunction mapToBooleanHasAnyOrganizations() {\n return map((orgs) => orgs.length > 0);\n}\n\n/**\n * Map an observable stream of organizations down to a single organization.\n * @param `organizationId` The ID of the organization you'd like to subscribe to\n * @returns a function that can be used in `Observable` pipes,\n * like `organizationService.organizations$`\n */\nfunction mapToSingleOrganization(organizationId: string) {\n return map((orgs) => orgs?.find((o) => o.id === organizationId));\n}\n\nexport class OrganizationService implements InternalOrganizationServiceAbstraction {\n organizations$ = this.getOrganizationsFromState$();\n memberOrganizations$ = this.organizations$.pipe(mapToExcludeProviderOrganizations());\n\n constructor(private stateProvider: StateProvider) {}\n\n get$(id: string): Observable {\n return this.organizations$.pipe(mapToSingleOrganization(id));\n }\n\n async getAll(userId?: string): Promise {\n return await firstValueFrom(this.getOrganizationsFromState$(userId as UserId));\n }\n\n async canManageSponsorships(): Promise {\n return await firstValueFrom(\n this.organizations$.pipe(\n mapToExcludeOrganizationsWithoutFamilySponsorshipSupport(),\n mapToBooleanHasAnyOrganizations(),\n ),\n );\n }\n\n async hasOrganizations(): Promise {\n return await firstValueFrom(this.organizations$.pipe(mapToBooleanHasAnyOrganizations()));\n }\n\n async upsert(organization: OrganizationData, userId?: UserId): Promise {\n await this.stateFor(userId).update((existingOrganizations) => {\n const organizations = existingOrganizations ?? {};\n organizations[organization.id] = organization;\n return organizations;\n });\n }\n\n async get(id: string): Promise {\n return await firstValueFrom(this.organizations$.pipe(mapToSingleOrganization(id)));\n }\n\n /**\n * @deprecated For the CLI only\n * @param id id of the organization\n */\n async getFromState(id: string): Promise {\n return await firstValueFrom(this.organizations$.pipe(mapToSingleOrganization(id)));\n }\n\n async replace(organizations: { [id: string]: OrganizationData }, userId?: UserId): Promise {\n await this.stateFor(userId).update(() => organizations);\n }\n\n // Ideally this method would be renamed to organizations$() and the\n // $organizations observable as it stands would be removed. This will\n // require updates to callers, and so this method exists as a temporary\n // workaround until we have time & a plan to update callers.\n //\n // It can be thought of as \"organizations$ but with a userId option\".\n private getOrganizationsFromState$(userId?: UserId): Observable {\n return this.stateFor(userId).state$.pipe(this.mapOrganizationRecordToArray());\n }\n\n /**\n * Accepts a record of `OrganizationData`, which is how we store the\n * organization list as a JSON object on disk, to an array of\n * `Organization`, which is how the data is published to callers of the\n * service.\n * @returns a function that can be used to pipe organization data from\n * stored state to an exposed object easily consumable by others.\n */\n private mapOrganizationRecordToArray() {\n return map, Organization[]>((orgs) =>\n Object.values(orgs ?? {})?.map((o) => new Organization(o)),\n );\n }\n\n /**\n * Fetches the organization list from on disk state for the specified user.\n * @param userId the user ID to fetch the organization list for. Defaults to\n * the currently active user.\n * @returns an observable of organization state as it is stored on disk.\n */\n private stateFor(userId?: UserId) {\n return userId\n ? this.stateProvider.getUser(userId, ORGANIZATIONS)\n : this.stateProvider.getActive(ORGANIZATIONS);\n }\n}\n","import { BaseResponse } from \"../../../../models/response/base.response\";\n\nexport class OrganizationDomainSsoDetailsResponse extends BaseResponse {\n id: string;\n organizationIdentifier: string;\n ssoAvailable: boolean;\n domainName: string;\n verifiedDate?: Date;\n\n constructor(response: any) {\n super(response);\n this.id = this.getResponseProperty(\"id\");\n this.organizationIdentifier = this.getResponseProperty(\"organizationIdentifier\");\n this.ssoAvailable = this.getResponseProperty(\"ssoAvailable\");\n this.domainName = this.getResponseProperty(\"domainName\");\n this.verifiedDate = this.getResponseProperty(\"verifiedDate\");\n }\n}\n","import { BaseResponse } from \"../../../../models/response/base.response\";\n\nexport class OrganizationDomainResponse extends BaseResponse {\n id: string;\n organizationId: string;\n txt: string;\n domainName: string;\n creationDate: string;\n nextRunDate: string;\n jobRunCount: number;\n verifiedDate?: string;\n lastCheckedDate?: string;\n\n constructor(response: any) {\n super(response);\n this.id = this.getResponseProperty(\"id\");\n this.organizationId = this.getResponseProperty(\"organizationId\");\n this.txt = this.getResponseProperty(\"txt\");\n this.domainName = this.getResponseProperty(\"domainName\");\n this.creationDate = this.getResponseProperty(\"creationDate\");\n this.nextRunDate = this.getResponseProperty(\"nextRunDate\");\n this.jobRunCount = this.getResponseProperty(\"jobRunCount\");\n this.verifiedDate = this.getResponseProperty(\"verifiedDate\");\n this.lastCheckedDate = this.getResponseProperty(\"lastCheckedDate\");\n }\n}\n","export class OrganizationDomainSsoDetailsRequest {\n constructor(public email: string) {}\n}\n","import { map } from \"rxjs\";\nimport { Jsonify } from \"type-fest\";\n\nimport {\n ORGANIZATION_MANAGEMENT_PREFERENCES_DISK,\n StateProvider,\n UserKeyDefinition,\n} from \"../../../platform/state\";\nimport {\n OrganizationManagementPreference,\n OrganizationManagementPreferencesService,\n} from \"../../abstractions/organization-management-preferences/organization-management-preferences.service\";\n\n/**\n * This helper function can be used to quickly create `KeyDefinitions` that\n * target the `ORGANIZATION_MANAGEMENT_PREFERENCES_DISK` `StateDefinition`\n * and that have the default deserializer and `clearOn` options. Any\n * contenders for options to add to this service will likely use these same\n * options.\n */\nfunction buildKeyDefinition(key: string): UserKeyDefinition {\n return new UserKeyDefinition(ORGANIZATION_MANAGEMENT_PREFERENCES_DISK, key, {\n deserializer: (obj: Jsonify) => obj as T,\n clearOn: [\"logout\"],\n });\n}\n\nexport const AUTO_CONFIRM_FINGERPRINTS = buildKeyDefinition(\"autoConfirmFingerPrints\");\n\nexport class DefaultOrganizationManagementPreferencesService\n implements OrganizationManagementPreferencesService\n{\n constructor(private stateProvider: StateProvider) {}\n\n autoConfirmFingerPrints = this.buildOrganizationManagementPreference(\n AUTO_CONFIRM_FINGERPRINTS,\n false,\n );\n\n /**\n * Returns an `OrganizationManagementPreference` object for the provided\n * `KeyDefinition`. This object can then be used by callers to subscribe to\n * a given key, or set its value in state.\n */\n private buildOrganizationManagementPreference(\n keyDefinition: UserKeyDefinition,\n defaultValue: T,\n ) {\n return new OrganizationManagementPreference(\n this.getKeyFromState(keyDefinition).state$.pipe(map((x) => x ?? defaultValue)),\n this.setKeyInStateFn(keyDefinition),\n );\n }\n\n /**\n * Returns the full `ActiveUserState` value for a given `keyDefinition`\n * The returned value can then be called for subscription || set operations\n */\n private getKeyFromState(keyDefinition: UserKeyDefinition) {\n return this.stateProvider.getActive(keyDefinition);\n }\n\n /**\n * Returns a function that can be called to set the given `keyDefinition` in state\n */\n private setKeyInStateFn(keyDefinition: UserKeyDefinition) {\n return async (value: T) => {\n await this.getKeyFromState(keyDefinition).update(() => value);\n };\n }\n}\n","import { BaseResponse } from \"../../../../models/response/base.response\";\nimport { KdfType } from \"../../../../platform/enums\";\nimport { OrganizationUserStatusType, OrganizationUserType } from \"../../../enums\";\nimport { PermissionsApi } from \"../../../models/api/permissions.api\";\nimport { SelectionReadOnlyResponse } from \"../../../models/response/selection-read-only.response\";\n\nexport class OrganizationUserResponse extends BaseResponse {\n id: string;\n userId: string;\n type: OrganizationUserType;\n status: OrganizationUserStatusType;\n externalId: string;\n /**\n * @deprecated\n * To be removed after Flexible Collections.\n **/\n accessAll: boolean;\n accessSecretsManager: boolean;\n permissions: PermissionsApi;\n resetPasswordEnrolled: boolean;\n hasMasterPassword: boolean;\n collections: SelectionReadOnlyResponse[] = [];\n groups: string[] = [];\n\n constructor(response: any) {\n super(response);\n this.id = this.getResponseProperty(\"Id\");\n this.userId = this.getResponseProperty(\"UserId\");\n this.type = this.getResponseProperty(\"Type\");\n this.status = this.getResponseProperty(\"Status\");\n this.permissions = new PermissionsApi(this.getResponseProperty(\"Permissions\"));\n this.externalId = this.getResponseProperty(\"ExternalId\");\n this.accessAll = this.getResponseProperty(\"AccessAll\");\n this.accessSecretsManager = this.getResponseProperty(\"AccessSecretsManager\");\n this.resetPasswordEnrolled = this.getResponseProperty(\"ResetPasswordEnrolled\");\n this.hasMasterPassword = this.getResponseProperty(\"HasMasterPassword\");\n\n const collections = this.getResponseProperty(\"Collections\");\n if (collections != null) {\n this.collections = collections.map((c: any) => new SelectionReadOnlyResponse(c));\n }\n const groups = this.getResponseProperty(\"Groups\");\n if (groups != null) {\n this.groups = groups;\n }\n }\n}\n\nexport class OrganizationUserUserDetailsResponse extends OrganizationUserResponse {\n name: string;\n email: string;\n avatarColor: string;\n twoFactorEnabled: boolean;\n usesKeyConnector: boolean;\n\n constructor(response: any) {\n super(response);\n this.name = this.getResponseProperty(\"Name\");\n this.email = this.getResponseProperty(\"Email\");\n this.avatarColor = this.getResponseProperty(\"AvatarColor\");\n this.twoFactorEnabled = this.getResponseProperty(\"TwoFactorEnabled\");\n this.usesKeyConnector = this.getResponseProperty(\"UsesKeyConnector\") ?? false;\n }\n}\n\nexport class OrganizationUserDetailsResponse extends OrganizationUserResponse {\n constructor(response: any) {\n super(response);\n }\n}\n\nexport class OrganizationUserResetPasswordDetailsResponse extends BaseResponse {\n kdf: KdfType;\n kdfIterations: number;\n kdfMemory?: number;\n kdfParallelism?: number;\n resetPasswordKey: string;\n encryptedPrivateKey: string;\n\n constructor(response: any) {\n super(response);\n this.kdf = this.getResponseProperty(\"Kdf\");\n this.kdfIterations = this.getResponseProperty(\"KdfIterations\");\n this.kdfMemory = this.getResponseProperty(\"KdfMemory\");\n this.kdfParallelism = this.getResponseProperty(\"KdfParallelism\");\n this.resetPasswordKey = this.getResponseProperty(\"ResetPasswordKey\");\n this.encryptedPrivateKey = this.getResponseProperty(\"EncryptedPrivateKey\");\n }\n}\n","import { BaseResponse } from \"../../../../models/response/base.response\";\n\nexport class OrganizationUserBulkResponse extends BaseResponse {\n id: string;\n error: string;\n\n constructor(response: any) {\n super(response);\n this.id = this.getResponseProperty(\"Id\");\n this.error = this.getResponseProperty(\"Error\");\n }\n}\n","import { BaseResponse } from \"../../../../models/response/base.response\";\n\nexport class OrganizationUserBulkPublicKeyResponse extends BaseResponse {\n id: string;\n userId: string;\n key: string;\n\n constructor(response: any) {\n super(response);\n this.id = this.getResponseProperty(\"Id\");\n this.userId = this.getResponseProperty(\"UserId\");\n this.key = this.getResponseProperty(\"Key\");\n }\n}\n","export class OrganizationUserBulkRequest {\n ids: string[];\n\n constructor(ids: string[]) {\n this.ids = ids == null ? [] : ids;\n }\n}\n","import Domain from \"../../../platform/models/domain/domain-base\";\n\nexport class ResetPasswordPolicyOptions extends Domain {\n autoEnrollEnabled = false;\n}\n","import { combineLatest, firstValueFrom, map, Observable, of } from \"rxjs\";\n\nimport { KeyDefinition, POLICIES_DISK, StateProvider } from \"../../../platform/state\";\nimport { PolicyId, UserId } from \"../../../types/guid\";\nimport { OrganizationService } from \"../../abstractions/organization/organization.service.abstraction\";\nimport { InternalPolicyService as InternalPolicyServiceAbstraction } from \"../../abstractions/policy/policy.service.abstraction\";\nimport { OrganizationUserStatusType, PolicyType } from \"../../enums\";\nimport { PolicyData } from \"../../models/data/policy.data\";\nimport { MasterPasswordPolicyOptions } from \"../../models/domain/master-password-policy-options\";\nimport { Organization } from \"../../models/domain/organization\";\nimport { Policy } from \"../../models/domain/policy\";\nimport { ResetPasswordPolicyOptions } from \"../../models/domain/reset-password-policy-options\";\n\nconst policyRecordToArray = (policiesMap: { [id: string]: PolicyData }) =>\n Object.values(policiesMap || {}).map((f) => new Policy(f));\n\nexport const POLICIES = KeyDefinition.record(POLICIES_DISK, \"policies\", {\n deserializer: (policyData) => policyData,\n});\n\nexport class PolicyService implements InternalPolicyServiceAbstraction {\n private activeUserPolicyState = this.stateProvider.getActive(POLICIES);\n private activeUserPolicies$ = this.activeUserPolicyState.state$.pipe(\n map((policyData) => policyRecordToArray(policyData)),\n );\n\n policies$ = this.activeUserPolicies$;\n\n constructor(\n private stateProvider: StateProvider,\n private organizationService: OrganizationService,\n ) {}\n\n get$(policyType: PolicyType) {\n const filteredPolicies$ = this.activeUserPolicies$.pipe(\n map((policies) => policies.filter((p) => p.type === policyType)),\n );\n\n return combineLatest([filteredPolicies$, this.organizationService.organizations$]).pipe(\n map(\n ([policies, organizations]) =>\n this.enforcedPolicyFilter(policies, organizations)?.at(0) ?? null,\n ),\n );\n }\n\n getAll$(policyType: PolicyType, userId?: UserId) {\n const filteredPolicies$ = this.stateProvider.getUserState$(POLICIES, userId).pipe(\n map((policyData) => policyRecordToArray(policyData)),\n map((policies) => policies.filter((p) => p.type === policyType)),\n );\n\n return combineLatest([filteredPolicies$, this.organizationService.organizations$]).pipe(\n map(([policies, organizations]) => this.enforcedPolicyFilter(policies, organizations)),\n );\n }\n\n async getAll(policyType: PolicyType) {\n return await firstValueFrom(\n this.policies$.pipe(map((policies) => policies.filter((p) => p.type === policyType))),\n );\n }\n\n policyAppliesToActiveUser$(policyType: PolicyType) {\n return this.get$(policyType).pipe(map((policy) => policy != null));\n }\n\n async policyAppliesToUser(policyType: PolicyType) {\n return await firstValueFrom(this.policyAppliesToActiveUser$(policyType));\n }\n\n private enforcedPolicyFilter(policies: Policy[], organizations: Organization[]) {\n const orgDict = Object.fromEntries(organizations.map((o) => [o.id, o]));\n return policies.filter((policy) => {\n const organization = orgDict[policy.organizationId];\n\n // This shouldn't happen, i.e. the user should only have policies for orgs they are a member of\n // But if it does, err on the side of enforcing the policy\n if (organization == null) {\n return true;\n }\n\n return (\n policy.enabled &&\n organization.status >= OrganizationUserStatusType.Accepted &&\n organization.usePolicies &&\n !this.isExemptFromPolicy(policy.type, organization)\n );\n });\n }\n\n masterPasswordPolicyOptions$(policies?: Policy[]): Observable {\n const observable = policies ? of(policies) : this.policies$;\n return observable.pipe(\n map((obsPolicies) => {\n let enforcedOptions: MasterPasswordPolicyOptions = null;\n const filteredPolicies = obsPolicies.filter((p) => p.type === PolicyType.MasterPassword);\n\n if (filteredPolicies == null || filteredPolicies.length === 0) {\n return enforcedOptions;\n }\n\n filteredPolicies.forEach((currentPolicy) => {\n if (!currentPolicy.enabled || currentPolicy.data == null) {\n return;\n }\n\n if (enforcedOptions == null) {\n enforcedOptions = new MasterPasswordPolicyOptions();\n }\n\n if (\n currentPolicy.data.minComplexity != null &&\n currentPolicy.data.minComplexity > enforcedOptions.minComplexity\n ) {\n enforcedOptions.minComplexity = currentPolicy.data.minComplexity;\n }\n\n if (\n currentPolicy.data.minLength != null &&\n currentPolicy.data.minLength > enforcedOptions.minLength\n ) {\n enforcedOptions.minLength = currentPolicy.data.minLength;\n }\n\n if (currentPolicy.data.requireUpper) {\n enforcedOptions.requireUpper = true;\n }\n\n if (currentPolicy.data.requireLower) {\n enforcedOptions.requireLower = true;\n }\n\n if (currentPolicy.data.requireNumbers) {\n enforcedOptions.requireNumbers = true;\n }\n\n if (currentPolicy.data.requireSpecial) {\n enforcedOptions.requireSpecial = true;\n }\n\n if (currentPolicy.data.enforceOnLogin) {\n enforcedOptions.enforceOnLogin = true;\n }\n });\n\n return enforcedOptions;\n }),\n );\n }\n\n evaluateMasterPassword(\n passwordStrength: number,\n newPassword: string,\n enforcedPolicyOptions: MasterPasswordPolicyOptions,\n ): boolean {\n if (enforcedPolicyOptions == null) {\n return true;\n }\n\n if (\n enforcedPolicyOptions.minComplexity > 0 &&\n enforcedPolicyOptions.minComplexity > passwordStrength\n ) {\n return false;\n }\n\n if (\n enforcedPolicyOptions.minLength > 0 &&\n enforcedPolicyOptions.minLength > newPassword.length\n ) {\n return false;\n }\n\n if (enforcedPolicyOptions.requireUpper && newPassword.toLocaleLowerCase() === newPassword) {\n return false;\n }\n\n if (enforcedPolicyOptions.requireLower && newPassword.toLocaleUpperCase() === newPassword) {\n return false;\n }\n\n if (enforcedPolicyOptions.requireNumbers && !/[0-9]/.test(newPassword)) {\n return false;\n }\n\n // eslint-disable-next-line\n if (enforcedPolicyOptions.requireSpecial && !/[!@#$%\\^&*]/g.test(newPassword)) {\n return false;\n }\n\n return true;\n }\n\n getResetPasswordPolicyOptions(\n policies: Policy[],\n orgId: string,\n ): [ResetPasswordPolicyOptions, boolean] {\n const resetPasswordPolicyOptions = new ResetPasswordPolicyOptions();\n\n if (policies == null || orgId == null) {\n return [resetPasswordPolicyOptions, false];\n }\n\n const policy = policies.find(\n (p) => p.organizationId === orgId && p.type === PolicyType.ResetPassword && p.enabled,\n );\n resetPasswordPolicyOptions.autoEnrollEnabled = policy?.data?.autoEnrollEnabled ?? false;\n\n return [resetPasswordPolicyOptions, policy?.enabled ?? false];\n }\n\n async upsert(policy: PolicyData): Promise {\n await this.activeUserPolicyState.update((policies) => {\n policies ??= {};\n policies[policy.id] = policy;\n return policies;\n });\n }\n\n async replace(policies: { [id: string]: PolicyData }): Promise {\n await this.activeUserPolicyState.update(() => policies);\n }\n\n async clear(userId?: UserId): Promise {\n await this.stateProvider.setUserState(POLICIES, null, userId);\n }\n\n /**\n * Determines whether an orgUser is exempt from a specific policy because of their role\n * Generally orgUsers who can manage policies are exempt from them, but some policies are stricter\n */\n private isExemptFromPolicy(policyType: PolicyType, organization: Organization) {\n switch (policyType) {\n case PolicyType.MaximumVaultTimeout:\n // Max Vault Timeout applies to everyone except owners\n return organization.isOwner;\n default:\n return organization.canManagePolicies;\n }\n }\n}\n","import { ProviderUserStatusType, ProviderUserType } from \"../../enums\";\nimport { ProviderData } from \"../data/provider.data\";\n\nexport class Provider {\n id: string;\n name: string;\n status: ProviderUserStatusType;\n type: ProviderUserType;\n enabled: boolean;\n userId: string;\n useEvents: boolean;\n\n constructor(obj?: ProviderData) {\n if (obj == null) {\n return;\n }\n\n this.id = obj.id;\n this.name = obj.name;\n this.status = obj.status;\n this.type = obj.type;\n this.enabled = obj.enabled;\n this.userId = obj.userId;\n this.useEvents = obj.useEvents;\n }\n\n get canAccess() {\n if (this.isProviderAdmin) {\n return true;\n }\n return this.enabled && this.status === ProviderUserStatusType.Confirmed;\n }\n\n get canCreateOrganizations() {\n return this.enabled && this.isProviderAdmin;\n }\n\n get canManageUsers() {\n return this.isProviderAdmin;\n }\n\n get canAccessEventLogs() {\n return this.isProviderAdmin;\n }\n\n get isProviderAdmin() {\n return this.type === ProviderUserType.ProviderAdmin;\n }\n}\n","import { Observable, map, firstValueFrom, of, switchMap, take } from \"rxjs\";\n\nimport { KeyDefinition, PROVIDERS_DISK, StateProvider } from \"../../platform/state\";\nimport { UserId } from \"../../types/guid\";\nimport { ProviderService as ProviderServiceAbstraction } from \"../abstractions/provider.service\";\nimport { ProviderData } from \"../models/data/provider.data\";\nimport { Provider } from \"../models/domain/provider\";\n\nexport const PROVIDERS = KeyDefinition.record(PROVIDERS_DISK, \"providers\", {\n deserializer: (obj: ProviderData) => obj,\n});\n\nfunction mapToSingleProvider(providerId: string) {\n return map((providers) => providers?.find((p) => p.id === providerId));\n}\n\nexport class ProviderService implements ProviderServiceAbstraction {\n constructor(private stateProvider: StateProvider) {}\n\n private providers$(userId?: UserId): Observable {\n // FIXME: Can be replaced with `getUserStateOrDefault$` if we weren't trying to pick this.\n return (\n userId != null\n ? this.stateProvider.getUser(userId, PROVIDERS).state$\n : this.stateProvider.activeUserId$.pipe(\n take(1),\n switchMap((userId) =>\n userId != null ? this.stateProvider.getUser(userId, PROVIDERS).state$ : of(null),\n ),\n )\n ).pipe(this.mapProviderRecordToArray());\n }\n\n private mapProviderRecordToArray() {\n return map, Provider[]>((providers) =>\n Object.values(providers ?? {})?.map((o) => new Provider(o)),\n );\n }\n\n async get(id: string): Promise {\n return await firstValueFrom(this.providers$().pipe(mapToSingleProvider(id)));\n }\n\n async getAll(): Promise {\n return await firstValueFrom(this.providers$());\n }\n\n async save(providers: { [id: string]: ProviderData }, userId?: UserId) {\n await this.stateProvider.setUserState(PROVIDERS, providers, userId);\n }\n}\n","import { VerifyOTPRequest } from \"../../models/request/verify-otp.request\";\n\nexport abstract class UserVerificationApiServiceAbstraction {\n postAccountVerifyOTP: (request: VerifyOTPRequest) => Promise;\n postAccountRequestOTP: () => Promise;\n}\n","import { CredentialAssertionOptionsResponse } from \"../../services/webauthn-login/response/credential-assertion-options.response\";\n\nexport class WebAuthnLoginApiServiceAbstraction {\n getCredentialAssertionOptions: () => Promise;\n}\n","import { Subject, combineLatestWith, map, distinctUntilChanged, shareReplay } from \"rxjs\";\n\nimport {\n AccountInfo,\n InternalAccountService,\n accountInfoEqual,\n} from \"../../auth/abstractions/account.service\";\nimport { LogService } from \"../../platform/abstractions/log.service\";\nimport { MessagingService } from \"../../platform/abstractions/messaging.service\";\nimport {\n ACCOUNT_MEMORY,\n GlobalState,\n GlobalStateProvider,\n KeyDefinition,\n} from \"../../platform/state\";\nimport { UserId } from \"../../types/guid\";\nimport { AuthenticationStatus } from \"../enums/authentication-status\";\n\nexport const ACCOUNT_ACCOUNTS = KeyDefinition.record(\n ACCOUNT_MEMORY,\n \"accounts\",\n {\n deserializer: (accountInfo) => accountInfo,\n },\n);\n\nexport const ACCOUNT_ACTIVE_ACCOUNT_ID = new KeyDefinition(ACCOUNT_MEMORY, \"activeAccountId\", {\n deserializer: (id: UserId) => id,\n});\n\nexport class AccountServiceImplementation implements InternalAccountService {\n private lock = new Subject();\n private logout = new Subject();\n private accountsState: GlobalState>;\n private activeAccountIdState: GlobalState;\n\n accounts$;\n activeAccount$;\n accountLock$ = this.lock.asObservable();\n accountLogout$ = this.logout.asObservable();\n\n constructor(\n private messagingService: MessagingService,\n private logService: LogService,\n private globalStateProvider: GlobalStateProvider,\n ) {\n this.accountsState = this.globalStateProvider.get(ACCOUNT_ACCOUNTS);\n this.activeAccountIdState = this.globalStateProvider.get(ACCOUNT_ACTIVE_ACCOUNT_ID);\n\n this.accounts$ = this.accountsState.state$.pipe(\n map((accounts) => (accounts == null ? {} : accounts)),\n );\n this.activeAccount$ = this.activeAccountIdState.state$.pipe(\n combineLatestWith(this.accounts$),\n map(([id, accounts]) => (id ? { id, ...accounts[id] } : undefined)),\n distinctUntilChanged((a, b) => a?.id === b?.id && accountInfoEqual(a, b)),\n shareReplay({ bufferSize: 1, refCount: false }),\n );\n }\n\n async addAccount(userId: UserId, accountData: AccountInfo): Promise {\n await this.accountsState.update((accounts) => {\n accounts ||= {};\n accounts[userId] = accountData;\n return accounts;\n });\n }\n\n async setAccountName(userId: UserId, name: string): Promise {\n await this.setAccountInfo(userId, { name });\n }\n\n async setAccountEmail(userId: UserId, email: string): Promise {\n await this.setAccountInfo(userId, { email });\n }\n\n async setAccountStatus(userId: UserId, status: AuthenticationStatus): Promise {\n await this.setAccountInfo(userId, { status });\n\n if (status === AuthenticationStatus.LoggedOut) {\n this.logout.next(userId);\n } else if (status === AuthenticationStatus.Locked) {\n this.lock.next(userId);\n }\n }\n\n async setMaxAccountStatus(userId: UserId, maxStatus: AuthenticationStatus): Promise {\n await this.accountsState.update(\n (accounts) => {\n accounts[userId].status = maxStatus;\n return accounts;\n },\n {\n shouldUpdate: (accounts) => {\n if (accounts?.[userId] == null) {\n throw new Error(\"Account does not exist\");\n }\n\n return accounts[userId].status > maxStatus;\n },\n },\n );\n }\n\n async switchAccount(userId: UserId): Promise {\n await this.activeAccountIdState.update(\n (_, accounts) => {\n if (userId == null) {\n // indicates no account is active\n return null;\n }\n\n if (accounts?.[userId] == null) {\n throw new Error(\"Account does not exist\");\n }\n return userId;\n },\n {\n combineLatestWith: this.accounts$,\n shouldUpdate: (id) => {\n // update only if userId changes\n return id !== userId;\n },\n },\n );\n }\n\n // TODO: update to use our own account status settings. Requires inverting direction of state service accounts flow\n async delete(): Promise {\n try {\n this.messagingService?.send(\"logout\");\n } catch (e) {\n this.logService.error(e);\n throw e;\n }\n }\n\n private async setAccountInfo(userId: UserId, update: Partial): Promise {\n function newAccountInfo(oldAccountInfo: AccountInfo): AccountInfo {\n return { ...oldAccountInfo, ...update };\n }\n await this.accountsState.update(\n (accounts) => {\n accounts[userId] = newAccountInfo(accounts[userId]);\n return accounts;\n },\n {\n // Avoid unnecessary updates\n // TODO: Faster comparison, maybe include a hash on the objects?\n shouldUpdate: (accounts) => {\n if (accounts?.[userId] == null) {\n throw new Error(\"Account does not exist\");\n }\n\n return !accountInfoEqual(accounts[userId], newAccountInfo(accounts[userId]));\n },\n },\n );\n }\n}\n","import { NotificationType } from \"../../enums\";\n\nimport { BaseResponse } from \"./base.response\";\n\nexport class NotificationResponse extends BaseResponse {\n contextId: string;\n type: NotificationType;\n payload: any;\n\n constructor(response: any) {\n super(response);\n this.contextId = this.getResponseProperty(\"ContextId\");\n this.type = this.getResponseProperty(\"Type\");\n\n const payload = this.getResponseProperty(\"Payload\");\n switch (this.type) {\n case NotificationType.SyncCipherCreate:\n case NotificationType.SyncCipherDelete:\n case NotificationType.SyncCipherUpdate:\n case NotificationType.SyncLoginDelete:\n this.payload = new SyncCipherNotification(payload);\n break;\n case NotificationType.SyncFolderCreate:\n case NotificationType.SyncFolderDelete:\n case NotificationType.SyncFolderUpdate:\n this.payload = new SyncFolderNotification(payload);\n break;\n case NotificationType.SyncVault:\n case NotificationType.SyncCiphers:\n case NotificationType.SyncOrganizations:\n case NotificationType.SyncOrgKeys:\n case NotificationType.SyncSettings:\n case NotificationType.LogOut:\n this.payload = new UserNotification(payload);\n break;\n case NotificationType.SyncSendCreate:\n case NotificationType.SyncSendUpdate:\n case NotificationType.SyncSendDelete:\n this.payload = new SyncSendNotification(payload);\n break;\n case NotificationType.AuthRequest:\n case NotificationType.AuthRequestResponse:\n this.payload = new AuthRequestPushNotification(payload);\n break;\n default:\n break;\n }\n }\n}\n\nexport class SyncCipherNotification extends BaseResponse {\n id: string;\n userId: string;\n organizationId: string;\n collectionIds: string[];\n revisionDate: Date;\n\n constructor(response: any) {\n super(response);\n this.id = this.getResponseProperty(\"Id\");\n this.userId = this.getResponseProperty(\"UserId\");\n this.organizationId = this.getResponseProperty(\"OrganizationId\");\n this.collectionIds = this.getResponseProperty(\"CollectionIds\");\n this.revisionDate = new Date(this.getResponseProperty(\"RevisionDate\"));\n }\n}\n\nexport class SyncFolderNotification extends BaseResponse {\n id: string;\n userId: string;\n revisionDate: Date;\n\n constructor(response: any) {\n super(response);\n this.id = this.getResponseProperty(\"Id\");\n this.userId = this.getResponseProperty(\"UserId\");\n this.revisionDate = new Date(this.getResponseProperty(\"RevisionDate\"));\n }\n}\n\nexport class UserNotification extends BaseResponse {\n userId: string;\n date: Date;\n\n constructor(response: any) {\n super(response);\n this.userId = this.getResponseProperty(\"UserId\");\n this.date = new Date(this.getResponseProperty(\"Date\"));\n }\n}\n\nexport class SyncSendNotification extends BaseResponse {\n id: string;\n userId: string;\n revisionDate: Date;\n\n constructor(response: any) {\n super(response);\n this.id = this.getResponseProperty(\"Id\");\n this.userId = this.getResponseProperty(\"UserId\");\n this.revisionDate = new Date(this.getResponseProperty(\"RevisionDate\"));\n }\n}\n\nexport class AuthRequestPushNotification extends BaseResponse {\n id: string;\n userId: string;\n\n constructor(response: any) {\n super(response);\n this.id = this.getResponseProperty(\"Id\");\n this.userId = this.getResponseProperty(\"UserId\");\n }\n}\n","export class UpdateAvatarRequest {\n avatarColor: string;\n\n constructor(avatarColor: string) {\n this.avatarColor = avatarColor;\n }\n}\n","import { Observable } from \"rxjs\";\n\nimport { ApiService } from \"../../abstractions/api.service\";\nimport { UpdateAvatarRequest } from \"../../models/request/update-avatar.request\";\nimport { AVATAR_DISK, StateProvider, UserKeyDefinition } from \"../../platform/state\";\nimport { UserId } from \"../../types/guid\";\nimport { AvatarService as AvatarServiceAbstraction } from \"../abstractions/avatar.service\";\n\nconst AVATAR_COLOR = new UserKeyDefinition(AVATAR_DISK, \"avatarColor\", {\n deserializer: (value) => value,\n clearOn: [],\n});\n\nexport class AvatarService implements AvatarServiceAbstraction {\n avatarColor$: Observable;\n\n constructor(\n private apiService: ApiService,\n private stateProvider: StateProvider,\n ) {\n this.avatarColor$ = this.stateProvider.getActive(AVATAR_COLOR).state$;\n }\n\n async setAvatarColor(color: string): Promise {\n const { avatarColor } = await this.apiService.putAvatar(new UpdateAvatarRequest(color));\n\n await this.stateProvider.setUserState(AVATAR_COLOR, avatarColor);\n }\n\n async setSyncAvatarColor(userId: UserId, color: string): Promise {\n await this.stateProvider.getUser(userId, AVATAR_COLOR).update(() => color);\n }\n\n getUserAvatarColor$(userId: UserId): Observable {\n return this.stateProvider.getUser(userId, AVATAR_COLOR).state$;\n }\n}\n","import { SecretVerificationRequest } from \"./secret-verification.request\";\n\nexport class UpdateDevicesTrustRequest extends SecretVerificationRequest {\n currentDevice: DeviceKeysUpdateRequest;\n otherDevices: OtherDeviceKeysUpdateRequest[];\n}\n\nexport class DeviceKeysUpdateRequest {\n encryptedPublicKey: string;\n encryptedUserKey: string;\n}\n\nexport class OtherDeviceKeysUpdateRequest extends DeviceKeysUpdateRequest {\n id: string;\n}\n","import { DeviceType } from \"../../../../enums\";\nimport { View } from \"../../../../models/view/view\";\nimport { DeviceResponse } from \"../responses/device.response\";\n\nexport class DeviceView implements View {\n id: string;\n userId: string;\n name: string;\n identifier: string;\n type: DeviceType;\n creationDate: string;\n revisionDate: string;\n\n constructor(deviceResponse: DeviceResponse) {\n Object.assign(this, deviceResponse);\n }\n}\n","import { DeviceType } from \"../../../../enums\";\nimport { BaseResponse } from \"../../../../models/response/base.response\";\n\nexport class DeviceResponse extends BaseResponse {\n id: string;\n userId: string;\n name: string;\n identifier: string;\n type: DeviceType;\n creationDate: string;\n revisionDate: string;\n constructor(response: any) {\n super(response);\n this.id = this.getResponseProperty(\"Id\");\n this.userId = this.getResponseProperty(\"UserId\");\n this.name = this.getResponseProperty(\"Name\");\n this.identifier = this.getResponseProperty(\"Identifier\");\n this.type = this.getResponseProperty(\"Type\");\n this.creationDate = this.getResponseProperty(\"CreationDate\");\n this.revisionDate = this.getResponseProperty(\"RevisionDate\");\n }\n}\n","import { Jsonify } from \"type-fest\";\n\nimport { DeviceType } from \"../../../enums\";\nimport { BaseResponse } from \"../../../models/response/base.response\";\nimport { EncString } from \"../../../platform/models/domain/enc-string\";\n\nexport class ProtectedDeviceResponse extends BaseResponse {\n constructor(response: Jsonify) {\n super(response);\n this.id = this.getResponseProperty(\"id\");\n this.name = this.getResponseProperty(\"name\");\n this.identifier = this.getResponseProperty(\"identifier\");\n this.type = this.getResponseProperty(\"type\");\n this.creationDate = new Date(this.getResponseProperty(\"creationDate\"));\n if (response.encryptedUserKey) {\n this.encryptedUserKey = new EncString(this.getResponseProperty(\"encryptedUserKey\"));\n }\n if (response.encryptedPublicKey) {\n this.encryptedPublicKey = new EncString(this.getResponseProperty(\"encryptedPublicKey\"));\n }\n }\n\n id: string;\n name: string;\n type: DeviceType;\n identifier: string;\n creationDate: Date;\n /**\n * Intended to be the users symmetric key that is encrypted in some form, the current way to encrypt this is with\n * the devices public key.\n */\n encryptedUserKey: EncString;\n /**\n * Intended to be the public key that was generated for a device upon trust and encrypted. Currenly encrypted using\n * a users symmetric key so that when trusted and unlocked a user can decrypt the public key for all their devices.\n * This enabled a user to rotate the keys for all of their devices.\n */\n encryptedPublicKey: EncString;\n}\n","export class TrustedDeviceKeysRequest {\n constructor(\n public encryptedUserKey: string,\n public encryptedPublicKey: string,\n public encryptedPrivateKey: string,\n ) {}\n}\n","export class KeyConnectorUserKeyRequest {\n key: string;\n\n constructor(key: string) {\n this.key = key;\n }\n}\n","import { KeysRequest } from \"../../../models/request/keys.request\";\nimport { KdfType } from \"../../../platform/enums\";\nimport { KdfConfig } from \"../domain/kdf-config\";\n\nexport class SetKeyConnectorKeyRequest {\n key: string;\n keys: KeysRequest;\n kdf: KdfType;\n kdfIterations: number;\n kdfMemory?: number;\n kdfParallelism?: number;\n orgIdentifier: string;\n\n constructor(\n key: string,\n kdf: KdfType,\n kdfConfig: KdfConfig,\n orgIdentifier: string,\n keys: KeysRequest,\n ) {\n this.key = key;\n this.kdf = kdf;\n this.kdfIterations = kdfConfig.iterations;\n this.kdfMemory = kdfConfig.memory;\n this.kdfParallelism = kdfConfig.parallelism;\n this.orgIdentifier = orgIdentifier;\n this.keys = keys;\n }\n}\n","import { StateService } from \"../../platform/abstractions/state.service\";\nimport { LoginService as LoginServiceAbstraction } from \"../abstractions/login.service\";\n\nexport class LoginService implements LoginServiceAbstraction {\n private _email: string;\n private _rememberEmail: boolean;\n\n constructor(private stateService: StateService) {}\n\n getEmail() {\n return this._email;\n }\n\n getRememberEmail() {\n return this._rememberEmail;\n }\n\n setEmail(value: string) {\n this._email = value;\n }\n\n setRememberEmail(value: boolean) {\n this._rememberEmail = value;\n }\n\n clearValues() {\n this._email = null;\n this._rememberEmail = null;\n }\n\n async saveEmailSettings() {\n await this.stateService.setRememberedEmail(this._rememberEmail ? this._email : null);\n this.clearValues();\n }\n}\n","import { firstValueFrom } from \"rxjs\";\n\nimport {\n ActiveUserState,\n GlobalState,\n KeyDefinition,\n SSO_DISK,\n StateProvider,\n} from \"../../platform/state\";\nimport { SsoLoginServiceAbstraction } from \"../abstractions/sso-login.service.abstraction\";\n\n/**\n * Uses disk storage so that the code verifier can be persisted across sso redirects.\n */\nconst CODE_VERIFIER = new KeyDefinition(SSO_DISK, \"ssoCodeVerifier\", {\n deserializer: (codeVerifier) => codeVerifier,\n});\n\n/**\n * Uses disk storage so that the sso state can be persisted across sso redirects.\n */\nconst SSO_STATE = new KeyDefinition(SSO_DISK, \"ssoState\", {\n deserializer: (state) => state,\n});\n\n/**\n * Uses disk storage so that the organization sso identifier can be persisted across sso redirects.\n */\nconst ORGANIZATION_SSO_IDENTIFIER = new KeyDefinition(\n SSO_DISK,\n \"organizationSsoIdentifier\",\n {\n deserializer: (organizationIdentifier) => organizationIdentifier,\n },\n);\n\n/**\n * Uses disk storage so that the user's email can be persisted across sso redirects.\n */\nconst SSO_EMAIL = new KeyDefinition(SSO_DISK, \"ssoEmail\", {\n deserializer: (state) => state,\n});\n\nexport class SsoLoginService implements SsoLoginServiceAbstraction {\n private codeVerifierState: GlobalState;\n private ssoState: GlobalState;\n private orgSsoIdentifierState: GlobalState;\n private ssoEmailState: GlobalState;\n private activeUserOrgSsoIdentifierState: ActiveUserState;\n\n constructor(private stateProvider: StateProvider) {\n this.codeVerifierState = this.stateProvider.getGlobal(CODE_VERIFIER);\n this.ssoState = this.stateProvider.getGlobal(SSO_STATE);\n this.orgSsoIdentifierState = this.stateProvider.getGlobal(ORGANIZATION_SSO_IDENTIFIER);\n this.ssoEmailState = this.stateProvider.getGlobal(SSO_EMAIL);\n this.activeUserOrgSsoIdentifierState = this.stateProvider.getActive(\n ORGANIZATION_SSO_IDENTIFIER,\n );\n }\n\n getCodeVerifier(): Promise {\n return firstValueFrom(this.codeVerifierState.state$);\n }\n\n async setCodeVerifier(codeVerifier: string): Promise {\n await this.codeVerifierState.update((_) => codeVerifier);\n }\n\n getSsoState(): Promise {\n return firstValueFrom(this.ssoState.state$);\n }\n\n async setSsoState(ssoState: string): Promise {\n await this.ssoState.update((_) => ssoState);\n }\n\n getOrganizationSsoIdentifier(): Promise {\n return firstValueFrom(this.orgSsoIdentifierState.state$);\n }\n\n async setOrganizationSsoIdentifier(organizationIdentifier: string): Promise {\n await this.orgSsoIdentifierState.update((_) => organizationIdentifier);\n }\n\n getSsoEmail(): Promise {\n return firstValueFrom(this.ssoEmailState.state$);\n }\n\n async setSsoEmail(email: string): Promise {\n await this.ssoEmailState.update((_) => email);\n }\n\n getActiveUserOrganizationSsoIdentifier(): Promise {\n return firstValueFrom(this.activeUserOrgSsoIdentifierState.state$);\n }\n\n async setActiveUserOrganizationSsoIdentifier(organizationIdentifier: string): Promise {\n await this.activeUserOrgSsoIdentifierState.update((_) => organizationIdentifier);\n }\n}\n","import { KeyDefinition, TOKEN_DISK, TOKEN_DISK_LOCAL, TOKEN_MEMORY } from \"../../platform/state\";\n\n// Note: all tokens / API key information must be cleared on logout.\n// because we are using secure storage, we must manually call to clean up our tokens.\n// See stateService.deAuthenticateAccount for where we call clearTokens(...)\n\nexport const ACCESS_TOKEN_DISK = new KeyDefinition(TOKEN_DISK, \"accessToken\", {\n deserializer: (accessToken) => accessToken,\n});\n\nexport const ACCESS_TOKEN_MEMORY = new KeyDefinition(TOKEN_MEMORY, \"accessToken\", {\n deserializer: (accessToken) => accessToken,\n});\n\nexport const REFRESH_TOKEN_DISK = new KeyDefinition(TOKEN_DISK, \"refreshToken\", {\n deserializer: (refreshToken) => refreshToken,\n});\n\nexport const REFRESH_TOKEN_MEMORY = new KeyDefinition(TOKEN_MEMORY, \"refreshToken\", {\n deserializer: (refreshToken) => refreshToken,\n});\n\nexport const REFRESH_TOKEN_MIGRATED_TO_SECURE_STORAGE = new KeyDefinition(\n TOKEN_DISK,\n \"refreshTokenMigratedToSecureStorage\",\n {\n deserializer: (refreshTokenMigratedToSecureStorage) => refreshTokenMigratedToSecureStorage,\n },\n);\n\nexport const EMAIL_TWO_FACTOR_TOKEN_RECORD_DISK_LOCAL = KeyDefinition.record(\n TOKEN_DISK_LOCAL,\n \"emailTwoFactorTokenRecord\",\n {\n deserializer: (emailTwoFactorTokenRecord) => emailTwoFactorTokenRecord,\n },\n);\n\nexport const API_KEY_CLIENT_ID_DISK = new KeyDefinition(TOKEN_DISK, \"apiKeyClientId\", {\n deserializer: (apiKeyClientId) => apiKeyClientId,\n});\n\nexport const API_KEY_CLIENT_ID_MEMORY = new KeyDefinition(TOKEN_MEMORY, \"apiKeyClientId\", {\n deserializer: (apiKeyClientId) => apiKeyClientId,\n});\n\nexport const API_KEY_CLIENT_SECRET_DISK = new KeyDefinition(\n TOKEN_DISK,\n \"apiKeyClientSecret\",\n {\n deserializer: (apiKeyClientSecret) => apiKeyClientSecret,\n },\n);\n\nexport const API_KEY_CLIENT_SECRET_MEMORY = new KeyDefinition(\n TOKEN_MEMORY,\n \"apiKeyClientSecret\",\n {\n deserializer: (apiKeyClientSecret) => apiKeyClientSecret,\n },\n);\n","import { firstValueFrom } from \"rxjs\";\nimport { Opaque } from \"type-fest\";\n\nimport { decodeJwtTokenToJson } from \"@bitwarden/auth/common\";\n\nimport { VaultTimeoutAction } from \"../../enums/vault-timeout-action.enum\";\nimport { EncryptService } from \"../../platform/abstractions/encrypt.service\";\nimport { KeyGenerationService } from \"../../platform/abstractions/key-generation.service\";\nimport { LogService } from \"../../platform/abstractions/log.service\";\nimport { AbstractStorageService } from \"../../platform/abstractions/storage.service\";\nimport { StorageLocation } from \"../../platform/enums\";\nimport { EncString, EncryptedString } from \"../../platform/models/domain/enc-string\";\nimport { StorageOptions } from \"../../platform/models/domain/storage-options\";\nimport { SymmetricCryptoKey } from \"../../platform/models/domain/symmetric-crypto-key\";\nimport {\n GlobalState,\n GlobalStateProvider,\n KeyDefinition,\n SingleUserStateProvider,\n} from \"../../platform/state\";\nimport { UserId } from \"../../types/guid\";\nimport { TokenService as TokenServiceAbstraction } from \"../abstractions/token.service\";\n\nimport { ACCOUNT_ACTIVE_ACCOUNT_ID } from \"./account.service\";\nimport {\n ACCESS_TOKEN_DISK,\n ACCESS_TOKEN_MEMORY,\n API_KEY_CLIENT_ID_DISK,\n API_KEY_CLIENT_ID_MEMORY,\n API_KEY_CLIENT_SECRET_DISK,\n API_KEY_CLIENT_SECRET_MEMORY,\n EMAIL_TWO_FACTOR_TOKEN_RECORD_DISK_LOCAL,\n REFRESH_TOKEN_DISK,\n REFRESH_TOKEN_MEMORY,\n REFRESH_TOKEN_MIGRATED_TO_SECURE_STORAGE,\n} from \"./token.state\";\n\nexport enum TokenStorageLocation {\n Disk = \"disk\",\n SecureStorage = \"secureStorage\",\n Memory = \"memory\",\n}\n\n/**\n * Type representing the structure of a standard Bitwarden decoded access token.\n * src: https://datatracker.ietf.org/doc/html/rfc7519#section-4.1\n * Note: all claims are technically optional so we must verify their existence before using them.\n * Note 2: NumericDate is a number representing a date in seconds since the Unix epoch.\n */\nexport type DecodedAccessToken = {\n /** Issuer - the issuer of the token, typically the URL of the authentication server */\n iss?: string;\n\n /** Not Before - a timestamp defining when the token starts being valid */\n nbf?: number;\n\n /** Issued At - a timestamp of when the token was issued */\n iat?: number;\n\n /** Expiration Time - a NumericDate timestamp of when the token will expire */\n exp?: number;\n\n /** Scope - the scope of the access request, such as the permissions the token grants */\n scope?: string[];\n\n /** Authentication Method Reference - the methods used in the authentication */\n amr?: string[];\n\n /** Client ID - the identifier for the client that requested the token */\n client_id?: string;\n\n /** Subject - the unique identifier for the user */\n sub?: string;\n\n /** Authentication Time - a timestamp of when the user authentication occurred */\n auth_time?: number;\n\n /** Identity Provider - the system or service that authenticated the user */\n idp?: string;\n\n /** Premium - a boolean flag indicating whether the account is premium */\n premium?: boolean;\n\n /** Email - the user's email address */\n email?: string;\n\n /** Email Verified - a boolean flag indicating whether the user's email address has been verified */\n email_verified?: boolean;\n\n /**\n * Security Stamp - a unique identifier which invalidates the access token if it changes in the db\n * (typically after critical account changes like a password change)\n */\n sstamp?: string;\n\n /** Name - the name of the user */\n name?: string;\n\n /** Organization Owners - a list of organization owner identifiers */\n orgowner?: string[];\n\n /** Device - the identifier of the device used */\n device?: string;\n\n /** JWT ID - a unique identifier for the JWT */\n jti?: string;\n};\n\n/**\n * A symmetric key for encrypting the access token before the token is stored on disk.\n * This key should be stored in secure storage.\n * */\ntype AccessTokenKey = Opaque;\n\nexport class TokenService implements TokenServiceAbstraction {\n private readonly accessTokenKeySecureStorageKey: string = \"_accessTokenKey\";\n\n private readonly refreshTokenSecureStorageKey: string = \"_refreshToken\";\n\n private emailTwoFactorTokenRecordGlobalState: GlobalState>;\n\n private activeUserIdGlobalState: GlobalState;\n\n constructor(\n // Note: we cannot use ActiveStateProvider because if we ever want to inject\n // this service into the AccountService, we will make a circular dependency\n private singleUserStateProvider: SingleUserStateProvider,\n private globalStateProvider: GlobalStateProvider,\n private readonly platformSupportsSecureStorage: boolean,\n private secureStorageService: AbstractStorageService,\n private keyGenerationService: KeyGenerationService,\n private encryptService: EncryptService,\n private logService: LogService,\n ) {\n this.initializeState();\n }\n\n // pivoting to an approach where we create a symmetric key we store in secure storage\n // which is used to protect the data before persisting to disk.\n // We will also use the same symmetric key to decrypt the data when reading from disk.\n\n private initializeState(): void {\n this.emailTwoFactorTokenRecordGlobalState = this.globalStateProvider.get(\n EMAIL_TWO_FACTOR_TOKEN_RECORD_DISK_LOCAL,\n );\n\n this.activeUserIdGlobalState = this.globalStateProvider.get(ACCOUNT_ACTIVE_ACCOUNT_ID);\n }\n\n async setTokens(\n accessToken: string,\n vaultTimeoutAction: VaultTimeoutAction,\n vaultTimeout: number | null,\n refreshToken?: string,\n clientIdClientSecret?: [string, string],\n ): Promise {\n if (!accessToken) {\n throw new Error(\"Access token is required.\");\n }\n\n // get user id the access token\n const userId: UserId = await this.getUserIdFromAccessToken(accessToken);\n\n if (!userId) {\n throw new Error(\"User id not found. Cannot set tokens.\");\n }\n\n await this._setAccessToken(accessToken, vaultTimeoutAction, vaultTimeout, userId);\n\n if (refreshToken) {\n await this.setRefreshToken(refreshToken, vaultTimeoutAction, vaultTimeout, userId);\n }\n\n if (clientIdClientSecret != null) {\n await this.setClientId(clientIdClientSecret[0], vaultTimeoutAction, vaultTimeout, userId);\n await this.setClientSecret(clientIdClientSecret[1], vaultTimeoutAction, vaultTimeout, userId);\n }\n }\n\n private async getAccessTokenKey(userId: UserId): Promise {\n const accessTokenKeyB64 = await this.secureStorageService.get<\n ReturnType\n >(`${userId}${this.accessTokenKeySecureStorageKey}`, this.getSecureStorageOptions(userId));\n\n if (!accessTokenKeyB64) {\n return null;\n }\n\n const accessTokenKey = SymmetricCryptoKey.fromJSON(accessTokenKeyB64) as AccessTokenKey;\n return accessTokenKey;\n }\n\n private async createAndSaveAccessTokenKey(userId: UserId): Promise {\n const newAccessTokenKey = (await this.keyGenerationService.createKey(512)) as AccessTokenKey;\n\n await this.secureStorageService.save(\n `${userId}${this.accessTokenKeySecureStorageKey}`,\n newAccessTokenKey,\n this.getSecureStorageOptions(userId),\n );\n\n return newAccessTokenKey;\n }\n\n private async clearAccessTokenKey(userId: UserId): Promise {\n await this.secureStorageService.remove(\n `${userId}${this.accessTokenKeySecureStorageKey}`,\n this.getSecureStorageOptions(userId),\n );\n }\n\n private async getOrCreateAccessTokenKey(userId: UserId): Promise {\n if (!this.platformSupportsSecureStorage) {\n throw new Error(\"Platform does not support secure storage. Cannot obtain access token key.\");\n }\n\n if (!userId) {\n throw new Error(\"User id not found. Cannot obtain access token key.\");\n }\n\n // First see if we have an accessTokenKey in secure storage and return it if we do\n let accessTokenKey: AccessTokenKey = await this.getAccessTokenKey(userId);\n\n if (!accessTokenKey) {\n // Otherwise, create a new one and save it to secure storage, then return it\n accessTokenKey = await this.createAndSaveAccessTokenKey(userId);\n }\n\n return accessTokenKey;\n }\n\n private async encryptAccessToken(accessToken: string, userId: UserId): Promise {\n const accessTokenKey = await this.getOrCreateAccessTokenKey(userId);\n\n return await this.encryptService.encrypt(accessToken, accessTokenKey);\n }\n\n private async decryptAccessToken(\n encryptedAccessToken: EncString,\n userId: UserId,\n ): Promise {\n const accessTokenKey = await this.getAccessTokenKey(userId);\n\n if (!accessTokenKey) {\n // If we don't have an accessTokenKey, then that means we don't have an access token as it hasn't been set yet\n // and we have to return null here to properly indicate the the user isn't logged in.\n return null;\n }\n\n const decryptedAccessToken = await this.encryptService.decryptToUtf8(\n encryptedAccessToken,\n accessTokenKey,\n );\n\n return decryptedAccessToken;\n }\n\n /**\n * Internal helper for set access token which always requires user id.\n * This is useful because setTokens always will have a user id from the access token whereas\n * the public setAccessToken method does not.\n */\n private async _setAccessToken(\n accessToken: string,\n vaultTimeoutAction: VaultTimeoutAction,\n vaultTimeout: number | null,\n userId: UserId,\n ): Promise {\n const storageLocation = await this.determineStorageLocation(\n vaultTimeoutAction,\n vaultTimeout,\n true,\n );\n\n switch (storageLocation) {\n case TokenStorageLocation.SecureStorage: {\n // Secure storage implementations have variable length limitations (Windows), so we cannot\n // store the access token directly. Instead, we encrypt with accessTokenKey and store that\n // in secure storage.\n\n const encryptedAccessToken: EncString = await this.encryptAccessToken(accessToken, userId);\n\n // Save the encrypted access token to disk\n await this.singleUserStateProvider\n .get(userId, ACCESS_TOKEN_DISK)\n .update((_) => encryptedAccessToken.encryptedString);\n\n // TODO: PM-6408 - https://bitwarden.atlassian.net/browse/PM-6408\n // 2024-02-20: Remove access token from memory so that we migrate to encrypt the access token over time.\n // Remove this call to remove the access token from memory after 3 releases.\n await this.singleUserStateProvider.get(userId, ACCESS_TOKEN_MEMORY).update((_) => null);\n\n return;\n }\n case TokenStorageLocation.Disk:\n // Access token stored on disk unencrypted as platform does not support secure storage\n await this.singleUserStateProvider\n .get(userId, ACCESS_TOKEN_DISK)\n .update((_) => accessToken);\n return;\n case TokenStorageLocation.Memory:\n // Access token stored in memory due to vault timeout settings\n await this.singleUserStateProvider\n .get(userId, ACCESS_TOKEN_MEMORY)\n .update((_) => accessToken);\n return;\n }\n }\n\n async setAccessToken(\n accessToken: string,\n vaultTimeoutAction: VaultTimeoutAction,\n vaultTimeout: number | null,\n ): Promise {\n if (!accessToken) {\n throw new Error(\"Access token is required.\");\n }\n const userId: UserId = await this.getUserIdFromAccessToken(accessToken);\n\n // If we don't have a user id, we can't save the value\n if (!userId) {\n throw new Error(\"User id not found. Cannot save access token.\");\n }\n\n await this._setAccessToken(accessToken, vaultTimeoutAction, vaultTimeout, userId);\n }\n\n async clearAccessToken(userId?: UserId): Promise {\n userId ??= await firstValueFrom(this.activeUserIdGlobalState.state$);\n\n // If we don't have a user id, we can't clear the value\n if (!userId) {\n throw new Error(\"User id not found. Cannot clear access token.\");\n }\n\n // TODO: re-eval this implementation once we get shared key definitions for vault timeout and vault timeout action data.\n // we can't determine storage location w/out vaultTimeoutAction and vaultTimeout\n // but we can simply clear all locations to avoid the need to require those parameters.\n\n if (this.platformSupportsSecureStorage) {\n // Always clear the access token key when clearing the access token\n // The next set of the access token will create a new access token key\n await this.clearAccessTokenKey(userId);\n }\n\n // Platform doesn't support secure storage, so use state provider implementation\n await this.singleUserStateProvider.get(userId, ACCESS_TOKEN_DISK).update((_) => null);\n await this.singleUserStateProvider.get(userId, ACCESS_TOKEN_MEMORY).update((_) => null);\n }\n\n async getAccessToken(userId?: UserId): Promise {\n userId ??= await firstValueFrom(this.activeUserIdGlobalState.state$);\n\n if (!userId) {\n return undefined;\n }\n\n // Try to get the access token from memory\n const accessTokenMemory = await this.getStateValueByUserIdAndKeyDef(\n userId,\n ACCESS_TOKEN_MEMORY,\n );\n if (accessTokenMemory != null) {\n return accessTokenMemory;\n }\n\n // If memory is null, read from disk\n const accessTokenDisk = await this.getStateValueByUserIdAndKeyDef(userId, ACCESS_TOKEN_DISK);\n if (!accessTokenDisk) {\n return null;\n }\n\n if (this.platformSupportsSecureStorage) {\n const accessTokenKey = await this.getAccessTokenKey(userId);\n\n if (!accessTokenKey) {\n // We know this is an unencrypted access token because we don't have an access token key\n return accessTokenDisk;\n }\n\n try {\n const encryptedAccessTokenEncString = new EncString(accessTokenDisk as EncryptedString);\n\n const decryptedAccessToken = await this.decryptAccessToken(\n encryptedAccessTokenEncString,\n userId,\n );\n return decryptedAccessToken;\n } catch (error) {\n // If an error occurs during decryption, return null for logout.\n // We don't try to recover here since we'd like to know\n // if access token and key are getting out of sync.\n this.logService.error(\n `Failed to decrypt access token: ${error?.message ?? \"Unknown error.\"}`,\n );\n return null;\n }\n }\n return accessTokenDisk;\n }\n\n // Private because we only ever set the refresh token when also setting the access token\n // and we need the user id from the access token to save to secure storage\n private async setRefreshToken(\n refreshToken: string,\n vaultTimeoutAction: VaultTimeoutAction,\n vaultTimeout: number | null,\n userId: UserId,\n ): Promise {\n // If we don't have a user id, we can't save the value\n if (!userId) {\n throw new Error(\"User id not found. Cannot save refresh token.\");\n }\n\n const storageLocation = await this.determineStorageLocation(\n vaultTimeoutAction,\n vaultTimeout,\n true,\n );\n\n switch (storageLocation) {\n case TokenStorageLocation.SecureStorage:\n await this.saveStringToSecureStorage(\n userId,\n this.refreshTokenSecureStorageKey,\n refreshToken,\n );\n\n // TODO: PM-6408 - https://bitwarden.atlassian.net/browse/PM-6408\n // 2024-02-20: Remove refresh token from memory and disk so that we migrate to secure storage over time.\n // Remove these 2 calls to remove the refresh token from memory and disk after 3 releases.\n await this.singleUserStateProvider.get(userId, REFRESH_TOKEN_DISK).update((_) => null);\n await this.singleUserStateProvider.get(userId, REFRESH_TOKEN_MEMORY).update((_) => null);\n\n // Set flag to indicate that the refresh token has been migrated to secure storage (don't remove this)\n await this.setRefreshTokenMigratedToSecureStorage(userId);\n\n return;\n\n case TokenStorageLocation.Disk:\n await this.singleUserStateProvider\n .get(userId, REFRESH_TOKEN_DISK)\n .update((_) => refreshToken);\n return;\n\n case TokenStorageLocation.Memory:\n await this.singleUserStateProvider\n .get(userId, REFRESH_TOKEN_MEMORY)\n .update((_) => refreshToken);\n return;\n }\n }\n\n async getRefreshToken(userId?: UserId): Promise {\n userId ??= await firstValueFrom(this.activeUserIdGlobalState.state$);\n\n if (!userId) {\n return undefined;\n }\n\n const refreshTokenMigratedToSecureStorage =\n await this.getRefreshTokenMigratedToSecureStorage(userId);\n if (this.platformSupportsSecureStorage && refreshTokenMigratedToSecureStorage) {\n return await this.getStringFromSecureStorage(userId, this.refreshTokenSecureStorageKey);\n }\n\n // pre-secure storage migration:\n // Always read memory first b/c faster\n const refreshTokenMemory = await this.getStateValueByUserIdAndKeyDef(\n userId,\n REFRESH_TOKEN_MEMORY,\n );\n\n if (refreshTokenMemory != null) {\n return refreshTokenMemory;\n }\n\n // if memory is null, read from disk\n const refreshTokenDisk = await this.getStateValueByUserIdAndKeyDef(userId, REFRESH_TOKEN_DISK);\n\n if (refreshTokenDisk != null) {\n return refreshTokenDisk;\n }\n\n return null;\n }\n\n private async clearRefreshToken(userId: UserId): Promise {\n // If we don't have a user id, we can't clear the value\n if (!userId) {\n throw new Error(\"User id not found. Cannot clear refresh token.\");\n }\n\n // TODO: re-eval this once we get shared key definitions for vault timeout and vault timeout action data.\n // we can't determine storage location w/out vaultTimeoutAction and vaultTimeout\n // but we can simply clear all locations to avoid the need to require those parameters\n\n if (this.platformSupportsSecureStorage) {\n await this.secureStorageService.remove(\n `${userId}${this.refreshTokenSecureStorageKey}`,\n this.getSecureStorageOptions(userId),\n );\n }\n\n // Platform doesn't support secure storage, so use state provider implementation\n await this.singleUserStateProvider.get(userId, REFRESH_TOKEN_MEMORY).update((_) => null);\n await this.singleUserStateProvider.get(userId, REFRESH_TOKEN_DISK).update((_) => null);\n }\n\n private async getRefreshTokenMigratedToSecureStorage(userId: UserId): Promise {\n return await firstValueFrom(\n this.singleUserStateProvider.get(userId, REFRESH_TOKEN_MIGRATED_TO_SECURE_STORAGE).state$,\n );\n }\n\n private async setRefreshTokenMigratedToSecureStorage(userId: UserId): Promise {\n await this.singleUserStateProvider\n .get(userId, REFRESH_TOKEN_MIGRATED_TO_SECURE_STORAGE)\n .update((_) => true);\n }\n\n async setClientId(\n clientId: string,\n vaultTimeoutAction: VaultTimeoutAction,\n vaultTimeout: number | null,\n userId?: UserId,\n ): Promise {\n userId ??= await firstValueFrom(this.activeUserIdGlobalState.state$);\n\n // If we don't have a user id, we can't save the value\n if (!userId) {\n throw new Error(\"User id not found. Cannot save client id.\");\n }\n\n const storageLocation = await this.determineStorageLocation(\n vaultTimeoutAction,\n vaultTimeout,\n false, // don't use secure storage for client id\n );\n\n if (storageLocation === TokenStorageLocation.Disk) {\n await this.singleUserStateProvider\n .get(userId, API_KEY_CLIENT_ID_DISK)\n .update((_) => clientId);\n } else if (storageLocation === TokenStorageLocation.Memory) {\n await this.singleUserStateProvider\n .get(userId, API_KEY_CLIENT_ID_MEMORY)\n .update((_) => clientId);\n }\n }\n\n async getClientId(userId?: UserId): Promise {\n userId ??= await firstValueFrom(this.activeUserIdGlobalState.state$);\n\n if (!userId) {\n return undefined;\n }\n\n // Always read memory first b/c faster\n const apiKeyClientIdMemory = await this.getStateValueByUserIdAndKeyDef(\n userId,\n API_KEY_CLIENT_ID_MEMORY,\n );\n\n if (apiKeyClientIdMemory != null) {\n return apiKeyClientIdMemory;\n }\n\n // if memory is null, read from disk\n return await this.getStateValueByUserIdAndKeyDef(userId, API_KEY_CLIENT_ID_DISK);\n }\n\n private async clearClientId(userId?: UserId): Promise {\n userId ??= await firstValueFrom(this.activeUserIdGlobalState.state$);\n\n // If we don't have a user id, we can't clear the value\n if (!userId) {\n throw new Error(\"User id not found. Cannot clear client id.\");\n }\n\n // TODO: re-eval this once we get shared key definitions for vault timeout and vault timeout action data.\n // we can't determine storage location w/out vaultTimeoutAction and vaultTimeout\n // but we can simply clear both locations to avoid the need to require those parameters\n\n // Platform doesn't support secure storage, so use state provider implementation\n await this.singleUserStateProvider.get(userId, API_KEY_CLIENT_ID_MEMORY).update((_) => null);\n await this.singleUserStateProvider.get(userId, API_KEY_CLIENT_ID_DISK).update((_) => null);\n }\n\n async setClientSecret(\n clientSecret: string,\n vaultTimeoutAction: VaultTimeoutAction,\n vaultTimeout: number | null,\n userId?: UserId,\n ): Promise {\n userId ??= await firstValueFrom(this.activeUserIdGlobalState.state$);\n\n if (!userId) {\n throw new Error(\"User id not found. Cannot save client secret.\");\n }\n\n const storageLocation = await this.determineStorageLocation(\n vaultTimeoutAction,\n vaultTimeout,\n false, // don't use secure storage for client secret\n );\n\n if (storageLocation === TokenStorageLocation.Disk) {\n await this.singleUserStateProvider\n .get(userId, API_KEY_CLIENT_SECRET_DISK)\n .update((_) => clientSecret);\n } else if (storageLocation === TokenStorageLocation.Memory) {\n await this.singleUserStateProvider\n .get(userId, API_KEY_CLIENT_SECRET_MEMORY)\n .update((_) => clientSecret);\n }\n }\n\n async getClientSecret(userId?: UserId): Promise {\n userId ??= await firstValueFrom(this.activeUserIdGlobalState.state$);\n\n if (!userId) {\n return undefined;\n }\n\n // Always read memory first b/c faster\n const apiKeyClientSecretMemory = await this.getStateValueByUserIdAndKeyDef(\n userId,\n API_KEY_CLIENT_SECRET_MEMORY,\n );\n\n if (apiKeyClientSecretMemory != null) {\n return apiKeyClientSecretMemory;\n }\n\n // if memory is null, read from disk\n return await this.getStateValueByUserIdAndKeyDef(userId, API_KEY_CLIENT_SECRET_DISK);\n }\n\n private async clearClientSecret(userId?: UserId): Promise {\n userId ??= await firstValueFrom(this.activeUserIdGlobalState.state$);\n\n // If we don't have a user id, we can't clear the value\n if (!userId) {\n throw new Error(\"User id not found. Cannot clear client secret.\");\n }\n\n // TODO: re-eval this once we get shared key definitions for vault timeout and vault timeout action data.\n // we can't determine storage location w/out vaultTimeoutAction and vaultTimeout\n // but we can simply clear both locations to avoid the need to require those parameters\n\n // Platform doesn't support secure storage, so use state provider implementation\n await this.singleUserStateProvider\n .get(userId, API_KEY_CLIENT_SECRET_MEMORY)\n .update((_) => null);\n await this.singleUserStateProvider.get(userId, API_KEY_CLIENT_SECRET_DISK).update((_) => null);\n }\n\n async setTwoFactorToken(email: string, twoFactorToken: string): Promise {\n await this.emailTwoFactorTokenRecordGlobalState.update((emailTwoFactorTokenRecord) => {\n emailTwoFactorTokenRecord ??= {};\n\n emailTwoFactorTokenRecord[email] = twoFactorToken;\n return emailTwoFactorTokenRecord;\n });\n }\n\n async getTwoFactorToken(email: string): Promise {\n const emailTwoFactorTokenRecord: Record = await firstValueFrom(\n this.emailTwoFactorTokenRecordGlobalState.state$,\n );\n\n if (!emailTwoFactorTokenRecord) {\n return null;\n }\n\n return emailTwoFactorTokenRecord[email];\n }\n\n async clearTwoFactorToken(email: string): Promise {\n await this.emailTwoFactorTokenRecordGlobalState.update((emailTwoFactorTokenRecord) => {\n emailTwoFactorTokenRecord ??= {};\n delete emailTwoFactorTokenRecord[email];\n return emailTwoFactorTokenRecord;\n });\n }\n\n // TODO: stop accepting optional userIds\n async clearTokens(userId?: UserId): Promise {\n userId ??= await firstValueFrom(this.activeUserIdGlobalState.state$);\n\n if (!userId) {\n throw new Error(\"User id not found. Cannot clear tokens.\");\n }\n\n await Promise.all([\n this.clearAccessToken(userId),\n this.clearRefreshToken(userId),\n this.clearClientId(userId),\n this.clearClientSecret(userId),\n ]);\n }\n\n // jwthelper methods\n // ref https://github.com/auth0/angular-jwt/blob/master/src/angularJwt/services/jwt.js\n\n async decodeAccessToken(token?: string): Promise {\n token = token ?? (await this.getAccessToken());\n\n if (token == null) {\n throw new Error(\"Access token not found.\");\n }\n\n return decodeJwtTokenToJson(token) as DecodedAccessToken;\n }\n\n // TODO: PM-6678- tech debt - consider consolidating the return types of all these access\n // token data retrieval methods to return null if something goes wrong instead of throwing an error.\n\n async getTokenExpirationDate(): Promise {\n let decoded: DecodedAccessToken;\n try {\n decoded = await this.decodeAccessToken();\n } catch (error) {\n throw new Error(\"Failed to decode access token: \" + error.message);\n }\n\n // per RFC, exp claim is optional but if it exists, it should be a number\n if (!decoded || typeof decoded.exp !== \"number\") {\n return null;\n }\n\n // The 0 in Date(0) is the key; it sets the date to the epoch\n const expirationDate = new Date(0);\n expirationDate.setUTCSeconds(decoded.exp);\n return expirationDate;\n }\n\n async tokenSecondsRemaining(offsetSeconds = 0): Promise {\n const date = await this.getTokenExpirationDate();\n if (date == null) {\n return 0;\n }\n\n const msRemaining = date.valueOf() - (new Date().valueOf() + offsetSeconds * 1000);\n return Math.round(msRemaining / 1000);\n }\n\n async tokenNeedsRefresh(minutes = 5): Promise {\n const sRemaining = await this.tokenSecondsRemaining();\n return sRemaining < 60 * minutes;\n }\n\n async getUserId(): Promise {\n let decoded: DecodedAccessToken;\n try {\n decoded = await this.decodeAccessToken();\n } catch (error) {\n throw new Error(\"Failed to decode access token: \" + error.message);\n }\n\n if (!decoded || typeof decoded.sub !== \"string\") {\n throw new Error(\"No user id found\");\n }\n\n return decoded.sub as UserId;\n }\n\n private async getUserIdFromAccessToken(accessToken: string): Promise {\n let decoded: DecodedAccessToken;\n try {\n decoded = await this.decodeAccessToken(accessToken);\n } catch (error) {\n throw new Error(\"Failed to decode access token: \" + error.message);\n }\n\n if (!decoded || typeof decoded.sub !== \"string\") {\n throw new Error(\"No user id found\");\n }\n\n return decoded.sub as UserId;\n }\n\n async getEmail(): Promise {\n let decoded: DecodedAccessToken;\n try {\n decoded = await this.decodeAccessToken();\n } catch (error) {\n throw new Error(\"Failed to decode access token: \" + error.message);\n }\n\n if (!decoded || typeof decoded.email !== \"string\") {\n throw new Error(\"No email found\");\n }\n\n return decoded.email;\n }\n\n async getEmailVerified(): Promise {\n let decoded: DecodedAccessToken;\n try {\n decoded = await this.decodeAccessToken();\n } catch (error) {\n throw new Error(\"Failed to decode access token: \" + error.message);\n }\n\n if (!decoded || typeof decoded.email_verified !== \"boolean\") {\n throw new Error(\"No email verification found\");\n }\n\n return decoded.email_verified;\n }\n\n async getName(): Promise {\n let decoded: DecodedAccessToken;\n try {\n decoded = await this.decodeAccessToken();\n } catch (error) {\n throw new Error(\"Failed to decode access token: \" + error.message);\n }\n\n if (!decoded || typeof decoded.name !== \"string\") {\n return null;\n }\n\n return decoded.name;\n }\n\n async getIssuer(): Promise {\n let decoded: DecodedAccessToken;\n try {\n decoded = await this.decodeAccessToken();\n } catch (error) {\n throw new Error(\"Failed to decode access token: \" + error.message);\n }\n\n if (!decoded || typeof decoded.iss !== \"string\") {\n throw new Error(\"No issuer found\");\n }\n\n return decoded.iss;\n }\n\n async getIsExternal(): Promise {\n let decoded: DecodedAccessToken;\n try {\n decoded = await this.decodeAccessToken();\n } catch (error) {\n throw new Error(\"Failed to decode access token: \" + error.message);\n }\n\n return Array.isArray(decoded.amr) && decoded.amr.includes(\"external\");\n }\n\n private async getStateValueByUserIdAndKeyDef(\n userId: UserId,\n storageLocation: KeyDefinition,\n ): Promise {\n // read from single user state provider\n return await firstValueFrom(this.singleUserStateProvider.get(userId, storageLocation).state$);\n }\n\n private async determineStorageLocation(\n vaultTimeoutAction: VaultTimeoutAction,\n vaultTimeout: number | null,\n useSecureStorage: boolean,\n ): Promise {\n if (vaultTimeoutAction === VaultTimeoutAction.LogOut && vaultTimeout != null) {\n return TokenStorageLocation.Memory;\n } else {\n if (useSecureStorage && this.platformSupportsSecureStorage) {\n return TokenStorageLocation.SecureStorage;\n }\n\n return TokenStorageLocation.Disk;\n }\n }\n\n private async saveStringToSecureStorage(\n userId: UserId,\n storageKey: string,\n value: string,\n ): Promise {\n await this.secureStorageService.save(\n `${userId}${storageKey}`,\n value,\n this.getSecureStorageOptions(userId),\n );\n }\n\n private async getStringFromSecureStorage(\n userId: UserId,\n storageKey: string,\n ): Promise {\n // If we have a user ID, read from secure storage.\n return await this.secureStorageService.get(\n `${userId}${storageKey}`,\n this.getSecureStorageOptions(userId),\n );\n }\n\n private getSecureStorageOptions(userId: UserId): StorageOptions {\n return {\n storageLocation: StorageLocation.Disk,\n useSecureStorage: true,\n userId: userId,\n };\n }\n}\n","export class VerifyOTPRequest {\n OTP: string;\n\n constructor(OTP: string) {\n this.OTP = OTP;\n }\n}\n","import { PrfKey } from \"../../../../types/key\";\nimport { WebAuthnLoginAssertionResponseRequest } from \"../../../services/webauthn-login/request/webauthn-login-assertion-response.request\";\n\nexport class WebAuthnLoginCredentialAssertionView {\n constructor(\n readonly token: string,\n readonly deviceResponse: WebAuthnLoginAssertionResponseRequest,\n readonly prfKey?: PrfKey,\n ) {}\n}\n","export const TYPE_CHECK = {\n FUNCTION: \"function\",\n NUMBER: \"number\",\n STRING: \"string\",\n} as const;\n\nexport const EVENTS = {\n CHANGE: \"change\",\n INPUT: \"input\",\n KEYDOWN: \"keydown\",\n KEYPRESS: \"keypress\",\n KEYUP: \"keyup\",\n BLUR: \"blur\",\n CLICK: \"click\",\n FOCUS: \"focus\",\n SCROLL: \"scroll\",\n RESIZE: \"resize\",\n DOMCONTENTLOADED: \"DOMContentLoaded\",\n LOAD: \"load\",\n MESSAGE: \"message\",\n VISIBILITYCHANGE: \"visibilitychange\",\n FOCUSOUT: \"focusout\",\n} as const;\n\nexport const ClearClipboardDelay = {\n Never: null as null,\n TenSeconds: 10,\n TwentySeconds: 20,\n ThirtySeconds: 30,\n OneMinute: 60,\n TwoMinutes: 120,\n FiveMinutes: 300,\n} as const;\n\n/* Context Menu item Ids */\nexport const AUTOFILL_CARD_ID = \"autofill-card\";\nexport const AUTOFILL_ID = \"autofill\";\nexport const SHOW_AUTOFILL_BUTTON = \"show-autofill-button\";\nexport const AUTOFILL_IDENTITY_ID = \"autofill-identity\";\nexport const COPY_IDENTIFIER_ID = \"copy-identifier\";\nexport const COPY_PASSWORD_ID = \"copy-password\";\nexport const COPY_USERNAME_ID = \"copy-username\";\nexport const COPY_VERIFICATION_CODE_ID = \"copy-totp\";\nexport const CREATE_CARD_ID = \"create-card\";\nexport const CREATE_IDENTITY_ID = \"create-identity\";\nexport const CREATE_LOGIN_ID = \"create-login\";\nexport const GENERATE_PASSWORD_ID = \"generate-password\";\nexport const NOOP_COMMAND_SUFFIX = \"noop\";\nexport const ROOT_ID = \"root\";\nexport const SEPARATOR_ID = \"separator\";\n\nexport const NOTIFICATION_BAR_LIFESPAN_MS = 150000; // 150 seconds\n\nexport const AutofillOverlayVisibility = {\n Off: 0,\n OnButtonClick: 1,\n OnFieldFocus: 2,\n} as const;\n","import { map, Observable } from \"rxjs\";\n\nimport { PolicyService } from \"../../admin-console/abstractions/policy/policy.service.abstraction\";\nimport { PolicyType } from \"../../admin-console/enums\";\nimport {\n AUTOFILL_SETTINGS_DISK,\n AUTOFILL_SETTINGS_DISK_LOCAL,\n ActiveUserState,\n GlobalState,\n KeyDefinition,\n StateProvider,\n} from \"../../platform/state\";\nimport { ClearClipboardDelay, AutofillOverlayVisibility } from \"../constants\";\nimport { ClearClipboardDelaySetting, InlineMenuVisibilitySetting } from \"../types\";\n\nconst AUTOFILL_ON_PAGE_LOAD = new KeyDefinition(AUTOFILL_SETTINGS_DISK, \"autofillOnPageLoad\", {\n deserializer: (value: boolean) => value ?? false,\n});\n\nconst AUTOFILL_ON_PAGE_LOAD_DEFAULT = new KeyDefinition(\n AUTOFILL_SETTINGS_DISK,\n \"autofillOnPageLoadDefault\",\n {\n deserializer: (value: boolean) => value ?? false,\n },\n);\n\nconst AUTOFILL_ON_PAGE_LOAD_CALLOUT_DISMISSED = new KeyDefinition(\n AUTOFILL_SETTINGS_DISK,\n \"autofillOnPageLoadCalloutIsDismissed\",\n {\n deserializer: (value: boolean) => value ?? false,\n },\n);\n\nconst AUTOFILL_ON_PAGE_LOAD_POLICY_TOAST_HAS_DISPLAYED = new KeyDefinition(\n AUTOFILL_SETTINGS_DISK,\n \"autofillOnPageLoadPolicyToastHasDisplayed\",\n {\n deserializer: (value: boolean) => value ?? false,\n },\n);\n\nconst AUTO_COPY_TOTP = new KeyDefinition(AUTOFILL_SETTINGS_DISK, \"autoCopyTotp\", {\n deserializer: (value: boolean) => value ?? true,\n});\n\nconst INLINE_MENU_VISIBILITY = new KeyDefinition(\n AUTOFILL_SETTINGS_DISK_LOCAL,\n \"inlineMenuVisibility\",\n {\n deserializer: (value: InlineMenuVisibilitySetting) => value ?? AutofillOverlayVisibility.Off,\n },\n);\n\nconst ENABLE_CONTEXT_MENU = new KeyDefinition(AUTOFILL_SETTINGS_DISK, \"enableContextMenu\", {\n deserializer: (value: boolean) => value ?? true,\n});\n\nconst CLEAR_CLIPBOARD_DELAY = new KeyDefinition(\n AUTOFILL_SETTINGS_DISK_LOCAL,\n \"clearClipboardDelay\",\n {\n deserializer: (value: ClearClipboardDelaySetting) => value ?? ClearClipboardDelay.Never,\n },\n);\n\nexport abstract class AutofillSettingsServiceAbstraction {\n autofillOnPageLoad$: Observable;\n setAutofillOnPageLoad: (newValue: boolean) => Promise;\n autofillOnPageLoadDefault$: Observable;\n setAutofillOnPageLoadDefault: (newValue: boolean) => Promise;\n autofillOnPageLoadCalloutIsDismissed$: Observable;\n setAutofillOnPageLoadCalloutIsDismissed: (newValue: boolean) => Promise;\n activateAutofillOnPageLoadFromPolicy$: Observable;\n setAutofillOnPageLoadPolicyToastHasDisplayed: (newValue: boolean) => Promise;\n autofillOnPageLoadPolicyToastHasDisplayed$: Observable;\n autoCopyTotp$: Observable;\n setAutoCopyTotp: (newValue: boolean) => Promise;\n inlineMenuVisibility$: Observable;\n setInlineMenuVisibility: (newValue: InlineMenuVisibilitySetting) => Promise;\n enableContextMenu$: Observable;\n setEnableContextMenu: (newValue: boolean) => Promise;\n clearClipboardDelay$: Observable;\n setClearClipboardDelay: (newValue: ClearClipboardDelaySetting) => Promise;\n}\n\nexport class AutofillSettingsService implements AutofillSettingsServiceAbstraction {\n private autofillOnPageLoadState: ActiveUserState;\n readonly autofillOnPageLoad$: Observable;\n\n private autofillOnPageLoadDefaultState: ActiveUserState;\n readonly autofillOnPageLoadDefault$: Observable;\n\n private autofillOnPageLoadCalloutIsDismissedState: ActiveUserState;\n readonly autofillOnPageLoadCalloutIsDismissed$: Observable;\n\n readonly activateAutofillOnPageLoadFromPolicy$: Observable;\n\n private autofillOnPageLoadPolicyToastHasDisplayedState: ActiveUserState;\n readonly autofillOnPageLoadPolicyToastHasDisplayed$: Observable;\n\n private autoCopyTotpState: ActiveUserState;\n readonly autoCopyTotp$: Observable;\n\n private inlineMenuVisibilityState: GlobalState;\n readonly inlineMenuVisibility$: Observable;\n\n private enableContextMenuState: GlobalState;\n readonly enableContextMenu$: Observable;\n\n private clearClipboardDelayState: ActiveUserState;\n readonly clearClipboardDelay$: Observable;\n\n constructor(\n private stateProvider: StateProvider,\n private policyService: PolicyService,\n ) {\n this.autofillOnPageLoadState = this.stateProvider.getActive(AUTOFILL_ON_PAGE_LOAD);\n this.autofillOnPageLoad$ = this.autofillOnPageLoadState.state$.pipe(map((x) => x ?? false));\n\n this.autofillOnPageLoadDefaultState = this.stateProvider.getActive(\n AUTOFILL_ON_PAGE_LOAD_DEFAULT,\n );\n this.autofillOnPageLoadDefault$ = this.autofillOnPageLoadDefaultState.state$.pipe(\n map((x) => x ?? true),\n );\n\n this.autofillOnPageLoadCalloutIsDismissedState = this.stateProvider.getActive(\n AUTOFILL_ON_PAGE_LOAD_CALLOUT_DISMISSED,\n );\n this.autofillOnPageLoadCalloutIsDismissed$ =\n this.autofillOnPageLoadCalloutIsDismissedState.state$.pipe(map((x) => x ?? false));\n\n this.activateAutofillOnPageLoadFromPolicy$ = this.policyService.policyAppliesToActiveUser$(\n PolicyType.ActivateAutofill,\n );\n\n this.autofillOnPageLoadPolicyToastHasDisplayedState = this.stateProvider.getActive(\n AUTOFILL_ON_PAGE_LOAD_POLICY_TOAST_HAS_DISPLAYED,\n );\n this.autofillOnPageLoadPolicyToastHasDisplayed$ = this.autofillOnPageLoadState.state$.pipe(\n map((x) => x ?? false),\n );\n\n this.autoCopyTotpState = this.stateProvider.getActive(AUTO_COPY_TOTP);\n this.autoCopyTotp$ = this.autoCopyTotpState.state$.pipe(map((x) => x ?? true));\n\n this.inlineMenuVisibilityState = this.stateProvider.getGlobal(INLINE_MENU_VISIBILITY);\n this.inlineMenuVisibility$ = this.inlineMenuVisibilityState.state$.pipe(\n map((x) => x ?? AutofillOverlayVisibility.Off),\n );\n\n this.enableContextMenuState = this.stateProvider.getGlobal(ENABLE_CONTEXT_MENU);\n this.enableContextMenu$ = this.enableContextMenuState.state$.pipe(map((x) => x ?? true));\n\n this.clearClipboardDelayState = this.stateProvider.getActive(CLEAR_CLIPBOARD_DELAY);\n this.clearClipboardDelay$ = this.clearClipboardDelayState.state$.pipe(\n map((x) => x ?? ClearClipboardDelay.Never),\n );\n }\n\n async setAutofillOnPageLoad(newValue: boolean): Promise {\n await this.autofillOnPageLoadState.update(() => newValue);\n }\n\n async setAutofillOnPageLoadDefault(newValue: boolean): Promise {\n await this.autofillOnPageLoadDefaultState.update(() => newValue);\n }\n\n async setAutofillOnPageLoadCalloutIsDismissed(newValue: boolean): Promise {\n await this.autofillOnPageLoadCalloutIsDismissedState.update(() => newValue);\n }\n\n async setAutofillOnPageLoadPolicyToastHasDisplayed(newValue: boolean): Promise {\n await this.autofillOnPageLoadPolicyToastHasDisplayedState.update(() => newValue);\n }\n\n async setAutoCopyTotp(newValue: boolean): Promise {\n await this.autoCopyTotpState.update(() => newValue);\n }\n\n async setInlineMenuVisibility(newValue: InlineMenuVisibilitySetting): Promise {\n await this.inlineMenuVisibilityState.update(() => newValue);\n }\n\n async setEnableContextMenu(newValue: boolean): Promise {\n await this.enableContextMenuState.update(() => newValue);\n }\n\n async setClearClipboardDelay(newValue: ClearClipboardDelaySetting): Promise {\n await this.clearClipboardDelayState.update(() => newValue);\n }\n}\n","import { map, Observable } from \"rxjs\";\n\nimport {\n BADGE_SETTINGS_DISK,\n ActiveUserState,\n KeyDefinition,\n StateProvider,\n} from \"../../platform/state\";\n\nconst ENABLE_BADGE_COUNTER = new KeyDefinition(BADGE_SETTINGS_DISK, \"enableBadgeCounter\", {\n deserializer: (value: boolean) => value ?? true,\n});\n\nexport abstract class BadgeSettingsServiceAbstraction {\n enableBadgeCounter$: Observable;\n setEnableBadgeCounter: (newValue: boolean) => Promise;\n}\n\nexport class BadgeSettingsService implements BadgeSettingsServiceAbstraction {\n private enableBadgeCounterState: ActiveUserState;\n readonly enableBadgeCounter$: Observable;\n\n constructor(private stateProvider: StateProvider) {\n this.enableBadgeCounterState = this.stateProvider.getActive(ENABLE_BADGE_COUNTER);\n this.enableBadgeCounter$ = this.enableBadgeCounterState.state$.pipe(map((x) => x ?? true));\n }\n\n async setEnableBadgeCounter(newValue: boolean): Promise {\n await this.enableBadgeCounterState.update(() => newValue);\n }\n}\n","import { map, Observable, of, switchMap } from \"rxjs\";\n\nimport {\n ActiveUserState,\n BILLING_DISK,\n KeyDefinition,\n StateProvider,\n} from \"../../../platform/state\";\nimport {\n BillingAccountProfile,\n BillingAccountProfileStateService,\n} from \"../../abstractions/account/billing-account-profile-state.service\";\n\nexport const BILLING_ACCOUNT_PROFILE_KEY_DEFINITION = new KeyDefinition(\n BILLING_DISK,\n \"accountProfile\",\n {\n deserializer: (billingAccountProfile) => billingAccountProfile,\n },\n);\n\nexport class DefaultBillingAccountProfileStateService implements BillingAccountProfileStateService {\n private billingAccountProfileState: ActiveUserState;\n\n hasPremiumFromAnyOrganization$: Observable;\n hasPremiumPersonally$: Observable;\n hasPremiumFromAnySource$: Observable;\n\n constructor(stateProvider: StateProvider) {\n this.billingAccountProfileState = stateProvider.getActive(\n BILLING_ACCOUNT_PROFILE_KEY_DEFINITION,\n );\n\n // Setup an observable that will always track the currently active user\n // but will fallback to emitting null when there is no active user.\n const billingAccountProfileOrNull = stateProvider.activeUserId$.pipe(\n switchMap((userId) =>\n userId != null\n ? stateProvider.getUser(userId, BILLING_ACCOUNT_PROFILE_KEY_DEFINITION).state$\n : of(null),\n ),\n );\n\n this.hasPremiumFromAnyOrganization$ = billingAccountProfileOrNull.pipe(\n map((billingAccountProfile) => !!billingAccountProfile?.hasPremiumFromAnyOrganization),\n );\n\n this.hasPremiumPersonally$ = billingAccountProfileOrNull.pipe(\n map((billingAccountProfile) => !!billingAccountProfile?.hasPremiumPersonally),\n );\n\n this.hasPremiumFromAnySource$ = billingAccountProfileOrNull.pipe(\n map(\n (billingAccountProfile) =>\n billingAccountProfile?.hasPremiumFromAnyOrganization === true ||\n billingAccountProfile?.hasPremiumPersonally === true,\n ),\n );\n }\n\n async setHasPremium(\n hasPremiumPersonally: boolean,\n hasPremiumFromAnyOrganization: boolean,\n ): Promise {\n await this.billingAccountProfileState.update((billingAccountProfile) => {\n return {\n hasPremiumPersonally: hasPremiumPersonally,\n hasPremiumFromAnyOrganization: hasPremiumFromAnyOrganization,\n };\n });\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\n\nexport class OrganizationBillingStatusResponse extends BaseResponse {\n organizationId: string;\n organizationName: string;\n risksSubscriptionFailure: boolean;\n\n constructor(response: any) {\n super(response);\n\n this.organizationId = this.getResponseProperty(\"OrganizationId\");\n this.organizationName = this.getResponseProperty(\"OrganizationName\");\n this.risksSubscriptionFailure = this.getResponseProperty(\"RisksSubscriptionFailure\");\n }\n}\n","import { BILLING_DISK, KeyDefinition } from \"../../platform/state\";\nimport { PaymentMethodWarning } from \"../models/domain/payment-method-warning\";\n\nexport const PAYMENT_METHOD_WARNINGS_KEY = KeyDefinition.record(\n BILLING_DISK,\n \"paymentMethodWarnings\",\n {\n deserializer: (warnings) => ({\n ...warnings,\n savedAt: new Date(warnings.savedAt),\n }),\n },\n);\n","import { ServerConfigResponse } from \"../../models/response/server-config.response\";\n\nexport abstract class ConfigApiServiceAbstraction {\n get: () => Promise;\n}\n","import { FileUploadType } from \"../../enums\";\nimport { EncArrayBuffer } from \"../../models/domain/enc-array-buffer\";\nimport { EncString } from \"../../models/domain/enc-string\";\n\nexport abstract class FileUploadService {\n upload: (\n uploadData: { url: string; fileUploadType: FileUploadType },\n fileName: EncString,\n encryptedFileData: EncArrayBuffer,\n fileUploadMethods: FileUploadApiMethods,\n ) => Promise;\n}\n\nexport type FileUploadApiMethods = {\n postDirect: (fileData: FormData) => Promise;\n renewFileUploadUrl: () => Promise;\n rollback: () => Promise;\n};\n","import { Observable } from \"rxjs\";\n\nimport { MemoryStorageOptions, StorageOptions } from \"../models/domain/storage-options\";\n\nexport type StorageUpdateType = \"save\" | \"remove\";\nexport type StorageUpdate = {\n key: string;\n updateType: StorageUpdateType;\n};\n\nexport interface ObservableStorageService {\n /**\n * Provides an {@link Observable} that represents a stream of updates that\n * have happened in this storage service or in the storage this service provides\n * an interface to.\n */\n get updates$(): Observable;\n}\n\nexport abstract class AbstractStorageService {\n abstract get valuesRequireDeserialization(): boolean;\n abstract get(key: string, options?: StorageOptions): Promise;\n abstract has(key: string, options?: StorageOptions): Promise;\n abstract save(key: string, obj: T, options?: StorageOptions): Promise;\n abstract remove(key: string, options?: StorageOptions): Promise;\n}\n\nexport abstract class AbstractMemoryStorageService extends AbstractStorageService {\n // Used to identify the service in the session sync decorator framework\n static readonly TYPE = \"MemoryStorageService\";\n readonly type = AbstractMemoryStorageService.TYPE;\n\n abstract get(key: string, options?: MemoryStorageOptions): Promise;\n abstract getBypassCache(key: string, options?: MemoryStorageOptions): Promise;\n}\n","import { Account } from \"../models/domain/account\";\n\nexport class AccountFactory {\n private accountConstructor: new (init: Partial) => T;\n\n constructor(accountConstructor: new (init: Partial) => T) {\n this.accountConstructor = accountConstructor;\n }\n\n create(args: Partial) {\n return new this.accountConstructor(args);\n }\n}\n","import { GlobalState } from \"../models/domain/global-state\";\n\nexport class GlobalStateFactory {\n private globalStateConstructor: new (init: Partial) => T;\n\n constructor(globalStateConstructor: new (init: Partial) => T) {\n this.globalStateConstructor = globalStateConstructor;\n }\n\n create(args?: Partial) {\n return new this.globalStateConstructor(args);\n }\n}\n","import { Account } from \"../models/domain/account\";\nimport { GlobalState } from \"../models/domain/global-state\";\n\nimport { AccountFactory } from \"./account-factory\";\nimport { GlobalStateFactory } from \"./global-state-factory\";\n\nexport class StateFactory<\n TGlobal extends GlobalState = GlobalState,\n TAccount extends Account = Account,\n> {\n private globalStateFactory: GlobalStateFactory;\n private accountFactory: AccountFactory;\n\n constructor(\n globalStateConstructor: new (init: Partial) => TGlobal,\n accountConstructor: new (init: Partial) => TAccount,\n ) {\n this.globalStateFactory = new GlobalStateFactory(globalStateConstructor);\n this.accountFactory = new AccountFactory(accountConstructor);\n }\n\n createGlobal(args: Partial): TGlobal {\n return this.globalStateFactory.create(args);\n }\n\n createAccount(args: Partial): TAccount {\n return this.accountFactory.create(args);\n }\n}\n","import { ThemeType } from \"../../enums\";\n\nexport class GlobalState {\n installedVersion?: string;\n organizationInvitation?: any;\n rememberedEmail?: string;\n theme?: ThemeType = ThemeType.System;\n twoFactorToken?: string;\n biometricFingerprintValidated?: boolean;\n vaultTimeout?: number;\n vaultTimeoutAction?: string;\n loginRedirect?: any;\n mainWindowSize?: number;\n enableBrowserIntegration?: boolean;\n enableBrowserIntegrationFingerprint?: boolean;\n deepLinkRedirectUrl?: string;\n}\n","import { Observable, filter, firstValueFrom, tap } from \"rxjs\";\n\nimport { AppIdService as AppIdServiceAbstraction } from \"../abstractions/app-id.service\";\nimport { Utils } from \"../misc/utils\";\nimport { APPLICATION_ID_DISK, GlobalStateProvider, KeyDefinition } from \"../state\";\n\nexport const APP_ID_KEY = new KeyDefinition(APPLICATION_ID_DISK, \"appId\", {\n deserializer: (value: string) => value,\n});\nexport const ANONYMOUS_APP_ID_KEY = new KeyDefinition(APPLICATION_ID_DISK, \"anonymousAppId\", {\n deserializer: (value: string) => value,\n});\n\nexport class AppIdService implements AppIdServiceAbstraction {\n appId$: Observable;\n anonymousAppId$: Observable;\n\n constructor(globalStateProvider: GlobalStateProvider) {\n const appIdState = globalStateProvider.get(APP_ID_KEY);\n const anonymousAppIdState = globalStateProvider.get(ANONYMOUS_APP_ID_KEY);\n this.appId$ = appIdState.state$.pipe(\n tap(async (appId) => {\n if (!appId) {\n await appIdState.update(() => Utils.newGuid());\n }\n }),\n filter((appId) => !!appId),\n );\n this.anonymousAppId$ = anonymousAppIdState.state$.pipe(\n tap(async (appId) => {\n if (!appId) {\n await anonymousAppIdState.update(() => Utils.newGuid());\n }\n }),\n filter((appId) => !!appId),\n );\n }\n\n async getAppId(): Promise {\n return await firstValueFrom(this.appId$);\n }\n\n async getAnonymousAppId(): Promise {\n return await firstValueFrom(this.anonymousAppId$);\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\nimport { Region } from \"../../abstractions/environment.service\";\n\nexport class ServerConfigResponse extends BaseResponse {\n version: string;\n gitHash: string;\n server: ThirdPartyServerConfigResponse;\n environment: EnvironmentServerConfigResponse;\n featureStates: { [key: string]: string } = {};\n\n constructor(response: any) {\n super(response);\n\n if (response == null) {\n return;\n }\n\n this.version = this.getResponseProperty(\"Version\");\n this.gitHash = this.getResponseProperty(\"GitHash\");\n this.server = new ThirdPartyServerConfigResponse(this.getResponseProperty(\"Server\"));\n this.environment = new EnvironmentServerConfigResponse(this.getResponseProperty(\"Environment\"));\n this.featureStates = this.getResponseProperty(\"FeatureStates\");\n }\n}\n\nexport class EnvironmentServerConfigResponse extends BaseResponse {\n cloudRegion: Region;\n vault: string;\n api: string;\n identity: string;\n notifications: string;\n sso: string;\n\n constructor(data: any = null) {\n super(data);\n\n if (data == null) {\n return;\n }\n\n this.cloudRegion = this.getResponseProperty(\"CloudRegion\");\n this.vault = this.getResponseProperty(\"Vault\");\n this.api = this.getResponseProperty(\"Api\");\n this.identity = this.getResponseProperty(\"Identity\");\n this.notifications = this.getResponseProperty(\"Notifications\");\n this.sso = this.getResponseProperty(\"Sso\");\n }\n}\n\nexport class ThirdPartyServerConfigResponse extends BaseResponse {\n name: string;\n url: string;\n\n constructor(data: any = null) {\n super(data);\n\n if (data == null) {\n return;\n }\n\n this.name = this.getResponseProperty(\"Name\");\n this.url = this.getResponseProperty(\"Url\");\n }\n}\n","import { Jsonify } from \"type-fest\";\n\nimport {\n ServerConfigData,\n ThirdPartyServerConfigData,\n EnvironmentServerConfigData,\n} from \"../../models/data/server-config.data\";\n\nconst dayInMilliseconds = 24 * 3600 * 1000;\nconst eighteenHoursInMilliseconds = 18 * 3600 * 1000;\n\nexport class ServerConfig {\n version: string;\n gitHash: string;\n server?: ThirdPartyServerConfigData;\n environment?: EnvironmentServerConfigData;\n utcDate: Date;\n featureStates: { [key: string]: string } = {};\n\n constructor(serverConfigData: ServerConfigData) {\n this.version = serverConfigData.version;\n this.gitHash = serverConfigData.gitHash;\n this.server = serverConfigData.server;\n this.utcDate = new Date(serverConfigData.utcDate);\n this.environment = serverConfigData.environment;\n this.featureStates = serverConfigData.featureStates;\n\n if (this.server?.name == null && this.server?.url == null) {\n this.server = null;\n }\n }\n\n private getAgeInMilliseconds(): number {\n return new Date().getTime() - this.utcDate?.getTime();\n }\n\n isValid(): boolean {\n return this.getAgeInMilliseconds() <= dayInMilliseconds;\n }\n\n expiresSoon(): boolean {\n return this.getAgeInMilliseconds() >= eighteenHoursInMilliseconds;\n }\n\n static fromJSON(obj: Jsonify): ServerConfig {\n if (obj == null) {\n return null;\n }\n\n return new ServerConfig(obj);\n }\n}\n","import {\n ReplaySubject,\n Subject,\n catchError,\n concatMap,\n defer,\n delayWhen,\n firstValueFrom,\n map,\n merge,\n timer,\n} from \"rxjs\";\nimport { SemVer } from \"semver\";\n\nimport { AuthService } from \"../../../auth/abstractions/auth.service\";\nimport { AuthenticationStatus } from \"../../../auth/enums/authentication-status\";\nimport { FeatureFlag, FeatureFlagValue } from \"../../../enums/feature-flag.enum\";\nimport { ConfigApiServiceAbstraction } from \"../../abstractions/config/config-api.service.abstraction\";\nimport { ConfigServiceAbstraction } from \"../../abstractions/config/config.service.abstraction\";\nimport { ServerConfig } from \"../../abstractions/config/server-config\";\nimport { EnvironmentService, Region } from \"../../abstractions/environment.service\";\nimport { LogService } from \"../../abstractions/log.service\";\nimport { StateService } from \"../../abstractions/state.service\";\nimport { ServerConfigData } from \"../../models/data/server-config.data\";\nimport { StateProvider } from \"../../state\";\n\nconst ONE_HOUR_IN_MILLISECONDS = 1000 * 3600;\n\nexport class ConfigService implements ConfigServiceAbstraction {\n private inited = false;\n\n protected _serverConfig = new ReplaySubject(1);\n serverConfig$ = this._serverConfig.asObservable();\n\n private _forceFetchConfig = new Subject();\n protected refreshTimer$ = timer(ONE_HOUR_IN_MILLISECONDS, ONE_HOUR_IN_MILLISECONDS); // after 1 hour, then every hour\n\n cloudRegion$ = this.serverConfig$.pipe(\n map((config) => config?.environment?.cloudRegion ?? Region.US),\n );\n\n constructor(\n private stateService: StateService,\n private configApiService: ConfigApiServiceAbstraction,\n private authService: AuthService,\n private environmentService: EnvironmentService,\n private logService: LogService,\n private stateProvider: StateProvider,\n\n // Used to avoid duplicate subscriptions, e.g. in browser between the background and popup\n private subscribe = true,\n ) {}\n\n init() {\n if (!this.subscribe || this.inited) {\n return;\n }\n\n const latestServerConfig$ = defer(() => this.configApiService.get()).pipe(\n map((response) => new ServerConfigData(response)),\n delayWhen((data) => this.saveConfig(data)),\n catchError((e: unknown) => {\n // fall back to stored ServerConfig (if any)\n this.logService.error(\"Unable to fetch ServerConfig: \" + (e as Error)?.message);\n return this.stateService.getServerConfig();\n }),\n );\n\n // If you need to fetch a new config when an event occurs, add an observable that emits on that event here\n merge(\n this.refreshTimer$, // an overridable interval\n this.environmentService.environment$, // when environment URLs change (including when app is started)\n this._forceFetchConfig, // manual\n )\n .pipe(\n concatMap(() => latestServerConfig$),\n map((data) => (data == null ? null : new ServerConfig(data))),\n )\n .subscribe((config) => this._serverConfig.next(config));\n\n this.inited = true;\n }\n\n getFeatureFlag$(key: FeatureFlag, defaultValue?: T) {\n return this.serverConfig$.pipe(\n map((serverConfig) => {\n if (serverConfig?.featureStates == null || serverConfig.featureStates[key] == null) {\n return defaultValue;\n }\n\n return serverConfig.featureStates[key] as T;\n }),\n );\n }\n\n async getFeatureFlag(key: FeatureFlag, defaultValue?: T) {\n return await firstValueFrom(this.getFeatureFlag$(key, defaultValue));\n }\n\n triggerServerConfigFetch() {\n this._forceFetchConfig.next();\n }\n\n private async saveConfig(data: ServerConfigData) {\n if ((await this.authService.getAuthStatus()) === AuthenticationStatus.LoggedOut) {\n return;\n }\n\n const userId = await firstValueFrom(this.stateProvider.activeUserId$);\n await this.stateService.setServerConfig(data);\n await this.environmentService.setCloudRegion(userId, data.environment?.cloudRegion);\n }\n\n /**\n * Verifies whether the server version meets the minimum required version\n * @param minimumRequiredServerVersion The minimum version required\n * @returns True if the server version is greater than or equal to the minimum required version\n */\n checkServerMeetsVersionRequirement$(minimumRequiredServerVersion: SemVer) {\n return this.serverConfig$.pipe(\n map((serverConfig) => {\n if (serverConfig == null) {\n return false;\n }\n const serverVersion = new SemVer(serverConfig.version);\n return serverVersion.compare(minimumRequiredServerVersion) >= 0;\n }),\n );\n }\n}\n","/**\n * Use as a Decorator on async functions, it will prevent multiple 'active' calls as the same time\n *\n * If a promise was returned from a previous call to this function, that hasn't yet resolved it will\n * be returned, instead of calling the original function again\n *\n * Results are not cached, once the promise has returned, the next call will result in a fresh call\n *\n * Read more at https://github.com/bitwarden/jslib/pull/7\n */\nexport function sequentialize(cacheKey: (args: any[]) => string) {\n return (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n const originalMethod: () => Promise = descriptor.value;\n const caches = new Map>>();\n\n const getCache = (obj: any) => {\n let cache = caches.get(obj);\n if (cache != null) {\n return cache;\n }\n cache = new Map>();\n caches.set(obj, cache);\n return cache;\n };\n\n return {\n value: function (...args: any[]) {\n const cache = getCache(this);\n const argsCacheKey = cacheKey(args);\n let response = cache.get(argsCacheKey);\n if (response != null) {\n return response;\n }\n\n const onFinally = () => {\n cache.delete(argsCacheKey);\n if (cache.size === 0) {\n caches.delete(this);\n }\n };\n response = originalMethod\n .apply(this, args)\n .then((val: any) => {\n onFinally();\n return val;\n })\n .catch((err: any) => {\n onFinally();\n throw err;\n });\n\n cache.set(argsCacheKey, response);\n return response;\n },\n };\n };\n}\n","import { CryptoService } from \"../../../platform/abstractions/crypto.service\";\nimport { EncString } from \"../../../platform/models/domain/enc-string\";\nimport { SymmetricCryptoKey } from \"../../../platform/models/domain/symmetric-crypto-key\";\nimport { OrgKey } from \"../../../types/key\";\nimport { EncryptedOrganizationKeyData } from \"../data/encrypted-organization-key.data\";\n\nexport abstract class BaseEncryptedOrganizationKey {\n decrypt: (cryptoService: CryptoService) => Promise;\n\n static fromData(data: EncryptedOrganizationKeyData) {\n switch (data.type) {\n case \"organization\":\n return new EncryptedOrganizationKey(data.key);\n\n case \"provider\":\n return new ProviderEncryptedOrganizationKey(data.key, data.providerId);\n\n default:\n return null;\n }\n }\n}\n\nexport class EncryptedOrganizationKey implements BaseEncryptedOrganizationKey {\n constructor(private key: string) {}\n\n async decrypt(cryptoService: CryptoService) {\n const decValue = await cryptoService.rsaDecrypt(this.key);\n return new SymmetricCryptoKey(decValue) as OrgKey;\n }\n\n toData(): EncryptedOrganizationKeyData {\n return {\n type: \"organization\",\n key: this.key,\n };\n }\n}\n\nexport class ProviderEncryptedOrganizationKey implements BaseEncryptedOrganizationKey {\n constructor(\n private key: string,\n private providerId: string,\n ) {}\n\n async decrypt(cryptoService: CryptoService) {\n const providerKey = await cryptoService.getProviderKey(this.providerId);\n const decValue = await cryptoService.decryptToBytes(new EncString(this.key), providerKey);\n return new SymmetricCryptoKey(decValue) as OrgKey;\n }\n\n toData(): EncryptedOrganizationKeyData {\n return {\n type: \"provider\",\n key: this.key,\n providerId: this.providerId,\n };\n }\n}\n","import { EncryptedOrganizationKeyData } from \"../../../admin-console/models/data/encrypted-organization-key.data\";\nimport { BaseEncryptedOrganizationKey } from \"../../../admin-console/models/domain/encrypted-organization-key\";\nimport { OrganizationId } from \"../../../types/guid\";\nimport { OrgKey } from \"../../../types/key\";\nimport { CryptoService } from \"../../abstractions/crypto.service\";\nimport { SymmetricCryptoKey } from \"../../models/domain/symmetric-crypto-key\";\nimport { KeyDefinition, CRYPTO_DISK, DeriveDefinition } from \"../../state\";\n\nexport const USER_ENCRYPTED_ORGANIZATION_KEYS = KeyDefinition.record<\n EncryptedOrganizationKeyData,\n OrganizationId\n>(CRYPTO_DISK, \"organizationKeys\", {\n deserializer: (obj) => obj,\n});\n\nexport const USER_ORGANIZATION_KEYS = DeriveDefinition.from<\n Record,\n Record,\n { cryptoService: CryptoService }\n>(USER_ENCRYPTED_ORGANIZATION_KEYS, {\n deserializer: (obj) => {\n const result: Record = {};\n for (const orgId of Object.keys(obj ?? {}) as OrganizationId[]) {\n result[orgId] = SymmetricCryptoKey.fromJSON(obj[orgId]) as OrgKey;\n }\n return result;\n },\n derive: async (from, { cryptoService }) => {\n const result: Record = {};\n for (const orgId of Object.keys(from ?? {}) as OrganizationId[]) {\n if (result[orgId] != null) {\n continue;\n }\n const encrypted = BaseEncryptedOrganizationKey.fromData(from[orgId]);\n const decrypted = await encrypted.decrypt(cryptoService);\n\n result[orgId] = decrypted;\n }\n\n return result;\n },\n});\n","import { ProviderId } from \"../../../types/guid\";\nimport { ProviderKey } from \"../../../types/key\";\nimport { EncryptService } from \"../../abstractions/encrypt.service\";\nimport { EncString, EncryptedString } from \"../../models/domain/enc-string\";\nimport { SymmetricCryptoKey } from \"../../models/domain/symmetric-crypto-key\";\nimport { KeyDefinition, CRYPTO_DISK, DeriveDefinition } from \"../../state\";\nimport { CryptoService } from \"../crypto.service\";\n\nexport const USER_ENCRYPTED_PROVIDER_KEYS = KeyDefinition.record(\n CRYPTO_DISK,\n \"providerKeys\",\n {\n deserializer: (obj) => obj,\n },\n);\n\nexport const USER_PROVIDER_KEYS = DeriveDefinition.from<\n Record,\n Record,\n { encryptService: EncryptService; cryptoService: CryptoService } // TODO: This should depend on an active user private key observable directly\n>(USER_ENCRYPTED_PROVIDER_KEYS, {\n deserializer: (obj) => {\n const result: Record = {};\n for (const providerId of Object.keys(obj ?? {}) as ProviderId[]) {\n result[providerId] = SymmetricCryptoKey.fromJSON(obj[providerId]) as ProviderKey;\n }\n return result;\n },\n derive: async (from, { encryptService, cryptoService }) => {\n const result: Record = {};\n for (const providerId of Object.keys(from ?? {}) as ProviderId[]) {\n if (result[providerId] != null) {\n continue;\n }\n const encrypted = new EncString(from[providerId]);\n const privateKey = await cryptoService.getPrivateKey();\n const decrypted = await encryptService.rsaDecrypt(encrypted, privateKey);\n const providerKey = new SymmetricCryptoKey(decrypted) as ProviderKey;\n\n result[providerId] = providerKey;\n }\n\n return result;\n },\n});\n","import { UserPrivateKey, UserPublicKey, UserKey } from \"../../../types/key\";\nimport { CryptoFunctionService } from \"../../abstractions/crypto-function.service\";\nimport { EncryptService } from \"../../abstractions/encrypt.service\";\nimport { EncString, EncryptedString } from \"../../models/domain/enc-string\";\nimport { SymmetricCryptoKey } from \"../../models/domain/symmetric-crypto-key\";\nimport { KeyDefinition, CRYPTO_DISK, DeriveDefinition, CRYPTO_MEMORY } from \"../../state\";\nimport { CryptoService } from \"../crypto.service\";\n\nexport const USER_EVER_HAD_USER_KEY = new KeyDefinition(CRYPTO_DISK, \"everHadUserKey\", {\n deserializer: (obj) => obj,\n});\n\nexport const USER_ENCRYPTED_PRIVATE_KEY = new KeyDefinition(\n CRYPTO_DISK,\n \"privateKey\",\n {\n deserializer: (obj) => obj,\n },\n);\n\nexport const USER_PRIVATE_KEY = DeriveDefinition.fromWithUserId<\n EncryptedString,\n UserPrivateKey,\n // TODO: update cryptoService to user key directly\n { encryptService: EncryptService; cryptoService: CryptoService }\n>(USER_ENCRYPTED_PRIVATE_KEY, {\n deserializer: (obj) => new Uint8Array(Object.values(obj)) as UserPrivateKey,\n derive: async ([userId, encPrivateKeyString], { encryptService, cryptoService }) => {\n if (encPrivateKeyString == null) {\n return null;\n }\n\n const userKey = await cryptoService.getUserKey(userId);\n if (userKey == null) {\n return null;\n }\n\n const encPrivateKey = new EncString(encPrivateKeyString);\n const privateKey = (await encryptService.decryptToBytes(\n encPrivateKey,\n userKey,\n )) as UserPrivateKey;\n return privateKey;\n },\n});\n\nexport const USER_PUBLIC_KEY = DeriveDefinition.from<\n UserPrivateKey,\n UserPublicKey,\n { cryptoFunctionService: CryptoFunctionService }\n>([USER_PRIVATE_KEY, \"publicKey\"], {\n deserializer: (obj) => new Uint8Array(Object.values(obj)) as UserPublicKey,\n derive: async (privateKey, { cryptoFunctionService }) => {\n if (privateKey == null) {\n return null;\n }\n\n return (await cryptoFunctionService.rsaExtractPublicKey(privateKey)) as UserPublicKey;\n },\n});\nexport const USER_KEY = new KeyDefinition(CRYPTO_MEMORY, \"userKey\", {\n deserializer: (obj) => SymmetricCryptoKey.fromJSON(obj) as UserKey,\n});\n","import * as bigInt from \"big-integer\";\nimport { Observable, filter, firstValueFrom, map } from \"rxjs\";\n\nimport { EncryptedOrganizationKeyData } from \"../../admin-console/models/data/encrypted-organization-key.data\";\nimport { ProfileOrganizationResponse } from \"../../admin-console/models/response/profile-organization.response\";\nimport { ProfileProviderOrganizationResponse } from \"../../admin-console/models/response/profile-provider-organization.response\";\nimport { ProfileProviderResponse } from \"../../admin-console/models/response/profile-provider.response\";\nimport { AccountService } from \"../../auth/abstractions/account.service\";\nimport { AuthenticationStatus } from \"../../auth/enums/authentication-status\";\nimport { KdfConfig } from \"../../auth/models/domain/kdf-config\";\nimport { Utils } from \"../../platform/misc/utils\";\nimport { CsprngArray } from \"../../types/csprng\";\nimport { OrganizationId, ProviderId, UserId } from \"../../types/guid\";\nimport {\n OrgKey,\n UserKey,\n MasterKey,\n ProviderKey,\n PinKey,\n CipherKey,\n UserPrivateKey,\n UserPublicKey,\n} from \"../../types/key\";\nimport { CryptoFunctionService } from \"../abstractions/crypto-function.service\";\nimport { CryptoService as CryptoServiceAbstraction } from \"../abstractions/crypto.service\";\nimport { EncryptService } from \"../abstractions/encrypt.service\";\nimport { KeyGenerationService } from \"../abstractions/key-generation.service\";\nimport { LogService } from \"../abstractions/log.service\";\nimport { PlatformUtilsService } from \"../abstractions/platform-utils.service\";\nimport { StateService } from \"../abstractions/state.service\";\nimport {\n KeySuffixOptions,\n HashPurpose,\n KdfType,\n ARGON2_ITERATIONS,\n ARGON2_MEMORY,\n ARGON2_PARALLELISM,\n EncryptionType,\n PBKDF2_ITERATIONS,\n} from \"../enums\";\nimport { sequentialize } from \"../misc/sequentialize\";\nimport { EFFLongWordList } from \"../misc/wordlist\";\nimport { EncArrayBuffer } from \"../models/domain/enc-array-buffer\";\nimport { EncString, EncryptedString } from \"../models/domain/enc-string\";\nimport { SymmetricCryptoKey } from \"../models/domain/symmetric-crypto-key\";\nimport { ActiveUserState, DerivedState, StateProvider } from \"../state\";\n\nimport {\n USER_ENCRYPTED_ORGANIZATION_KEYS,\n USER_ORGANIZATION_KEYS,\n} from \"./key-state/org-keys.state\";\nimport { USER_ENCRYPTED_PROVIDER_KEYS, USER_PROVIDER_KEYS } from \"./key-state/provider-keys.state\";\nimport {\n USER_ENCRYPTED_PRIVATE_KEY,\n USER_EVER_HAD_USER_KEY,\n USER_PRIVATE_KEY,\n USER_PUBLIC_KEY,\n USER_KEY,\n} from \"./key-state/user-key.state\";\n\nexport class CryptoService implements CryptoServiceAbstraction {\n private readonly activeUserKeyState: ActiveUserState;\n private readonly activeUserEverHadUserKey: ActiveUserState;\n private readonly activeUserEncryptedOrgKeysState: ActiveUserState<\n Record\n >;\n private readonly activeUserOrgKeysState: DerivedState>;\n private readonly activeUserEncryptedProviderKeysState: ActiveUserState<\n Record\n >;\n private readonly activeUserProviderKeysState: DerivedState>;\n private readonly activeUserEncryptedPrivateKeyState: ActiveUserState;\n private readonly activeUserPrivateKeyState: DerivedState;\n private readonly activeUserPublicKeyState: DerivedState;\n\n readonly activeUserKey$: Observable;\n\n readonly activeUserOrgKeys$: Observable>;\n readonly activeUserProviderKeys$: Observable>;\n readonly activeUserPrivateKey$: Observable;\n readonly activeUserPublicKey$: Observable;\n readonly everHadUserKey$: Observable;\n\n constructor(\n protected keyGenerationService: KeyGenerationService,\n protected cryptoFunctionService: CryptoFunctionService,\n protected encryptService: EncryptService,\n protected platformUtilService: PlatformUtilsService,\n protected logService: LogService,\n protected stateService: StateService,\n protected accountService: AccountService,\n protected stateProvider: StateProvider,\n ) {\n // User Key\n this.activeUserKeyState = stateProvider.getActive(USER_KEY);\n this.activeUserKey$ = this.activeUserKeyState.state$;\n this.activeUserEverHadUserKey = stateProvider.getActive(USER_EVER_HAD_USER_KEY);\n this.everHadUserKey$ = this.activeUserEverHadUserKey.state$.pipe(map((x) => x ?? false));\n\n // User Asymmetric Key Pair\n this.activeUserEncryptedPrivateKeyState = stateProvider.getActive(USER_ENCRYPTED_PRIVATE_KEY);\n this.activeUserPrivateKeyState = stateProvider.getDerived(\n this.activeUserEncryptedPrivateKeyState.combinedState$.pipe(\n filter(([_userId, key]) => key != null),\n ),\n USER_PRIVATE_KEY,\n {\n encryptService: this.encryptService,\n cryptoService: this,\n },\n );\n this.activeUserPrivateKey$ = this.activeUserPrivateKeyState.state$; // may be null\n this.activeUserPublicKeyState = stateProvider.getDerived(\n this.activeUserPrivateKey$.pipe(filter((key) => key != null)),\n USER_PUBLIC_KEY,\n {\n cryptoFunctionService: this.cryptoFunctionService,\n },\n );\n this.activeUserPublicKey$ = this.activeUserPublicKeyState.state$; // may be null\n\n // Organization keys\n this.activeUserEncryptedOrgKeysState = stateProvider.getActive(\n USER_ENCRYPTED_ORGANIZATION_KEYS,\n );\n this.activeUserOrgKeysState = stateProvider.getDerived(\n this.activeUserEncryptedOrgKeysState.state$.pipe(filter((keys) => keys != null)),\n USER_ORGANIZATION_KEYS,\n { cryptoService: this },\n );\n this.activeUserOrgKeys$ = this.activeUserOrgKeysState.state$; // null handled by `derive` function\n\n // Provider keys\n this.activeUserEncryptedProviderKeysState = stateProvider.getActive(\n USER_ENCRYPTED_PROVIDER_KEYS,\n );\n this.activeUserProviderKeysState = stateProvider.getDerived(\n this.activeUserEncryptedProviderKeysState.state$.pipe(filter((keys) => keys != null)),\n USER_PROVIDER_KEYS,\n { encryptService: this.encryptService, cryptoService: this },\n );\n this.activeUserProviderKeys$ = this.activeUserProviderKeysState.state$; // null handled by `derive` function\n }\n\n async setUserKey(key: UserKey, userId?: UserId): Promise {\n if (key == null) {\n throw new Error(\"No key provided. Use ClearUserKey to clear the key\");\n }\n // Set userId to ensure we have one for the account status update\n [userId, key] = await this.stateProvider.setUserState(USER_KEY, key, userId);\n await this.stateProvider.setUserState(USER_EVER_HAD_USER_KEY, true, userId);\n\n await this.accountService.setAccountStatus(userId, AuthenticationStatus.Unlocked);\n\n await this.storeAdditionalKeys(key, userId);\n }\n\n async refreshAdditionalKeys(): Promise {\n const key = await this.getUserKey();\n await this.setUserKey(key);\n }\n\n async getUserKey(userId?: UserId): Promise {\n let userKey = await firstValueFrom(this.stateProvider.getUserState$(USER_KEY, userId));\n if (userKey) {\n return userKey;\n }\n\n // If the user has set their vault timeout to 'Never', we can load the user key from storage\n if (await this.hasUserKeyStored(KeySuffixOptions.Auto, userId)) {\n userKey = await this.getKeyFromStorage(KeySuffixOptions.Auto, userId);\n if (userKey) {\n await this.setUserKey(userKey, userId);\n return userKey;\n }\n }\n }\n\n async isLegacyUser(masterKey?: MasterKey, userId?: UserId): Promise {\n return await this.validateUserKey(\n (masterKey ?? (await this.getMasterKey(userId))) as unknown as UserKey,\n );\n }\n\n async getUserKeyWithLegacySupport(userId?: UserId): Promise {\n const userKey = await this.getUserKey(userId);\n if (userKey) {\n return userKey;\n }\n\n // Legacy support: encryption used to be done with the master key (derived from master password).\n // Users who have not migrated will have a null user key and must use the master key instead.\n return (await this.getMasterKey(userId)) as unknown as UserKey;\n }\n\n async getUserKeyFromStorage(keySuffix: KeySuffixOptions, userId?: UserId): Promise {\n const userKey = await this.getKeyFromStorage(keySuffix, userId);\n if (userKey) {\n if (!(await this.validateUserKey(userKey))) {\n this.logService.warning(\"Invalid key, throwing away stored keys\");\n await this.clearAllStoredUserKeys(userId);\n }\n return userKey;\n }\n }\n\n async hasUserKey(userId?: UserId): Promise {\n userId ??= await firstValueFrom(this.stateProvider.activeUserId$);\n if (userId == null) {\n return false;\n }\n return (\n (await this.hasUserKeyInMemory(userId)) ||\n (await this.hasUserKeyStored(KeySuffixOptions.Auto, userId))\n );\n }\n\n async hasUserKeyInMemory(userId?: UserId): Promise {\n userId ??= await firstValueFrom(this.stateProvider.activeUserId$);\n if (userId == null) {\n return false;\n }\n\n return (await firstValueFrom(this.stateProvider.getUserState$(USER_KEY, userId))) != null;\n }\n\n async hasUserKeyStored(keySuffix: KeySuffixOptions, userId?: UserId): Promise {\n return (await this.getKeyFromStorage(keySuffix, userId)) != null;\n }\n\n async makeUserKey(masterKey: MasterKey): Promise<[UserKey, EncString]> {\n masterKey ||= await this.getMasterKey();\n if (masterKey == null) {\n throw new Error(\"No Master Key found.\");\n }\n\n const newUserKey = await this.keyGenerationService.createKey(512);\n return this.buildProtectedSymmetricKey(masterKey, newUserKey.key);\n }\n\n async clearUserKey(clearStoredKeys = true, userId?: UserId): Promise {\n // Set userId to ensure we have one for the account status update\n [userId] = await this.stateProvider.setUserState(USER_KEY, null, userId);\n await this.accountService.setMaxAccountStatus(userId, AuthenticationStatus.Locked);\n if (clearStoredKeys) {\n await this.clearAllStoredUserKeys(userId);\n }\n }\n\n async clearStoredUserKey(keySuffix: KeySuffixOptions, userId?: UserId): Promise {\n if (keySuffix === KeySuffixOptions.Auto) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.stateService.setUserKeyAutoUnlock(null, { userId: userId });\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.clearDeprecatedKeys(KeySuffixOptions.Auto, userId);\n }\n if (keySuffix === KeySuffixOptions.Pin) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.stateService.setPinKeyEncryptedUserKeyEphemeral(null, { userId: userId });\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.clearDeprecatedKeys(KeySuffixOptions.Pin, userId);\n }\n }\n\n async setMasterKeyEncryptedUserKey(userKeyMasterKey: string, userId?: UserId): Promise {\n await this.stateService.setMasterKeyEncryptedUserKey(userKeyMasterKey, { userId: userId });\n }\n\n async setMasterKey(key: MasterKey, userId?: UserId): Promise {\n await this.stateService.setMasterKey(key, { userId: userId });\n }\n\n async getMasterKey(userId?: UserId): Promise {\n let masterKey = await this.stateService.getMasterKey({ userId: userId });\n if (!masterKey) {\n masterKey = (await this.stateService.getCryptoMasterKey({ userId: userId })) as MasterKey;\n // if master key was null/undefined and getCryptoMasterKey also returned null/undefined,\n // don't set master key as it is unnecessary\n if (masterKey) {\n await this.setMasterKey(masterKey, userId);\n }\n }\n return masterKey;\n }\n\n async getOrDeriveMasterKey(password: string, userId?: UserId) {\n let masterKey = await this.getMasterKey(userId);\n return (masterKey ||= await this.makeMasterKey(\n password,\n await this.stateService.getEmail({ userId: userId }),\n await this.stateService.getKdfType({ userId: userId }),\n await this.stateService.getKdfConfig({ userId: userId }),\n ));\n }\n\n /**\n * Derive a master key from a password and email.\n *\n * @remarks\n * Does not validate the kdf config to ensure it satisfies the minimum requirements for the given kdf type.\n */\n async makeMasterKey(\n password: string,\n email: string,\n kdf: KdfType,\n KdfConfig: KdfConfig,\n ): Promise {\n return (await this.keyGenerationService.deriveKeyFromPassword(\n password,\n email,\n kdf,\n KdfConfig,\n )) as MasterKey;\n }\n\n async clearMasterKey(userId?: UserId): Promise {\n await this.stateService.setMasterKey(null, { userId: userId });\n }\n\n async encryptUserKeyWithMasterKey(\n masterKey: MasterKey,\n userKey?: UserKey,\n ): Promise<[UserKey, EncString]> {\n userKey ||= await this.getUserKey();\n return await this.buildProtectedSymmetricKey(masterKey, userKey.key);\n }\n\n async decryptUserKeyWithMasterKey(\n masterKey: MasterKey,\n userKey?: EncString,\n userId?: UserId,\n ): Promise {\n masterKey ||= await this.getMasterKey(userId);\n if (masterKey == null) {\n throw new Error(\"No master key found.\");\n }\n\n if (!userKey) {\n let masterKeyEncryptedUserKey = await this.stateService.getMasterKeyEncryptedUserKey({\n userId: userId,\n });\n\n // Try one more way to get the user key if it still wasn't found.\n if (masterKeyEncryptedUserKey == null) {\n masterKeyEncryptedUserKey = await this.stateService.getEncryptedCryptoSymmetricKey({\n userId: userId,\n });\n }\n\n if (masterKeyEncryptedUserKey == null) {\n throw new Error(\"No encrypted user key found.\");\n }\n userKey = new EncString(masterKeyEncryptedUserKey);\n }\n\n let decUserKey: Uint8Array;\n if (userKey.encryptionType === EncryptionType.AesCbc256_B64) {\n decUserKey = await this.encryptService.decryptToBytes(userKey, masterKey);\n } else if (userKey.encryptionType === EncryptionType.AesCbc256_HmacSha256_B64) {\n const newKey = await this.stretchKey(masterKey);\n decUserKey = await this.encryptService.decryptToBytes(userKey, newKey);\n } else {\n throw new Error(\"Unsupported encryption type.\");\n }\n if (decUserKey == null) {\n return null;\n }\n\n return new SymmetricCryptoKey(decUserKey) as UserKey;\n }\n\n async hashMasterKey(\n password: string,\n key: MasterKey,\n hashPurpose?: HashPurpose,\n ): Promise {\n key ||= await this.getMasterKey();\n\n if (password == null || key == null) {\n throw new Error(\"Invalid parameters.\");\n }\n\n const iterations = hashPurpose === HashPurpose.LocalAuthorization ? 2 : 1;\n const hash = await this.cryptoFunctionService.pbkdf2(key.key, password, \"sha256\", iterations);\n return Utils.fromBufferToB64(hash);\n }\n\n async setMasterKeyHash(keyHash: string): Promise {\n await this.stateService.setKeyHash(keyHash);\n }\n\n async getMasterKeyHash(): Promise {\n return await this.stateService.getKeyHash();\n }\n\n async clearMasterKeyHash(userId?: UserId): Promise {\n return await this.stateService.setKeyHash(null, { userId: userId });\n }\n\n async compareAndUpdateKeyHash(masterPassword: string, masterKey: MasterKey): Promise {\n const storedPasswordHash = await this.getMasterKeyHash();\n if (masterPassword != null && storedPasswordHash != null) {\n const localKeyHash = await this.hashMasterKey(\n masterPassword,\n masterKey,\n HashPurpose.LocalAuthorization,\n );\n if (localKeyHash != null && storedPasswordHash === localKeyHash) {\n return true;\n }\n\n // TODO: remove serverKeyHash check in 1-2 releases after everyone's keyHash has been updated\n const serverKeyHash = await this.hashMasterKey(\n masterPassword,\n masterKey,\n HashPurpose.ServerAuthorization,\n );\n if (serverKeyHash != null && storedPasswordHash === serverKeyHash) {\n await this.setMasterKeyHash(localKeyHash);\n return true;\n }\n }\n\n return false;\n }\n\n async setOrgKeys(\n orgs: ProfileOrganizationResponse[] = [],\n providerOrgs: ProfileProviderOrganizationResponse[] = [],\n ): Promise {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.activeUserEncryptedOrgKeysState.update((_) => {\n const encOrgKeyData: { [orgId: string]: EncryptedOrganizationKeyData } = {};\n\n orgs.forEach((org) => {\n encOrgKeyData[org.id] = {\n type: \"organization\",\n key: org.key,\n };\n });\n\n providerOrgs.forEach((org) => {\n encOrgKeyData[org.id] = {\n type: \"provider\",\n providerId: org.providerId,\n key: org.key,\n };\n });\n\n return encOrgKeyData;\n });\n }\n\n async getOrgKey(orgId: OrganizationId): Promise {\n return (await firstValueFrom(this.activeUserOrgKeys$))[orgId];\n }\n\n @sequentialize(() => \"getOrgKeys\")\n async getOrgKeys(): Promise> {\n return await firstValueFrom(this.activeUserOrgKeys$);\n }\n\n async makeDataEncKey(\n key: T,\n ): Promise<[SymmetricCryptoKey, EncString]> {\n if (key == null) {\n throw new Error(\"No key provided\");\n }\n\n const newSymKey = await this.keyGenerationService.createKey(512);\n return this.buildProtectedSymmetricKey(key, newSymKey.key);\n }\n\n async clearOrgKeys(memoryOnly?: boolean, userId?: UserId): Promise {\n const activeUserId = (await firstValueFrom(this.accountService.activeAccount$))?.id;\n const userIdIsActive = userId == null || userId === activeUserId;\n\n if (!memoryOnly) {\n if (userId == null && activeUserId == null) {\n // nothing to do\n return;\n }\n await this.stateProvider\n .getUser(userId ?? activeUserId, USER_ENCRYPTED_ORGANIZATION_KEYS)\n .update(() => null);\n return;\n }\n\n // org keys are only cached for active users\n if (userIdIsActive) {\n await this.activeUserOrgKeysState.forceValue({});\n }\n }\n\n async setProviderKeys(providers: ProfileProviderResponse[]): Promise {\n await this.activeUserEncryptedProviderKeysState.update((_) => {\n const encProviderKeys: { [providerId: ProviderId]: EncryptedString } = {};\n\n providers.forEach((provider) => {\n encProviderKeys[provider.id as ProviderId] = provider.key as EncryptedString;\n });\n\n return encProviderKeys;\n });\n }\n\n async getProviderKey(providerId: ProviderId): Promise {\n if (providerId == null) {\n return null;\n }\n\n return (await firstValueFrom(this.activeUserProviderKeys$))[providerId] ?? null;\n }\n\n @sequentialize(() => \"getProviderKeys\")\n async getProviderKeys(): Promise> {\n return await firstValueFrom(this.activeUserProviderKeys$);\n }\n\n async clearProviderKeys(memoryOnly?: boolean, userId?: UserId): Promise {\n const activeUserId = (await firstValueFrom(this.accountService.activeAccount$))?.id;\n const userIdIsActive = userId == null || userId === activeUserId;\n\n if (!memoryOnly) {\n if (userId == null && activeUserId == null) {\n // nothing to do\n return;\n }\n await this.stateProvider\n .getUser(userId ?? activeUserId, USER_ENCRYPTED_PROVIDER_KEYS)\n .update(() => null);\n return;\n }\n\n // provider keys are only cached for active users\n if (userIdIsActive) {\n await this.activeUserProviderKeysState.forceValue({});\n }\n }\n\n async getPublicKey(): Promise {\n return await firstValueFrom(this.activeUserPublicKey$);\n }\n\n async makeOrgKey(): Promise<[EncString, T]> {\n const shareKey = await this.keyGenerationService.createKey(512);\n const publicKey = await this.getPublicKey();\n const encShareKey = await this.rsaEncrypt(shareKey.key, publicKey);\n return [encShareKey, shareKey as T];\n }\n\n async setPrivateKey(encPrivateKey: EncryptedString): Promise {\n if (encPrivateKey == null) {\n return;\n }\n\n await this.activeUserEncryptedPrivateKeyState.update(() => encPrivateKey);\n }\n\n async getPrivateKey(): Promise {\n return await firstValueFrom(this.activeUserPrivateKey$);\n }\n\n async getFingerprint(fingerprintMaterial: string, publicKey?: Uint8Array): Promise {\n if (publicKey == null) {\n publicKey = await this.getPublicKey();\n }\n if (publicKey === null) {\n throw new Error(\"No public key available.\");\n }\n const keyFingerprint = await this.cryptoFunctionService.hash(publicKey, \"sha256\");\n const userFingerprint = await this.cryptoFunctionService.hkdfExpand(\n keyFingerprint,\n fingerprintMaterial,\n 32,\n \"sha256\",\n );\n return this.hashPhrase(userFingerprint);\n }\n\n async makeKeyPair(key?: SymmetricCryptoKey): Promise<[string, EncString]> {\n // Default to user key\n key ||= await this.getUserKeyWithLegacySupport();\n\n const keyPair = await this.cryptoFunctionService.rsaGenerateKeyPair(2048);\n const publicB64 = Utils.fromBufferToB64(keyPair[0]);\n const privateEnc = await this.encryptService.encrypt(keyPair[1], key);\n return [publicB64, privateEnc];\n }\n\n async clearKeyPair(memoryOnly?: boolean, userId?: UserId): Promise {\n const activeUserId = (await firstValueFrom(this.accountService.activeAccount$))?.id;\n const userIdIsActive = userId == null || userId === activeUserId;\n\n if (!memoryOnly) {\n if (userId == null && activeUserId == null) {\n // nothing to do\n return;\n }\n await this.stateProvider\n .getUser(userId ?? activeUserId, USER_ENCRYPTED_PRIVATE_KEY)\n .update(() => null);\n return;\n }\n\n // decrypted key pair is only cached for active users\n if (userIdIsActive) {\n await this.activeUserPrivateKeyState.forceValue(null);\n await this.activeUserPublicKeyState.forceValue(null);\n }\n }\n\n async makePinKey(pin: string, salt: string, kdf: KdfType, kdfConfig: KdfConfig): Promise {\n const pinKey = await this.keyGenerationService.deriveKeyFromPassword(pin, salt, kdf, kdfConfig);\n return (await this.stretchKey(pinKey)) as PinKey;\n }\n\n async clearPinKeys(userId?: UserId): Promise {\n await this.stateService.setPinKeyEncryptedUserKey(null, { userId: userId });\n await this.stateService.setPinKeyEncryptedUserKeyEphemeral(null, { userId: userId });\n await this.stateService.setProtectedPin(null, { userId: userId });\n await this.clearDeprecatedKeys(KeySuffixOptions.Pin, userId);\n }\n\n async decryptUserKeyWithPin(\n pin: string,\n salt: string,\n kdf: KdfType,\n kdfConfig: KdfConfig,\n pinProtectedUserKey?: EncString,\n ): Promise {\n pinProtectedUserKey ||= await this.stateService.getPinKeyEncryptedUserKey();\n pinProtectedUserKey ||= await this.stateService.getPinKeyEncryptedUserKeyEphemeral();\n if (!pinProtectedUserKey) {\n throw new Error(\"No PIN protected key found.\");\n }\n const pinKey = await this.makePinKey(pin, salt, kdf, kdfConfig);\n const userKey = await this.encryptService.decryptToBytes(pinProtectedUserKey, pinKey);\n return new SymmetricCryptoKey(userKey) as UserKey;\n }\n\n // only for migration purposes\n async decryptMasterKeyWithPin(\n pin: string,\n salt: string,\n kdf: KdfType,\n kdfConfig: KdfConfig,\n pinProtectedMasterKey?: EncString,\n ): Promise {\n if (!pinProtectedMasterKey) {\n const pinProtectedMasterKeyString = await this.stateService.getEncryptedPinProtected();\n if (pinProtectedMasterKeyString == null) {\n throw new Error(\"No PIN protected key found.\");\n }\n pinProtectedMasterKey = new EncString(pinProtectedMasterKeyString);\n }\n const pinKey = await this.makePinKey(pin, salt, kdf, kdfConfig);\n const masterKey = await this.encryptService.decryptToBytes(pinProtectedMasterKey, pinKey);\n return new SymmetricCryptoKey(masterKey) as MasterKey;\n }\n\n async makeSendKey(keyMaterial: CsprngArray): Promise {\n return await this.keyGenerationService.deriveKeyFromMaterial(\n keyMaterial,\n \"bitwarden-send\",\n \"send\",\n );\n }\n\n async makeCipherKey(): Promise {\n return (await this.keyGenerationService.createKey(512)) as CipherKey;\n }\n\n async clearKeys(userId?: UserId): Promise {\n await this.clearUserKey(true, userId);\n await this.clearMasterKeyHash(userId);\n await this.clearOrgKeys(false, userId);\n await this.clearProviderKeys(false, userId);\n await this.clearKeyPair(false, userId);\n await this.clearPinKeys(userId);\n await this.stateProvider.setUserState(USER_EVER_HAD_USER_KEY, null, userId);\n }\n\n async rsaEncrypt(data: Uint8Array, publicKey?: Uint8Array): Promise {\n if (publicKey == null) {\n publicKey = await this.getPublicKey();\n }\n if (publicKey == null) {\n throw new Error(\"Public key unavailable.\");\n }\n\n const encBytes = await this.cryptoFunctionService.rsaEncrypt(data, publicKey, \"sha1\");\n return new EncString(EncryptionType.Rsa2048_OaepSha1_B64, Utils.fromBufferToB64(encBytes));\n }\n\n async rsaDecrypt(encValue: string, privateKeyValue?: Uint8Array): Promise {\n const headerPieces = encValue.split(\".\");\n let encType: EncryptionType = null;\n let encPieces: string[];\n\n if (headerPieces.length === 1) {\n encType = EncryptionType.Rsa2048_OaepSha256_B64;\n encPieces = [headerPieces[0]];\n } else if (headerPieces.length === 2) {\n try {\n encType = parseInt(headerPieces[0], null);\n encPieces = headerPieces[1].split(\"|\");\n } catch (e) {\n this.logService.error(e);\n }\n }\n\n switch (encType) {\n case EncryptionType.Rsa2048_OaepSha256_B64:\n case EncryptionType.Rsa2048_OaepSha1_B64:\n case EncryptionType.Rsa2048_OaepSha256_HmacSha256_B64: // HmacSha256 types are deprecated\n case EncryptionType.Rsa2048_OaepSha1_HmacSha256_B64:\n break;\n default:\n throw new Error(\"encType unavailable.\");\n }\n\n if (encPieces == null || encPieces.length <= 0) {\n throw new Error(\"encPieces unavailable.\");\n }\n\n const data = Utils.fromB64ToArray(encPieces[0]);\n const privateKey = privateKeyValue ?? (await this.getPrivateKey());\n if (privateKey == null) {\n throw new Error(\"No private key.\");\n }\n\n let alg: \"sha1\" | \"sha256\" = \"sha1\";\n switch (encType) {\n case EncryptionType.Rsa2048_OaepSha256_B64:\n case EncryptionType.Rsa2048_OaepSha256_HmacSha256_B64:\n alg = \"sha256\";\n break;\n case EncryptionType.Rsa2048_OaepSha1_B64:\n case EncryptionType.Rsa2048_OaepSha1_HmacSha256_B64:\n break;\n default:\n throw new Error(\"encType unavailable.\");\n }\n\n return this.cryptoFunctionService.rsaDecrypt(data, privateKey, alg);\n }\n\n // EFForg/OpenWireless\n // ref https://github.com/EFForg/OpenWireless/blob/master/app/js/diceware.js\n async randomNumber(min: number, max: number): Promise {\n let rval = 0;\n const range = max - min + 1;\n const bitsNeeded = Math.ceil(Math.log2(range));\n if (bitsNeeded > 53) {\n throw new Error(\"We cannot generate numbers larger than 53 bits.\");\n }\n\n const bytesNeeded = Math.ceil(bitsNeeded / 8);\n const mask = Math.pow(2, bitsNeeded) - 1;\n // 7776 -> (2^13 = 8192) -1 == 8191 or 0x00001111 11111111\n\n // Fill a byte array with N random numbers\n const byteArray = new Uint8Array(await this.cryptoFunctionService.randomBytes(bytesNeeded));\n\n let p = (bytesNeeded - 1) * 8;\n for (let i = 0; i < bytesNeeded; i++) {\n rval += byteArray[i] * Math.pow(2, p);\n p -= 8;\n }\n\n // Use & to apply the mask and reduce the number of recursive lookups\n rval = rval & mask;\n\n if (rval >= range) {\n // Integer out of acceptable range\n return this.randomNumber(min, max);\n }\n\n // Return an integer that falls within the range\n return min + rval;\n }\n\n // ---HELPERS---\n protected async validateUserKey(key: UserKey): Promise {\n if (!key) {\n return false;\n }\n\n try {\n const [userId, encPrivateKey] = await firstValueFrom(\n this.activeUserEncryptedPrivateKeyState.combinedState$,\n );\n if (encPrivateKey == null) {\n return false;\n }\n\n // Can decrypt private key\n const privateKey = await USER_PRIVATE_KEY.derive([userId, encPrivateKey], {\n encryptService: this.encryptService,\n cryptoService: this,\n });\n\n // Can successfully derive public key\n await USER_PUBLIC_KEY.derive(privateKey, {\n cryptoFunctionService: this.cryptoFunctionService,\n });\n } catch (e) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Initialize all necessary crypto keys needed for a new account.\n * Warning! This completely replaces any existing keys!\n */\n async initAccount(): Promise<{\n userKey: UserKey;\n publicKey: string;\n privateKey: EncString;\n }> {\n const userKey = (await this.keyGenerationService.createKey(512)) as UserKey;\n const [publicKey, privateKey] = await this.makeKeyPair(userKey);\n await this.setUserKey(userKey);\n await this.activeUserEncryptedPrivateKeyState.update(() => privateKey.encryptedString);\n\n return {\n userKey,\n publicKey,\n privateKey,\n };\n }\n\n /**\n * Generates any additional keys if needed. Additional keys are\n * keys such as biometrics, auto, and pin keys.\n * Useful to make sure other keys stay in sync when the user key\n * has been rotated.\n * @param key The user key\n * @param userId The desired user\n */\n protected async storeAdditionalKeys(key: UserKey, userId?: UserId) {\n const storeAuto = await this.shouldStoreKey(KeySuffixOptions.Auto, userId);\n if (storeAuto) {\n await this.stateService.setUserKeyAutoUnlock(key.keyB64, { userId: userId });\n } else {\n await this.stateService.setUserKeyAutoUnlock(null, { userId: userId });\n }\n await this.clearDeprecatedKeys(KeySuffixOptions.Auto, userId);\n\n const storePin = await this.shouldStoreKey(KeySuffixOptions.Pin, userId);\n if (storePin) {\n await this.storePinKey(key, userId);\n // We can't always clear deprecated keys because the pin is only\n // migrated once used to unlock\n await this.clearDeprecatedKeys(KeySuffixOptions.Pin, userId);\n } else {\n await this.stateService.setPinKeyEncryptedUserKey(null, { userId: userId });\n await this.stateService.setPinKeyEncryptedUserKeyEphemeral(null, { userId: userId });\n }\n }\n\n /**\n * Stores the pin key if needed. If MP on Reset is enabled, stores the\n * ephemeral version.\n * @param key The user key\n */\n protected async storePinKey(key: UserKey, userId?: UserId) {\n const pin = await this.encryptService.decryptToUtf8(\n new EncString(await this.stateService.getProtectedPin({ userId: userId })),\n key,\n );\n const pinKey = await this.makePinKey(\n pin,\n await this.stateService.getEmail({ userId: userId }),\n await this.stateService.getKdfType({ userId: userId }),\n await this.stateService.getKdfConfig({ userId: userId }),\n );\n const encPin = await this.encryptService.encrypt(key.key, pinKey);\n\n if ((await this.stateService.getPinKeyEncryptedUserKey({ userId: userId })) != null) {\n await this.stateService.setPinKeyEncryptedUserKey(encPin, { userId: userId });\n } else {\n await this.stateService.setPinKeyEncryptedUserKeyEphemeral(encPin, { userId: userId });\n }\n }\n\n protected async shouldStoreKey(keySuffix: KeySuffixOptions, userId?: UserId) {\n let shouldStoreKey = false;\n switch (keySuffix) {\n case KeySuffixOptions.Auto: {\n const vaultTimeout = await this.stateService.getVaultTimeout({ userId: userId });\n shouldStoreKey = vaultTimeout == null;\n break;\n }\n case KeySuffixOptions.Pin: {\n const protectedPin = await this.stateService.getProtectedPin({ userId: userId });\n shouldStoreKey = !!protectedPin;\n break;\n }\n }\n return shouldStoreKey;\n }\n\n protected async getKeyFromStorage(\n keySuffix: KeySuffixOptions,\n userId?: UserId,\n ): Promise {\n if (keySuffix === KeySuffixOptions.Auto) {\n const userKey = await this.stateService.getUserKeyAutoUnlock({ userId: userId });\n if (userKey) {\n return new SymmetricCryptoKey(Utils.fromB64ToArray(userKey)) as UserKey;\n }\n }\n return null;\n }\n\n /**\n * Validate that the KDF config follows the requirements for the given KDF type.\n *\n * @remarks\n * Should always be called before updating a users KDF config.\n */\n validateKdfConfig(kdf: KdfType, kdfConfig: KdfConfig): void {\n switch (kdf) {\n case KdfType.PBKDF2_SHA256:\n if (!PBKDF2_ITERATIONS.inRange(kdfConfig.iterations)) {\n throw new Error(\n `PBKDF2 iterations must be between ${PBKDF2_ITERATIONS.min} and ${PBKDF2_ITERATIONS.max}`,\n );\n }\n break;\n case KdfType.Argon2id:\n if (!ARGON2_ITERATIONS.inRange(kdfConfig.iterations)) {\n throw new Error(\n `Argon2 iterations must be between ${ARGON2_ITERATIONS.min} and ${ARGON2_ITERATIONS.max}`,\n );\n }\n\n if (!ARGON2_MEMORY.inRange(kdfConfig.memory)) {\n throw new Error(\n `Argon2 memory must be between ${ARGON2_MEMORY.min}mb and ${ARGON2_MEMORY.max}mb`,\n );\n }\n\n if (!ARGON2_PARALLELISM.inRange(kdfConfig.parallelism)) {\n throw new Error(\n `Argon2 parallelism must be between ${ARGON2_PARALLELISM.min} and ${ARGON2_PARALLELISM.max}.`,\n );\n }\n break;\n }\n }\n\n protected async clearAllStoredUserKeys(userId?: UserId): Promise {\n await this.stateService.setUserKeyAutoUnlock(null, { userId: userId });\n await this.stateService.setPinKeyEncryptedUserKeyEphemeral(null, { userId: userId });\n }\n\n private async stretchKey(key: SymmetricCryptoKey): Promise {\n const newKey = new Uint8Array(64);\n const encKey = await this.cryptoFunctionService.hkdfExpand(key.key, \"enc\", 32, \"sha256\");\n const macKey = await this.cryptoFunctionService.hkdfExpand(key.key, \"mac\", 32, \"sha256\");\n newKey.set(new Uint8Array(encKey));\n newKey.set(new Uint8Array(macKey), 32);\n return new SymmetricCryptoKey(newKey);\n }\n\n private async hashPhrase(hash: Uint8Array, minimumEntropy = 64) {\n const entropyPerWord = Math.log(EFFLongWordList.length) / Math.log(2);\n let numWords = Math.ceil(minimumEntropy / entropyPerWord);\n\n const hashArr = Array.from(new Uint8Array(hash));\n const entropyAvailable = hashArr.length * 4;\n if (numWords * entropyPerWord > entropyAvailable) {\n throw new Error(\"Output entropy of hash function is too small\");\n }\n\n const phrase: string[] = [];\n let hashNumber = bigInt.fromArray(hashArr, 256);\n while (numWords--) {\n const remainder = hashNumber.mod(EFFLongWordList.length);\n hashNumber = hashNumber.divide(EFFLongWordList.length);\n phrase.push(EFFLongWordList[remainder as any]);\n }\n return phrase;\n }\n\n private async buildProtectedSymmetricKey(\n encryptionKey: SymmetricCryptoKey,\n newSymKey: Uint8Array,\n ): Promise<[T, EncString]> {\n let protectedSymKey: EncString = null;\n if (encryptionKey.key.byteLength === 32) {\n const stretchedEncryptionKey = await this.stretchKey(encryptionKey);\n protectedSymKey = await this.encryptService.encrypt(newSymKey, stretchedEncryptionKey);\n } else if (encryptionKey.key.byteLength === 64) {\n protectedSymKey = await this.encryptService.encrypt(newSymKey, encryptionKey);\n } else {\n throw new Error(\"Invalid key size.\");\n }\n return [new SymmetricCryptoKey(newSymKey) as T, protectedSymKey];\n }\n\n // --LEGACY METHODS--\n // We previously used the master key for additional keys, but now we use the user key.\n // These methods support migrating the old keys to the new ones.\n // TODO: Remove after 2023.10 release (https://bitwarden.atlassian.net/browse/PM-3475)\n\n async clearDeprecatedKeys(keySuffix: KeySuffixOptions, userId?: UserId) {\n if (keySuffix === KeySuffixOptions.Auto) {\n await this.stateService.setCryptoMasterKeyAuto(null, { userId: userId });\n } else if (keySuffix === KeySuffixOptions.Pin) {\n await this.stateService.setEncryptedPinProtected(null, { userId: userId });\n await this.stateService.setDecryptedPinProtected(null, { userId: userId });\n }\n }\n\n async migrateAutoKeyIfNeeded(userId?: UserId) {\n const oldAutoKey = await this.stateService.getCryptoMasterKeyAuto({ userId: userId });\n if (!oldAutoKey) {\n return;\n }\n // Decrypt\n const masterKey = new SymmetricCryptoKey(Utils.fromB64ToArray(oldAutoKey)) as MasterKey;\n if (await this.isLegacyUser(masterKey, userId)) {\n // Legacy users don't have a user key, so no need to migrate.\n // Instead, set the master key for additional isLegacyUser checks that will log the user out.\n await this.setMasterKey(masterKey, userId);\n return;\n }\n const encryptedUserKey = await this.stateService.getEncryptedCryptoSymmetricKey({\n userId: userId,\n });\n const userKey = await this.decryptUserKeyWithMasterKey(\n masterKey,\n new EncString(encryptedUserKey),\n userId,\n );\n // Migrate\n await this.stateService.setUserKeyAutoUnlock(userKey.keyB64, { userId: userId });\n await this.stateService.setCryptoMasterKeyAuto(null, { userId: userId });\n // Set encrypted user key in case user immediately locks without syncing\n await this.setMasterKeyEncryptedUserKey(encryptedUserKey);\n }\n\n async decryptAndMigrateOldPinKey(\n masterPasswordOnRestart: boolean,\n pin: string,\n email: string,\n kdf: KdfType,\n kdfConfig: KdfConfig,\n oldPinKey: EncString,\n ): Promise {\n // Decrypt\n const masterKey = await this.decryptMasterKeyWithPin(pin, email, kdf, kdfConfig, oldPinKey);\n const encUserKey = await this.stateService.getEncryptedCryptoSymmetricKey();\n const userKey = await this.decryptUserKeyWithMasterKey(masterKey, new EncString(encUserKey));\n // Migrate\n const pinKey = await this.makePinKey(pin, email, kdf, kdfConfig);\n const pinProtectedKey = await this.encryptService.encrypt(userKey.key, pinKey);\n if (masterPasswordOnRestart) {\n await this.stateService.setDecryptedPinProtected(null);\n await this.stateService.setPinKeyEncryptedUserKeyEphemeral(pinProtectedKey);\n } else {\n await this.stateService.setEncryptedPinProtected(null);\n await this.stateService.setPinKeyEncryptedUserKey(pinProtectedKey);\n // We previously only set the protected pin if MP on Restart was enabled\n // now we set it regardless\n const encPin = await this.encryptService.encrypt(pin, userKey);\n await this.stateService.setProtectedPin(encPin.encryptedString);\n }\n // This also clears the old Biometrics key since the new Biometrics key will\n // be created when the user key is set.\n await this.stateService.setCryptoMasterKeyBiometric(null);\n return userKey;\n }\n\n // --DEPRECATED METHODS--\n\n /**\n * @deprecated July 25 2022: Get the key you need from CryptoService (getKeyForUserEncryption or getOrgKey)\n * and then call encryptService.encrypt\n */\n async encrypt(plainValue: string | Uint8Array, key?: SymmetricCryptoKey): Promise {\n key ||= await this.getUserKeyWithLegacySupport();\n return await this.encryptService.encrypt(plainValue, key);\n }\n\n /**\n * @deprecated July 25 2022: Get the key you need from CryptoService (getKeyForUserEncryption or getOrgKey)\n * and then call encryptService.encryptToBytes\n */\n async encryptToBytes(plainValue: Uint8Array, key?: SymmetricCryptoKey): Promise {\n key ||= await this.getUserKeyWithLegacySupport();\n return this.encryptService.encryptToBytes(plainValue, key);\n }\n\n /**\n * @deprecated July 25 2022: Get the key you need from CryptoService (getKeyForUserEncryption or getOrgKey)\n * and then call encryptService.decryptToBytes\n */\n async decryptToBytes(encString: EncString, key?: SymmetricCryptoKey): Promise {\n key ||= await this.getUserKeyWithLegacySupport();\n return this.encryptService.decryptToBytes(encString, key);\n }\n\n /**\n * @deprecated July 25 2022: Get the key you need from CryptoService (getKeyForUserEncryption or getOrgKey)\n * and then call encryptService.decryptToUtf8\n */\n async decryptToUtf8(encString: EncString, key?: SymmetricCryptoKey): Promise {\n key ||= await this.getUserKeyWithLegacySupport();\n return await this.encryptService.decryptToUtf8(encString, key);\n }\n\n /**\n * @deprecated July 25 2022: Get the key you need from CryptoService (getKeyForUserEncryption or getOrgKey)\n * and then call encryptService.decryptToBytes\n */\n async decryptFromBytes(encBuffer: EncArrayBuffer, key: SymmetricCryptoKey): Promise {\n if (encBuffer == null) {\n throw new Error(\"No buffer provided for decryption.\");\n }\n\n key ||= await this.getUserKeyWithLegacySupport();\n\n return this.encryptService.decryptToBytes(encBuffer, key);\n }\n}\n","import { SymmetricCryptoKey } from \"../../../platform/models/domain/symmetric-crypto-key\";\n\nexport class EncryptedObject {\n iv: Uint8Array;\n data: Uint8Array;\n mac: Uint8Array;\n key: SymmetricCryptoKey;\n}\n","import { Utils } from \"../../../platform/misc/utils\";\nimport { CryptoFunctionService } from \"../../abstractions/crypto-function.service\";\nimport { EncryptService } from \"../../abstractions/encrypt.service\";\nimport { LogService } from \"../../abstractions/log.service\";\nimport { EncryptionType } from \"../../enums\";\nimport { Decryptable } from \"../../interfaces/decryptable.interface\";\nimport { Encrypted } from \"../../interfaces/encrypted\";\nimport { InitializerMetadata } from \"../../interfaces/initializer-metadata.interface\";\nimport { EncArrayBuffer } from \"../../models/domain/enc-array-buffer\";\nimport { EncString } from \"../../models/domain/enc-string\";\nimport { EncryptedObject } from \"../../models/domain/encrypted-object\";\nimport { SymmetricCryptoKey } from \"../../models/domain/symmetric-crypto-key\";\n\nexport class EncryptServiceImplementation implements EncryptService {\n constructor(\n protected cryptoFunctionService: CryptoFunctionService,\n protected logService: LogService,\n protected logMacFailures: boolean,\n ) {}\n\n async encrypt(plainValue: string | Uint8Array, key: SymmetricCryptoKey): Promise {\n if (key == null) {\n throw new Error(\"No encryption key provided.\");\n }\n\n if (plainValue == null) {\n return Promise.resolve(null);\n }\n\n let plainBuf: Uint8Array;\n if (typeof plainValue === \"string\") {\n plainBuf = Utils.fromUtf8ToArray(plainValue);\n } else {\n plainBuf = plainValue;\n }\n\n const encObj = await this.aesEncrypt(plainBuf, key);\n const iv = Utils.fromBufferToB64(encObj.iv);\n const data = Utils.fromBufferToB64(encObj.data);\n const mac = encObj.mac != null ? Utils.fromBufferToB64(encObj.mac) : null;\n return new EncString(encObj.key.encType, data, iv, mac);\n }\n\n async encryptToBytes(plainValue: Uint8Array, key: SymmetricCryptoKey): Promise {\n if (key == null) {\n throw new Error(\"No encryption key provided.\");\n }\n\n const encValue = await this.aesEncrypt(plainValue, key);\n let macLen = 0;\n if (encValue.mac != null) {\n macLen = encValue.mac.byteLength;\n }\n\n const encBytes = new Uint8Array(1 + encValue.iv.byteLength + macLen + encValue.data.byteLength);\n encBytes.set([encValue.key.encType]);\n encBytes.set(new Uint8Array(encValue.iv), 1);\n if (encValue.mac != null) {\n encBytes.set(new Uint8Array(encValue.mac), 1 + encValue.iv.byteLength);\n }\n\n encBytes.set(new Uint8Array(encValue.data), 1 + encValue.iv.byteLength + macLen);\n return new EncArrayBuffer(encBytes);\n }\n\n async decryptToUtf8(encString: EncString, key: SymmetricCryptoKey): Promise {\n if (key == null) {\n throw new Error(\"No key provided for decryption.\");\n }\n\n key = this.resolveLegacyKey(key, encString);\n\n if (key.macKey != null && encString?.mac == null) {\n this.logService.error(\"mac required.\");\n return null;\n }\n\n if (key.encType !== encString.encryptionType) {\n this.logService.error(\"encType unavailable.\");\n return null;\n }\n\n const fastParams = this.cryptoFunctionService.aesDecryptFastParameters(\n encString.data,\n encString.iv,\n encString.mac,\n key,\n );\n if (fastParams.macKey != null && fastParams.mac != null) {\n const computedMac = await this.cryptoFunctionService.hmacFast(\n fastParams.macData,\n fastParams.macKey,\n \"sha256\",\n );\n const macsEqual = await this.cryptoFunctionService.compareFast(fastParams.mac, computedMac);\n if (!macsEqual) {\n this.logMacFailed(\"mac failed.\");\n return null;\n }\n }\n\n return await this.cryptoFunctionService.aesDecryptFast(fastParams, \"cbc\");\n }\n\n async decryptToBytes(encThing: Encrypted, key: SymmetricCryptoKey): Promise {\n if (key == null) {\n throw new Error(\"No encryption key provided.\");\n }\n\n if (encThing == null) {\n throw new Error(\"Nothing provided for decryption.\");\n }\n\n key = this.resolveLegacyKey(key, encThing);\n\n if (key.macKey != null && encThing.macBytes == null) {\n return null;\n }\n\n if (key.encType !== encThing.encryptionType) {\n return null;\n }\n\n if (key.macKey != null && encThing.macBytes != null) {\n const macData = new Uint8Array(encThing.ivBytes.byteLength + encThing.dataBytes.byteLength);\n macData.set(new Uint8Array(encThing.ivBytes), 0);\n macData.set(new Uint8Array(encThing.dataBytes), encThing.ivBytes.byteLength);\n const computedMac = await this.cryptoFunctionService.hmac(macData, key.macKey, \"sha256\");\n if (computedMac === null) {\n return null;\n }\n\n const macsMatch = await this.cryptoFunctionService.compare(encThing.macBytes, computedMac);\n if (!macsMatch) {\n this.logMacFailed(\"mac failed.\");\n return null;\n }\n }\n\n const result = await this.cryptoFunctionService.aesDecrypt(\n encThing.dataBytes,\n encThing.ivBytes,\n key.encKey,\n \"cbc\",\n );\n\n return result ?? null;\n }\n\n async rsaEncrypt(data: Uint8Array, publicKey: Uint8Array): Promise {\n if (data == null) {\n throw new Error(\"No data provided for encryption.\");\n }\n\n if (publicKey == null) {\n throw new Error(\"No public key provided for encryption.\");\n }\n const encrypted = await this.cryptoFunctionService.rsaEncrypt(data, publicKey, \"sha1\");\n return new EncString(EncryptionType.Rsa2048_OaepSha1_B64, Utils.fromBufferToB64(encrypted));\n }\n\n async rsaDecrypt(data: EncString, privateKey: Uint8Array): Promise {\n if (data == null) {\n throw new Error(\"No data provided for decryption.\");\n }\n\n let algorithm: \"sha1\" | \"sha256\";\n switch (data.encryptionType) {\n case EncryptionType.Rsa2048_OaepSha1_B64:\n case EncryptionType.Rsa2048_OaepSha1_HmacSha256_B64:\n algorithm = \"sha1\";\n break;\n case EncryptionType.Rsa2048_OaepSha256_B64:\n case EncryptionType.Rsa2048_OaepSha256_HmacSha256_B64:\n algorithm = \"sha256\";\n break;\n default:\n throw new Error(\"Invalid encryption type.\");\n }\n\n if (privateKey == null) {\n throw new Error(\"No private key provided for decryption.\");\n }\n\n return this.cryptoFunctionService.rsaDecrypt(data.dataBytes, privateKey, algorithm);\n }\n\n async decryptItems(\n items: Decryptable[],\n key: SymmetricCryptoKey,\n ): Promise {\n if (items == null || items.length < 1) {\n return [];\n }\n\n // don't use promise.all because this task is not io bound\n const results = [];\n for (let i = 0; i < items.length; i++) {\n results.push(await items[i].decrypt(key));\n }\n return results;\n }\n\n async hash(value: string | Uint8Array, algorithm: \"sha1\" | \"sha256\" | \"sha512\"): Promise {\n const hashArray = await this.cryptoFunctionService.hash(value, algorithm);\n return Utils.fromBufferToB64(hashArray);\n }\n\n private async aesEncrypt(data: Uint8Array, key: SymmetricCryptoKey): Promise {\n const obj = new EncryptedObject();\n obj.key = key;\n obj.iv = await this.cryptoFunctionService.randomBytes(16);\n obj.data = await this.cryptoFunctionService.aesEncrypt(data, obj.iv, obj.key.encKey);\n\n if (obj.key.macKey != null) {\n const macData = new Uint8Array(obj.iv.byteLength + obj.data.byteLength);\n macData.set(new Uint8Array(obj.iv), 0);\n macData.set(new Uint8Array(obj.data), obj.iv.byteLength);\n obj.mac = await this.cryptoFunctionService.hmac(macData, obj.key.macKey, \"sha256\");\n }\n\n return obj;\n }\n\n private logMacFailed(msg: string) {\n if (this.logMacFailures) {\n this.logService.error(msg);\n }\n }\n\n /**\n * Transform into new key for the old encrypt-then-mac scheme if required, otherwise return the current key unchanged\n * @param encThing The encrypted object (e.g. encString or encArrayBuffer) that you want to decrypt\n */\n resolveLegacyKey(key: SymmetricCryptoKey, encThing: Encrypted): SymmetricCryptoKey {\n if (\n encThing.encryptionType === EncryptionType.AesCbc128_HmacSha256_B64 &&\n key.encType === EncryptionType.AesCbc256_B64\n ) {\n return new SymmetricCryptoKey(key.key, EncryptionType.AesCbc128_HmacSha256_B64);\n }\n\n return key;\n }\n}\n","import { Jsonify } from \"type-fest\";\n\nimport { Cipher } from \"../../../vault/models/domain/cipher\";\nimport { CipherView } from \"../../../vault/models/view/cipher.view\";\nimport { InitializerMetadata } from \"../../interfaces/initializer-metadata.interface\";\n\nimport { InitializerKey } from \"./initializer-key\";\n\n/**\n * Internal reference of classes so we can reconstruct objects properly.\n * Each entry should be keyed using the Decryptable.initializerKey property\n */\nconst classInitializers: Record any> = {\n [InitializerKey.Cipher]: Cipher.fromJSON,\n [InitializerKey.CipherView]: CipherView.fromJSON,\n};\n\nexport function getClassInitializer(\n className: InitializerKey,\n): (obj: Jsonify) => T {\n return classInitializers[className];\n}\n","import { defaultIfEmpty, filter, firstValueFrom, fromEvent, map, Subject, takeUntil } from \"rxjs\";\nimport { Jsonify } from \"type-fest\";\n\nimport { Utils } from \"../../../platform/misc/utils\";\nimport { Decryptable } from \"../../interfaces/decryptable.interface\";\nimport { InitializerMetadata } from \"../../interfaces/initializer-metadata.interface\";\nimport { SymmetricCryptoKey } from \"../../models/domain/symmetric-crypto-key\";\n\nimport { EncryptServiceImplementation } from \"./encrypt.service.implementation\";\nimport { getClassInitializer } from \"./get-class-initializer\";\n\n// TTL (time to live) is not strictly required but avoids tying up memory resources if inactive\nconst workerTTL = 3 * 60000; // 3 minutes\n\nexport class MultithreadEncryptServiceImplementation extends EncryptServiceImplementation {\n private worker: Worker;\n private timeout: any;\n\n private clear$ = new Subject();\n\n /**\n * Sends items to a web worker to decrypt them.\n * This utilises multithreading to decrypt items faster without interrupting other operations (e.g. updating UI).\n */\n async decryptItems(\n items: Decryptable[],\n key: SymmetricCryptoKey,\n ): Promise {\n if (items == null || items.length < 1) {\n return [];\n }\n\n this.logService.info(\"Starting decryption using multithreading\");\n\n this.worker ??= new Worker(\n new URL(\n /* webpackChunkName: 'encrypt-worker' */\n \"@bitwarden/common/platform/services/cryptography/encrypt.worker.ts\",\n import.meta.url,\n ),\n );\n\n this.restartTimeout();\n\n const request = {\n id: Utils.newGuid(),\n items: items,\n key: key,\n };\n\n this.worker.postMessage(JSON.stringify(request));\n\n return await firstValueFrom(\n fromEvent(this.worker, \"message\").pipe(\n filter((response: MessageEvent) => response.data?.id === request.id),\n map((response) => JSON.parse(response.data.items)),\n map((items) =>\n items.map((jsonItem: Jsonify) => {\n const initializer = getClassInitializer(jsonItem.initializerKey);\n return initializer(jsonItem);\n }),\n ),\n takeUntil(this.clear$),\n defaultIfEmpty([]),\n ),\n );\n }\n\n private clear() {\n this.clear$.next();\n this.worker?.terminate();\n this.worker = null;\n this.clearTimeout();\n }\n\n private restartTimeout() {\n this.clearTimeout();\n this.timeout = setTimeout(() => this.clear(), workerTTL);\n }\n\n private clearTimeout() {\n if (this.timeout != null) {\n clearTimeout(this.timeout);\n }\n }\n}\n","import { distinctUntilChanged, firstValueFrom, map, Observable, switchMap } from \"rxjs\";\nimport { Jsonify } from \"type-fest\";\n\nimport { AccountService } from \"../../auth/abstractions/account.service\";\nimport { UserId } from \"../../types/guid\";\nimport {\n EnvironmentService,\n Environment,\n Region,\n RegionConfig,\n Urls,\n CloudRegion,\n} from \"../abstractions/environment.service\";\nimport { Utils } from \"../misc/utils\";\nimport {\n ENVIRONMENT_DISK,\n ENVIRONMENT_MEMORY,\n GlobalState,\n KeyDefinition,\n StateProvider,\n} from \"../state\";\n\nexport class EnvironmentUrls {\n base: string = null;\n api: string = null;\n identity: string = null;\n icons: string = null;\n notifications: string = null;\n events: string = null;\n webVault: string = null;\n keyConnector: string = null;\n}\n\nclass EnvironmentState {\n region: Region;\n urls: EnvironmentUrls;\n\n static fromJSON(obj: Jsonify): EnvironmentState {\n return Object.assign(new EnvironmentState(), obj);\n }\n}\n\nexport const ENVIRONMENT_KEY = new KeyDefinition(\n ENVIRONMENT_DISK,\n \"environment\",\n {\n deserializer: EnvironmentState.fromJSON,\n },\n);\n\nexport const CLOUD_REGION_KEY = new KeyDefinition(ENVIRONMENT_MEMORY, \"cloudRegion\", {\n deserializer: (b) => b,\n});\n\n/**\n * The production regions available for selection.\n *\n * In the future we desire to load these urls from the config endpoint.\n */\nexport const PRODUCTION_REGIONS: RegionConfig[] = [\n {\n key: Region.US,\n domain: \"bitwarden.com\",\n urls: {\n base: null,\n api: \"https://api.bitwarden.com\",\n identity: \"https://identity.bitwarden.com\",\n icons: \"https://icons.bitwarden.net\",\n webVault: \"https://vault.bitwarden.com\",\n notifications: \"https://notifications.bitwarden.com\",\n events: \"https://events.bitwarden.com\",\n scim: \"https://scim.bitwarden.com\",\n },\n },\n {\n key: Region.EU,\n domain: \"bitwarden.eu\",\n urls: {\n base: null,\n api: \"https://api.bitwarden.eu\",\n identity: \"https://identity.bitwarden.eu\",\n icons: \"https://icons.bitwarden.eu\",\n webVault: \"https://vault.bitwarden.eu\",\n notifications: \"https://notifications.bitwarden.eu\",\n events: \"https://events.bitwarden.eu\",\n scim: \"https://scim.bitwarden.eu\",\n },\n },\n];\n\n/**\n * The default region when starting the app.\n */\nconst DEFAULT_REGION = Region.US;\n\n/**\n * The default region configuration.\n */\nconst DEFAULT_REGION_CONFIG = PRODUCTION_REGIONS.find((r) => r.key === DEFAULT_REGION);\n\nexport class DefaultEnvironmentService implements EnvironmentService {\n private globalState: GlobalState;\n private globalCloudRegionState: GlobalState;\n\n // We intentionally don't want the helper on account service, we want the null back if there is no active user\n private activeAccountId$: Observable = this.accountService.activeAccount$.pipe(\n map((a) => a?.id),\n );\n\n environment$: Observable;\n cloudWebVaultUrl$: Observable;\n\n constructor(\n private stateProvider: StateProvider,\n private accountService: AccountService,\n ) {\n this.globalState = this.stateProvider.getGlobal(ENVIRONMENT_KEY);\n this.globalCloudRegionState = this.stateProvider.getGlobal(CLOUD_REGION_KEY);\n\n const account$ = this.activeAccountId$.pipe(\n // Use == here to not trigger on undefined -> null transition\n distinctUntilChanged((oldUserId: UserId, newUserId: UserId) => oldUserId == newUserId),\n );\n\n this.environment$ = account$.pipe(\n switchMap((userId) => {\n const t = userId\n ? this.stateProvider.getUser(userId, ENVIRONMENT_KEY).state$\n : this.stateProvider.getGlobal(ENVIRONMENT_KEY).state$;\n return t;\n }),\n map((state) => {\n return this.buildEnvironment(state?.region, state?.urls);\n }),\n );\n this.cloudWebVaultUrl$ = account$.pipe(\n switchMap((userId) => {\n const t = userId\n ? this.stateProvider.getUser(userId, CLOUD_REGION_KEY).state$\n : this.stateProvider.getGlobal(CLOUD_REGION_KEY).state$;\n return t;\n }),\n map((region) => {\n if (region != null) {\n const config = this.getRegionConfig(region);\n\n if (config != null) {\n return config.urls.webVault;\n }\n }\n return DEFAULT_REGION_CONFIG.urls.webVault;\n }),\n );\n }\n\n availableRegions(): RegionConfig[] {\n const additionalRegions = (process.env.ADDITIONAL_REGIONS as unknown as RegionConfig[]) ?? [];\n return PRODUCTION_REGIONS.concat(additionalRegions);\n }\n\n /**\n * Get the region configuration for the given region.\n */\n private getRegionConfig(region: Region): RegionConfig | undefined {\n return this.availableRegions().find((r) => r.key === region);\n }\n\n async setEnvironment(region: Region, urls?: Urls): Promise {\n // Unknown regions are treated as self-hosted\n if (this.getRegionConfig(region) == null) {\n region = Region.SelfHosted;\n }\n\n // If self-hosted ensure urls are valid else fallback to default region\n if (region == Region.SelfHosted && isEmpty(urls)) {\n region = DEFAULT_REGION;\n }\n\n if (region != Region.SelfHosted) {\n await this.globalState.update(() => ({\n region: region,\n urls: null,\n }));\n\n return null;\n } else {\n // Clean the urls\n urls.base = formatUrl(urls.base);\n urls.webVault = formatUrl(urls.webVault);\n urls.api = formatUrl(urls.api);\n urls.identity = formatUrl(urls.identity);\n urls.icons = formatUrl(urls.icons);\n urls.notifications = formatUrl(urls.notifications);\n urls.events = formatUrl(urls.events);\n urls.keyConnector = formatUrl(urls.keyConnector);\n urls.scim = null;\n\n await this.globalState.update(() => ({\n region: region,\n urls: {\n base: urls.base,\n api: urls.api,\n identity: urls.identity,\n webVault: urls.webVault,\n icons: urls.icons,\n notifications: urls.notifications,\n events: urls.events,\n keyConnector: urls.keyConnector,\n },\n }));\n\n return urls;\n }\n }\n\n /**\n * Helper for building the environment from state. Performs some general sanitization to avoid invalid regions and urls.\n */\n protected buildEnvironment(region: Region, urls: Urls) {\n // Unknown regions are treated as self-hosted\n if (this.getRegionConfig(region) == null) {\n region = Region.SelfHosted;\n }\n\n // If self-hosted ensure urls are valid else fallback to default region\n if (region == Region.SelfHosted && isEmpty(urls)) {\n region = DEFAULT_REGION;\n }\n\n // Load urls from region config\n if (region != Region.SelfHosted) {\n const regionConfig = this.getRegionConfig(region);\n if (regionConfig != null) {\n return new CloudEnvironment(regionConfig);\n }\n }\n\n return new SelfHostedEnvironment(urls);\n }\n\n async setCloudRegion(userId: UserId, region: CloudRegion) {\n if (userId == null) {\n await this.globalCloudRegionState.update(() => region);\n } else {\n await this.stateProvider.getUser(userId, CLOUD_REGION_KEY).update(() => region);\n }\n }\n\n async getEnvironment(userId?: UserId) {\n if (userId == null) {\n return await firstValueFrom(this.environment$);\n }\n\n const state = await this.getEnvironmentState(userId);\n return this.buildEnvironment(state.region, state.urls);\n }\n\n private async getEnvironmentState(userId: UserId | null) {\n // Previous rules dictated that we only get from user scoped state if there is an active user.\n const activeUserId = await firstValueFrom(this.activeAccountId$);\n return activeUserId == null\n ? await firstValueFrom(this.globalState.state$)\n : await firstValueFrom(\n this.stateProvider.getUser(userId ?? activeUserId, ENVIRONMENT_KEY).state$,\n );\n }\n\n async seedUserEnvironment(userId: UserId) {\n const global = await firstValueFrom(this.globalState.state$);\n await this.stateProvider.getUser(userId, ENVIRONMENT_KEY).update(() => global);\n }\n}\n\nfunction formatUrl(url: string): string {\n if (url == null || url === \"\") {\n return null;\n }\n\n url = url.replace(/\\/+$/g, \"\");\n if (!url.startsWith(\"http://\") && !url.startsWith(\"https://\")) {\n url = \"https://\" + url;\n }\n\n return url.trim();\n}\n\nfunction isEmpty(u?: Urls): boolean {\n if (u == null) {\n return true;\n }\n\n return (\n u.base == null &&\n u.webVault == null &&\n u.api == null &&\n u.identity == null &&\n u.icons == null &&\n u.notifications == null &&\n u.events == null\n );\n}\n\nabstract class UrlEnvironment implements Environment {\n constructor(\n protected region: Region,\n protected urls: Urls,\n ) {\n // Scim is always null for self-hosted\n if (region == Region.SelfHosted) {\n this.urls.scim = null;\n }\n }\n\n abstract getHostname(): string;\n\n getRegion() {\n return this.region;\n }\n\n getUrls() {\n return {\n base: this.urls.base,\n webVault: this.urls.webVault,\n api: this.urls.api,\n identity: this.urls.identity,\n icons: this.urls.icons,\n notifications: this.urls.notifications,\n events: this.urls.events,\n keyConnector: this.urls.keyConnector,\n scim: this.urls.scim,\n };\n }\n\n hasBaseUrl() {\n return this.urls.base != null;\n }\n\n getWebVaultUrl() {\n return this.getUrl(\"webVault\", \"\");\n }\n\n getApiUrl() {\n return this.getUrl(\"api\", \"/api\");\n }\n\n getEventsUrl() {\n return this.getUrl(\"events\", \"/events\");\n }\n\n getIconsUrl() {\n return this.getUrl(\"icons\", \"/icons\");\n }\n\n getIdentityUrl() {\n return this.getUrl(\"identity\", \"/identity\");\n }\n\n getKeyConnectorUrl() {\n return this.urls.keyConnector;\n }\n\n getNotificationsUrl() {\n return this.getUrl(\"notifications\", \"/notifications\");\n }\n\n getScimUrl() {\n if (this.urls.scim != null) {\n return this.urls.scim + \"/v2\";\n }\n\n return this.getWebVaultUrl() === \"https://vault.bitwarden.com\"\n ? \"https://scim.bitwarden.com/v2\"\n : this.getWebVaultUrl() + \"/scim/v2\";\n }\n\n getSendUrl() {\n return this.getWebVaultUrl() === \"https://vault.bitwarden.com\"\n ? \"https://send.bitwarden.com/#\"\n : this.getWebVaultUrl() + \"/#/send/\";\n }\n\n /**\n * Presume that if the region is not self-hosted, it is cloud.\n */\n isCloud(): boolean {\n return this.region !== Region.SelfHosted;\n }\n\n /**\n * Helper for getting an URL.\n *\n * @param key Key of the URL to get from URLs\n * @param baseSuffix Suffix to append to the base URL if the url is not set\n * @returns\n */\n private getUrl(key: keyof Urls, baseSuffix: string) {\n if (this.urls[key] != null) {\n return this.urls[key];\n }\n\n if (this.urls.base) {\n return this.urls.base + baseSuffix;\n }\n\n return DEFAULT_REGION_CONFIG.urls[key];\n }\n}\n\n/**\n * Denote a cloud environment.\n */\nexport class CloudEnvironment extends UrlEnvironment {\n constructor(private config: RegionConfig) {\n super(config.key, config.urls);\n }\n\n /**\n * Cloud always returns nice urls, i.e. bitwarden.com instead of vault.bitwarden.com.\n */\n getHostname() {\n return this.config.domain;\n }\n}\n\nexport class SelfHostedEnvironment extends UrlEnvironment {\n constructor(urls: Urls) {\n super(Region.SelfHosted, urls);\n }\n\n getHostname() {\n return Utils.getHost(this.getWebVaultUrl());\n }\n}\n","import { LogService } from \"../../abstractions/log.service\";\nimport { Utils } from \"../../misc/utils\";\nimport { EncArrayBuffer } from \"../../models/domain/enc-array-buffer\";\n\nconst MAX_SINGLE_BLOB_UPLOAD_SIZE = 256 * 1024 * 1024; // 256 MiB\nconst MAX_BLOCKS_PER_BLOB = 50000;\n\nexport class AzureFileUploadService {\n constructor(private logService: LogService) {}\n\n async upload(url: string, data: EncArrayBuffer, renewalCallback: () => Promise) {\n if (data.buffer.byteLength <= MAX_SINGLE_BLOB_UPLOAD_SIZE) {\n return await this.azureUploadBlob(url, data);\n } else {\n return await this.azureUploadBlocks(url, data, renewalCallback);\n }\n }\n private async azureUploadBlob(url: string, data: EncArrayBuffer) {\n const urlObject = Utils.getUrl(url);\n const headers = new Headers({\n \"x-ms-date\": new Date().toUTCString(),\n \"x-ms-version\": urlObject.searchParams.get(\"sv\"),\n \"Content-Length\": data.buffer.byteLength.toString(),\n \"x-ms-blob-type\": \"BlockBlob\",\n });\n\n const request = new Request(url, {\n body: data.buffer,\n cache: \"no-store\",\n method: \"PUT\",\n headers: headers,\n });\n\n const blobResponse = await fetch(request);\n\n if (blobResponse.status !== 201) {\n throw new Error(`Failed to create Azure blob: ${blobResponse.status}`);\n }\n }\n private async azureUploadBlocks(\n url: string,\n data: EncArrayBuffer,\n renewalCallback: () => Promise,\n ) {\n const baseUrl = Utils.getUrl(url);\n const blockSize = this.getMaxBlockSize(baseUrl.searchParams.get(\"sv\"));\n let blockIndex = 0;\n const numBlocks = Math.ceil(data.buffer.byteLength / blockSize);\n const blocksStaged: string[] = [];\n\n if (numBlocks > MAX_BLOCKS_PER_BLOB) {\n throw new Error(\n `Cannot upload file, exceeds maximum size of ${blockSize * MAX_BLOCKS_PER_BLOB}`,\n );\n }\n\n // eslint-disable-next-line\n try {\n while (blockIndex < numBlocks) {\n url = await this.renewUrlIfNecessary(url, renewalCallback);\n const blockUrl = Utils.getUrl(url);\n const blockId = this.encodedBlockId(blockIndex);\n blockUrl.searchParams.append(\"comp\", \"block\");\n blockUrl.searchParams.append(\"blockid\", blockId);\n const start = blockIndex * blockSize;\n const blockData = data.buffer.slice(start, start + blockSize);\n const blockHeaders = new Headers({\n \"x-ms-date\": new Date().toUTCString(),\n \"x-ms-version\": blockUrl.searchParams.get(\"sv\"),\n \"Content-Length\": blockData.byteLength.toString(),\n });\n\n const blockRequest = new Request(blockUrl.toString(), {\n body: blockData,\n cache: \"no-store\",\n method: \"PUT\",\n headers: blockHeaders,\n });\n\n const blockResponse = await fetch(blockRequest);\n\n if (blockResponse.status !== 201) {\n const message = `Unsuccessful block PUT. Received status ${blockResponse.status}`;\n this.logService.error(message + \"\\n\" + (await blockResponse.json()));\n throw new Error(message);\n }\n\n blocksStaged.push(blockId);\n blockIndex++;\n }\n\n url = await this.renewUrlIfNecessary(url, renewalCallback);\n const blockListUrl = Utils.getUrl(url);\n const blockListXml = this.blockListXml(blocksStaged);\n blockListUrl.searchParams.append(\"comp\", \"blocklist\");\n const headers = new Headers({\n \"x-ms-date\": new Date().toUTCString(),\n \"x-ms-version\": blockListUrl.searchParams.get(\"sv\"),\n \"Content-Length\": blockListXml.length.toString(),\n });\n\n const request = new Request(blockListUrl.toString(), {\n body: blockListXml,\n cache: \"no-store\",\n method: \"PUT\",\n headers: headers,\n });\n\n const response = await fetch(request);\n\n if (response.status !== 201) {\n const message = `Unsuccessful block list PUT. Received status ${response.status}`;\n this.logService.error(message + \"\\n\" + (await response.json()));\n throw new Error(message);\n }\n } catch (e) {\n throw e;\n }\n }\n\n private async renewUrlIfNecessary(\n url: string,\n renewalCallback: () => Promise,\n ): Promise {\n const urlObject = Utils.getUrl(url);\n const expiry = new Date(urlObject.searchParams.get(\"se\") ?? \"\");\n\n if (isNaN(expiry.getTime())) {\n expiry.setTime(Date.now() + 3600000);\n }\n\n if (expiry.getTime() < Date.now() + 1000) {\n return await renewalCallback();\n }\n return url;\n }\n\n private encodedBlockId(blockIndex: number) {\n // Encoded blockId max size is 64, so pre-encoding max size is 48\n const utfBlockId = (\n \"000000000000000000000000000000000000000000000000\" + blockIndex.toString()\n ).slice(-48);\n return Utils.fromUtf8ToB64(utfBlockId);\n }\n\n private blockListXml(blockIdList: string[]) {\n let xml = '';\n blockIdList.forEach((blockId) => {\n xml += `${blockId}`;\n });\n xml += \"\";\n return xml;\n }\n\n private getMaxBlockSize(version: string) {\n if (Version.compare(version, \"2019-12-12\") >= 0) {\n return 4000 * 1024 * 1024; // 4000 MiB\n } else if (Version.compare(version, \"2016-05-31\") >= 0) {\n return 100 * 1024 * 1024; // 100 MiB\n } else {\n return 4 * 1024 * 1024; // 4 MiB\n }\n }\n}\n\nclass Version {\n /**\n * Compares two Azure Versions against each other\n * @param a Version to compare\n * @param b Version to compare\n * @returns a number less than zero if b is newer than a, 0 if equal,\n * and greater than zero if a is newer than b\n */\n static compare(a: Required | string, b: Required | string) {\n if (typeof a === \"string\") {\n a = new Version(a);\n }\n\n if (typeof b === \"string\") {\n b = new Version(b);\n }\n\n return a.year !== b.year\n ? a.year - b.year\n : a.month !== b.month\n ? a.month - b.month\n : a.day !== b.day\n ? a.day - b.day\n : 0;\n }\n year = 0;\n month = 0;\n day = 0;\n\n constructor(version: string) {\n try {\n const parts = version.split(\"-\").map((v) => Number.parseInt(v, 10));\n this.year = parts[0];\n this.month = parts[1];\n this.day = parts[2];\n } catch {\n // Ignore error\n }\n }\n /**\n * Compares two Azure Versions against each other\n * @param compareTo Version to compare against\n * @returns a number less than zero if compareTo is newer, 0 if equal,\n * and greater than zero if this is greater than compareTo\n */\n compare(compareTo: Required | string) {\n return Version.compare(this, compareTo);\n }\n}\n","import { Utils } from \"../../misc/utils\";\nimport { EncArrayBuffer } from \"../../models/domain/enc-array-buffer\";\n\nexport class BitwardenFileUploadService {\n async upload(\n encryptedFileName: string,\n encryptedFileData: EncArrayBuffer,\n apiCall: (fd: FormData) => Promise,\n ) {\n const fd = new FormData();\n try {\n const blob = new Blob([encryptedFileData.buffer], { type: \"application/octet-stream\" });\n fd.append(\"data\", blob, encryptedFileName);\n } catch (e) {\n if (Utils.isNode && !Utils.isBrowser) {\n fd.append(\n \"data\",\n Buffer.from(encryptedFileData.buffer) as any,\n {\n filepath: encryptedFileName,\n contentType: \"application/octet-stream\",\n } as any,\n );\n } else {\n throw e;\n }\n }\n\n await apiCall(fd);\n }\n}\n","import { MigrationHelper } from \"./migration-helper\";\nimport { Direction, Migrator, VersionFrom, VersionTo } from \"./migrator\";\n\nexport class MigrationBuilder {\n /** Create a new MigrationBuilder with an empty buffer of migrations to perform.\n *\n * Add migrations to the buffer with {@link with} and {@link rollback}.\n * @returns A new MigrationBuilder.\n */\n static create(): MigrationBuilder<0> {\n return new MigrationBuilder([]);\n }\n\n private constructor(\n private migrations: readonly { migrator: Migrator; direction: Direction }[],\n ) {}\n\n /** Add a migrator to the MigrationBuilder. Types are updated such that the chained MigrationBuilder must currently be\n * at state version equal to the from version of the migrator. Return as MigrationBuilder where TTo is the to\n * version of the migrator, so that the next migrator can be chained.\n *\n * @param migrate A migrator class or a tuple of a migrator class, the from version, and the to version. A tuple is\n * required to instantiate version numbers unless a default constructor is defined.\n * @returns A new MigrationBuilder with the to version of the migrator as the current version.\n */\n with<\n TMigrator extends Migrator,\n TFrom extends VersionFrom & TCurrent,\n TTo extends VersionTo,\n >(\n ...migrate: [new () => TMigrator] | [new (from: TFrom, to: TTo) => TMigrator, TFrom, TTo]\n ): MigrationBuilder {\n return this.addMigrator(migrate, \"up\");\n }\n\n /** Add a migrator to rollback on the MigrationBuilder's list of migrations. As with {@link with}, types of\n * MigrationBuilder and Migrator must align. However, this time the migration is reversed so TCurrent of the\n * MigrationBuilder must be equal to the to version of the migrator. Return as MigrationBuilder where TFrom\n * is the from version of the migrator, so that the next migrator can be chained.\n *\n * @param migrate A migrator class or a tuple of a migrator class, the from version, and the to version. A tuple is\n * required to instantiate version numbers unless a default constructor is defined.\n * @returns A new MigrationBuilder with the from version of the migrator as the current version.\n */\n rollback<\n TMigrator extends Migrator,\n TFrom extends VersionFrom,\n TTo extends VersionTo & TCurrent,\n >(\n ...migrate: [new () => TMigrator] | [new (from: TFrom, to: TTo) => TMigrator, TTo, TFrom]\n ): MigrationBuilder {\n if (migrate.length === 3) {\n migrate = [migrate[0], migrate[2], migrate[1]];\n }\n return this.addMigrator(migrate, \"down\");\n }\n\n /** Execute the migrations as defined in the MigrationBuilder's migrator buffer */\n migrate(helper: MigrationHelper): Promise {\n return this.migrations.reduce(\n (promise, migrator) =>\n promise.then(async () => {\n await this.runMigrator(migrator.migrator, helper, migrator.direction);\n }),\n Promise.resolve(),\n );\n }\n\n private addMigrator<\n TMigrator extends Migrator,\n TFrom extends VersionFrom & TCurrent,\n TTo extends VersionTo,\n >(\n migrate: [new () => TMigrator] | [new (from: TFrom, to: TTo) => TMigrator, TFrom, TTo],\n direction: Direction = \"up\",\n ) {\n const newMigration =\n migrate.length === 1\n ? { migrator: new migrate[0](), direction }\n : { migrator: new migrate[0](migrate[1], migrate[2]), direction };\n\n return new MigrationBuilder([...this.migrations, newMigration]);\n }\n\n private async runMigrator(\n migrator: Migrator,\n helper: MigrationHelper,\n direction: Direction,\n ): Promise {\n const shouldMigrate = await migrator.shouldMigrate(helper, direction);\n helper.info(\n `Migrator ${migrator.constructor.name} (to version ${migrator.toVersion}) should migrate: ${shouldMigrate} - ${direction}`,\n );\n if (shouldMigrate) {\n const method = direction === \"up\" ? migrator.migrate : migrator.rollback;\n await method.bind(migrator)(helper);\n helper.info(\n `Migrator ${migrator.constructor.name} (to version ${migrator.toVersion}) migrated - ${direction}`,\n );\n await migrator.updateVersion(helper, direction);\n helper.info(\n `Migrator ${migrator.constructor.name} (to version ${migrator.toVersion}) updated version - ${direction}`,\n );\n }\n }\n}\n","import { NonNegativeInteger } from \"type-fest\";\n\nimport { MigrationHelper } from \"./migration-helper\";\n\nexport const IRREVERSIBLE = new Error(\"Irreversible migration\");\n\nexport type VersionFrom =\n T extends Migrator\n ? TFrom extends NonNegativeInteger\n ? TFrom\n : never\n : never;\nexport type VersionTo =\n T extends Migrator\n ? TTo extends NonNegativeInteger\n ? TTo\n : never\n : never;\nexport type Direction = \"up\" | \"down\";\n\nexport abstract class Migrator {\n constructor(\n public fromVersion: TFrom,\n public toVersion: TTo,\n ) {\n if (fromVersion == null || toVersion == null) {\n throw new Error(\"Invalid migration\");\n }\n if (fromVersion > toVersion) {\n throw new Error(\"Invalid migration\");\n }\n }\n\n shouldMigrate(helper: MigrationHelper, direction: Direction): Promise {\n const startVersion = direction === \"up\" ? this.fromVersion : this.toVersion;\n return Promise.resolve(helper.currentVersion === startVersion);\n }\n abstract migrate(helper: MigrationHelper): Promise;\n abstract rollback(helper: MigrationHelper): Promise;\n async updateVersion(helper: MigrationHelper, direction: Direction): Promise {\n const endVersion = direction === \"up\" ? this.toVersion : this.fromVersion;\n helper.currentVersion = endVersion;\n await helper.set(\"stateVersion\", endVersion);\n }\n}\n","import { KeyDefinitionLike, MigrationHelper } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\ntype ExpectedAccountType = {\n profile?: {\n everHadUserKey?: boolean;\n };\n};\n\nconst USER_EVER_HAD_USER_KEY: KeyDefinitionLike = {\n key: \"everHadUserKey\",\n stateDefinition: {\n name: \"crypto\",\n },\n};\n\nexport class EverHadUserKeyMigrator extends Migrator<9, 10> {\n async migrate(helper: MigrationHelper): Promise {\n const accounts = await helper.getAccounts();\n async function migrateAccount(userId: string, account: ExpectedAccountType): Promise {\n const value = account?.profile?.everHadUserKey;\n await helper.setToUser(userId, USER_EVER_HAD_USER_KEY, value ?? false);\n if (value != null) {\n delete account.profile.everHadUserKey;\n }\n await helper.set(userId, account);\n }\n\n await Promise.all([...accounts.map(({ userId, account }) => migrateAccount(userId, account))]);\n }\n async rollback(helper: MigrationHelper): Promise {\n const accounts = await helper.getAccounts();\n async function rollbackAccount(userId: string, account: ExpectedAccountType): Promise {\n const value = await helper.getFromUser(userId, USER_EVER_HAD_USER_KEY);\n if (account) {\n account.profile = Object.assign(account.profile ?? {}, {\n everHadUserKey: value,\n });\n await helper.set(userId, account);\n }\n await helper.setToUser(userId, USER_EVER_HAD_USER_KEY, null);\n }\n\n await Promise.all([...accounts.map(({ userId, account }) => rollbackAccount(userId, account))]);\n }\n}\n","import { KeyDefinitionLike, MigrationHelper } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\ntype OrgKeyDataType = {\n type: \"organization\" | \"provider\";\n key: string;\n providerId?: string;\n};\n\ntype ExpectedAccountType = {\n keys?: {\n organizationKeys?: {\n encrypted?: Record;\n };\n };\n};\n\nconst USER_ENCRYPTED_ORGANIZATION_KEYS: KeyDefinitionLike = {\n key: \"organizationKeys\",\n stateDefinition: {\n name: \"crypto\",\n },\n};\n\nexport class OrganizationKeyMigrator extends Migrator<10, 11> {\n async migrate(helper: MigrationHelper): Promise {\n const accounts = await helper.getAccounts();\n async function migrateAccount(userId: string, account: ExpectedAccountType): Promise {\n const value = account?.keys?.organizationKeys?.encrypted;\n if (value != null) {\n await helper.setToUser(userId, USER_ENCRYPTED_ORGANIZATION_KEYS, value);\n delete account.keys.organizationKeys;\n await helper.set(userId, account);\n }\n }\n\n await Promise.all([...accounts.map(({ userId, account }) => migrateAccount(userId, account))]);\n }\n async rollback(helper: MigrationHelper): Promise {\n const accounts = await helper.getAccounts();\n async function rollbackAccount(userId: string, account: ExpectedAccountType): Promise {\n const value = await helper.getFromUser>(\n userId,\n USER_ENCRYPTED_ORGANIZATION_KEYS,\n );\n if (account && value) {\n account.keys = Object.assign(account.keys ?? {}, {\n organizationKeys: {\n encrypted: value,\n },\n });\n await helper.set(userId, account);\n }\n await helper.setToUser(userId, USER_ENCRYPTED_ORGANIZATION_KEYS, null);\n }\n\n await Promise.all([...accounts.map(({ userId, account }) => rollbackAccount(userId, account))]);\n }\n}\n","import { KeyDefinitionLike, MigrationHelper, StateDefinitionLike } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\ntype EnvironmentUrls = Record;\n\ntype ExpectedAccountType = {\n settings?: { region?: string; environmentUrls?: EnvironmentUrls };\n};\n\ntype ExpectedGlobalType = { region?: string; environmentUrls?: EnvironmentUrls };\n\nconst ENVIRONMENT_STATE: StateDefinitionLike = { name: \"environment\" };\n\nconst REGION_KEY: KeyDefinitionLike = { key: \"region\", stateDefinition: ENVIRONMENT_STATE };\nconst URLS_KEY: KeyDefinitionLike = { key: \"urls\", stateDefinition: ENVIRONMENT_STATE };\n\nexport class MoveEnvironmentStateToProviders extends Migrator<11, 12> {\n async migrate(helper: MigrationHelper): Promise {\n const legacyGlobal = await helper.get(\"global\");\n\n // Move global data\n if (legacyGlobal?.region != null) {\n await helper.setToGlobal(REGION_KEY, legacyGlobal.region);\n }\n\n if (legacyGlobal?.environmentUrls != null) {\n await helper.setToGlobal(URLS_KEY, legacyGlobal.environmentUrls);\n }\n\n const legacyAccounts = await helper.getAccounts();\n\n await Promise.all(\n legacyAccounts.map(async ({ userId, account }) => {\n // Move account data\n if (account?.settings?.region != null) {\n await helper.setToUser(userId, REGION_KEY, account.settings.region);\n }\n\n if (account?.settings?.environmentUrls != null) {\n await helper.setToUser(userId, URLS_KEY, account.settings.environmentUrls);\n }\n\n // Delete old account data\n delete account?.settings?.region;\n delete account?.settings?.environmentUrls;\n await helper.set(userId, account);\n }),\n );\n\n // Delete legacy global data\n delete legacyGlobal?.region;\n delete legacyGlobal?.environmentUrls;\n await helper.set(\"global\", legacyGlobal);\n }\n\n async rollback(helper: MigrationHelper): Promise {\n let legacyGlobal = await helper.get(\"global\");\n\n let updatedLegacyGlobal = false;\n\n const globalRegion = await helper.getFromGlobal(REGION_KEY);\n\n if (globalRegion) {\n if (!legacyGlobal) {\n legacyGlobal = {};\n }\n\n updatedLegacyGlobal = true;\n legacyGlobal.region = globalRegion;\n await helper.setToGlobal(REGION_KEY, null);\n }\n\n const globalUrls = await helper.getFromGlobal(URLS_KEY);\n\n if (globalUrls) {\n if (!legacyGlobal) {\n legacyGlobal = {};\n }\n\n updatedLegacyGlobal = true;\n legacyGlobal.environmentUrls = globalUrls;\n await helper.setToGlobal(URLS_KEY, null);\n }\n\n if (updatedLegacyGlobal) {\n await helper.set(\"global\", legacyGlobal);\n }\n\n async function rollbackUser(userId: string, account: ExpectedAccountType) {\n let updatedAccount = false;\n const userRegion = await helper.getFromUser(userId, REGION_KEY);\n\n if (userRegion) {\n if (!account) {\n account = {};\n }\n\n if (!account.settings) {\n account.settings = {};\n }\n\n updatedAccount = true;\n account.settings.region = userRegion;\n await helper.setToUser(userId, REGION_KEY, null);\n }\n\n const userUrls = await helper.getFromUser(userId, URLS_KEY);\n\n if (userUrls) {\n if (!account) {\n account = {};\n }\n\n if (!account.settings) {\n account.settings = {};\n }\n\n updatedAccount = true;\n account.settings.environmentUrls = userUrls;\n await helper.setToUser(userId, URLS_KEY, null);\n }\n\n if (updatedAccount) {\n await helper.set(userId, account);\n }\n }\n\n const accounts = await helper.getAccounts();\n\n await Promise.all(accounts.map(({ userId, account }) => rollbackUser(userId, account)));\n }\n}\n","import { KeyDefinitionLike, MigrationHelper } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\ntype ExpectedAccountType = {\n keys?: {\n providerKeys?: {\n encrypted?: Record; // Record where EncryptedString is the ProviderKey encrypted by the UserKey.\n };\n };\n};\n\nconst USER_ENCRYPTED_PROVIDER_KEYS: KeyDefinitionLike = {\n key: \"providerKeys\",\n stateDefinition: {\n name: \"crypto\",\n },\n};\n\nexport class ProviderKeyMigrator extends Migrator<12, 13> {\n async migrate(helper: MigrationHelper): Promise {\n const accounts = await helper.getAccounts();\n async function migrateAccount(userId: string, account: ExpectedAccountType): Promise {\n const value = account?.keys?.providerKeys?.encrypted;\n if (value != null) {\n await helper.setToUser(userId, USER_ENCRYPTED_PROVIDER_KEYS, value);\n delete account.keys.providerKeys;\n await helper.set(userId, account);\n }\n }\n\n await Promise.all([...accounts.map(({ userId, account }) => migrateAccount(userId, account))]);\n }\n async rollback(helper: MigrationHelper): Promise {\n const accounts = await helper.getAccounts();\n async function rollbackAccount(userId: string, account: ExpectedAccountType): Promise {\n const value = await helper.getFromUser>(\n userId,\n USER_ENCRYPTED_PROVIDER_KEYS,\n );\n if (account && value) {\n account.keys = Object.assign(account.keys ?? {}, {\n providerKeys: {\n encrypted: value,\n },\n });\n await helper.set(userId, account);\n }\n await helper.setToUser(userId, USER_ENCRYPTED_PROVIDER_KEYS, null);\n }\n\n await Promise.all([...accounts.map(({ userId, account }) => rollbackAccount(userId, account))]);\n }\n}\n","import { KeyDefinitionLike, MigrationHelper } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\ntype ExpectedAccountType = {\n settings?: {\n disableAutoBiometricsPrompt?: boolean;\n biometricUnlock?: boolean;\n dismissedBiometricRequirePasswordOnStartCallout?: boolean;\n };\n keys?: { biometricEncryptionClientKeyHalf?: string };\n};\n\n// Biometric text, no auto prompt text, fingerprint validated, and prompt cancelled are refreshed on every app start, so we don't need to migrate them\nexport const CLIENT_KEY_HALF: KeyDefinitionLike = {\n key: \"clientKeyHalf\",\n stateDefinition: { name: \"biometricSettings\" },\n};\n\nexport class MoveBiometricClientKeyHalfToStateProviders extends Migrator<13, 14> {\n async migrate(helper: MigrationHelper): Promise {\n const legacyAccounts = await helper.getAccounts();\n\n await Promise.all(\n legacyAccounts.map(async ({ userId, account }) => {\n // Move account data\n if (account?.keys?.biometricEncryptionClientKeyHalf != null) {\n await helper.setToUser(\n userId,\n CLIENT_KEY_HALF,\n account.keys.biometricEncryptionClientKeyHalf,\n );\n\n // Delete old account data\n delete account?.keys?.biometricEncryptionClientKeyHalf;\n await helper.set(userId, account);\n }\n }),\n );\n }\n\n async rollback(helper: MigrationHelper): Promise {\n async function rollbackUser(userId: string, account: ExpectedAccountType) {\n let updatedAccount = false;\n\n const userKeyHalf = await helper.getFromUser(userId, CLIENT_KEY_HALF);\n\n if (userKeyHalf) {\n account ??= {};\n account.keys ??= {};\n\n updatedAccount = true;\n account.keys.biometricEncryptionClientKeyHalf = userKeyHalf;\n await helper.setToUser(userId, CLIENT_KEY_HALF, null);\n }\n\n if (updatedAccount) {\n await helper.set(userId, account);\n }\n }\n\n const accounts = await helper.getAccounts();\n\n await Promise.all(accounts.map(({ userId, account }) => rollbackUser(userId, account)));\n }\n}\n","import { KeyDefinitionLike, MigrationHelper } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\ntype FolderDataType = {\n id: string;\n name: string;\n revisionDate: string;\n};\n\ntype ExpectedAccountType = {\n data?: {\n folders?: {\n encrypted?: Record;\n };\n };\n};\n\nconst USER_ENCRYPTED_FOLDERS: KeyDefinitionLike = {\n key: \"folders\",\n stateDefinition: {\n name: \"folder\",\n },\n};\n\nexport class FolderMigrator extends Migrator<14, 15> {\n async migrate(helper: MigrationHelper): Promise {\n const accounts = await helper.getAccounts();\n async function migrateAccount(userId: string, account: ExpectedAccountType): Promise {\n const value = account?.data?.folders?.encrypted;\n if (value != null) {\n await helper.setToUser(userId, USER_ENCRYPTED_FOLDERS, value);\n delete account.data.folders;\n await helper.set(userId, account);\n }\n }\n\n await Promise.all([...accounts.map(({ userId, account }) => migrateAccount(userId, account))]);\n }\n\n async rollback(helper: MigrationHelper): Promise {\n const accounts = await helper.getAccounts();\n async function rollbackAccount(userId: string, account: ExpectedAccountType): Promise {\n const value = await helper.getFromUser(userId, USER_ENCRYPTED_FOLDERS);\n if (account) {\n account.data = Object.assign(account.data ?? {}, {\n folders: {\n encrypted: value,\n },\n });\n await helper.set(userId, account);\n }\n await helper.setToUser(userId, USER_ENCRYPTED_FOLDERS, null);\n }\n\n await Promise.all([...accounts.map(({ userId, account }) => rollbackAccount(userId, account))]);\n }\n}\n","import { KeyDefinitionLike, MigrationHelper } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\ntype ExpectedAccountType = {\n profile?: {\n lastSync?: string;\n };\n};\n\nconst LAST_SYNC_KEY: KeyDefinitionLike = {\n key: \"lastSync\",\n stateDefinition: {\n name: \"sync\",\n },\n};\n\nexport class LastSyncMigrator extends Migrator<15, 16> {\n async migrate(helper: MigrationHelper): Promise {\n const accounts = await helper.getAccounts();\n async function migrateAccount(userId: string, account: ExpectedAccountType): Promise {\n const value = account?.profile?.lastSync;\n await helper.setToUser(userId, LAST_SYNC_KEY, value ?? null);\n if (value != null) {\n delete account.profile.lastSync;\n await helper.set(userId, account);\n }\n }\n\n await Promise.all([...accounts.map(({ userId, account }) => migrateAccount(userId, account))]);\n }\n async rollback(helper: MigrationHelper): Promise {\n const accounts = await helper.getAccounts();\n\n async function rollbackAccount(userId: string, account: ExpectedAccountType): Promise {\n const value = await helper.getFromUser(userId, LAST_SYNC_KEY);\n if (account) {\n account.profile = Object.assign(account.profile ?? {}, {\n lastSync: value,\n });\n await helper.set(userId, account);\n }\n await helper.setToUser(userId, LAST_SYNC_KEY, null);\n }\n\n await Promise.all([...accounts.map(({ userId, account }) => rollbackAccount(userId, account))]);\n }\n}\n","import { KeyDefinitionLike, MigrationHelper } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\ntype ExpectedGlobalType = {\n enablePasskeys?: boolean;\n};\n\nconst USER_ENABLE_PASSKEYS: KeyDefinitionLike = {\n key: \"enablePasskeys\",\n stateDefinition: {\n name: \"vaultSettings\",\n },\n};\n\nexport class EnablePasskeysMigrator extends Migrator<16, 17> {\n async migrate(helper: MigrationHelper): Promise {\n const global = await helper.get(\"global\");\n\n if (global?.enablePasskeys != null) {\n await helper.setToGlobal(USER_ENABLE_PASSKEYS, global.enablePasskeys);\n delete global?.enablePasskeys;\n await helper.set(\"global\", global);\n }\n }\n\n async rollback(helper: MigrationHelper): Promise {\n let global = await helper.get(\"global\");\n const globalEnablePasskeys = await helper.getFromGlobal(USER_ENABLE_PASSKEYS);\n\n if (globalEnablePasskeys != null) {\n global = Object.assign(global ?? {}, { enablePasskeys: globalEnablePasskeys });\n await helper.set(\"global\", global);\n await helper.setToGlobal(USER_ENABLE_PASSKEYS, undefined);\n }\n }\n}\n","import { StateDefinitionLike, MigrationHelper } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\nconst AutofillOverlayVisibility = {\n Off: 0,\n OnButtonClick: 1,\n OnFieldFocus: 2,\n} as const;\n\ntype InlineMenuVisibilitySetting =\n (typeof AutofillOverlayVisibility)[keyof typeof AutofillOverlayVisibility];\n\ntype ExpectedAccountState = {\n settings?: {\n autoFillOnPageLoadDefault?: boolean;\n enableAutoFillOnPageLoad?: boolean;\n dismissedAutoFillOnPageLoadCallout?: boolean;\n disableAutoTotpCopy?: boolean;\n activateAutoFillOnPageLoadFromPolicy?: InlineMenuVisibilitySetting;\n };\n};\n\ntype ExpectedGlobalState = { autoFillOverlayVisibility?: InlineMenuVisibilitySetting };\n\nconst autofillSettingsStateDefinition: {\n stateDefinition: StateDefinitionLike;\n} = {\n stateDefinition: {\n name: \"autofillSettings\",\n },\n};\n\nexport class AutofillSettingsKeyMigrator extends Migrator<17, 18> {\n async migrate(helper: MigrationHelper): Promise {\n // global state (e.g. \"autoFillOverlayVisibility -> inlineMenuVisibility\")\n const globalState = await helper.get(\"global\");\n\n if (globalState?.autoFillOverlayVisibility != null) {\n await helper.setToGlobal(\n {\n stateDefinition: {\n name: \"autofillSettingsLocal\",\n },\n key: \"inlineMenuVisibility\",\n },\n globalState.autoFillOverlayVisibility,\n );\n\n // delete `autoFillOverlayVisibility` from state global\n delete globalState.autoFillOverlayVisibility;\n\n await helper.set(\"global\", globalState);\n }\n\n // account state (e.g. account settings -> state provider framework keys)\n const accounts = await helper.getAccounts();\n\n await Promise.all([...accounts.map(({ userId, account }) => migrateAccount(userId, account))]);\n\n // migrate account state\n async function migrateAccount(userId: string, account: ExpectedAccountState): Promise {\n let updateAccount = false;\n const accountSettings = account?.settings;\n\n if (accountSettings?.autoFillOnPageLoadDefault != null) {\n await helper.setToUser(\n userId,\n { ...autofillSettingsStateDefinition, key: \"autofillOnPageLoadDefault\" },\n accountSettings.autoFillOnPageLoadDefault,\n );\n delete account.settings.autoFillOnPageLoadDefault;\n updateAccount = true;\n }\n\n if (accountSettings?.enableAutoFillOnPageLoad != null) {\n await helper.setToUser(\n userId,\n { ...autofillSettingsStateDefinition, key: \"autofillOnPageLoad\" },\n accountSettings?.enableAutoFillOnPageLoad,\n );\n delete account.settings.enableAutoFillOnPageLoad;\n updateAccount = true;\n }\n\n if (accountSettings?.dismissedAutoFillOnPageLoadCallout != null) {\n await helper.setToUser(\n userId,\n { ...autofillSettingsStateDefinition, key: \"autofillOnPageLoadCalloutIsDismissed\" },\n accountSettings?.dismissedAutoFillOnPageLoadCallout,\n );\n delete account.settings.dismissedAutoFillOnPageLoadCallout;\n updateAccount = true;\n }\n\n if (accountSettings?.disableAutoTotpCopy != null) {\n await helper.setToUser(\n userId,\n { ...autofillSettingsStateDefinition, key: \"autoCopyTotp\" },\n // invert the value to match the new naming convention\n !accountSettings?.disableAutoTotpCopy,\n );\n delete account.settings.disableAutoTotpCopy;\n updateAccount = true;\n }\n\n if (accountSettings?.activateAutoFillOnPageLoadFromPolicy != null) {\n await helper.setToUser(\n userId,\n {\n stateDefinition: {\n name: \"autofillSettingsLocal\",\n },\n key: \"activateAutofillOnPageLoadFromPolicy\",\n },\n accountSettings?.activateAutoFillOnPageLoadFromPolicy,\n );\n delete account.settings.activateAutoFillOnPageLoadFromPolicy;\n updateAccount = true;\n }\n\n if (updateAccount) {\n // update the state account settings with the migrated values deleted\n await helper.set(userId, account);\n }\n }\n }\n\n async rollback(helper: MigrationHelper): Promise {\n // global state (e.g. \"inlineMenuVisibility -> autoFillOverlayVisibility\")\n const globalState = (await helper.get(\"global\")) || {};\n const inlineMenuVisibility: InlineMenuVisibilitySetting = await helper.getFromGlobal({\n stateDefinition: {\n name: \"autofillSettingsLocal\",\n },\n key: \"inlineMenuVisibility\",\n });\n\n if (inlineMenuVisibility) {\n await helper.set(\"global\", {\n ...globalState,\n autoFillOverlayVisibility: inlineMenuVisibility,\n });\n\n // remove the global state provider framework key for `inlineMenuVisibility`\n await helper.setToGlobal(\n {\n stateDefinition: {\n name: \"autofillSettingsLocal\",\n },\n key: \"inlineMenuVisibility\",\n },\n null,\n );\n }\n\n // account state (e.g. state provider framework keys -> account settings)\n const accounts = await helper.getAccounts();\n\n await Promise.all([...accounts.map(({ userId, account }) => rollbackAccount(userId, account))]);\n\n // rollback account state\n async function rollbackAccount(userId: string, account: ExpectedAccountState): Promise {\n let updateAccount = false;\n let settings = account?.settings || {};\n\n const autoFillOnPageLoadDefault: boolean = await helper.getFromUser(userId, {\n ...autofillSettingsStateDefinition,\n key: \"autofillOnPageLoadDefault\",\n });\n\n const enableAutoFillOnPageLoad: boolean = await helper.getFromUser(userId, {\n ...autofillSettingsStateDefinition,\n key: \"autofillOnPageLoad\",\n });\n\n const dismissedAutoFillOnPageLoadCallout: boolean = await helper.getFromUser(userId, {\n ...autofillSettingsStateDefinition,\n key: \"autofillOnPageLoadCalloutIsDismissed\",\n });\n\n const autoCopyTotp: boolean = await helper.getFromUser(userId, {\n ...autofillSettingsStateDefinition,\n key: \"autoCopyTotp\",\n });\n\n const activateAutoFillOnPageLoadFromPolicy: InlineMenuVisibilitySetting =\n await helper.getFromUser(userId, {\n stateDefinition: {\n name: \"autofillSettingsLocal\",\n },\n key: \"activateAutofillOnPageLoadFromPolicy\",\n });\n\n // update new settings and remove the account state provider framework keys for the rolled back values\n if (autoFillOnPageLoadDefault != null) {\n settings = { ...settings, autoFillOnPageLoadDefault };\n\n await helper.setToUser(\n userId,\n { ...autofillSettingsStateDefinition, key: \"autofillOnPageLoadDefault\" },\n null,\n );\n\n updateAccount = true;\n }\n\n if (enableAutoFillOnPageLoad != null) {\n settings = { ...settings, enableAutoFillOnPageLoad };\n\n await helper.setToUser(\n userId,\n { ...autofillSettingsStateDefinition, key: \"autofillOnPageLoad\" },\n null,\n );\n\n updateAccount = true;\n }\n\n if (dismissedAutoFillOnPageLoadCallout != null) {\n settings = { ...settings, dismissedAutoFillOnPageLoadCallout };\n\n await helper.setToUser(\n userId,\n { ...autofillSettingsStateDefinition, key: \"autofillOnPageLoadCalloutIsDismissed\" },\n null,\n );\n\n updateAccount = true;\n }\n\n if (autoCopyTotp != null) {\n // invert the value to match the new naming convention\n settings = { ...settings, disableAutoTotpCopy: !autoCopyTotp };\n\n await helper.setToUser(\n userId,\n { ...autofillSettingsStateDefinition, key: \"autoCopyTotp\" },\n null,\n );\n\n updateAccount = true;\n }\n\n if (activateAutoFillOnPageLoadFromPolicy != null) {\n settings = { ...settings, activateAutoFillOnPageLoadFromPolicy };\n\n await helper.setToUser(\n userId,\n {\n stateDefinition: {\n name: \"autofillSettingsLocal\",\n },\n key: \"activateAutofillOnPageLoadFromPolicy\",\n },\n null,\n );\n\n updateAccount = true;\n }\n\n if (updateAccount) {\n // commit updated settings to state\n await helper.set(userId, {\n ...account,\n settings,\n });\n }\n }\n }\n}\n","import { KeyDefinitionLike, MigrationHelper } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\ntype ExpectedAccountType = {\n settings?: {\n requirePasswordOnStart?: boolean;\n };\n};\n\n// Biometric text, no auto prompt text, fingerprint validated, and prompt cancelled are refreshed on every app start, so we don't need to migrate them\nexport const REQUIRE_PASSWORD_ON_START: KeyDefinitionLike = {\n key: \"requirePasswordOnStart\",\n stateDefinition: { name: \"biometricSettings\" },\n};\n\nexport class RequirePasswordOnStartMigrator extends Migrator<18, 19> {\n async migrate(helper: MigrationHelper): Promise {\n const legacyAccounts = await helper.getAccounts();\n\n await Promise.all(\n legacyAccounts.map(async ({ userId, account }) => {\n // Move account data\n if (account?.settings?.requirePasswordOnStart != null) {\n await helper.setToUser(\n userId,\n REQUIRE_PASSWORD_ON_START,\n account.settings.requirePasswordOnStart,\n );\n\n // Delete old account data\n delete account.settings.requirePasswordOnStart;\n await helper.set(userId, account);\n }\n }),\n );\n }\n\n async rollback(helper: MigrationHelper): Promise {\n async function rollbackUser(userId: string, account: ExpectedAccountType) {\n const requirePassword = await helper.getFromUser(userId, REQUIRE_PASSWORD_ON_START);\n\n if (requirePassword) {\n account ??= {};\n account.settings ??= {};\n\n account.settings.requirePasswordOnStart = requirePassword;\n await helper.setToUser(userId, REQUIRE_PASSWORD_ON_START, null);\n await helper.set(userId, account);\n }\n }\n\n const accounts = await helper.getAccounts();\n\n await Promise.all(accounts.map(({ userId, account }) => rollbackUser(userId, account)));\n }\n}\n","import { KeyDefinitionLike, MigrationHelper } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\ntype ExpectedAccountType = {\n keys?: {\n privateKey?: {\n encrypted?: string; // EncryptedString\n };\n };\n};\n\nconst USER_ENCRYPTED_PRIVATE_KEY: KeyDefinitionLike = {\n key: \"privateKey\",\n stateDefinition: {\n name: \"crypto\",\n },\n};\n\nexport class PrivateKeyMigrator extends Migrator<19, 20> {\n async migrate(helper: MigrationHelper): Promise {\n const accounts = await helper.getAccounts();\n async function migrateAccount(userId: string, account: ExpectedAccountType): Promise {\n const value = account?.keys?.privateKey?.encrypted;\n if (value != null) {\n await helper.setToUser(userId, USER_ENCRYPTED_PRIVATE_KEY, value);\n delete account.keys.privateKey;\n await helper.set(userId, account);\n }\n }\n\n await Promise.all([...accounts.map(({ userId, account }) => migrateAccount(userId, account))]);\n }\n async rollback(helper: MigrationHelper): Promise {\n const accounts = await helper.getAccounts();\n async function rollbackAccount(userId: string, account: ExpectedAccountType): Promise {\n const value = await helper.getFromUser>(\n userId,\n USER_ENCRYPTED_PRIVATE_KEY,\n );\n if (account && value) {\n account.keys = Object.assign(account.keys ?? {}, {\n privateKey: {\n encrypted: value,\n },\n });\n await helper.set(userId, account);\n }\n await helper.setToUser(userId, USER_ENCRYPTED_PRIVATE_KEY, null);\n }\n\n await Promise.all([...accounts.map(({ userId, account }) => rollbackAccount(userId, account))]);\n }\n}\n","import { KeyDefinitionLike, MigrationHelper } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\ntype CollectionDataType = {\n id: string;\n organizationId: string;\n name: string;\n externalId: string;\n readOnly: boolean;\n manage: boolean;\n hidePasswords: boolean;\n};\n\ntype ExpectedAccountType = {\n data?: {\n collections?: {\n encrypted?: Record;\n };\n };\n};\n\nconst USER_ENCRYPTED_COLLECTIONS: KeyDefinitionLike = {\n key: \"collections\",\n stateDefinition: {\n name: \"collection\",\n },\n};\n\nexport class CollectionMigrator extends Migrator<20, 21> {\n async migrate(helper: MigrationHelper): Promise {\n const accounts = await helper.getAccounts();\n\n async function migrateAccount(userId: string, account: ExpectedAccountType): Promise {\n const value = account?.data?.collections?.encrypted;\n if (value != null) {\n await helper.setToUser(userId, USER_ENCRYPTED_COLLECTIONS, value);\n delete account.data.collections;\n await helper.set(userId, account);\n }\n }\n\n await Promise.all([...accounts.map(({ userId, account }) => migrateAccount(userId, account))]);\n }\n\n async rollback(helper: MigrationHelper): Promise {\n const accounts = await helper.getAccounts();\n\n async function rollbackAccount(userId: string, account: ExpectedAccountType): Promise {\n const value = await helper.getFromUser(userId, USER_ENCRYPTED_COLLECTIONS);\n if (account) {\n account.data = Object.assign(account.data ?? {}, {\n collections: {\n encrypted: value,\n },\n });\n\n await helper.set(userId, account);\n }\n await helper.setToUser(userId, USER_ENCRYPTED_COLLECTIONS, null);\n }\n await Promise.all([...accounts.map(({ userId, account }) => rollbackAccount(userId, account))]);\n }\n}\n","import { KeyDefinitionLike, MigrationHelper } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\ntype ExpectedAccountType = {\n settings?: {\n collapsedGroupings?: string[];\n };\n};\n\nconst COLLAPSED_GROUPINGS: KeyDefinitionLike = {\n key: \"collapsedGroupings\",\n stateDefinition: {\n name: \"vaultFilter\",\n },\n};\n\nexport class CollapsedGroupingsMigrator extends Migrator<21, 22> {\n async migrate(helper: MigrationHelper): Promise {\n const accounts = await helper.getAccounts();\n async function migrateAccount(userId: string, account: ExpectedAccountType): Promise {\n const value = account?.settings?.collapsedGroupings;\n if (value != null) {\n await helper.setToUser(userId, COLLAPSED_GROUPINGS, value);\n delete account.settings.collapsedGroupings;\n await helper.set(userId, account);\n }\n }\n\n await Promise.all([...accounts.map(({ userId, account }) => migrateAccount(userId, account))]);\n }\n\n async rollback(helper: MigrationHelper): Promise {\n const accounts = await helper.getAccounts();\n async function rollbackAccount(userId: string, account: ExpectedAccountType): Promise {\n const value = await helper.getFromUser(userId, COLLAPSED_GROUPINGS);\n if (account) {\n account.settings = Object.assign(account.settings ?? {}, {\n collapsedGroupings: value,\n });\n await helper.set(userId, account);\n }\n await helper.setToUser(userId, COLLAPSED_GROUPINGS, null);\n }\n\n await Promise.all([...accounts.map(({ userId, account }) => rollbackAccount(userId, account))]);\n }\n}\n","import { KeyDefinitionLike, MigrationHelper } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\ntype ExpectedAccountType = {\n settings?: {\n disableAutoBiometricsPrompt?: boolean;\n dismissedBiometricRequirePasswordOnStartCallout?: boolean;\n };\n};\n\n// prompt cancelled is refreshed on every app start/quit/unlock, so we don't need to migrate it\n\nexport const DISMISSED_BIOMETRIC_REQUIRE_PASSWORD_ON_START_CALLOUT: KeyDefinitionLike = {\n key: \"dismissedBiometricRequirePasswordOnStartCallout\",\n stateDefinition: { name: \"biometricSettings\" },\n};\n\nexport const PROMPT_AUTOMATICALLY: KeyDefinitionLike = {\n key: \"promptAutomatically\",\n stateDefinition: { name: \"biometricSettings\" },\n};\n\nexport class MoveBiometricPromptsToStateProviders extends Migrator<22, 23> {\n async migrate(helper: MigrationHelper): Promise {\n const legacyAccounts = await helper.getAccounts();\n\n await Promise.all(\n legacyAccounts.map(async ({ userId, account }) => {\n if (account == null) {\n return;\n }\n // Move account data\n\n if (account?.settings?.dismissedBiometricRequirePasswordOnStartCallout != null) {\n await helper.setToUser(\n userId,\n DISMISSED_BIOMETRIC_REQUIRE_PASSWORD_ON_START_CALLOUT,\n account.settings.dismissedBiometricRequirePasswordOnStartCallout,\n );\n }\n\n if (account?.settings?.disableAutoBiometricsPrompt != null) {\n await helper.setToUser(\n userId,\n PROMPT_AUTOMATICALLY,\n !account.settings.disableAutoBiometricsPrompt,\n );\n }\n\n // Delete old account data\n delete account?.settings?.dismissedBiometricRequirePasswordOnStartCallout;\n delete account?.settings?.disableAutoBiometricsPrompt;\n await helper.set(userId, account);\n }),\n );\n }\n\n async rollback(helper: MigrationHelper): Promise {\n async function rollbackUser(userId: string, account: ExpectedAccountType) {\n let updatedAccount = false;\n\n const userDismissed = await helper.getFromUser(\n userId,\n DISMISSED_BIOMETRIC_REQUIRE_PASSWORD_ON_START_CALLOUT,\n );\n\n if (userDismissed) {\n account ??= {};\n account.settings ??= {};\n\n updatedAccount = true;\n account.settings.dismissedBiometricRequirePasswordOnStartCallout = userDismissed;\n await helper.setToUser(userId, DISMISSED_BIOMETRIC_REQUIRE_PASSWORD_ON_START_CALLOUT, null);\n }\n\n const userPromptAutomatically = await helper.getFromUser(\n userId,\n PROMPT_AUTOMATICALLY,\n );\n\n if (userPromptAutomatically != null) {\n account ??= {};\n account.settings ??= {};\n\n updatedAccount = true;\n account.settings.disableAutoBiometricsPrompt = !userPromptAutomatically;\n await helper.setToUser(userId, PROMPT_AUTOMATICALLY, null);\n }\n\n if (updatedAccount) {\n await helper.set(userId, account);\n }\n }\n\n const accounts = await helper.getAccounts();\n\n await Promise.all(accounts.map(({ userId, account }) => rollbackUser(userId, account)));\n }\n}\n","import { KeyDefinitionLike, MigrationHelper } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\ntype ExpectedAccountType = {\n settings?: {\n smOnboardingTasks?: Record>;\n };\n};\n\nexport const SM_ONBOARDING_TASKS: KeyDefinitionLike = {\n key: \"tasks\",\n stateDefinition: { name: \"smOnboarding\" },\n};\n\nexport class SmOnboardingTasksMigrator extends Migrator<23, 24> {\n async migrate(helper: MigrationHelper): Promise {\n const legacyAccounts = await helper.getAccounts();\n\n await Promise.all(\n legacyAccounts.map(async ({ userId, account }) => {\n // Move account data\n if (account?.settings?.smOnboardingTasks != null) {\n await helper.setToUser(userId, SM_ONBOARDING_TASKS, account.settings.smOnboardingTasks);\n\n // Delete old account data\n delete account.settings.smOnboardingTasks;\n await helper.set(userId, account);\n }\n }),\n );\n }\n\n async rollback(helper: MigrationHelper): Promise {\n async function rollbackUser(userId: string, account: ExpectedAccountType) {\n const smOnboardingTasks = await helper.getFromUser>>(\n userId,\n SM_ONBOARDING_TASKS,\n );\n if (smOnboardingTasks) {\n account ??= {};\n account.settings ??= {};\n\n account.settings.smOnboardingTasks = smOnboardingTasks;\n await helper.setToUser(userId, SM_ONBOARDING_TASKS, null);\n await helper.set(userId, account);\n }\n }\n\n const accounts = await helper.getAccounts();\n\n await Promise.all(accounts.map(({ userId, account }) => rollbackUser(userId, account)));\n }\n}\n","import { StateDefinitionLike, MigrationHelper } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\nconst ClearClipboardDelay = {\n Never: null as null,\n TenSeconds: 10,\n TwentySeconds: 20,\n ThirtySeconds: 30,\n OneMinute: 60,\n TwoMinutes: 120,\n FiveMinutes: 300,\n} as const;\n\ntype ClearClipboardDelaySetting = (typeof ClearClipboardDelay)[keyof typeof ClearClipboardDelay];\n\ntype ExpectedAccountState = {\n settings?: {\n clearClipboard?: ClearClipboardDelaySetting;\n };\n};\n\nconst autofillSettingsLocalStateDefinition: {\n stateDefinition: StateDefinitionLike;\n} = {\n stateDefinition: {\n name: \"autofillSettingsLocal\",\n },\n};\n\nexport class ClearClipboardDelayMigrator extends Migrator<24, 25> {\n async migrate(helper: MigrationHelper): Promise {\n // account state (e.g. account settings -> state provider framework keys)\n const accounts = await helper.getAccounts();\n\n await Promise.all([...accounts.map(({ userId, account }) => migrateAccount(userId, account))]);\n\n // migrate account state\n async function migrateAccount(userId: string, account: ExpectedAccountState): Promise {\n const accountSettings = account?.settings;\n\n if (accountSettings?.clearClipboard !== undefined) {\n await helper.setToUser(\n userId,\n { ...autofillSettingsLocalStateDefinition, key: \"clearClipboardDelay\" },\n accountSettings.clearClipboard,\n );\n delete account.settings.clearClipboard;\n\n // update the state account settings with the migrated values deleted\n await helper.set(userId, account);\n }\n }\n }\n\n async rollback(helper: MigrationHelper): Promise {\n // account state (e.g. state provider framework keys -> account settings)\n const accounts = await helper.getAccounts();\n\n await Promise.all([...accounts.map(({ userId, account }) => rollbackAccount(userId, account))]);\n\n // rollback account state\n async function rollbackAccount(userId: string, account: ExpectedAccountState): Promise {\n let settings = account?.settings || {};\n\n const clearClipboardDelay: ClearClipboardDelaySetting = await helper.getFromUser(userId, {\n ...autofillSettingsLocalStateDefinition,\n key: \"clearClipboardDelay\",\n });\n\n // update new settings and remove the account state provider framework keys for the rolled back values\n if (clearClipboardDelay !== undefined) {\n settings = { ...settings, clearClipboard: clearClipboardDelay };\n\n await helper.setToUser(\n userId,\n { ...autofillSettingsLocalStateDefinition, key: \"clearClipboardDelay\" },\n null,\n );\n\n // commit updated settings to state\n await helper.set(userId, {\n ...account,\n settings,\n });\n }\n }\n }\n}\n","import { KeyDefinitionLike, MigrationHelper } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\ntype ExpectedAccountType = {\n profile?: {\n lastSync?: string;\n };\n};\n\nconst LAST_SYNC_KEY: KeyDefinitionLike = {\n key: \"lastSync\",\n stateDefinition: {\n name: \"sync\",\n },\n};\n\nexport class RevertLastSyncMigrator extends Migrator<25, 26> {\n async rollback(helper: MigrationHelper): Promise {\n const accounts = await helper.getAccounts();\n async function rollbackAccount(userId: string, account: ExpectedAccountType): Promise {\n const value = account?.profile?.lastSync;\n await helper.setToUser(userId, LAST_SYNC_KEY, value ?? null);\n if (value != null) {\n delete account.profile.lastSync;\n await helper.set(userId, account);\n }\n }\n\n await Promise.all([...accounts.map(({ userId, account }) => rollbackAccount(userId, account))]);\n }\n async migrate(helper: MigrationHelper): Promise {\n const accounts = await helper.getAccounts();\n\n async function migrateAccount(userId: string, account: ExpectedAccountType): Promise {\n const value = await helper.getFromUser(userId, LAST_SYNC_KEY);\n if (account) {\n account.profile = Object.assign(account.profile ?? {}, {\n lastSync: value,\n });\n await helper.set(userId, account);\n }\n await helper.setToUser(userId, LAST_SYNC_KEY, null);\n }\n\n await Promise.all([...accounts.map(({ userId, account }) => migrateAccount(userId, account))]);\n }\n}\n","import { KeyDefinitionLike, MigrationHelper } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\ntype ExpectedAccountState = {\n settings?: {\n disableBadgeCounter?: boolean;\n };\n};\n\nconst enableBadgeCounterKeyDefinition: KeyDefinitionLike = {\n stateDefinition: {\n name: \"badgeSettings\",\n },\n key: \"enableBadgeCounter\",\n};\n\nexport class BadgeSettingsMigrator extends Migrator<26, 27> {\n async migrate(helper: MigrationHelper): Promise {\n // account state (e.g. account settings -> state provider framework keys)\n const accounts = await helper.getAccounts();\n\n await Promise.all([...accounts.map(({ userId, account }) => migrateAccount(userId, account))]);\n\n // migrate account state\n async function migrateAccount(userId: string, account: ExpectedAccountState): Promise {\n const accountSettings = account?.settings;\n\n if (accountSettings?.disableBadgeCounter != undefined) {\n await helper.setToUser(\n userId,\n enableBadgeCounterKeyDefinition,\n !accountSettings.disableBadgeCounter,\n );\n delete account.settings.disableBadgeCounter;\n\n // update the state account settings with the migrated values deleted\n await helper.set(userId, account);\n }\n }\n }\n\n async rollback(helper: MigrationHelper): Promise {\n // account state (e.g. state provider framework keys -> account settings)\n const accounts = await helper.getAccounts();\n\n await Promise.all([...accounts.map(({ userId, account }) => rollbackAccount(userId, account))]);\n\n // rollback account state\n async function rollbackAccount(userId: string, account: ExpectedAccountState): Promise {\n let settings = account?.settings || {};\n\n const enableBadgeCounter: boolean = await helper.getFromUser(\n userId,\n enableBadgeCounterKeyDefinition,\n );\n\n // update new settings and remove the account state provider framework keys for the rolled back values\n if (enableBadgeCounter != undefined) {\n settings = { ...settings, disableBadgeCounter: !enableBadgeCounter };\n\n await helper.setToUser(userId, enableBadgeCounterKeyDefinition, null);\n\n // commit updated settings to state\n await helper.set(userId, {\n ...account,\n settings,\n });\n }\n }\n }\n}\n","import { KeyDefinitionLike, MigrationHelper } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\ntype ExpectedAccountType = {\n settings?: {\n biometricUnlock?: boolean;\n };\n};\n\nexport const BIOMETRIC_UNLOCK_ENABLED: KeyDefinitionLike = {\n key: \"biometricUnlockEnabled\",\n stateDefinition: { name: \"biometricSettings\" },\n};\n\nexport class MoveBiometricUnlockToStateProviders extends Migrator<27, 28> {\n async migrate(helper: MigrationHelper): Promise {\n const legacyAccounts = await helper.getAccounts();\n\n await Promise.all(\n legacyAccounts.map(async ({ userId, account }) => {\n if (account == null) {\n return;\n }\n // Move account data\n if (account?.settings?.biometricUnlock != null) {\n await helper.setToUser(\n userId,\n BIOMETRIC_UNLOCK_ENABLED,\n account.settings.biometricUnlock,\n );\n }\n\n // Delete old account data\n delete account?.settings?.biometricUnlock;\n await helper.set(userId, account);\n }),\n );\n }\n\n async rollback(helper: MigrationHelper): Promise {\n async function rollbackUser(userId: string, account: ExpectedAccountType) {\n const biometricUnlock = await helper.getFromUser(userId, BIOMETRIC_UNLOCK_ENABLED);\n\n if (biometricUnlock != null) {\n account ??= {};\n account.settings ??= {};\n\n account.settings.biometricUnlock = biometricUnlock;\n await helper.setToUser(userId, BIOMETRIC_UNLOCK_ENABLED, null);\n await helper.set(userId, account);\n }\n }\n\n const accounts = await helper.getAccounts();\n\n await Promise.all(accounts.map(({ userId, account }) => rollbackUser(userId, account)));\n }\n}\n","import { MigrationHelper } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\ntype ExpectedGlobalState = {\n disableAddLoginNotification?: boolean;\n disableChangedPasswordNotification?: boolean;\n};\n\nexport class UserNotificationSettingsKeyMigrator extends Migrator<28, 29> {\n async migrate(helper: MigrationHelper): Promise {\n const globalState = await helper.get(\"global\");\n\n // disableAddLoginNotification -> enableAddedLoginPrompt\n if (globalState?.disableAddLoginNotification != null) {\n await helper.setToGlobal(\n {\n stateDefinition: {\n name: \"userNotificationSettings\",\n },\n key: \"enableAddedLoginPrompt\",\n },\n !globalState.disableAddLoginNotification,\n );\n\n // delete `disableAddLoginNotification` from state global\n delete globalState.disableAddLoginNotification;\n\n await helper.set(\"global\", globalState);\n }\n\n // disableChangedPasswordNotification -> enableChangedPasswordPrompt\n if (globalState?.disableChangedPasswordNotification != null) {\n await helper.setToGlobal(\n {\n stateDefinition: {\n name: \"userNotificationSettings\",\n },\n key: \"enableChangedPasswordPrompt\",\n },\n !globalState.disableChangedPasswordNotification,\n );\n\n // delete `disableChangedPasswordNotification` from state global\n delete globalState.disableChangedPasswordNotification;\n\n await helper.set(\"global\", globalState);\n }\n }\n\n async rollback(helper: MigrationHelper): Promise {\n const globalState = (await helper.get(\"global\")) || {};\n\n const enableAddedLoginPrompt: boolean = await helper.getFromGlobal({\n stateDefinition: {\n name: \"userNotificationSettings\",\n },\n key: \"enableAddedLoginPrompt\",\n });\n\n const enableChangedPasswordPrompt: boolean = await helper.getFromGlobal({\n stateDefinition: {\n name: \"userNotificationSettings\",\n },\n key: \"enableChangedPasswordPrompt\",\n });\n\n // enableAddedLoginPrompt -> disableAddLoginNotification\n if (enableAddedLoginPrompt) {\n await helper.set(\"global\", {\n ...globalState,\n disableAddLoginNotification: !enableAddedLoginPrompt,\n });\n\n // remove the global state provider framework key for `enableAddedLoginPrompt`\n await helper.setToGlobal(\n {\n stateDefinition: {\n name: \"userNotificationSettings\",\n },\n key: \"enableAddedLoginPrompt\",\n },\n null,\n );\n }\n\n // enableChangedPasswordPrompt -> disableChangedPasswordNotification\n if (enableChangedPasswordPrompt) {\n await helper.set(\"global\", {\n ...globalState,\n disableChangedPasswordNotification: !enableChangedPasswordPrompt,\n });\n\n // remove the global state provider framework key for `enableChangedPasswordPrompt`\n await helper.setToGlobal(\n {\n stateDefinition: {\n name: \"userNotificationSettings\",\n },\n key: \"enableChangedPasswordPrompt\",\n },\n null,\n );\n }\n }\n}\n","import { KeyDefinitionLike, MigrationHelper } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\nenum PolicyType {\n TwoFactorAuthentication = 0, // Requires users to have 2fa enabled\n MasterPassword = 1, // Sets minimum requirements for master password complexity\n PasswordGenerator = 2, // Sets minimum requirements/default type for generated passwords/passphrases\n SingleOrg = 3, // Allows users to only be apart of one organization\n RequireSso = 4, // Requires users to authenticate with SSO\n PersonalOwnership = 5, // Disables personal vault ownership for adding/cloning items\n DisableSend = 6, // Disables the ability to create and edit Bitwarden Sends\n SendOptions = 7, // Sets restrictions or defaults for Bitwarden Sends\n ResetPassword = 8, // Allows orgs to use reset password : also can enable auto-enrollment during invite flow\n MaximumVaultTimeout = 9, // Sets the maximum allowed vault timeout\n DisablePersonalVaultExport = 10, // Disable personal vault export\n ActivateAutofill = 11, // Activates autofill with page load on the browser extension\n}\n\ntype PolicyDataType = {\n id: string;\n organizationId: string;\n type: PolicyType;\n data: Record;\n enabled: boolean;\n};\n\ntype ExpectedAccountType = {\n data?: {\n policies?: {\n encrypted?: Record;\n };\n };\n};\n\nconst POLICIES_KEY: KeyDefinitionLike = {\n key: \"policies\",\n stateDefinition: {\n name: \"policies\",\n },\n};\n\nexport class PolicyMigrator extends Migrator<29, 30> {\n async migrate(helper: MigrationHelper): Promise {\n const accounts = await helper.getAccounts();\n\n async function migrateAccount(userId: string, account: ExpectedAccountType): Promise {\n const value = account?.data?.policies?.encrypted;\n if (value != null) {\n await helper.setToUser(userId, POLICIES_KEY, value);\n delete account.data.policies;\n await helper.set(userId, account);\n }\n }\n\n await Promise.all(accounts.map(({ userId, account }) => migrateAccount(userId, account)));\n }\n\n async rollback(helper: MigrationHelper): Promise {\n const accounts = await helper.getAccounts();\n\n async function rollbackAccount(userId: string, account: ExpectedAccountType): Promise {\n const value = await helper.getFromUser(userId, POLICIES_KEY);\n if (account) {\n account.data = Object.assign(account.data ?? {}, {\n policies: {\n encrypted: value,\n },\n });\n\n await helper.set(userId, account);\n }\n await helper.setToUser(userId, POLICIES_KEY, null);\n }\n await Promise.all(accounts.map(({ userId, account }) => rollbackAccount(userId, account)));\n }\n}\n","import { KeyDefinitionLike, MigrationHelper } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\ntype ExpectedGlobalState = {\n disableContextMenuItem?: boolean;\n};\n\nconst enableContextMenuKeyDefinition: KeyDefinitionLike = {\n stateDefinition: {\n name: \"autofillSettings\",\n },\n key: \"enableContextMenu\",\n};\n\nexport class EnableContextMenuMigrator extends Migrator<30, 31> {\n async migrate(helper: MigrationHelper): Promise {\n const globalState = await helper.get(\"global\");\n\n // disableContextMenuItem -> enableContextMenu\n if (globalState?.disableContextMenuItem != null) {\n await helper.setToGlobal(enableContextMenuKeyDefinition, !globalState.disableContextMenuItem);\n\n // delete `disableContextMenuItem` from state global\n delete globalState.disableContextMenuItem;\n\n await helper.set(\"global\", globalState);\n }\n }\n\n async rollback(helper: MigrationHelper): Promise {\n const globalState = (await helper.get(\"global\")) || {};\n\n const enableContextMenu: boolean = await helper.getFromGlobal(enableContextMenuKeyDefinition);\n\n // enableContextMenu -> disableContextMenuItem\n if (enableContextMenu != null) {\n await helper.set(\"global\", {\n ...globalState,\n disableContextMenuItem: !enableContextMenu,\n });\n\n // remove the global state provider framework key for `enableContextMenu`\n await helper.setToGlobal(enableContextMenuKeyDefinition, null);\n }\n }\n}\n","import { MigrationHelper } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\ntype ExpectedGlobal = {\n locale?: string;\n};\n\nexport const LOCALE_KEY = {\n key: \"locale\",\n stateDefinition: {\n name: \"translation\",\n },\n};\n\nexport class PreferredLanguageMigrator extends Migrator<31, 32> {\n async migrate(helper: MigrationHelper): Promise {\n // global state\n const global = await helper.get(\"global\");\n if (!global?.locale) {\n return;\n }\n\n await helper.setToGlobal(LOCALE_KEY, global.locale);\n delete global.locale;\n await helper.set(\"global\", global);\n }\n\n async rollback(helper: MigrationHelper): Promise {\n const locale = await helper.getFromGlobal(LOCALE_KEY);\n\n if (!locale) {\n return;\n }\n const global = (await helper.get(\"global\")) ?? {};\n global.locale = locale;\n await helper.set(\"global\", global);\n await helper.setToGlobal(LOCALE_KEY, null);\n }\n}\n","import { KeyDefinitionLike, MigrationHelper } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\nexport const APP_ID_STORAGE_KEY = \"appId\";\nexport const ANONYMOUS_APP_ID_STORAGE_KEY = \"anonymousAppId\";\n\nexport const APP_ID_KEY: KeyDefinitionLike = {\n key: APP_ID_STORAGE_KEY,\n stateDefinition: { name: \"applicationId\" },\n};\n\nexport const ANONYMOUS_APP_ID_KEY: KeyDefinitionLike = {\n key: ANONYMOUS_APP_ID_STORAGE_KEY,\n stateDefinition: { name: \"applicationId\" },\n};\n\nexport class AppIdMigrator extends Migrator<32, 33> {\n async migrate(helper: MigrationHelper): Promise {\n const appId = await helper.get(APP_ID_STORAGE_KEY);\n const anonymousAppId = await helper.get(ANONYMOUS_APP_ID_STORAGE_KEY);\n\n if (appId != null) {\n await helper.setToGlobal(APP_ID_KEY, appId);\n await helper.set(APP_ID_STORAGE_KEY, null);\n }\n\n if (anonymousAppId != null) {\n await helper.setToGlobal(ANONYMOUS_APP_ID_KEY, anonymousAppId);\n await helper.set(ANONYMOUS_APP_ID_STORAGE_KEY, null);\n }\n }\n\n async rollback(helper: MigrationHelper): Promise {\n const appId = await helper.getFromGlobal(APP_ID_KEY);\n const anonymousAppId = await helper.getFromGlobal(ANONYMOUS_APP_ID_KEY);\n\n if (appId != null) {\n await helper.set(APP_ID_STORAGE_KEY, appId);\n await helper.setToGlobal(APP_ID_KEY, null);\n }\n if (anonymousAppId != null) {\n await helper.set(ANONYMOUS_APP_ID_STORAGE_KEY, anonymousAppId);\n await helper.setToGlobal(ANONYMOUS_APP_ID_KEY, null);\n }\n }\n}\n","import { KeyDefinitionLike, MigrationHelper } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\nconst UriMatchStrategy = {\n Domain: 0,\n Host: 1,\n StartsWith: 2,\n Exact: 3,\n RegularExpression: 4,\n Never: 5,\n} as const;\n\ntype UriMatchStrategySetting = (typeof UriMatchStrategy)[keyof typeof UriMatchStrategy];\n\ntype ExpectedAccountState = {\n settings?: {\n defaultUriMatch?: UriMatchStrategySetting;\n settings?: {\n equivalentDomains?: string[][];\n };\n };\n};\n\ntype ExpectedGlobalState = {\n neverDomains?: { [key: string]: null };\n};\n\nconst defaultUriMatchStrategyDefinition: KeyDefinitionLike = {\n stateDefinition: {\n name: \"domainSettings\",\n },\n key: \"defaultUriMatchStrategy\",\n};\n\nconst equivalentDomainsDefinition: KeyDefinitionLike = {\n stateDefinition: {\n name: \"domainSettings\",\n },\n key: \"equivalentDomains\",\n};\n\nconst neverDomainsDefinition: KeyDefinitionLike = {\n stateDefinition: {\n name: \"domainSettings\",\n },\n key: \"neverDomains\",\n};\n\nexport class DomainSettingsMigrator extends Migrator<33, 34> {\n async migrate(helper: MigrationHelper): Promise {\n let updateAccount = false;\n\n // global state (\"neverDomains\")\n const globalState = await helper.get(\"global\");\n\n if (globalState?.neverDomains != null) {\n await helper.setToGlobal(neverDomainsDefinition, globalState.neverDomains);\n\n // delete `neverDomains` from state global\n delete globalState.neverDomains;\n\n await helper.set(\"global\", globalState);\n }\n\n // account state (\"defaultUriMatch\" and \"settings.equivalentDomains\")\n const accounts = await helper.getAccounts();\n\n await Promise.all([...accounts.map(({ userId, account }) => migrateAccount(userId, account))]);\n\n // migrate account state\n async function migrateAccount(userId: string, account: ExpectedAccountState): Promise {\n const accountSettings = account?.settings;\n\n if (accountSettings?.defaultUriMatch != undefined) {\n await helper.setToUser(\n userId,\n defaultUriMatchStrategyDefinition,\n accountSettings.defaultUriMatch,\n );\n delete account.settings.defaultUriMatch;\n\n updateAccount = true;\n }\n\n if (accountSettings?.settings?.equivalentDomains != undefined) {\n await helper.setToUser(\n userId,\n equivalentDomainsDefinition,\n accountSettings.settings.equivalentDomains,\n );\n delete account.settings.settings.equivalentDomains;\n delete account.settings.settings;\n\n updateAccount = true;\n }\n\n if (updateAccount) {\n // update the state account settings with the migrated values deleted\n await helper.set(userId, account);\n }\n }\n }\n\n async rollback(helper: MigrationHelper): Promise {\n let updateAccount = false;\n\n // global state (\"neverDomains\")\n const globalState = (await helper.get(\"global\")) || {};\n const neverDomains: { [key: string]: null } =\n await helper.getFromGlobal(neverDomainsDefinition);\n\n if (neverDomains != null) {\n await helper.set(\"global\", {\n ...globalState,\n neverDomains: neverDomains,\n });\n\n // remove the global state provider framework key for `neverDomains`\n await helper.setToGlobal(neverDomainsDefinition, null);\n }\n\n // account state (\"defaultUriMatchStrategy\" and \"equivalentDomains\")\n const accounts = await helper.getAccounts();\n\n await Promise.all([...accounts.map(({ userId, account }) => rollbackAccount(userId, account))]);\n\n // rollback account state\n async function rollbackAccount(userId: string, account: ExpectedAccountState): Promise {\n let settings = account?.settings || {};\n\n const defaultUriMatchStrategy: UriMatchStrategySetting = await helper.getFromUser(\n userId,\n defaultUriMatchStrategyDefinition,\n );\n\n const equivalentDomains: string[][] = await helper.getFromUser(\n userId,\n equivalentDomainsDefinition,\n );\n\n // update new settings and remove the account state provider framework keys for the rolled back values\n if (defaultUriMatchStrategy != null) {\n settings = { ...settings, defaultUriMatch: defaultUriMatchStrategy };\n\n await helper.setToUser(userId, defaultUriMatchStrategyDefinition, null);\n\n updateAccount = true;\n }\n\n if (equivalentDomains != null) {\n settings = { ...settings, settings: { equivalentDomains } };\n\n await helper.setToUser(userId, equivalentDomainsDefinition, null);\n\n updateAccount = true;\n }\n\n // commit updated settings to state\n if (updateAccount) {\n await helper.set(userId, {\n ...account,\n settings,\n });\n }\n }\n }\n}\n","import { KeyDefinitionLike, MigrationHelper } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\ntype ExpectedGlobal = { theme?: string };\n\nconst THEME_SELECTION: KeyDefinitionLike = {\n key: \"selection\",\n stateDefinition: { name: \"theming\" },\n};\n\nexport class MoveThemeToStateProviderMigrator extends Migrator<34, 35> {\n async migrate(helper: MigrationHelper): Promise {\n const legacyGlobalState = await helper.get(\"global\");\n const theme = legacyGlobalState?.theme;\n if (theme != null) {\n await helper.setToGlobal(THEME_SELECTION, theme);\n delete legacyGlobalState.theme;\n await helper.set(\"global\", legacyGlobalState);\n }\n }\n\n async rollback(helper: MigrationHelper): Promise {\n const theme = await helper.getFromGlobal(THEME_SELECTION);\n if (theme != null) {\n const legacyGlobal = (await helper.get(\"global\")) ?? {};\n legacyGlobal.theme = theme;\n await helper.set(\"global\", legacyGlobal);\n await helper.removeFromGlobal(THEME_SELECTION);\n }\n }\n}\n","import { MigrationHelper, StateDefinitionLike } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\ntype ExpectedAccountState = {\n settings?: {\n dontShowCardsCurrentTab?: boolean;\n dontShowIdentitiesCurrentTab?: boolean;\n };\n};\n\nconst vaultSettingsStateDefinition: {\n stateDefinition: StateDefinitionLike;\n} = {\n stateDefinition: {\n name: \"vaultSettings\",\n },\n};\n\nexport class VaultSettingsKeyMigrator extends Migrator<35, 36> {\n async migrate(helper: MigrationHelper): Promise {\n const accounts = await helper.getAccounts();\n\n await Promise.all([...accounts.map(({ userId, account }) => migrateAccount(userId, account))]);\n\n async function migrateAccount(userId: string, account: ExpectedAccountState): Promise {\n let updateAccount = false;\n const accountSettings = account?.settings;\n\n if (accountSettings?.dontShowCardsCurrentTab != null) {\n await helper.setToUser(\n userId,\n { ...vaultSettingsStateDefinition, key: \"showCardsCurrentTab\" },\n !accountSettings.dontShowCardsCurrentTab,\n );\n delete account.settings.dontShowCardsCurrentTab;\n updateAccount = true;\n }\n\n if (accountSettings?.dontShowIdentitiesCurrentTab != null) {\n await helper.setToUser(\n userId,\n { ...vaultSettingsStateDefinition, key: \"showIdentitiesCurrentTab\" },\n !accountSettings.dontShowIdentitiesCurrentTab,\n );\n delete account.settings.dontShowIdentitiesCurrentTab;\n updateAccount = true;\n }\n\n if (updateAccount) {\n await helper.set(userId, account);\n }\n }\n }\n\n async rollback(helper: MigrationHelper): Promise {\n const accounts = await helper.getAccounts();\n\n await Promise.all([...accounts.map(({ userId, account }) => rollbackAccount(userId, account))]);\n\n async function rollbackAccount(userId: string, account: ExpectedAccountState): Promise {\n let updateAccount = false;\n let settings = account?.settings ?? {};\n\n const showCardsCurrentTab = await helper.getFromUser(userId, {\n ...vaultSettingsStateDefinition,\n key: \"showCardsCurrentTab\",\n });\n\n const showIdentitiesCurrentTab = await helper.getFromUser(userId, {\n ...vaultSettingsStateDefinition,\n key: \"showIdentitiesCurrentTab\",\n });\n\n if (showCardsCurrentTab != null) {\n // invert the value to match the new naming convention\n settings = { ...settings, dontShowCardsCurrentTab: !showCardsCurrentTab };\n\n await helper.setToUser(\n userId,\n { ...vaultSettingsStateDefinition, key: \"showCardsCurrentTab\" },\n null,\n );\n\n updateAccount = true;\n }\n\n if (showIdentitiesCurrentTab != null) {\n // invert the value to match the new naming convention\n settings = { ...settings, dontShowIdentitiesCurrentTab: !showIdentitiesCurrentTab };\n\n await helper.setToUser(\n userId,\n { ...vaultSettingsStateDefinition, key: \"showIdentitiesCurrentTab\" },\n null,\n );\n\n updateAccount = true;\n }\n\n if (updateAccount) {\n await helper.set(userId, { ...account, settings });\n }\n }\n }\n}\n","import { KeyDefinitionLike, MigrationHelper, StateDefinitionLike } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\ntype ExpectedAccountState = {\n settings?: { avatarColor?: string };\n};\n\nconst AVATAR_COLOR_STATE: StateDefinitionLike = { name: \"avatar\" };\n\nconst AVATAR_COLOR_KEY: KeyDefinitionLike = {\n key: \"avatarColor\",\n stateDefinition: AVATAR_COLOR_STATE,\n};\n\nexport class AvatarColorMigrator extends Migrator<36, 37> {\n async migrate(helper: MigrationHelper): Promise {\n const legacyAccounts = await helper.getAccounts();\n\n await Promise.all(\n legacyAccounts.map(async ({ userId, account }) => {\n // Move account avatarColor\n if (account?.settings?.avatarColor != null) {\n await helper.setToUser(userId, AVATAR_COLOR_KEY, account.settings.avatarColor);\n\n // Delete old account avatarColor property\n delete account?.settings?.avatarColor;\n await helper.set(userId, account);\n }\n }),\n );\n }\n\n async rollback(helper: MigrationHelper): Promise {\n async function rollbackUser(userId: string, account: ExpectedAccountState) {\n let updatedAccount = false;\n const userAvatarColor = await helper.getFromUser(userId, AVATAR_COLOR_KEY);\n\n if (userAvatarColor) {\n if (!account) {\n account = {};\n }\n\n updatedAccount = true;\n account.settings.avatarColor = userAvatarColor;\n await helper.setToUser(userId, AVATAR_COLOR_KEY, null);\n }\n\n if (updatedAccount) {\n await helper.set(userId, account);\n }\n }\n\n const accounts = await helper.getAccounts();\n\n await Promise.all(accounts.map(({ userId, account }) => rollbackUser(userId, account)));\n }\n}\n","import { KeyDefinitionLike, MigrationHelper, StateDefinitionLike } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\n// Types to represent data as it is stored in JSON\ntype ExpectedAccountType = {\n tokens?: {\n accessToken?: string;\n refreshToken?: string;\n };\n profile?: {\n apiKeyClientId?: string;\n email?: string;\n };\n keys?: {\n apiKeyClientSecret?: string;\n };\n};\n\ntype ExpectedGlobalType = {\n twoFactorToken?: string;\n};\n\nexport const EMAIL_TWO_FACTOR_TOKEN_RECORD_DISK_LOCAL: KeyDefinitionLike = {\n key: \"emailTwoFactorTokenRecord\",\n stateDefinition: {\n name: \"tokenDiskLocal\",\n },\n};\n\nconst TOKEN_STATE_DEF_LIKE: StateDefinitionLike = {\n name: \"token\",\n};\n\nexport const ACCESS_TOKEN_DISK: KeyDefinitionLike = {\n key: \"accessToken\", // matches KeyDefinition.key\n stateDefinition: TOKEN_STATE_DEF_LIKE,\n};\n\nexport const REFRESH_TOKEN_DISK: KeyDefinitionLike = {\n key: \"refreshToken\",\n stateDefinition: TOKEN_STATE_DEF_LIKE,\n};\n\nexport const API_KEY_CLIENT_ID_DISK: KeyDefinitionLike = {\n key: \"apiKeyClientId\",\n stateDefinition: TOKEN_STATE_DEF_LIKE,\n};\n\nexport const API_KEY_CLIENT_SECRET_DISK: KeyDefinitionLike = {\n key: \"apiKeyClientSecret\",\n stateDefinition: TOKEN_STATE_DEF_LIKE,\n};\n\nexport class TokenServiceStateProviderMigrator extends Migrator<37, 38> {\n async migrate(helper: MigrationHelper): Promise {\n // Move global data\n const globalData = await helper.get(\"global\");\n\n // Create new global record for 2FA token that we can accumulate data in\n const emailTwoFactorTokenRecord = {};\n\n const accounts = await helper.getAccounts();\n async function migrateAccount(\n userId: string,\n account: ExpectedAccountType | undefined,\n globalTwoFactorToken: string | undefined,\n emailTwoFactorTokenRecord: Record,\n ): Promise {\n let updatedAccount = false;\n\n // migrate 2FA token from global to user state\n // Due to the existing implmentation, n users on the same device share the same global state value for 2FA token.\n // So, we will just migrate it to all users to keep it valid for whichever was the user that set it previously.\n // Note: don't bother migrating 2FA Token if user account or email is undefined\n const email = account?.profile?.email;\n if (globalTwoFactorToken != undefined && account != undefined && email != undefined) {\n emailTwoFactorTokenRecord[email] = globalTwoFactorToken;\n // Note: don't set updatedAccount to true here as we aren't updating\n // the legacy user state, just migrating a global state to a new user state\n }\n\n // Migrate access token\n const existingAccessToken = account?.tokens?.accessToken;\n\n if (existingAccessToken != null) {\n // Only migrate data that exists\n if (helper.type !== \"web-disk-local\") {\n // only migrate access token to session storage - never local.\n await helper.setToUser(userId, ACCESS_TOKEN_DISK, existingAccessToken);\n }\n delete account.tokens.accessToken;\n updatedAccount = true;\n }\n\n // Migrate refresh token\n const existingRefreshToken = account?.tokens?.refreshToken;\n\n if (existingRefreshToken != null) {\n if (helper.type !== \"web-disk-local\") {\n // only migrate refresh token to session storage - never local.\n await helper.setToUser(userId, REFRESH_TOKEN_DISK, existingRefreshToken);\n }\n delete account.tokens.refreshToken;\n updatedAccount = true;\n }\n\n // Migrate API key client id\n const existingApiKeyClientId = account?.profile?.apiKeyClientId;\n\n if (existingApiKeyClientId != null) {\n if (helper.type !== \"web-disk-local\") {\n // only migrate client id to session storage - never local.\n await helper.setToUser(userId, API_KEY_CLIENT_ID_DISK, existingApiKeyClientId);\n }\n delete account.profile.apiKeyClientId;\n updatedAccount = true;\n }\n\n // Migrate API key client secret\n const existingApiKeyClientSecret = account?.keys?.apiKeyClientSecret;\n if (existingApiKeyClientSecret != null) {\n if (helper.type !== \"web-disk-local\") {\n // only migrate client secret to session storage - never local.\n await helper.setToUser(userId, API_KEY_CLIENT_SECRET_DISK, existingApiKeyClientSecret);\n }\n delete account.keys.apiKeyClientSecret;\n updatedAccount = true;\n }\n\n if (updatedAccount) {\n // Save the migrated account only if it was updated\n await helper.set(userId, account);\n }\n }\n\n await Promise.all([\n ...accounts.map(({ userId, account }) =>\n migrateAccount(userId, account, globalData?.twoFactorToken, emailTwoFactorTokenRecord),\n ),\n ]);\n\n // Save the global 2FA token record\n await helper.setToGlobal(EMAIL_TWO_FACTOR_TOKEN_RECORD_DISK_LOCAL, emailTwoFactorTokenRecord);\n\n // Delete global data\n delete globalData?.twoFactorToken;\n await helper.set(\"global\", globalData);\n }\n\n async rollback(helper: MigrationHelper): Promise {\n const accounts = await helper.getAccounts();\n\n // Since we migrated the global 2FA token to all users, we need to rollback the 2FA token for all users\n // but we only need to set it to the global state once\n\n // Go through accounts and find the first user that has a non-null email and 2FA token\n let migratedTwoFactorToken: string | null = null;\n for (const { account } of accounts) {\n const email = account?.profile?.email;\n if (email == null) {\n continue;\n }\n const emailTwoFactorTokenRecord: Record = await helper.getFromGlobal(\n EMAIL_TWO_FACTOR_TOKEN_RECORD_DISK_LOCAL,\n );\n\n migratedTwoFactorToken = emailTwoFactorTokenRecord[email];\n\n if (migratedTwoFactorToken != null) {\n break;\n }\n }\n\n if (migratedTwoFactorToken != null) {\n let legacyGlobal = await helper.get(\"global\");\n if (!legacyGlobal) {\n legacyGlobal = {};\n }\n legacyGlobal.twoFactorToken = migratedTwoFactorToken;\n await helper.set(\"global\", legacyGlobal);\n }\n\n // delete global 2FA token record\n await helper.setToGlobal(EMAIL_TWO_FACTOR_TOKEN_RECORD_DISK_LOCAL, null);\n\n async function rollbackAccount(userId: string, account: ExpectedAccountType): Promise {\n let updatedLegacyAccount = false;\n\n // Rollback access token\n const migratedAccessToken = await helper.getFromUser(userId, ACCESS_TOKEN_DISK);\n\n if (account?.tokens && migratedAccessToken != null) {\n account.tokens.accessToken = migratedAccessToken;\n updatedLegacyAccount = true;\n }\n\n await helper.setToUser(userId, ACCESS_TOKEN_DISK, null);\n\n // Rollback refresh token\n const migratedRefreshToken = await helper.getFromUser(userId, REFRESH_TOKEN_DISK);\n\n if (account?.tokens && migratedRefreshToken != null) {\n account.tokens.refreshToken = migratedRefreshToken;\n updatedLegacyAccount = true;\n }\n\n await helper.setToUser(userId, REFRESH_TOKEN_DISK, null);\n\n // Rollback API key client id\n\n const migratedApiKeyClientId = await helper.getFromUser(\n userId,\n API_KEY_CLIENT_ID_DISK,\n );\n\n if (account?.profile && migratedApiKeyClientId != null) {\n account.profile.apiKeyClientId = migratedApiKeyClientId;\n updatedLegacyAccount = true;\n }\n\n await helper.setToUser(userId, API_KEY_CLIENT_ID_DISK, null);\n\n // Rollback API key client secret\n const migratedApiKeyClientSecret = await helper.getFromUser(\n userId,\n API_KEY_CLIENT_SECRET_DISK,\n );\n\n if (account?.keys && migratedApiKeyClientSecret != null) {\n account.keys.apiKeyClientSecret = migratedApiKeyClientSecret;\n updatedLegacyAccount = true;\n }\n\n await helper.setToUser(userId, API_KEY_CLIENT_SECRET_DISK, null);\n\n if (updatedLegacyAccount) {\n await helper.set(userId, account);\n }\n }\n\n await Promise.all([...accounts.map(({ userId, account }) => rollbackAccount(userId, account))]);\n }\n}\n","import { KeyDefinitionLike, MigrationHelper } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\ntype ExpectedAccountType = {\n profile?: {\n hasPremiumPersonally?: boolean;\n hasPremiumFromOrganization?: boolean;\n };\n};\n\ntype ExpectedBillingAccountProfileType = {\n hasPremiumPersonally: boolean;\n hasPremiumFromOrganization: boolean;\n};\n\nexport const BILLING_ACCOUNT_PROFILE_KEY_DEFINITION: KeyDefinitionLike = {\n key: \"accountProfile\",\n stateDefinition: {\n name: \"billing\",\n },\n};\n\nexport class MoveBillingAccountProfileMigrator extends Migrator<38, 39> {\n async migrate(helper: MigrationHelper): Promise {\n const accounts = await helper.getAccounts();\n\n const migrateAccount = async (userId: string, account: ExpectedAccountType): Promise => {\n const hasPremiumPersonally = account?.profile?.hasPremiumPersonally;\n const hasPremiumFromOrganization = account?.profile?.hasPremiumFromOrganization;\n\n if (hasPremiumPersonally != null || hasPremiumFromOrganization != null) {\n await helper.setToUser(userId, BILLING_ACCOUNT_PROFILE_KEY_DEFINITION, {\n hasPremiumPersonally: hasPremiumPersonally,\n hasPremiumFromOrganization: hasPremiumFromOrganization,\n });\n\n delete account?.profile?.hasPremiumPersonally;\n delete account?.profile?.hasPremiumFromOrganization;\n await helper.set(userId, account);\n }\n };\n\n await Promise.all([...accounts.map(({ userId, account }) => migrateAccount(userId, account))]);\n }\n\n async rollback(helper: MigrationHelper): Promise {\n const accounts = await helper.getAccounts();\n const rollbackAccount = async (userId: string, account: ExpectedAccountType): Promise => {\n const value = await helper.getFromUser(\n userId,\n BILLING_ACCOUNT_PROFILE_KEY_DEFINITION,\n );\n\n if (account && value) {\n account.profile = Object.assign(account.profile ?? {}, {\n hasPremiumPersonally: value?.hasPremiumPersonally,\n hasPremiumFromOrganization: value?.hasPremiumFromOrganization,\n });\n await helper.set(userId, account);\n }\n\n await helper.setToUser(userId, BILLING_ACCOUNT_PROFILE_KEY_DEFINITION, null);\n };\n\n await Promise.all([...accounts.map(({ userId, account }) => rollbackAccount(userId, account))]);\n }\n}\n","import { MigrationHelper } from \"../migration-helper\";\nimport { Direction, IRREVERSIBLE, Migrator } from \"../migrator\";\n\ntype ExpectedAccountType = { profile?: { everBeenUnlocked?: boolean } };\n\nexport class RemoveEverBeenUnlockedMigrator extends Migrator<3, 4> {\n async migrate(helper: MigrationHelper): Promise {\n const accounts = await helper.getAccounts();\n\n async function removeEverBeenUnlocked(userId: string, account: ExpectedAccountType) {\n if (account?.profile?.everBeenUnlocked != null) {\n delete account.profile.everBeenUnlocked;\n return helper.set(userId, account);\n }\n }\n\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n Promise.all(accounts.map(({ userId, account }) => removeEverBeenUnlocked(userId, account)));\n }\n\n rollback(helper: MigrationHelper): Promise {\n throw IRREVERSIBLE;\n }\n\n // Override is necessary because default implementation assumes `stateVersion` at the root, but for this version\n // it is nested inside a global object.\n override async updateVersion(helper: MigrationHelper, direction: Direction): Promise {\n const endVersion = direction === \"up\" ? this.toVersion : this.fromVersion;\n helper.currentVersion = endVersion;\n const global: { stateVersion: number } = (await helper.get(\"global\")) || ({} as any);\n await helper.set(\"global\", { ...global, stateVersion: endVersion });\n }\n}\n","import { Jsonify } from \"type-fest\";\n\nimport { KeyDefinitionLike, MigrationHelper } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\n// Local declarations of `OrganizationData` and the types of it's properties.\n// Duplicated to remain frozen in time when migration occurs.\nenum OrganizationUserStatusType {\n Invited = 0,\n Accepted = 1,\n Confirmed = 2,\n Revoked = -1,\n}\n\nenum OrganizationUserType {\n Owner = 0,\n Admin = 1,\n User = 2,\n Manager = 3,\n Custom = 4,\n}\n\ntype PermissionsApi = {\n accessEventLogs: boolean;\n accessImportExport: boolean;\n accessReports: boolean;\n createNewCollections: boolean;\n editAnyCollection: boolean;\n deleteAnyCollection: boolean;\n editAssignedCollections: boolean;\n deleteAssignedCollections: boolean;\n manageCiphers: boolean;\n manageGroups: boolean;\n manageSso: boolean;\n managePolicies: boolean;\n manageUsers: boolean;\n manageResetPassword: boolean;\n manageScim: boolean;\n};\n\nenum ProviderType {\n Msp = 0,\n Reseller = 1,\n}\n\nenum ProductType {\n Free = 0,\n Families = 1,\n Teams = 2,\n Enterprise = 3,\n TeamsStarter = 4,\n}\n\ntype OrganizationData = {\n id: string;\n name: string;\n status: OrganizationUserStatusType;\n type: OrganizationUserType;\n enabled: boolean;\n usePolicies: boolean;\n useGroups: boolean;\n useDirectory: boolean;\n useEvents: boolean;\n useTotp: boolean;\n use2fa: boolean;\n useApi: boolean;\n useSso: boolean;\n useKeyConnector: boolean;\n useScim: boolean;\n useCustomPermissions: boolean;\n useResetPassword: boolean;\n useSecretsManager: boolean;\n usePasswordManager: boolean;\n useActivateAutofillPolicy: boolean;\n selfHost: boolean;\n usersGetPremium: boolean;\n seats: number;\n maxCollections: number;\n maxStorageGb?: number;\n ssoBound: boolean;\n identifier: string;\n permissions: PermissionsApi;\n resetPasswordEnrolled: boolean;\n userId: string;\n hasPublicAndPrivateKeys: boolean;\n providerId: string;\n providerName: string;\n providerType?: ProviderType;\n isProviderUser: boolean;\n isMember: boolean;\n familySponsorshipFriendlyName: string;\n familySponsorshipAvailable: boolean;\n planProductType: ProductType;\n keyConnectorEnabled: boolean;\n keyConnectorUrl: string;\n familySponsorshipLastSyncDate?: Date;\n familySponsorshipValidUntil?: Date;\n familySponsorshipToDelete?: boolean;\n accessSecretsManager: boolean;\n limitCollectionCreationDeletion: boolean;\n allowAdminAccessToAllCollectionItems: boolean;\n flexibleCollections: boolean;\n};\n\ntype ExpectedAccountType = {\n data?: {\n organizations?: Record>;\n };\n};\n\nconst USER_ORGANIZATIONS: KeyDefinitionLike = {\n key: \"organizations\",\n stateDefinition: {\n name: \"organizations\",\n },\n};\n\nexport class OrganizationMigrator extends Migrator<39, 40> {\n async migrate(helper: MigrationHelper): Promise {\n const accounts = await helper.getAccounts();\n async function migrateAccount(userId: string, account: ExpectedAccountType): Promise {\n const value = account?.data?.organizations;\n if (value != null) {\n await helper.setToUser(userId, USER_ORGANIZATIONS, value);\n delete account.data.organizations;\n await helper.set(userId, account);\n }\n }\n\n await Promise.all(accounts.map(({ userId, account }) => migrateAccount(userId, account)));\n }\n\n async rollback(helper: MigrationHelper): Promise {\n const accounts = await helper.getAccounts();\n async function rollbackAccount(userId: string, account: ExpectedAccountType): Promise {\n const value = await helper.getFromUser(userId, USER_ORGANIZATIONS);\n if (account) {\n account.data = Object.assign(account.data ?? {}, {\n organizations: value,\n });\n await helper.set(userId, account);\n }\n await helper.setToUser(userId, USER_ORGANIZATIONS, null);\n }\n\n await Promise.all(accounts.map(({ userId, account }) => rollbackAccount(userId, account)));\n }\n}\n","import { KeyDefinitionLike, MigrationHelper } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\ntype ExpectedAccountState = {\n data?: {\n eventCollection?: [];\n };\n};\n\nconst EVENT_COLLECTION: KeyDefinitionLike = {\n stateDefinition: {\n name: \"eventCollection\",\n },\n key: \"eventCollection\",\n};\n\nexport class EventCollectionMigrator extends Migrator<40, 41> {\n async migrate(helper: MigrationHelper): Promise {\n const accounts = await helper.getAccounts();\n\n async function migrateAccount(userId: string, account: ExpectedAccountState): Promise {\n const value = account?.data?.eventCollection;\n if (value != null) {\n await helper.setToUser(userId, EVENT_COLLECTION, value);\n delete account.data.eventCollection;\n await helper.set(userId, account);\n }\n }\n\n await Promise.all([...accounts.map(({ userId, account }) => migrateAccount(userId, account))]);\n }\n\n async rollback(helper: MigrationHelper): Promise {\n const accounts = await helper.getAccounts();\n\n async function rollbackAccount(userId: string, account: ExpectedAccountState): Promise {\n const value = await helper.getFromUser(userId, EVENT_COLLECTION);\n if (account) {\n account.data = Object.assign(account.data ?? {}, {\n eventCollection: value,\n });\n\n await helper.set(userId, account);\n }\n await helper.setToUser(userId, EVENT_COLLECTION, null);\n }\n await Promise.all([...accounts.map(({ userId, account }) => rollbackAccount(userId, account))]);\n }\n}\n","import { KeyDefinitionLike, MigrationHelper } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\ntype ExpectedGlobalState = {\n disableFavicon?: boolean;\n};\n\nconst ShowFaviconDefinition: KeyDefinitionLike = {\n stateDefinition: {\n name: \"domainSettings\",\n },\n key: \"showFavicons\",\n};\n\nexport class EnableFaviconMigrator extends Migrator<41, 42> {\n async migrate(helper: MigrationHelper): Promise {\n // global state (\"disableFavicon\" -> \"showFavicons\")\n const globalState = await helper.get(\"global\");\n\n if (globalState?.disableFavicon != null) {\n await helper.setToGlobal(ShowFaviconDefinition, !globalState.disableFavicon);\n\n // delete `disableFavicon` from state global\n delete globalState.disableFavicon;\n\n await helper.set(\"global\", globalState);\n }\n }\n\n async rollback(helper: MigrationHelper): Promise {\n // global state (\"showFavicons\" -> \"disableFavicon\")\n const globalState = (await helper.get(\"global\")) || {};\n const showFavicons: boolean = await helper.getFromGlobal(ShowFaviconDefinition);\n\n if (showFavicons != null) {\n await helper.set(\"global\", {\n ...globalState,\n disableFavicon: !showFavicons,\n });\n\n // remove the global state provider framework key for `showFavicons`\n await helper.setToGlobal(ShowFaviconDefinition, null);\n }\n }\n}\n","import { KeyDefinitionLike, MigrationHelper, StateDefinitionLike } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\ntype ExpectedAccountState = {\n settings?: { autoConfirmFingerPrints?: boolean };\n};\n\nconst ORGANIZATION_MANAGEMENT_PREFERENCES: StateDefinitionLike = {\n name: \"organizationManagementPreferences\",\n};\n\nconst AUTO_CONFIRM_FINGERPRINTS: KeyDefinitionLike = {\n key: \"autoConfirmFingerPrints\",\n stateDefinition: ORGANIZATION_MANAGEMENT_PREFERENCES,\n};\n\nexport class AutoConfirmFingerPrintsMigrator extends Migrator<42, 43> {\n async migrate(helper: MigrationHelper): Promise {\n const legacyAccounts = await helper.getAccounts();\n\n await Promise.all(\n legacyAccounts.map(async ({ userId, account }) => {\n if (account?.settings?.autoConfirmFingerPrints != null) {\n await helper.setToUser(\n userId,\n AUTO_CONFIRM_FINGERPRINTS,\n account.settings.autoConfirmFingerPrints,\n );\n delete account?.settings?.autoConfirmFingerPrints;\n await helper.set(userId, account);\n }\n }),\n );\n }\n\n async rollback(helper: MigrationHelper): Promise {\n async function rollbackUser(userId: string, account: ExpectedAccountState) {\n let updatedAccount = false;\n const autoConfirmFingerPrints = await helper.getFromUser(\n userId,\n AUTO_CONFIRM_FINGERPRINTS,\n );\n\n if (autoConfirmFingerPrints) {\n if (!account) {\n account = {};\n }\n\n updatedAccount = true;\n account.settings.autoConfirmFingerPrints = autoConfirmFingerPrints;\n await helper.setToUser(userId, AUTO_CONFIRM_FINGERPRINTS, null);\n }\n\n if (updatedAccount) {\n await helper.set(userId, account);\n }\n }\n\n const accounts = await helper.getAccounts();\n\n await Promise.all(accounts.map(({ userId, account }) => rollbackUser(userId, account)));\n }\n}\n","import { KeyDefinitionLike, MigrationHelper } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\ntype DecryptionOptionsType = {\n hasMasterPassword: boolean;\n trustedDeviceOption?: {\n hasAdminApproval: boolean;\n hasLoginApprovingDevice: boolean;\n hasManageResetPasswordPermission: boolean;\n };\n keyConnectorOption?: {\n keyConnectorUrl: string;\n };\n};\n\ntype ExpectedAccountType = {\n decryptionOptions?: DecryptionOptionsType;\n};\n\nconst USER_DECRYPTION_OPTIONS: KeyDefinitionLike = {\n key: \"decryptionOptions\",\n stateDefinition: {\n name: \"userDecryptionOptions\",\n },\n};\n\nexport class UserDecryptionOptionsMigrator extends Migrator<43, 44> {\n async migrate(helper: MigrationHelper): Promise {\n const accounts = await helper.getAccounts();\n async function migrateAccount(userId: string, account: ExpectedAccountType): Promise {\n const value = account?.decryptionOptions;\n if (value != null) {\n await helper.setToUser(userId, USER_DECRYPTION_OPTIONS, value);\n delete account.decryptionOptions;\n await helper.set(userId, account);\n }\n }\n\n await Promise.all([...accounts.map(({ userId, account }) => migrateAccount(userId, account))]);\n }\n async rollback(helper: MigrationHelper): Promise {\n const accounts = await helper.getAccounts();\n async function rollbackAccount(userId: string, account: ExpectedAccountType): Promise {\n const value: DecryptionOptionsType = await helper.getFromUser(\n userId,\n USER_DECRYPTION_OPTIONS,\n );\n if (account) {\n account.decryptionOptions = Object.assign(account.decryptionOptions, value);\n await helper.set(userId, account);\n }\n await helper.setToUser(userId, USER_DECRYPTION_OPTIONS, null);\n }\n\n await Promise.all([...accounts.map(({ userId, account }) => rollbackAccount(userId, account))]);\n }\n}\n","import { KeyDefinitionLike, MigrationHelper, StateDefinitionLike } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\nconst ENVIRONMENT_STATE: StateDefinitionLike = { name: \"environment\" };\n\nconst ENVIRONMENT_REGION: KeyDefinitionLike = {\n key: \"region\",\n stateDefinition: ENVIRONMENT_STATE,\n};\n\nconst ENVIRONMENT_URLS: KeyDefinitionLike = {\n key: \"urls\",\n stateDefinition: ENVIRONMENT_STATE,\n};\n\nconst ENVIRONMENT_ENVIRONMENT: KeyDefinitionLike = {\n key: \"environment\",\n stateDefinition: ENVIRONMENT_STATE,\n};\n\nexport class MergeEnvironmentState extends Migrator<44, 45> {\n async migrate(helper: MigrationHelper): Promise {\n const accounts = await helper.getAccounts();\n\n async function migrateAccount(userId: string, account: unknown): Promise {\n const region = await helper.getFromUser(userId, ENVIRONMENT_REGION);\n const urls = await helper.getFromUser(userId, ENVIRONMENT_URLS);\n\n if (region == null && urls == null) {\n return;\n }\n\n await helper.setToUser(userId, ENVIRONMENT_ENVIRONMENT, {\n region,\n urls,\n });\n await helper.removeFromUser(userId, ENVIRONMENT_REGION);\n await helper.removeFromUser(userId, ENVIRONMENT_URLS);\n }\n\n await Promise.all([...accounts.map(({ userId, account }) => migrateAccount(userId, account))]);\n\n const region = await helper.getFromGlobal(ENVIRONMENT_REGION);\n const urls = await helper.getFromGlobal(ENVIRONMENT_URLS);\n\n if (region == null && urls == null) {\n return;\n }\n\n await helper.setToGlobal(ENVIRONMENT_ENVIRONMENT, {\n region,\n urls,\n });\n await helper.removeFromGlobal(ENVIRONMENT_REGION);\n await helper.removeFromGlobal(ENVIRONMENT_URLS);\n }\n\n async rollback(helper: MigrationHelper): Promise {\n const accounts = await helper.getAccounts();\n\n async function rollbackAccount(userId: string, account: unknown): Promise {\n const state = (await helper.getFromUser(userId, ENVIRONMENT_ENVIRONMENT)) as {\n region: string;\n urls: string;\n } | null;\n\n await helper.setToUser(userId, ENVIRONMENT_REGION, state?.region);\n await helper.setToUser(userId, ENVIRONMENT_URLS, state?.urls);\n await helper.removeFromUser(userId, ENVIRONMENT_ENVIRONMENT);\n }\n\n await Promise.all([...accounts.map(({ userId, account }) => rollbackAccount(userId, account))]);\n\n const state = (await helper.getFromGlobal(ENVIRONMENT_ENVIRONMENT)) as {\n region: string;\n urls: string;\n } | null;\n\n await helper.setToGlobal(ENVIRONMENT_REGION, state?.region);\n await helper.setToGlobal(ENVIRONMENT_URLS, state?.urls);\n await helper.removeFromGlobal(ENVIRONMENT_ENVIRONMENT);\n }\n}\n","import { KeyDefinitionLike, MigrationHelper } from \"../migration-helper\";\nimport { IRREVERSIBLE, Migrator } from \"../migrator\";\n\nexport const PROMPT_CANCELLED: KeyDefinitionLike = {\n key: \"promptCancelled\",\n stateDefinition: { name: \"biometricSettings\" },\n};\n\nexport class DeleteBiometricPromptCancelledData extends Migrator<45, 46> {\n async migrate(helper: MigrationHelper): Promise {\n await Promise.all(\n (await helper.getAccounts()).map(async ({ userId }) => {\n if (helper.getFromUser(userId, PROMPT_CANCELLED) != null) {\n await helper.removeFromUser(userId, PROMPT_CANCELLED);\n }\n }),\n );\n }\n\n async rollback(helper: MigrationHelper): Promise {\n throw IRREVERSIBLE;\n }\n}\n","import { KeyDefinitionLike, MigrationHelper, StateDefinitionLike } from \"../migration-helper\";\nimport { IRREVERSIBLE, Migrator } from \"../migrator\";\n\ntype ExpectedGlobalType = {\n window?: object;\n enableTray?: boolean;\n enableMinimizeToTray?: boolean;\n enableCloseToTray?: boolean;\n enableStartToTray?: boolean;\n openAtLogin?: boolean;\n alwaysShowDock?: boolean;\n enableAlwaysOnTop?: boolean;\n};\n\ntype ExpectedAccountType = {\n settings?: {\n enableAlwaysOnTop?: boolean;\n };\n};\n\nconst DESKTOP_SETTINGS_STATE: StateDefinitionLike = { name: \"desktopSettings\" };\n\nconst WINDOW_KEY: KeyDefinitionLike = { key: \"window\", stateDefinition: DESKTOP_SETTINGS_STATE };\n\nconst CLOSE_TO_TRAY_KEY: KeyDefinitionLike = {\n key: \"closeToTray\",\n stateDefinition: DESKTOP_SETTINGS_STATE,\n};\nconst MINIMIZE_TO_TRAY_KEY: KeyDefinitionLike = {\n key: \"minimizeToTray\",\n stateDefinition: DESKTOP_SETTINGS_STATE,\n};\nconst START_TO_TRAY_KEY: KeyDefinitionLike = {\n key: \"startToTray\",\n stateDefinition: DESKTOP_SETTINGS_STATE,\n};\nconst TRAY_ENABLED_KEY: KeyDefinitionLike = {\n key: \"trayEnabled\",\n stateDefinition: DESKTOP_SETTINGS_STATE,\n};\nconst OPEN_AT_LOGIN_KEY: KeyDefinitionLike = {\n key: \"openAtLogin\",\n stateDefinition: DESKTOP_SETTINGS_STATE,\n};\nconst ALWAYS_SHOW_DOCK_KEY: KeyDefinitionLike = {\n key: \"alwaysShowDock\",\n stateDefinition: DESKTOP_SETTINGS_STATE,\n};\n\nconst ALWAYS_ON_TOP_KEY: KeyDefinitionLike = {\n key: \"alwaysOnTop\",\n stateDefinition: DESKTOP_SETTINGS_STATE,\n};\n\nexport class MoveDesktopSettingsMigrator extends Migrator<46, 47> {\n async migrate(helper: MigrationHelper): Promise {\n const legacyGlobal = await helper.get(\"global\");\n\n let updatedGlobal = false;\n if (legacyGlobal?.window !== undefined) {\n await helper.setToGlobal(WINDOW_KEY, legacyGlobal.window);\n updatedGlobal = true;\n delete legacyGlobal.window;\n }\n\n if (legacyGlobal?.enableCloseToTray != null) {\n await helper.setToGlobal(CLOSE_TO_TRAY_KEY, legacyGlobal.enableCloseToTray);\n updatedGlobal = true;\n delete legacyGlobal.enableCloseToTray;\n }\n\n if (legacyGlobal?.enableMinimizeToTray != null) {\n await helper.setToGlobal(MINIMIZE_TO_TRAY_KEY, legacyGlobal.enableMinimizeToTray);\n updatedGlobal = true;\n delete legacyGlobal.enableMinimizeToTray;\n }\n\n if (legacyGlobal?.enableStartToTray != null) {\n await helper.setToGlobal(START_TO_TRAY_KEY, legacyGlobal.enableStartToTray);\n updatedGlobal = true;\n delete legacyGlobal.enableStartToTray;\n }\n\n if (legacyGlobal?.enableTray != null) {\n await helper.setToGlobal(TRAY_ENABLED_KEY, legacyGlobal.enableTray);\n updatedGlobal = true;\n delete legacyGlobal.enableTray;\n }\n\n if (legacyGlobal?.openAtLogin != null) {\n await helper.setToGlobal(OPEN_AT_LOGIN_KEY, legacyGlobal.openAtLogin);\n updatedGlobal = true;\n delete legacyGlobal.openAtLogin;\n }\n\n if (legacyGlobal?.alwaysShowDock != null) {\n await helper.setToGlobal(ALWAYS_SHOW_DOCK_KEY, legacyGlobal.alwaysShowDock);\n updatedGlobal = true;\n delete legacyGlobal.alwaysShowDock;\n }\n\n if (legacyGlobal?.enableAlwaysOnTop != null) {\n await helper.setToGlobal(ALWAYS_ON_TOP_KEY, legacyGlobal.enableAlwaysOnTop);\n updatedGlobal = true;\n delete legacyGlobal.enableAlwaysOnTop;\n }\n\n if (updatedGlobal) {\n await helper.set(\"global\", legacyGlobal);\n }\n\n async function migrateAccount(userId: string, account: ExpectedAccountType) {\n // We only migrate the global setting for this, if we find it on the account object\n // just delete it.\n if (account?.settings?.enableAlwaysOnTop != null) {\n delete account.settings.enableAlwaysOnTop;\n await helper.set(userId, account);\n }\n }\n\n const accounts = await helper.getAccounts();\n await Promise.all(accounts.map(({ userId, account }) => migrateAccount(userId, account)));\n }\n\n rollback(helper: MigrationHelper): Promise {\n throw IRREVERSIBLE;\n }\n}\n","import { KeyDefinitionLike, MigrationHelper } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\ntype ExpectedGlobal = {\n enableDuckDuckGoBrowserIntegration?: boolean;\n};\n\nexport const DDG_KEY: KeyDefinitionLike = {\n key: \"enableDuckDuckGoBrowserIntegration\",\n stateDefinition: {\n name: \"autofillSettings\",\n },\n};\n\nexport class MoveDdgToStateProviderMigrator extends Migrator<47, 48> {\n async migrate(helper: MigrationHelper): Promise {\n // global state\n const global = await helper.get(\"global\");\n if (global?.enableDuckDuckGoBrowserIntegration == null) {\n return;\n }\n\n await helper.setToGlobal(DDG_KEY, global.enableDuckDuckGoBrowserIntegration);\n delete global.enableDuckDuckGoBrowserIntegration;\n await helper.set(\"global\", global);\n }\n\n async rollback(helper: MigrationHelper): Promise {\n const enableDdg = await helper.getFromGlobal(DDG_KEY);\n\n if (!enableDdg) {\n return;\n }\n\n const global = (await helper.get(\"global\")) ?? {};\n global.enableDuckDuckGoBrowserIntegration = enableDdg;\n await helper.set(\"global\", global);\n await helper.removeFromGlobal(DDG_KEY);\n }\n}\n","import { MigrationHelper } from \"../migration-helper\";\nimport { Direction, Migrator } from \"../migrator\";\n\ntype ExpectedAccountType = { keys?: { organizationKeys?: { encrypted: Record } } };\ntype NewAccountType = {\n keys?: {\n organizationKeys?: { encrypted: Record };\n };\n};\n\nexport class AddKeyTypeToOrgKeysMigrator extends Migrator<4, 5> {\n async migrate(helper: MigrationHelper): Promise {\n const accounts = await helper.getAccounts();\n\n async function updateOrgKey(userId: string, account: ExpectedAccountType) {\n const encryptedOrgKeys = account?.keys?.organizationKeys?.encrypted;\n if (encryptedOrgKeys == null) {\n return;\n }\n\n const newOrgKeys: Record = {};\n\n Object.entries(encryptedOrgKeys).forEach(([orgId, encKey]) => {\n newOrgKeys[orgId] = {\n type: \"organization\",\n key: encKey,\n };\n });\n (account as any).keys.organizationKeys.encrypted = newOrgKeys;\n\n await helper.set(userId, account);\n }\n\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n Promise.all(accounts.map(({ userId, account }) => updateOrgKey(userId, account)));\n }\n\n async rollback(helper: MigrationHelper): Promise {\n const accounts = await helper.getAccounts();\n\n async function updateOrgKey(userId: string, account: NewAccountType) {\n const encryptedOrgKeys = account?.keys?.organizationKeys?.encrypted;\n if (encryptedOrgKeys == null) {\n return;\n }\n\n const newOrgKeys: Record = {};\n\n Object.entries(encryptedOrgKeys).forEach(([orgId, encKey]) => {\n newOrgKeys[orgId] = encKey.key;\n });\n (account as any).keys.organizationKeys.encrypted = newOrgKeys;\n\n await helper.set(userId, account);\n }\n\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n Promise.all(accounts.map(async ({ userId, account }) => updateOrgKey(userId, account)));\n }\n\n // Override is necessary because default implementation assumes `stateVersion` at the root, but for this version\n // it is nested inside a global object.\n override async updateVersion(helper: MigrationHelper, direction: Direction): Promise {\n const endVersion = direction === \"up\" ? this.toVersion : this.fromVersion;\n helper.currentVersion = endVersion;\n const global: { stateVersion: number } = (await helper.get(\"global\")) || ({} as any);\n await helper.set(\"global\", { ...global, stateVersion: endVersion });\n }\n}\n","import { MigrationHelper } from \"../migration-helper\";\nimport { Direction, IRREVERSIBLE, Migrator } from \"../migrator\";\n\ntype ExpectedAccountType = { keys?: { legacyEtmKey?: string } };\n\nexport class RemoveLegacyEtmKeyMigrator extends Migrator<5, 6> {\n async migrate(helper: MigrationHelper): Promise {\n const accounts = await helper.getAccounts();\n\n async function updateAccount(userId: string, account: ExpectedAccountType) {\n if (account?.keys?.legacyEtmKey) {\n delete account.keys.legacyEtmKey;\n await helper.set(userId, account);\n }\n }\n\n await Promise.all(accounts.map(({ userId, account }) => updateAccount(userId, account)));\n }\n\n async rollback(helper: MigrationHelper): Promise {\n throw IRREVERSIBLE;\n }\n\n // Override is necessary because default implementation assumes `stateVersion` at the root, but for this version\n // it is nested inside a global object.\n override async updateVersion(helper: MigrationHelper, direction: Direction): Promise {\n const endVersion = direction === \"up\" ? this.toVersion : this.fromVersion;\n helper.currentVersion = endVersion;\n const global: { stateVersion: number } = (await helper.get(\"global\")) || ({} as any);\n await helper.set(\"global\", { ...global, stateVersion: endVersion });\n }\n}\n","import { MigrationHelper } from \"../migration-helper\";\nimport { Direction, IRREVERSIBLE, Migrator } from \"../migrator\";\n\ntype ExpectedAccountType = { settings?: { disableAutoBiometricsPrompt?: boolean } };\n\nexport class MoveBiometricAutoPromptToAccount extends Migrator<6, 7> {\n async migrate(helper: MigrationHelper): Promise {\n const global = await helper.get<{ noAutoPromptBiometrics?: boolean }>(\"global\");\n const noAutoPromptBiometrics = global?.noAutoPromptBiometrics ?? false;\n\n const accounts = await helper.getAccounts();\n async function updateAccount(userId: string, account: ExpectedAccountType) {\n if (account == null) {\n return;\n }\n\n if (noAutoPromptBiometrics) {\n account.settings = Object.assign(account?.settings ?? {}, {\n disableAutoBiometricsPrompt: true,\n });\n await helper.set(userId, account);\n }\n }\n\n delete global.noAutoPromptBiometrics;\n\n await Promise.all([\n ...accounts.map(({ userId, account }) => updateAccount(userId, account)),\n helper.set(\"global\", global),\n ]);\n }\n\n async rollback(helper: MigrationHelper): Promise {\n throw IRREVERSIBLE;\n }\n\n // Override is necessary because default implementation assumes `stateVersion` at the root, but for this version\n // it is nested inside a global object.\n override async updateVersion(helper: MigrationHelper, direction: Direction): Promise {\n const endVersion = direction === \"up\" ? this.toVersion : this.fromVersion;\n helper.currentVersion = endVersion;\n const global: { stateVersion: number } = (await helper.get(\"global\")) || ({} as any);\n await helper.set(\"global\", { ...global, stateVersion: endVersion });\n }\n}\n","import { JsonObject } from \"type-fest\";\n\nimport { MigrationHelper } from \"../migration-helper\";\nimport { Direction, Migrator } from \"../migrator\";\n\nexport class MoveStateVersionMigrator extends Migrator<7, 8> {\n async migrate(helper: MigrationHelper): Promise {\n const global = await helper.get<{ stateVersion: number }>(\"global\");\n if (global.stateVersion) {\n await helper.set(\"stateVersion\", global.stateVersion);\n delete global.stateVersion;\n await helper.set(\"global\", global);\n } else {\n throw new Error(\"Migration failed, state version not found\");\n }\n }\n\n async rollback(helper: MigrationHelper): Promise {\n const version = await helper.get(\"stateVersion\");\n const global = await helper.get(\"global\");\n await helper.set(\"global\", { ...global, stateVersion: version });\n await helper.set(\"stateVersion\", undefined);\n }\n\n // Override is necessary because default implementation assumes `stateVersion` at the root, but this migration moves\n // it from a `global` object to root.This makes for unique rollback versioning.\n override async updateVersion(helper: MigrationHelper, direction: Direction): Promise {\n const endVersion = direction === \"up\" ? this.toVersion : this.fromVersion;\n helper.currentVersion = endVersion;\n if (direction === \"up\") {\n await helper.set(\"stateVersion\", endVersion);\n } else {\n const global: { stateVersion: number } = (await helper.get(\"global\")) || ({} as any);\n await helper.set(\"global\", { ...global, stateVersion: endVersion });\n }\n }\n}\n","import { MigrationHelper } from \"../migration-helper\";\nimport { Migrator } from \"../migrator\";\n\ntype NeverDomains = { [id: string]: unknown };\n\ntype ExpectedAccountType = {\n settings?: {\n neverDomains?: NeverDomains;\n disableAddLoginNotification?: boolean;\n disableChangedPasswordNotification?: boolean;\n disableContextMenuItem?: boolean;\n };\n};\n\ntype TargetGlobalState = {\n neverDomains?: NeverDomains;\n disableAddLoginNotification?: boolean;\n disableChangedPasswordNotification?: boolean;\n disableContextMenuItem?: boolean;\n};\n\nexport class MoveBrowserSettingsToGlobal extends Migrator<8, 9> {\n // Will first check if any of the accounts have a value from the given accountSelector\n // if they do have a value it will set that value into global state but if multiple\n // users have differing values it will prefer the false setting,\n // if all users have true then it will take true.\n tryAddSetting(\n accounts: { userId: string; account: ExpectedAccountType }[],\n accountSelector: (account: ExpectedAccountType) => boolean | undefined,\n globalSetter: (value: boolean | undefined) => void,\n ): void {\n const hasValue = accounts.some(({ account }) => {\n return accountSelector(account) !== undefined;\n });\n\n if (hasValue) {\n const value = !accounts.some(({ account }) => {\n return (accountSelector(account) ?? false) === false;\n });\n\n globalSetter(value);\n }\n }\n\n async migrate(helper: MigrationHelper): Promise {\n const global = await helper.get(\"global\");\n\n const accounts = await helper.getAccounts();\n\n const globalNeverDomainsValue = accounts.reduce((accumulator, { account }) => {\n const normalizedNeverDomains = account.settings?.neverDomains ?? {};\n for (const [id, value] of Object.entries(normalizedNeverDomains)) {\n accumulator ??= {};\n accumulator[id] = value;\n }\n return accumulator;\n }, undefined as NeverDomains);\n\n const targetGlobalState: TargetGlobalState = {};\n\n if (globalNeverDomainsValue != null) {\n targetGlobalState.neverDomains = globalNeverDomainsValue;\n }\n\n this.tryAddSetting(\n accounts,\n (a) => a.settings?.disableAddLoginNotification,\n (v) => (targetGlobalState.disableAddLoginNotification = v),\n );\n\n this.tryAddSetting(\n accounts,\n (a) => a.settings?.disableChangedPasswordNotification,\n (v) => (targetGlobalState.disableChangedPasswordNotification = v),\n );\n\n this.tryAddSetting(\n accounts,\n (a) => a.settings?.disableContextMenuItem,\n (v) => (targetGlobalState.disableContextMenuItem = v),\n );\n\n await helper.set(\"global\", {\n ...global,\n ...targetGlobalState,\n });\n\n await Promise.all(\n accounts.map(async ({ userId, account }) => {\n delete account.settings?.disableAddLoginNotification;\n delete account.settings?.disableChangedPasswordNotification;\n delete account.settings?.disableContextMenuItem;\n delete account.settings?.neverDomains;\n await helper.set(userId, account);\n }),\n );\n }\n\n rollback(helper: MigrationHelper): Promise {\n throw new Error(\"Method not implemented.\");\n }\n}\n","import { MinVersion, MIN_VERSION } from \"../migrate\";\nimport { MigrationHelper } from \"../migration-helper\";\nimport { IRREVERSIBLE, Migrator } from \"../migrator\";\n\nexport function minVersionError(current: number) {\n return `Your local data is too old to be migrated. Your current state version is ${current}, but minimum version is ${MIN_VERSION}.`;\n}\n\nexport class MinVersionMigrator extends Migrator<0, MinVersion> {\n constructor() {\n super(0, MIN_VERSION);\n }\n\n // Overrides the default implementation to catch any version that may be passed in.\n override shouldMigrate(helper: MigrationHelper): Promise {\n return Promise.resolve(helper.currentVersion < MIN_VERSION);\n }\n async migrate(helper: MigrationHelper): Promise {\n if (helper.currentVersion < MIN_VERSION) {\n throw new Error(minVersionError(helper.currentVersion));\n }\n }\n async rollback(helper: MigrationHelper): Promise {\n throw IRREVERSIBLE;\n }\n}\n","// eslint-disable-next-line import/no-restricted-paths -- Needed to print log messages\nimport { LogService } from \"../platform/abstractions/log.service\";\n// eslint-disable-next-line import/no-restricted-paths -- Needed to interface with storage locations\nimport { AbstractStorageService } from \"../platform/abstractions/storage.service\";\n\nimport { MigrationBuilder } from \"./migration-builder\";\nimport { EverHadUserKeyMigrator } from \"./migrations/10-move-ever-had-user-key-to-state-providers\";\nimport { OrganizationKeyMigrator } from \"./migrations/11-move-org-keys-to-state-providers\";\nimport { MoveEnvironmentStateToProviders } from \"./migrations/12-move-environment-state-to-providers\";\nimport { ProviderKeyMigrator } from \"./migrations/13-move-provider-keys-to-state-providers\";\nimport { MoveBiometricClientKeyHalfToStateProviders } from \"./migrations/14-move-biometric-client-key-half-state-to-providers\";\nimport { FolderMigrator } from \"./migrations/15-move-folder-state-to-state-provider\";\nimport { LastSyncMigrator } from \"./migrations/16-move-last-sync-to-state-provider\";\nimport { EnablePasskeysMigrator } from \"./migrations/17-move-enable-passkeys-to-state-providers\";\nimport { AutofillSettingsKeyMigrator } from \"./migrations/18-move-autofill-settings-to-state-providers\";\nimport { RequirePasswordOnStartMigrator } from \"./migrations/19-migrate-require-password-on-start\";\nimport { PrivateKeyMigrator } from \"./migrations/20-move-private-key-to-state-providers\";\nimport { CollectionMigrator } from \"./migrations/21-move-collections-state-to-state-provider\";\nimport { CollapsedGroupingsMigrator } from \"./migrations/22-move-collapsed-groupings-to-state-provider\";\nimport { MoveBiometricPromptsToStateProviders } from \"./migrations/23-move-biometric-prompts-to-state-providers\";\nimport { SmOnboardingTasksMigrator } from \"./migrations/24-move-sm-onboarding-key-to-state-providers\";\nimport { ClearClipboardDelayMigrator } from \"./migrations/25-move-clear-clipboard-to-autofill-settings-state-provider\";\nimport { RevertLastSyncMigrator } from \"./migrations/26-revert-move-last-sync-to-state-provider\";\nimport { BadgeSettingsMigrator } from \"./migrations/27-move-badge-settings-to-state-providers\";\nimport { MoveBiometricUnlockToStateProviders } from \"./migrations/28-move-biometric-unlock-to-state-providers\";\nimport { UserNotificationSettingsKeyMigrator } from \"./migrations/29-move-user-notification-settings-to-state-provider\";\nimport { PolicyMigrator } from \"./migrations/30-move-policy-state-to-state-provider\";\nimport { EnableContextMenuMigrator } from \"./migrations/31-move-enable-context-menu-to-autofill-settings-state-provider\";\nimport { PreferredLanguageMigrator } from \"./migrations/32-move-preferred-language\";\nimport { AppIdMigrator } from \"./migrations/33-move-app-id-to-state-providers\";\nimport { DomainSettingsMigrator } from \"./migrations/34-move-domain-settings-to-state-providers\";\nimport { MoveThemeToStateProviderMigrator } from \"./migrations/35-move-theme-to-state-providers\";\nimport { VaultSettingsKeyMigrator } from \"./migrations/36-move-show-card-and-identity-to-state-provider\";\nimport { AvatarColorMigrator } from \"./migrations/37-move-avatar-color-to-state-providers\";\nimport { TokenServiceStateProviderMigrator } from \"./migrations/38-migrate-token-svc-to-state-provider\";\nimport { MoveBillingAccountProfileMigrator } from \"./migrations/39-move-billing-account-profile-to-state-providers\";\nimport { RemoveEverBeenUnlockedMigrator } from \"./migrations/4-remove-ever-been-unlocked\";\nimport { OrganizationMigrator } from \"./migrations/40-move-organization-state-to-state-provider\";\nimport { EventCollectionMigrator } from \"./migrations/41-move-event-collection-to-state-provider\";\nimport { EnableFaviconMigrator } from \"./migrations/42-move-enable-favicon-to-domain-settings-state-provider\";\nimport { AutoConfirmFingerPrintsMigrator } from \"./migrations/43-move-auto-confirm-finger-prints-to-state-provider\";\nimport { UserDecryptionOptionsMigrator } from \"./migrations/44-move-user-decryption-options-to-state-provider\";\nimport { MergeEnvironmentState } from \"./migrations/45-merge-environment-state\";\nimport { DeleteBiometricPromptCancelledData } from \"./migrations/46-delete-orphaned-biometric-prompt-data\";\nimport { MoveDesktopSettingsMigrator } from \"./migrations/47-move-desktop-settings\";\nimport { MoveDdgToStateProviderMigrator } from \"./migrations/48-move-ddg-to-state-provider\";\nimport { AddKeyTypeToOrgKeysMigrator } from \"./migrations/5-add-key-type-to-org-keys\";\nimport { RemoveLegacyEtmKeyMigrator } from \"./migrations/6-remove-legacy-etm-key\";\nimport { MoveBiometricAutoPromptToAccount } from \"./migrations/7-move-biometric-auto-prompt-to-account\";\nimport { MoveStateVersionMigrator } from \"./migrations/8-move-state-version\";\nimport { MoveBrowserSettingsToGlobal } from \"./migrations/9-move-browser-settings-to-global\";\nimport { MinVersionMigrator } from \"./migrations/min-version\";\n\nexport const MIN_VERSION = 3;\nexport const CURRENT_VERSION = 48;\n\nexport type MinVersion = typeof MIN_VERSION;\n\nexport function createMigrationBuilder() {\n return MigrationBuilder.create()\n .with(MinVersionMigrator)\n .with(RemoveEverBeenUnlockedMigrator, 3, 4)\n .with(AddKeyTypeToOrgKeysMigrator, 4, 5)\n .with(RemoveLegacyEtmKeyMigrator, 5, 6)\n .with(MoveBiometricAutoPromptToAccount, 6, 7)\n .with(MoveStateVersionMigrator, 7, 8)\n .with(MoveBrowserSettingsToGlobal, 8, 9)\n .with(EverHadUserKeyMigrator, 9, 10)\n .with(OrganizationKeyMigrator, 10, 11)\n .with(MoveEnvironmentStateToProviders, 11, 12)\n .with(ProviderKeyMigrator, 12, 13)\n .with(MoveBiometricClientKeyHalfToStateProviders, 13, 14)\n .with(FolderMigrator, 14, 15)\n .with(LastSyncMigrator, 15, 16)\n .with(EnablePasskeysMigrator, 16, 17)\n .with(AutofillSettingsKeyMigrator, 17, 18)\n .with(RequirePasswordOnStartMigrator, 18, 19)\n .with(PrivateKeyMigrator, 19, 20)\n .with(CollectionMigrator, 20, 21)\n .with(CollapsedGroupingsMigrator, 21, 22)\n .with(MoveBiometricPromptsToStateProviders, 22, 23)\n .with(SmOnboardingTasksMigrator, 23, 24)\n .with(ClearClipboardDelayMigrator, 24, 25)\n .with(RevertLastSyncMigrator, 25, 26)\n .with(BadgeSettingsMigrator, 26, 27)\n .with(MoveBiometricUnlockToStateProviders, 27, 28)\n .with(UserNotificationSettingsKeyMigrator, 28, 29)\n .with(PolicyMigrator, 29, 30)\n .with(EnableContextMenuMigrator, 30, 31)\n .with(PreferredLanguageMigrator, 31, 32)\n .with(AppIdMigrator, 32, 33)\n .with(DomainSettingsMigrator, 33, 34)\n .with(MoveThemeToStateProviderMigrator, 34, 35)\n .with(VaultSettingsKeyMigrator, 35, 36)\n .with(AvatarColorMigrator, 36, 37)\n .with(TokenServiceStateProviderMigrator, 37, 38)\n .with(MoveBillingAccountProfileMigrator, 38, 39)\n .with(OrganizationMigrator, 39, 40)\n .with(EventCollectionMigrator, 40, 41)\n .with(EnableFaviconMigrator, 41, 42)\n .with(AutoConfirmFingerPrintsMigrator, 42, 43)\n .with(UserDecryptionOptionsMigrator, 43, 44)\n .with(MergeEnvironmentState, 44, 45)\n .with(DeleteBiometricPromptCancelledData, 45, 46)\n .with(MoveDesktopSettingsMigrator, 46, 47)\n .with(MoveDdgToStateProviderMigrator, 47, CURRENT_VERSION);\n}\n\nexport async function currentVersion(\n storageService: AbstractStorageService,\n logService: LogService,\n) {\n let state = await storageService.get(\"stateVersion\");\n if (state == null) {\n // Pre v8\n state = (await storageService.get<{ stateVersion: number }>(\"global\"))?.stateVersion;\n }\n if (state == null) {\n logService.info(\"No state version found, assuming empty state.\");\n return -1;\n }\n logService.info(`State version: ${state}`);\n return state;\n}\n\n/**\n * Waits for migrations to have a chance to run and will resolve the promise once they are.\n *\n * @param storageService Disk storage where the `stateVersion` will or is already saved in.\n * @param logService Log service\n */\nexport async function waitForMigrations(\n storageService: AbstractStorageService,\n logService: LogService,\n) {\n const isReady = async () => {\n const version = await currentVersion(storageService, logService);\n // The saved version is what we consider the latest\n // migrations should be complete, the state version\n // shouldn't become larger than `CURRENT_VERSION` in\n // any normal usage of the application but it is common\n // enough in dev scenarios where we want to consider that\n // ready as well and return true in that scenario.\n return version >= CURRENT_VERSION;\n };\n\n const wait = async (time: number) => {\n // Wait exponentially\n const nextTime = time * 2;\n if (nextTime > 8192) {\n // Don't wait longer than ~8 seconds in a single wait,\n // if the migrations still haven't happened. They aren't\n // likely to.\n return;\n }\n return new Promise((resolve) => {\n setTimeout(async () => {\n if (!(await isReady())) {\n logService.info(`Waiting for migrations to finish, waiting for ${nextTime}ms`);\n await wait(nextTime);\n }\n resolve();\n }, time);\n });\n };\n\n if (!(await isReady())) {\n // Wait for 2ms to start with\n await wait(2);\n }\n}\n","import { createMigrationBuilder } from \"../../state-migrations\";\nimport { MigrationBuilder } from \"../../state-migrations/migration-builder\";\n\nexport class MigrationBuilderService {\n private migrationBuilderCache: MigrationBuilder;\n\n build() {\n return (this.migrationBuilderCache ??= createMigrationBuilder());\n }\n}\n","// eslint-disable-next-line import/no-restricted-paths -- Needed to print log messages\nimport { LogService } from \"../platform/abstractions/log.service\";\n// eslint-disable-next-line import/no-restricted-paths -- Needed to interface with storage locations\nimport { AbstractStorageService } from \"../platform/abstractions/storage.service\";\n\nexport type StateDefinitionLike = { name: string };\nexport type KeyDefinitionLike = {\n stateDefinition: StateDefinitionLike;\n key: string;\n};\n\nexport type MigrationHelperType = \"general\" | \"web-disk-local\";\n\nexport class MigrationHelper {\n constructor(\n public currentVersion: number,\n private storageService: AbstractStorageService,\n public logService: LogService,\n type: MigrationHelperType,\n ) {\n this.type = type;\n }\n\n /**\n * On some clients, migrations are ran multiple times without direct action from the migration writer.\n *\n * All clients will run through migrations at least once, this run is referred to as `\"general\"`. If a migration is\n * ran more than that single time, they will get a unique name if that the write can make conditional logic based on which\n * migration run this is.\n *\n * @remarks The preferrable way of writing migrations is ALWAYS to be defensive and reflect on the data you are given back. This\n * should really only be used when reflecting on the data given isn't enough.\n */\n type: MigrationHelperType;\n\n /**\n * Gets a value from the storage service at the given key.\n *\n * This is a brute force method to just get a value from the storage service. If you can use {@link getFromGlobal} or {@link getFromUser}, you should.\n * @param key location\n * @returns the value at the location\n */\n get(key: string): Promise {\n return this.storageService.get(key);\n }\n\n /**\n * Sets a value in the storage service at the given key.\n *\n * This is a brute force method to just set a value in the storage service. If you can use {@link setToGlobal} or {@link setToUser}, you should.\n * @param key location\n * @param value the value to set\n * @returns\n */\n set(key: string, value: T): Promise {\n this.logService.info(`Setting ${key}`);\n return this.storageService.save(key, value);\n }\n\n /**\n * Remove a value in the storage service at the given key.\n *\n * This is a brute force method to just remove a value in the storage service. If you can use {@link removeFromGlobal} or {@link removeFromUser}, you should.\n * @param key location\n * @returns void\n */\n remove(key: string): Promise {\n this.logService.info(`Removing ${key}`);\n return this.storageService.remove(key);\n }\n\n /**\n * Gets a globally scoped value from a location derived through the key definition\n *\n * This is for use with the state providers framework, DO NOT use for values stored with {@link StateService},\n * use {@link get} for those.\n * @param keyDefinition unique key definition\n * @returns value from store\n */\n getFromGlobal(keyDefinition: KeyDefinitionLike): Promise {\n return this.get(this.getGlobalKey(keyDefinition));\n }\n\n /**\n * Sets a globally scoped value to a location derived through the key definition\n *\n * This is for use with the state providers framework, DO NOT use for values stored with {@link StateService},\n * use {@link set} for those.\n * @param keyDefinition unique key definition\n * @param value value to store\n * @returns void\n */\n setToGlobal(keyDefinition: KeyDefinitionLike, value: T): Promise {\n return this.set(this.getGlobalKey(keyDefinition), value);\n }\n\n /**\n * Remove a globally scoped location derived through the key definition\n *\n * This is for use with the state providers framework, DO NOT use for values stored with {@link StateService},\n * use {@link remove} for those.\n * @param keyDefinition unique key definition\n * @returns void\n */\n removeFromGlobal(keyDefinition: KeyDefinitionLike): Promise {\n return this.remove(this.getGlobalKey(keyDefinition));\n }\n\n /**\n * Gets a user scoped value from a location derived through the user id and key definition\n *\n * This is for use with the state providers framework, DO NOT use for values stored with {@link StateService},\n * use {@link get} for those.\n * @param userId userId to use in the key\n * @param keyDefinition unique key definition\n * @returns value from store\n */\n getFromUser(userId: string, keyDefinition: KeyDefinitionLike): Promise {\n return this.get(this.getUserKey(userId, keyDefinition));\n }\n\n /**\n * Sets a user scoped value to a location derived through the user id and key definition\n *\n * This is for use with the state providers framework, DO NOT use for values stored with {@link StateService},\n * use {@link set} for those.\n * @param userId userId to use in the key\n * @param keyDefinition unique key definition\n * @param value value to store\n * @returns void\n */\n setToUser(userId: string, keyDefinition: KeyDefinitionLike, value: T): Promise {\n return this.set(this.getUserKey(userId, keyDefinition), value);\n }\n\n /**\n * Remove a user scoped location derived through the key definition\n *\n * This is for use with the state providers framework, DO NOT use for values stored with {@link StateService},\n * use {@link remove} for those.\n * @param keyDefinition unique key definition\n * @returns void\n */\n removeFromUser(userId: string, keyDefinition: KeyDefinitionLike): Promise {\n return this.remove(this.getUserKey(userId, keyDefinition));\n }\n\n info(message: string): void {\n this.logService.info(message);\n }\n\n /**\n * Helper method to read all Account objects stored by the State Service.\n *\n * This is useful from creating migrations off of this paradigm, but should not be used once a value is migrated to a state provider.\n *\n * @returns a list of all accounts that have been authenticated with state service, cast the the expected type.\n */\n async getAccounts(): Promise<\n { userId: string; account: ExpectedAccountType }[]\n > {\n const userIds = (await this.get(\"authenticatedAccounts\")) ?? [];\n return Promise.all(\n userIds.map(async (userId) => ({\n userId,\n account: await this.get(userId),\n })),\n );\n }\n\n /**\n * Builds a user storage key appropriate for the current version.\n *\n * @param userId userId to use in the key\n * @param keyDefinition state and key to use in the key\n * @returns\n */\n private getUserKey(userId: string, keyDefinition: KeyDefinitionLike): string {\n if (this.currentVersion < 9) {\n return userKeyBuilderPre9();\n } else {\n return userKeyBuilder(userId, keyDefinition);\n }\n }\n\n /**\n * Builds a global storage key appropriate for the current version.\n *\n * @param keyDefinition state and key to use in the key\n * @returns\n */\n private getGlobalKey(keyDefinition: KeyDefinitionLike): string {\n if (this.currentVersion < 9) {\n return globalKeyBuilderPre9();\n } else {\n return globalKeyBuilder(keyDefinition);\n }\n }\n}\n\n/**\n * When this is updated, rename this function to `userKeyBuilderXToY` where `X` is the version number it\n * became relevant, and `Y` prior to the version it was updated.\n *\n * Be sure to update the map in `MigrationHelper` to point to the appropriate function for the current version.\n * @param userId The userId of the user you want the key to be for.\n * @param keyDefinition the key definition of which data the key should point to.\n * @returns\n */\nfunction userKeyBuilder(userId: string, keyDefinition: KeyDefinitionLike): string {\n return `user_${userId}_${keyDefinition.stateDefinition.name}_${keyDefinition.key}`;\n}\n\nfunction userKeyBuilderPre9(): string {\n throw Error(\"No key builder should be used for versions prior to 9.\");\n}\n\n/**\n * When this is updated, rename this function to `globalKeyBuilderXToY` where `X` is the version number\n * it became relevant, and `Y` prior to the version it was updated.\n *\n * Be sure to update the map in `MigrationHelper` to point to the appropriate function for the current version.\n * @param keyDefinition the key definition of which data the key should point to.\n * @returns\n */\nfunction globalKeyBuilder(keyDefinition: KeyDefinitionLike): string {\n return `global_${keyDefinition.stateDefinition.name}_${keyDefinition.key}`;\n}\n\nfunction globalKeyBuilderPre9(): string {\n throw Error(\"No key builder should be used for versions prior to 9.\");\n}\n","import { waitForMigrations } from \"../../state-migrations\";\nimport { CURRENT_VERSION, currentVersion } from \"../../state-migrations/migrate\";\nimport { MigrationHelper } from \"../../state-migrations/migration-helper\";\nimport { LogService } from \"../abstractions/log.service\";\nimport { AbstractStorageService } from \"../abstractions/storage.service\";\n\nimport { MigrationBuilderService } from \"./migration-builder.service\";\n\nexport class MigrationRunner {\n constructor(\n protected diskStorage: AbstractStorageService,\n protected logService: LogService,\n protected migrationBuilderService: MigrationBuilderService,\n ) {}\n\n async run(): Promise {\n const migrationHelper = new MigrationHelper(\n await currentVersion(this.diskStorage, this.logService),\n this.diskStorage,\n this.logService,\n \"general\",\n );\n\n if (migrationHelper.currentVersion < 0) {\n // Cannot determine state, assuming empty so we don't repeatedly apply a migration.\n await this.diskStorage.save(\"stateVersion\", CURRENT_VERSION);\n return;\n }\n\n const migrationBuilder = this.migrationBuilderService.build();\n\n await migrationBuilder.migrate(migrationHelper);\n }\n\n async waitForCompletion(): Promise {\n await waitForMigrations(this.diskStorage, this.logService);\n }\n}\n","import { SendFileApi } from \"../api/send-file.api\";\n\nexport class SendFileData {\n id: string;\n fileName: string;\n size: string;\n sizeName: string;\n\n constructor(data?: SendFileApi) {\n if (data == null) {\n return;\n }\n\n this.id = data.id;\n this.fileName = data.fileName;\n this.size = data.size;\n this.sizeName = data.sizeName;\n }\n}\n","import { SendTextApi } from \"../api/send-text.api\";\n\nexport class SendTextData {\n text: string;\n hidden: boolean;\n\n constructor(data?: SendTextApi) {\n if (data == null) {\n return;\n }\n\n this.text = data.text;\n this.hidden = data.hidden;\n }\n}\n","import { SendType } from \"../../enums/send-type\";\nimport { SendResponse } from \"../response/send.response\";\n\nimport { SendFileData } from \"./send-file.data\";\nimport { SendTextData } from \"./send-text.data\";\n\nexport class SendData {\n id: string;\n accessId: string;\n type: SendType;\n name: string;\n notes: string;\n file: SendFileData;\n text: SendTextData;\n key: string;\n maxAccessCount?: number;\n accessCount: number;\n revisionDate: string;\n expirationDate: string;\n deletionDate: string;\n password: string;\n disabled: boolean;\n hideEmail: boolean;\n\n constructor(response?: SendResponse) {\n if (response == null) {\n return;\n }\n\n this.id = response.id;\n this.accessId = response.accessId;\n this.type = response.type;\n this.name = response.name;\n this.notes = response.notes;\n this.key = response.key;\n this.maxAccessCount = response.maxAccessCount;\n this.accessCount = response.accessCount;\n this.revisionDate = response.revisionDate;\n this.expirationDate = response.expirationDate;\n this.deletionDate = response.deletionDate;\n this.password = response.password;\n this.disabled = response.disable;\n this.hideEmail = response.hideEmail;\n\n switch (this.type) {\n case SendType.Text:\n this.text = new SendTextData(response.text);\n break;\n case SendType.File:\n this.file = new SendFileData(response.file);\n break;\n default:\n break;\n }\n }\n}\n","import { Jsonify } from \"type-fest\";\n\nimport { Account } from \"./account\";\nimport { GlobalState } from \"./global-state\";\n\nexport class State<\n TGlobalState extends GlobalState = GlobalState,\n TAccount extends Account = Account,\n> {\n accounts: { [userId: string]: TAccount } = {};\n globals: TGlobalState;\n activeUserId: string;\n authenticatedAccounts: string[] = [];\n accountActivity: { [userId: string]: number } = {};\n\n constructor(globals: TGlobalState) {\n this.globals = globals;\n }\n\n // TODO, make Jsonify work. It currently doesn't because Globals doesn't implement Jsonify.\n static fromJSON(\n obj: any,\n accountDeserializer: (json: Jsonify) => TAccount,\n ): State {\n if (obj == null) {\n return null;\n }\n\n return Object.assign(new State(null), obj, {\n accounts: State.buildAccountMapFromJSON(obj?.accounts, accountDeserializer),\n });\n }\n\n private static buildAccountMapFromJSON(\n jsonAccounts: { [userId: string]: Jsonify },\n accountDeserializer: (json: Jsonify) => TAccount,\n ) {\n if (!jsonAccounts) {\n return {};\n }\n const accounts: { [userId: string]: TAccount } = {};\n for (const userId in jsonAccounts) {\n accounts[userId] = accountDeserializer(jsonAccounts[userId]);\n }\n return accounts;\n }\n}\n","import { BehaviorSubject, Observable, map } from \"rxjs\";\nimport { Jsonify, JsonValue } from \"type-fest\";\n\nimport { AccountService } from \"../../auth/abstractions/account.service\";\nimport { TokenService } from \"../../auth/abstractions/token.service\";\nimport { AuthenticationStatus } from \"../../auth/enums/authentication-status\";\nimport { AdminAuthRequestStorable } from \"../../auth/models/domain/admin-auth-req-storable\";\nimport { ForceSetPasswordReason } from \"../../auth/models/domain/force-set-password-reason\";\nimport { KdfConfig } from \"../../auth/models/domain/kdf-config\";\nimport { BiometricKey } from \"../../auth/types/biometric-key\";\nimport { GeneratorOptions } from \"../../tools/generator/generator-options\";\nimport { GeneratedPasswordHistory, PasswordGeneratorOptions } from \"../../tools/generator/password\";\nimport { UsernameGeneratorOptions } from \"../../tools/generator/username\";\nimport { SendData } from \"../../tools/send/models/data/send.data\";\nimport { SendView } from \"../../tools/send/models/view/send.view\";\nimport { UserId } from \"../../types/guid\";\nimport { DeviceKey, MasterKey } from \"../../types/key\";\nimport { CipherData } from \"../../vault/models/data/cipher.data\";\nimport { LocalData } from \"../../vault/models/data/local.data\";\nimport { CipherView } from \"../../vault/models/view/cipher.view\";\nimport { AddEditCipherInfo } from \"../../vault/types/add-edit-cipher-info\";\nimport { EnvironmentService } from \"../abstractions/environment.service\";\nimport { LogService } from \"../abstractions/log.service\";\nimport {\n InitOptions,\n StateService as StateServiceAbstraction,\n} from \"../abstractions/state.service\";\nimport {\n AbstractMemoryStorageService,\n AbstractStorageService,\n} from \"../abstractions/storage.service\";\nimport { HtmlStorageLocation, KdfType, StorageLocation } from \"../enums\";\nimport { StateFactory } from \"../factories/state-factory\";\nimport { Utils } from \"../misc/utils\";\nimport { ServerConfigData } from \"../models/data/server-config.data\";\nimport { Account, AccountData, AccountSettings } from \"../models/domain/account\";\nimport { EncString } from \"../models/domain/enc-string\";\nimport { GlobalState } from \"../models/domain/global-state\";\nimport { State } from \"../models/domain/state\";\nimport { StorageOptions } from \"../models/domain/storage-options\";\nimport { SymmetricCryptoKey } from \"../models/domain/symmetric-crypto-key\";\n\nimport { MigrationRunner } from \"./migration-runner\";\n\nconst keys = {\n state: \"state\",\n stateVersion: \"stateVersion\",\n global: \"global\",\n authenticatedAccounts: \"authenticatedAccounts\",\n activeUserId: \"activeUserId\",\n tempAccountSettings: \"tempAccountSettings\", // used to hold account specific settings (i.e clear clipboard) between initial migration and first account authentication\n accountActivity: \"accountActivity\",\n};\n\nconst partialKeys = {\n userAutoKey: \"_user_auto\",\n userBiometricKey: \"_user_biometric\",\n\n autoKey: \"_masterkey_auto\",\n biometricKey: \"_masterkey_biometric\",\n masterKey: \"_masterkey\",\n};\n\nconst DDG_SHARED_KEY = \"DuckDuckGoSharedKey\";\n\nexport class StateService<\n TGlobalState extends GlobalState = GlobalState,\n TAccount extends Account = Account,\n> implements StateServiceAbstraction\n{\n protected accountsSubject = new BehaviorSubject<{ [userId: string]: TAccount }>({});\n accounts$ = this.accountsSubject.asObservable();\n\n protected activeAccountSubject = new BehaviorSubject(null);\n activeAccount$ = this.activeAccountSubject.asObservable();\n\n activeAccountUnlocked$: Observable;\n\n private hasBeenInited = false;\n protected isRecoveredSession = false;\n\n protected accountDiskCache = new BehaviorSubject>({});\n\n // default account serializer, must be overridden by child class\n protected accountDeserializer = Account.fromJSON as (json: Jsonify) => TAccount;\n\n constructor(\n protected storageService: AbstractStorageService,\n protected secureStorageService: AbstractStorageService,\n protected memoryStorageService: AbstractMemoryStorageService,\n protected logService: LogService,\n protected stateFactory: StateFactory,\n protected accountService: AccountService,\n protected environmentService: EnvironmentService,\n protected tokenService: TokenService,\n private migrationRunner: MigrationRunner,\n protected useAccountCache: boolean = true,\n ) {\n this.activeAccountUnlocked$ = this.accountService.activeAccount$.pipe(\n map((a) => {\n return a?.status === AuthenticationStatus.Unlocked;\n }),\n );\n }\n\n async init(initOptions: InitOptions = {}): Promise {\n // Deconstruct and apply defaults\n const { runMigrations = true } = initOptions;\n if (this.hasBeenInited) {\n return;\n }\n\n if (runMigrations) {\n await this.migrationRunner.run();\n } else {\n // It may have been requested to not run the migrations but we should defensively not\n // continue this method until migrations have a chance to be completed elsewhere.\n await this.migrationRunner.waitForCompletion();\n }\n\n await this.state().then(async (state) => {\n if (state == null) {\n await this.setState(new State(this.createGlobals()));\n } else {\n this.isRecoveredSession = true;\n }\n });\n await this.initAccountState();\n\n this.hasBeenInited = true;\n }\n\n async initAccountState() {\n if (this.isRecoveredSession) {\n return;\n }\n\n await this.updateState(async (state) => {\n state.authenticatedAccounts =\n (await this.storageService.get(keys.authenticatedAccounts)) ?? [];\n for (const i in state.authenticatedAccounts) {\n if (i != null) {\n state = await this.syncAccountFromDisk(state.authenticatedAccounts[i]);\n }\n }\n const storedActiveUser = await this.storageService.get(keys.activeUserId);\n if (storedActiveUser != null) {\n state.activeUserId = storedActiveUser;\n }\n await this.pushAccounts();\n this.activeAccountSubject.next(state.activeUserId);\n // TODO: Temporary update to avoid routing all account status changes through account service for now.\n // account service tracks logged out accounts, but State service does not, so we need to add the active account\n // if it's not in the accounts list.\n if (state.activeUserId != null && this.accountsSubject.value[state.activeUserId] == null) {\n const activeDiskAccount = await this.getAccountFromDisk({ userId: state.activeUserId });\n await this.accountService.addAccount(state.activeUserId as UserId, {\n name: activeDiskAccount.profile.name,\n email: activeDiskAccount.profile.email,\n status: AuthenticationStatus.LoggedOut,\n });\n }\n await this.accountService.switchAccount(state.activeUserId as UserId);\n // End TODO\n\n return state;\n });\n }\n\n async syncAccountFromDisk(userId: string): Promise> {\n if (userId == null) {\n return;\n }\n const diskAccount = await this.getAccountFromDisk({ userId: userId });\n const state = await this.updateState(async (state) => {\n if (state.accounts == null) {\n state.accounts = {};\n }\n state.accounts[userId] = this.createAccount();\n state.accounts[userId].profile = diskAccount.profile;\n return state;\n });\n\n // TODO: Temporary update to avoid routing all account status changes through account service for now.\n // The determination of state should be handled by the various services that control those values.\n const token = await this.tokenService.getAccessToken(userId as UserId);\n const autoKey = await this.getUserKeyAutoUnlock({ userId: userId });\n const accountStatus =\n token == null\n ? AuthenticationStatus.LoggedOut\n : autoKey == null\n ? AuthenticationStatus.Locked\n : AuthenticationStatus.Unlocked;\n await this.accountService.addAccount(userId as UserId, {\n status: accountStatus,\n name: diskAccount.profile.name,\n email: diskAccount.profile.email,\n });\n\n return state;\n }\n\n async addAccount(account: TAccount) {\n await this.environmentService.seedUserEnvironment(account.profile.userId as UserId);\n await this.updateState(async (state) => {\n state.authenticatedAccounts.push(account.profile.userId);\n await this.storageService.save(keys.authenticatedAccounts, state.authenticatedAccounts);\n state.accounts[account.profile.userId] = account;\n return state;\n });\n await this.scaffoldNewAccountStorage(account);\n await this.setLastActive(new Date().getTime(), { userId: account.profile.userId });\n // TODO: Temporary update to avoid routing all account status changes through account service for now.\n await this.accountService.addAccount(account.profile.userId as UserId, {\n status: AuthenticationStatus.Locked,\n name: account.profile.name,\n email: account.profile.email,\n });\n await this.setActiveUser(account.profile.userId);\n }\n\n async setActiveUser(userId: string): Promise {\n await this.clearDecryptedDataForActiveUser();\n await this.updateState(async (state) => {\n state.activeUserId = userId;\n await this.storageService.save(keys.activeUserId, userId);\n this.activeAccountSubject.next(state.activeUserId);\n // TODO: temporary update to avoid routing all account status changes through account service for now.\n await this.accountService.switchAccount(userId as UserId);\n\n return state;\n });\n\n await this.pushAccounts();\n }\n\n async clean(options?: StorageOptions): Promise {\n options = this.reconcileOptions(options, await this.defaultInMemoryOptions());\n await this.deAuthenticateAccount(options.userId);\n let currentUser = (await this.state())?.activeUserId;\n if (options.userId === currentUser) {\n currentUser = await this.dynamicallySetActiveUser();\n }\n\n await this.removeAccountFromDisk(options?.userId);\n await this.removeAccountFromMemory(options?.userId);\n await this.pushAccounts();\n return currentUser as UserId;\n }\n\n async getAddEditCipherInfo(options?: StorageOptions): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultInMemoryOptions()),\n );\n // ensure prototype on cipher\n const raw = account?.data?.addEditCipherInfo;\n return raw == null\n ? null\n : {\n cipher:\n raw?.cipher.toJSON != null\n ? raw.cipher\n : CipherView.fromJSON(raw?.cipher as Jsonify),\n collectionIds: raw?.collectionIds,\n };\n }\n\n async setAddEditCipherInfo(value: AddEditCipherInfo, options?: StorageOptions): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultInMemoryOptions()),\n );\n account.data.addEditCipherInfo = value;\n await this.saveAccount(\n account,\n this.reconcileOptions(options, await this.defaultInMemoryOptions()),\n );\n }\n\n async getBiometricFingerprintValidated(options?: StorageOptions): Promise {\n return (\n (await this.getGlobals(this.reconcileOptions(options, await this.defaultOnDiskOptions())))\n ?.biometricFingerprintValidated ?? false\n );\n }\n\n async setBiometricFingerprintValidated(value: boolean, options?: StorageOptions): Promise {\n const globals = await this.getGlobals(\n this.reconcileOptions(options, await this.defaultOnDiskOptions()),\n );\n globals.biometricFingerprintValidated = value;\n await this.saveGlobals(\n globals,\n this.reconcileOptions(options, await this.defaultOnDiskOptions()),\n );\n }\n\n async getConvertAccountToKeyConnector(options?: StorageOptions): Promise {\n return (\n await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskOptions()))\n )?.profile?.convertAccountToKeyConnector;\n }\n\n async setConvertAccountToKeyConnector(value: boolean, options?: StorageOptions): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultOnDiskOptions()),\n );\n account.profile.convertAccountToKeyConnector = value;\n await this.saveAccount(\n account,\n this.reconcileOptions(options, await this.defaultOnDiskOptions()),\n );\n }\n\n /**\n * @deprecated Do not save the Master Key. Use the User Symmetric Key instead\n */\n async getCryptoMasterKey(options?: StorageOptions): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultInMemoryOptions()),\n );\n return account?.keys?.cryptoMasterKey;\n }\n\n /**\n * User's master key derived from MP, saved only if we decrypted with MP\n */\n async getMasterKey(options?: StorageOptions): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultInMemoryOptions()),\n );\n return account?.keys?.masterKey;\n }\n\n /**\n * User's master key derived from MP, saved only if we decrypted with MP\n */\n async setMasterKey(value: MasterKey, options?: StorageOptions): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultInMemoryOptions()),\n );\n account.keys.masterKey = value;\n await this.saveAccount(\n account,\n this.reconcileOptions(options, await this.defaultInMemoryOptions()),\n );\n }\n\n /**\n * The master key encrypted User symmetric key, saved on every auth\n * so we can unlock with MP offline\n */\n async getMasterKeyEncryptedUserKey(options?: StorageOptions): Promise {\n return (\n await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskOptions()))\n )?.keys.masterKeyEncryptedUserKey;\n }\n\n /**\n * The master key encrypted User symmetric key, saved on every auth\n * so we can unlock with MP offline\n */\n async setMasterKeyEncryptedUserKey(value: string, options?: StorageOptions): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultOnDiskOptions()),\n );\n account.keys.masterKeyEncryptedUserKey = value;\n await this.saveAccount(\n account,\n this.reconcileOptions(options, await this.defaultOnDiskOptions()),\n );\n }\n\n /**\n * user key when using the \"never\" option of vault timeout\n */\n async getUserKeyAutoUnlock(options?: StorageOptions): Promise {\n options = this.reconcileOptions(\n this.reconcileOptions(options, { keySuffix: \"auto\" }),\n await this.defaultSecureStorageOptions(),\n );\n if (options?.userId == null) {\n return null;\n }\n return await this.secureStorageService.get(\n `${options.userId}${partialKeys.userAutoKey}`,\n options,\n );\n }\n\n /**\n * user key when using the \"never\" option of vault timeout\n */\n async setUserKeyAutoUnlock(value: string, options?: StorageOptions): Promise {\n options = this.reconcileOptions(\n this.reconcileOptions(options, { keySuffix: \"auto\" }),\n await this.defaultSecureStorageOptions(),\n );\n if (options?.userId == null) {\n return;\n }\n await this.saveSecureStorageKey(partialKeys.userAutoKey, value, options);\n }\n\n /**\n * User's encrypted symmetric key when using biometrics\n */\n async getUserKeyBiometric(options?: StorageOptions): Promise {\n options = this.reconcileOptions(\n this.reconcileOptions(options, { keySuffix: \"biometric\" }),\n await this.defaultSecureStorageOptions(),\n );\n if (options?.userId == null) {\n return null;\n }\n return await this.secureStorageService.get(\n `${options.userId}${partialKeys.userBiometricKey}`,\n options,\n );\n }\n\n async hasUserKeyBiometric(options?: StorageOptions): Promise {\n options = this.reconcileOptions(\n this.reconcileOptions(options, { keySuffix: \"biometric\" }),\n await this.defaultSecureStorageOptions(),\n );\n if (options?.userId == null) {\n return false;\n }\n return await this.secureStorageService.has(\n `${options.userId}${partialKeys.userBiometricKey}`,\n options,\n );\n }\n\n async setUserKeyBiometric(value: BiometricKey, options?: StorageOptions): Promise {\n options = this.reconcileOptions(\n this.reconcileOptions(options, { keySuffix: \"biometric\" }),\n await this.defaultSecureStorageOptions(),\n );\n if (options?.userId == null) {\n return;\n }\n await this.saveSecureStorageKey(partialKeys.userBiometricKey, value, options);\n }\n\n async getPinKeyEncryptedUserKey(options?: StorageOptions): Promise {\n return EncString.fromJSON(\n (await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskOptions())))\n ?.settings?.pinKeyEncryptedUserKey,\n );\n }\n\n async setPinKeyEncryptedUserKey(value: EncString, options?: StorageOptions): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultOnDiskOptions()),\n );\n account.settings.pinKeyEncryptedUserKey = value?.encryptedString;\n await this.saveAccount(\n account,\n this.reconcileOptions(options, await this.defaultOnDiskOptions()),\n );\n }\n\n async getPinKeyEncryptedUserKeyEphemeral(options?: StorageOptions): Promise {\n return EncString.fromJSON(\n (await this.getAccount(this.reconcileOptions(options, await this.defaultInMemoryOptions())))\n ?.settings?.pinKeyEncryptedUserKeyEphemeral,\n );\n }\n\n async setPinKeyEncryptedUserKeyEphemeral(\n value: EncString,\n options?: StorageOptions,\n ): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultInMemoryOptions()),\n );\n account.settings.pinKeyEncryptedUserKeyEphemeral = value?.encryptedString;\n await this.saveAccount(\n account,\n this.reconcileOptions(options, await this.defaultInMemoryOptions()),\n );\n }\n\n /**\n * @deprecated Use UserKeyAuto instead\n */\n async getCryptoMasterKeyAuto(options?: StorageOptions): Promise {\n options = this.reconcileOptions(\n this.reconcileOptions(options, { keySuffix: \"auto\" }),\n await this.defaultSecureStorageOptions(),\n );\n if (options?.userId == null) {\n return null;\n }\n return await this.secureStorageService.get(\n `${options.userId}${partialKeys.autoKey}`,\n options,\n );\n }\n\n /**\n * @deprecated Use UserKeyAuto instead\n */\n async setCryptoMasterKeyAuto(value: string, options?: StorageOptions): Promise {\n options = this.reconcileOptions(\n this.reconcileOptions(options, { keySuffix: \"auto\" }),\n await this.defaultSecureStorageOptions(),\n );\n if (options?.userId == null) {\n return;\n }\n await this.saveSecureStorageKey(partialKeys.autoKey, value, options);\n }\n\n /**\n * @deprecated I don't see where this is even used\n */\n async getCryptoMasterKeyB64(options?: StorageOptions): Promise {\n options = this.reconcileOptions(options, await this.defaultSecureStorageOptions());\n if (options?.userId == null) {\n return null;\n }\n return await this.secureStorageService.get(\n `${options?.userId}${partialKeys.masterKey}`,\n options,\n );\n }\n\n /**\n * @deprecated I don't see where this is even used\n */\n async setCryptoMasterKeyB64(value: string, options?: StorageOptions): Promise {\n options = this.reconcileOptions(options, await this.defaultSecureStorageOptions());\n if (options?.userId == null) {\n return;\n }\n await this.saveSecureStorageKey(partialKeys.masterKey, value, options);\n }\n\n /**\n * @deprecated Use UserKeyBiometric instead\n */\n async getCryptoMasterKeyBiometric(options?: StorageOptions): Promise {\n options = this.reconcileOptions(\n this.reconcileOptions(options, { keySuffix: \"biometric\" }),\n await this.defaultSecureStorageOptions(),\n );\n if (options?.userId == null) {\n return null;\n }\n return await this.secureStorageService.get(\n `${options.userId}${partialKeys.biometricKey}`,\n options,\n );\n }\n\n /**\n * @deprecated Use UserKeyBiometric instead\n */\n async hasCryptoMasterKeyBiometric(options?: StorageOptions): Promise {\n options = this.reconcileOptions(\n this.reconcileOptions(options, { keySuffix: \"biometric\" }),\n await this.defaultSecureStorageOptions(),\n );\n if (options?.userId == null) {\n return false;\n }\n return await this.secureStorageService.has(\n `${options.userId}${partialKeys.biometricKey}`,\n options,\n );\n }\n\n /**\n * @deprecated Use UserKeyBiometric instead\n */\n async setCryptoMasterKeyBiometric(value: BiometricKey, options?: StorageOptions): Promise {\n options = this.reconcileOptions(\n this.reconcileOptions(options, { keySuffix: \"biometric\" }),\n await this.defaultSecureStorageOptions(),\n );\n if (options?.userId == null) {\n return;\n }\n await this.saveSecureStorageKey(partialKeys.biometricKey, value, options);\n }\n\n @withPrototypeForArrayMembers(CipherView, CipherView.fromJSON)\n async getDecryptedCiphers(options?: StorageOptions): Promise {\n return (\n await this.getAccount(this.reconcileOptions(options, await this.defaultInMemoryOptions()))\n )?.data?.ciphers?.decrypted;\n }\n\n async setDecryptedCiphers(value: CipherView[], options?: StorageOptions): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultInMemoryOptions()),\n );\n account.data.ciphers.decrypted = value;\n await this.saveAccount(\n account,\n this.reconcileOptions(options, await this.defaultInMemoryOptions()),\n );\n }\n\n @withPrototypeForArrayMembers(GeneratedPasswordHistory)\n async getDecryptedPasswordGenerationHistory(\n options?: StorageOptions,\n ): Promise {\n return (\n await this.getAccount(this.reconcileOptions(options, await this.defaultInMemoryOptions()))\n )?.data?.passwordGenerationHistory?.decrypted;\n }\n\n async setDecryptedPasswordGenerationHistory(\n value: GeneratedPasswordHistory[],\n options?: StorageOptions,\n ): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultInMemoryOptions()),\n );\n account.data.passwordGenerationHistory.decrypted = value;\n await this.saveAccount(\n account,\n this.reconcileOptions(options, await this.defaultInMemoryOptions()),\n );\n }\n\n /**\n * @deprecated Use getPinKeyEncryptedUserKeyEphemeral instead\n */\n async getDecryptedPinProtected(options?: StorageOptions): Promise {\n return (\n await this.getAccount(this.reconcileOptions(options, await this.defaultInMemoryOptions()))\n )?.settings?.pinProtected?.decrypted;\n }\n\n /**\n * @deprecated Use setPinKeyEncryptedUserKeyEphemeral instead\n */\n async setDecryptedPinProtected(value: EncString, options?: StorageOptions): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultInMemoryOptions()),\n );\n account.settings.pinProtected.decrypted = value;\n await this.saveAccount(\n account,\n this.reconcileOptions(options, await this.defaultInMemoryOptions()),\n );\n }\n\n @withPrototypeForArrayMembers(SendView)\n async getDecryptedSends(options?: StorageOptions): Promise {\n return (\n await this.getAccount(this.reconcileOptions(options, await this.defaultInMemoryOptions()))\n )?.data?.sends?.decrypted;\n }\n\n async setDecryptedSends(value: SendView[], options?: StorageOptions): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultInMemoryOptions()),\n );\n account.data.sends.decrypted = value;\n await this.saveAccount(\n account,\n this.reconcileOptions(options, await this.defaultInMemoryOptions()),\n );\n }\n\n async getDisableGa(options?: StorageOptions): Promise {\n return (\n (await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskOptions())))\n ?.settings?.disableGa ?? false\n );\n }\n\n async setDisableGa(value: boolean, options?: StorageOptions): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultOnDiskOptions()),\n );\n account.settings.disableGa = value;\n await this.saveAccount(\n account,\n this.reconcileOptions(options, await this.defaultOnDiskOptions()),\n );\n }\n\n async getDuckDuckGoSharedKey(options?: StorageOptions): Promise {\n options = this.reconcileOptions(options, await this.defaultSecureStorageOptions());\n if (options?.userId == null) {\n return null;\n }\n return await this.secureStorageService.get(DDG_SHARED_KEY, options);\n }\n\n async setDuckDuckGoSharedKey(value: string, options?: StorageOptions): Promise {\n options = this.reconcileOptions(options, await this.defaultSecureStorageOptions());\n if (options?.userId == null) {\n return;\n }\n value == null\n ? await this.secureStorageService.remove(DDG_SHARED_KEY, options)\n : await this.secureStorageService.save(DDG_SHARED_KEY, value, options);\n }\n\n async getDeviceKey(options?: StorageOptions): Promise {\n options = this.reconcileOptions(options, await this.defaultOnDiskLocalOptions());\n\n if (options?.userId == null) {\n return null;\n }\n\n const account = await this.getAccount(options);\n\n const existingDeviceKey = account?.keys?.deviceKey;\n\n // Must manually instantiate the SymmetricCryptoKey class from the JSON object\n if (existingDeviceKey != null) {\n return SymmetricCryptoKey.fromJSON(existingDeviceKey) as DeviceKey;\n } else {\n return null;\n }\n }\n\n async setDeviceKey(value: DeviceKey | null, options?: StorageOptions): Promise {\n options = this.reconcileOptions(options, await this.defaultOnDiskLocalOptions());\n\n if (options?.userId == null) {\n return;\n }\n\n const account = await this.getAccount(options);\n\n account.keys.deviceKey = value?.toJSON() ?? null;\n\n await this.saveAccount(account, options);\n }\n\n async getAdminAuthRequest(options?: StorageOptions): Promise {\n options = this.reconcileOptions(options, await this.defaultOnDiskLocalOptions());\n\n if (options?.userId == null) {\n return null;\n }\n\n const account = await this.getAccount(options);\n\n return account?.adminAuthRequest\n ? AdminAuthRequestStorable.fromJSON(account.adminAuthRequest)\n : null;\n }\n\n async setAdminAuthRequest(\n adminAuthRequest: AdminAuthRequestStorable,\n options?: StorageOptions,\n ): Promise {\n options = this.reconcileOptions(options, await this.defaultOnDiskLocalOptions());\n\n if (options?.userId == null) {\n return;\n }\n\n const account = await this.getAccount(options);\n\n account.adminAuthRequest = adminAuthRequest?.toJSON();\n\n await this.saveAccount(account, options);\n }\n\n async getShouldTrustDevice(options?: StorageOptions): Promise {\n options = this.reconcileOptions(options, await this.defaultOnDiskLocalOptions());\n\n if (options?.userId == null) {\n return null;\n }\n\n const account = await this.getAccount(options);\n\n return account?.settings?.trustDeviceChoiceForDecryption ?? null;\n }\n\n async setShouldTrustDevice(value: boolean, options?: StorageOptions): Promise {\n options = this.reconcileOptions(options, await this.defaultOnDiskLocalOptions());\n if (options?.userId == null) {\n return;\n }\n\n const account = await this.getAccount(options);\n\n account.settings.trustDeviceChoiceForDecryption = value;\n\n await this.saveAccount(account, options);\n }\n\n async getEmail(options?: StorageOptions): Promise {\n return (\n await this.getAccount(this.reconcileOptions(options, await this.defaultInMemoryOptions()))\n )?.profile?.email;\n }\n\n async setEmail(value: string, options?: StorageOptions): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultInMemoryOptions()),\n );\n account.profile.email = value;\n await this.saveAccount(\n account,\n this.reconcileOptions(options, await this.defaultInMemoryOptions()),\n );\n }\n\n async getEmailVerified(options?: StorageOptions): Promise {\n return (\n (await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskOptions())))\n ?.profile.emailVerified ?? false\n );\n }\n\n async setEmailVerified(value: boolean, options?: StorageOptions): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultOnDiskOptions()),\n );\n account.profile.emailVerified = value;\n await this.saveAccount(\n account,\n this.reconcileOptions(options, await this.defaultOnDiskOptions()),\n );\n }\n\n async getEnableBrowserIntegration(options?: StorageOptions): Promise {\n return (\n (await this.getGlobals(this.reconcileOptions(options, await this.defaultOnDiskOptions())))\n ?.enableBrowserIntegration ?? false\n );\n }\n\n async setEnableBrowserIntegration(value: boolean, options?: StorageOptions): Promise {\n const globals = await this.getGlobals(\n this.reconcileOptions(options, await this.defaultOnDiskOptions()),\n );\n globals.enableBrowserIntegration = value;\n await this.saveGlobals(\n globals,\n this.reconcileOptions(options, await this.defaultOnDiskOptions()),\n );\n }\n\n async getEnableBrowserIntegrationFingerprint(options?: StorageOptions): Promise {\n return (\n (await this.getGlobals(this.reconcileOptions(options, await this.defaultOnDiskOptions())))\n ?.enableBrowserIntegrationFingerprint ?? false\n );\n }\n\n async setEnableBrowserIntegrationFingerprint(\n value: boolean,\n options?: StorageOptions,\n ): Promise {\n const globals = await this.getGlobals(\n this.reconcileOptions(options, await this.defaultOnDiskOptions()),\n );\n globals.enableBrowserIntegrationFingerprint = value;\n await this.saveGlobals(\n globals,\n this.reconcileOptions(options, await this.defaultOnDiskOptions()),\n );\n }\n\n @withPrototypeForObjectValues(CipherData)\n async getEncryptedCiphers(options?: StorageOptions): Promise<{ [id: string]: CipherData }> {\n return (\n await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskMemoryOptions()))\n )?.data?.ciphers?.encrypted;\n }\n\n async setEncryptedCiphers(\n value: { [id: string]: CipherData },\n options?: StorageOptions,\n ): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultOnDiskMemoryOptions()),\n );\n account.data.ciphers.encrypted = value;\n await this.saveAccount(\n account,\n this.reconcileOptions(options, await this.defaultOnDiskMemoryOptions()),\n );\n }\n\n /**\n * @deprecated Use UserKey instead\n */\n async getEncryptedCryptoSymmetricKey(options?: StorageOptions): Promise {\n return (\n await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskOptions()))\n )?.keys.cryptoSymmetricKey.encrypted;\n }\n\n @withPrototypeForArrayMembers(GeneratedPasswordHistory)\n async getEncryptedPasswordGenerationHistory(\n options?: StorageOptions,\n ): Promise {\n return (\n await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskOptions()))\n )?.data?.passwordGenerationHistory?.encrypted;\n }\n\n async setEncryptedPasswordGenerationHistory(\n value: GeneratedPasswordHistory[],\n options?: StorageOptions,\n ): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultOnDiskOptions()),\n );\n account.data.passwordGenerationHistory.encrypted = value;\n await this.saveAccount(\n account,\n this.reconcileOptions(options, await this.defaultOnDiskOptions()),\n );\n }\n\n async getEncryptedPinProtected(options?: StorageOptions): Promise {\n return (\n await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskOptions()))\n )?.settings?.pinProtected?.encrypted;\n }\n\n async setEncryptedPinProtected(value: string, options?: StorageOptions): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultOnDiskOptions()),\n );\n account.settings.pinProtected.encrypted = value;\n await this.saveAccount(\n account,\n this.reconcileOptions(options, await this.defaultOnDiskOptions()),\n );\n }\n\n @withPrototypeForObjectValues(SendData)\n async getEncryptedSends(options?: StorageOptions): Promise<{ [id: string]: SendData }> {\n return (\n await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskMemoryOptions()))\n )?.data?.sends.encrypted;\n }\n\n async setEncryptedSends(\n value: { [id: string]: SendData },\n options?: StorageOptions,\n ): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultOnDiskMemoryOptions()),\n );\n account.data.sends.encrypted = value;\n await this.saveAccount(\n account,\n this.reconcileOptions(options, await this.defaultOnDiskMemoryOptions()),\n );\n }\n\n async getEverBeenUnlocked(options?: StorageOptions): Promise {\n return (\n (await this.getAccount(this.reconcileOptions(options, await this.defaultInMemoryOptions())))\n ?.profile?.everBeenUnlocked ?? false\n );\n }\n\n async setEverBeenUnlocked(value: boolean, options?: StorageOptions): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultInMemoryOptions()),\n );\n account.profile.everBeenUnlocked = value;\n await this.saveAccount(\n account,\n this.reconcileOptions(options, await this.defaultInMemoryOptions()),\n );\n }\n\n async getForceSetPasswordReason(options?: StorageOptions): Promise {\n return (\n (\n await this.getAccount(\n this.reconcileOptions(options, await this.defaultOnDiskMemoryOptions()),\n )\n )?.profile?.forceSetPasswordReason ?? ForceSetPasswordReason.None\n );\n }\n\n async setForceSetPasswordReason(\n value: ForceSetPasswordReason,\n options?: StorageOptions,\n ): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultOnDiskMemoryOptions()),\n );\n account.profile.forceSetPasswordReason = value;\n await this.saveAccount(\n account,\n this.reconcileOptions(options, await this.defaultOnDiskMemoryOptions()),\n );\n }\n\n async getInstalledVersion(options?: StorageOptions): Promise {\n return (\n await this.getGlobals(this.reconcileOptions(options, await this.defaultOnDiskOptions()))\n )?.installedVersion;\n }\n\n async setInstalledVersion(value: string, options?: StorageOptions): Promise {\n const globals = await this.getGlobals(\n this.reconcileOptions(options, await this.defaultOnDiskOptions()),\n );\n globals.installedVersion = value;\n await this.saveGlobals(\n globals,\n this.reconcileOptions(options, await this.defaultOnDiskOptions()),\n );\n }\n\n async getIsAuthenticated(options?: StorageOptions): Promise {\n return (\n (await this.tokenService.getAccessToken(options?.userId as UserId)) != null &&\n (await this.getUserId(options)) != null\n );\n }\n\n async getKdfConfig(options?: StorageOptions): Promise {\n const iterations = (\n await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskOptions()))\n )?.profile?.kdfIterations;\n const memory = (\n await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskOptions()))\n )?.profile?.kdfMemory;\n const parallelism = (\n await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskOptions()))\n )?.profile?.kdfParallelism;\n return new KdfConfig(iterations, memory, parallelism);\n }\n\n async setKdfConfig(config: KdfConfig, options?: StorageOptions): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultOnDiskOptions()),\n );\n account.profile.kdfIterations = config.iterations;\n account.profile.kdfMemory = config.memory;\n account.profile.kdfParallelism = config.parallelism;\n await this.saveAccount(\n account,\n this.reconcileOptions(options, await this.defaultOnDiskOptions()),\n );\n }\n\n async getKdfType(options?: StorageOptions): Promise {\n return (\n await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskOptions()))\n )?.profile?.kdfType;\n }\n\n async setKdfType(value: KdfType, options?: StorageOptions): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultOnDiskOptions()),\n );\n account.profile.kdfType = value;\n await this.saveAccount(\n account,\n this.reconcileOptions(options, await this.defaultOnDiskOptions()),\n );\n }\n\n async getKeyHash(options?: StorageOptions): Promise {\n return (\n await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskOptions()))\n )?.profile?.keyHash;\n }\n\n async setKeyHash(value: string, options?: StorageOptions): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultOnDiskOptions()),\n );\n account.profile.keyHash = value;\n await this.saveAccount(\n account,\n this.reconcileOptions(options, await this.defaultOnDiskOptions()),\n );\n }\n\n async getLastActive(options?: StorageOptions): Promise {\n options = this.reconcileOptions(options, await this.defaultOnDiskOptions());\n\n const accountActivity = await this.storageService.get<{ [userId: string]: number }>(\n keys.accountActivity,\n options,\n );\n\n if (accountActivity == null || Object.keys(accountActivity).length < 1) {\n return null;\n }\n\n return accountActivity[options.userId];\n }\n\n async setLastActive(value: number, options?: StorageOptions): Promise {\n options = this.reconcileOptions(options, await this.defaultOnDiskOptions());\n if (options.userId == null) {\n return;\n }\n const accountActivity =\n (await this.storageService.get<{ [userId: string]: number }>(\n keys.accountActivity,\n options,\n )) ?? {};\n accountActivity[options.userId] = value;\n await this.storageService.save(keys.accountActivity, accountActivity, options);\n }\n\n async getLastSync(options?: StorageOptions): Promise {\n return (\n await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskMemoryOptions()))\n )?.profile?.lastSync;\n }\n\n async setLastSync(value: string, options?: StorageOptions): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultOnDiskMemoryOptions()),\n );\n account.profile.lastSync = value;\n await this.saveAccount(\n account,\n this.reconcileOptions(options, await this.defaultOnDiskMemoryOptions()),\n );\n }\n\n async getLocalData(options?: StorageOptions): Promise<{ [cipherId: string]: LocalData }> {\n return (\n await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()))\n )?.data?.localData;\n }\n\n async setLocalData(\n value: { [cipherId: string]: LocalData },\n options?: StorageOptions,\n ): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()),\n );\n account.data.localData = value;\n await this.saveAccount(\n account,\n this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()),\n );\n }\n\n async getMinimizeOnCopyToClipboard(options?: StorageOptions): Promise {\n return (\n (await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskOptions())))\n ?.settings?.minimizeOnCopyToClipboard ?? false\n );\n }\n\n async setMinimizeOnCopyToClipboard(value: boolean, options?: StorageOptions): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultOnDiskOptions()),\n );\n account.settings.minimizeOnCopyToClipboard = value;\n await this.saveAccount(\n account,\n this.reconcileOptions(options, await this.defaultOnDiskOptions()),\n );\n }\n\n async getOrganizationInvitation(options?: StorageOptions): Promise {\n return (\n await this.getGlobals(this.reconcileOptions(options, await this.defaultInMemoryOptions()))\n )?.organizationInvitation;\n }\n\n async setOrganizationInvitation(value: any, options?: StorageOptions): Promise {\n const globals = await this.getGlobals(\n this.reconcileOptions(options, await this.defaultInMemoryOptions()),\n );\n globals.organizationInvitation = value;\n await this.saveGlobals(\n globals,\n this.reconcileOptions(options, await this.defaultInMemoryOptions()),\n );\n }\n\n async getPasswordGenerationOptions(options?: StorageOptions): Promise {\n return (\n await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()))\n )?.settings?.passwordGenerationOptions;\n }\n\n async setPasswordGenerationOptions(\n value: PasswordGeneratorOptions,\n options?: StorageOptions,\n ): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()),\n );\n account.settings.passwordGenerationOptions = value;\n await this.saveAccount(\n account,\n this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()),\n );\n }\n\n async getUsernameGenerationOptions(options?: StorageOptions): Promise {\n return (\n await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()))\n )?.settings?.usernameGenerationOptions;\n }\n\n async setUsernameGenerationOptions(\n value: UsernameGeneratorOptions,\n options?: StorageOptions,\n ): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()),\n );\n account.settings.usernameGenerationOptions = value;\n await this.saveAccount(\n account,\n this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()),\n );\n }\n\n async getGeneratorOptions(options?: StorageOptions): Promise {\n return (\n await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()))\n )?.settings?.generatorOptions;\n }\n\n async setGeneratorOptions(value: GeneratorOptions, options?: StorageOptions): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()),\n );\n account.settings.generatorOptions = value;\n await this.saveAccount(\n account,\n this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()),\n );\n }\n\n async getProtectedPin(options?: StorageOptions): Promise {\n return (\n await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskOptions()))\n )?.settings?.protectedPin;\n }\n\n async setProtectedPin(value: string, options?: StorageOptions): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultOnDiskOptions()),\n );\n account.settings.protectedPin = value;\n await this.saveAccount(\n account,\n this.reconcileOptions(options, await this.defaultOnDiskOptions()),\n );\n }\n\n async getRememberedEmail(options?: StorageOptions): Promise {\n return (\n await this.getGlobals(this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()))\n )?.rememberedEmail;\n }\n\n async setRememberedEmail(value: string, options?: StorageOptions): Promise {\n const globals = await this.getGlobals(\n this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()),\n );\n globals.rememberedEmail = value;\n await this.saveGlobals(\n globals,\n this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()),\n );\n }\n\n async getSecurityStamp(options?: StorageOptions): Promise {\n return (\n await this.getAccount(this.reconcileOptions(options, await this.defaultInMemoryOptions()))\n )?.tokens?.securityStamp;\n }\n\n async setSecurityStamp(value: string, options?: StorageOptions): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultInMemoryOptions()),\n );\n account.tokens.securityStamp = value;\n await this.saveAccount(\n account,\n this.reconcileOptions(options, await this.defaultInMemoryOptions()),\n );\n }\n\n async getUserId(options?: StorageOptions): Promise {\n return (\n await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskOptions()))\n )?.profile?.userId;\n }\n\n async getUsesKeyConnector(options?: StorageOptions): Promise {\n return (\n await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskOptions()))\n )?.profile?.usesKeyConnector;\n }\n\n async setUsesKeyConnector(value: boolean, options?: StorageOptions): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultOnDiskOptions()),\n );\n account.profile.usesKeyConnector = value;\n await this.saveAccount(\n account,\n this.reconcileOptions(options, await this.defaultOnDiskOptions()),\n );\n }\n\n async getVaultTimeout(options?: StorageOptions): Promise {\n const accountVaultTimeout = (\n await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()))\n )?.settings?.vaultTimeout;\n return accountVaultTimeout;\n }\n\n async setVaultTimeout(value: number, options?: StorageOptions): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()),\n );\n account.settings.vaultTimeout = value;\n await this.saveAccount(\n account,\n this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()),\n );\n }\n\n async getVaultTimeoutAction(options?: StorageOptions): Promise {\n const accountVaultTimeoutAction = (\n await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()))\n )?.settings?.vaultTimeoutAction;\n return (\n accountVaultTimeoutAction ??\n (\n await this.getGlobals(\n this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()),\n )\n )?.vaultTimeoutAction\n );\n }\n\n async setVaultTimeoutAction(value: string, options?: StorageOptions): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()),\n );\n account.settings.vaultTimeoutAction = value;\n await this.saveAccount(\n account,\n this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()),\n );\n }\n\n async getApproveLoginRequests(options?: StorageOptions): Promise {\n const approveLoginRequests = (\n await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()))\n )?.settings?.approveLoginRequests;\n return approveLoginRequests;\n }\n\n async setApproveLoginRequests(value: boolean, options?: StorageOptions): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()),\n );\n account.settings.approveLoginRequests = value;\n await this.saveAccount(\n account,\n this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()),\n );\n }\n\n async setServerConfig(value: ServerConfigData, options?: StorageOptions): Promise {\n const account = await this.getAccount(\n this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()),\n );\n account.settings.serverConfig = value;\n return await this.saveAccount(\n account,\n this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()),\n );\n }\n\n async getServerConfig(options: StorageOptions): Promise {\n return (\n await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()))\n )?.settings?.serverConfig;\n }\n\n async getDeepLinkRedirectUrl(options?: StorageOptions): Promise {\n return (\n await this.getGlobals(this.reconcileOptions(options, await this.defaultOnDiskOptions()))\n )?.deepLinkRedirectUrl;\n }\n\n async setDeepLinkRedirectUrl(url: string, options?: StorageOptions): Promise {\n const globals = await this.getGlobals(\n this.reconcileOptions(options, await this.defaultOnDiskOptions()),\n );\n globals.deepLinkRedirectUrl = url;\n await this.saveGlobals(\n globals,\n this.reconcileOptions(options, await this.defaultOnDiskOptions()),\n );\n }\n\n protected async getGlobals(options: StorageOptions): Promise {\n let globals: TGlobalState;\n if (this.useMemory(options.storageLocation)) {\n globals = await this.getGlobalsFromMemory();\n }\n\n if (this.useDisk && globals == null) {\n globals = await this.getGlobalsFromDisk(options);\n }\n\n if (globals == null) {\n globals = this.createGlobals();\n }\n\n return globals;\n }\n\n protected async saveGlobals(globals: TGlobalState, options: StorageOptions) {\n return this.useMemory(options.storageLocation)\n ? this.saveGlobalsToMemory(globals)\n : await this.saveGlobalsToDisk(globals, options);\n }\n\n protected async getGlobalsFromMemory(): Promise {\n return (await this.state()).globals;\n }\n\n protected async getGlobalsFromDisk(options: StorageOptions): Promise {\n return await this.storageService.get(keys.global, options);\n }\n\n protected async saveGlobalsToMemory(globals: TGlobalState): Promise {\n await this.updateState(async (state) => {\n state.globals = globals;\n return state;\n });\n }\n\n protected async saveGlobalsToDisk(globals: TGlobalState, options: StorageOptions): Promise {\n if (options.useSecureStorage) {\n await this.secureStorageService.save(keys.global, globals, options);\n } else {\n await this.storageService.save(keys.global, globals, options);\n }\n }\n\n protected async getAccount(options: StorageOptions): Promise {\n try {\n let account: TAccount;\n if (this.useMemory(options.storageLocation)) {\n account = await this.getAccountFromMemory(options);\n }\n\n if (this.useDisk(options.storageLocation) && account == null) {\n account = await this.getAccountFromDisk(options);\n }\n\n return account;\n } catch (e) {\n this.logService.error(e);\n }\n }\n\n protected async getAccountFromMemory(options: StorageOptions): Promise {\n return await this.state().then(async (state) => {\n if (state.accounts == null) {\n return null;\n }\n return state.accounts[await this.getUserIdFromMemory(options)];\n });\n }\n\n protected async getUserIdFromMemory(options: StorageOptions): Promise {\n return await this.state().then((state) => {\n return options?.userId != null\n ? state.accounts[options.userId]?.profile?.userId\n : state.activeUserId;\n });\n }\n\n protected async getAccountFromDisk(options: StorageOptions): Promise {\n if (options?.userId == null && (await this.state())?.activeUserId == null) {\n return null;\n }\n\n if (this.useAccountCache) {\n const cachedAccount = this.accountDiskCache.value[options.userId];\n if (cachedAccount != null) {\n return cachedAccount;\n }\n }\n\n const account = options?.useSecureStorage\n ? (await this.secureStorageService.get(options.userId, options)) ??\n (await this.storageService.get(\n options.userId,\n this.reconcileOptions(options, { htmlStorageLocation: HtmlStorageLocation.Local }),\n ))\n : await this.storageService.get(options.userId, options);\n\n this.setDiskCache(options.userId, account);\n return account;\n }\n\n protected useMemory(storageLocation: StorageLocation) {\n return storageLocation === StorageLocation.Memory || storageLocation === StorageLocation.Both;\n }\n\n protected useDisk(storageLocation: StorageLocation) {\n return storageLocation === StorageLocation.Disk || storageLocation === StorageLocation.Both;\n }\n\n protected async saveAccount(\n account: TAccount,\n options: StorageOptions = {\n storageLocation: StorageLocation.Both,\n useSecureStorage: false,\n },\n ) {\n return this.useMemory(options.storageLocation)\n ? await this.saveAccountToMemory(account)\n : await this.saveAccountToDisk(account, options);\n }\n\n protected async saveAccountToDisk(account: TAccount, options: StorageOptions): Promise {\n const storageLocation = options.useSecureStorage\n ? this.secureStorageService\n : this.storageService;\n\n await storageLocation.save(`${options.userId}`, account, options);\n\n this.deleteDiskCache(options.userId);\n }\n\n protected async saveAccountToMemory(account: TAccount): Promise {\n if ((await this.getAccountFromMemory({ userId: account.profile.userId })) !== null) {\n await this.updateState((state) => {\n return new Promise((resolve) => {\n state.accounts[account.profile.userId] = account;\n resolve(state);\n });\n });\n }\n await this.pushAccounts();\n }\n\n protected async scaffoldNewAccountStorage(account: TAccount): Promise {\n // We don't want to manipulate the referenced in memory account\n const deepClone = JSON.parse(JSON.stringify(account));\n await this.scaffoldNewAccountLocalStorage(deepClone);\n await this.scaffoldNewAccountSessionStorage(deepClone);\n await this.scaffoldNewAccountMemoryStorage(deepClone);\n }\n\n // TODO: There is a tech debt item for splitting up these methods - only Web uses multiple storage locations in its storageService.\n // For now these methods exist with some redundancy to facilitate this special web requirement.\n protected async scaffoldNewAccountLocalStorage(account: TAccount): Promise {\n const storedAccount = await this.getAccount(\n this.reconcileOptions(\n { userId: account.profile.userId },\n await this.defaultOnDiskLocalOptions(),\n ),\n );\n if (storedAccount?.settings != null) {\n account.settings = storedAccount.settings;\n } else if (await this.storageService.has(keys.tempAccountSettings)) {\n account.settings = await this.storageService.get(keys.tempAccountSettings);\n await this.storageService.remove(keys.tempAccountSettings);\n }\n\n await this.saveAccount(\n account,\n this.reconcileOptions(\n { userId: account.profile.userId },\n await this.defaultOnDiskLocalOptions(),\n ),\n );\n }\n\n protected async scaffoldNewAccountMemoryStorage(account: TAccount): Promise {\n const storedAccount = await this.getAccount(\n this.reconcileOptions(\n { userId: account.profile.userId },\n await this.defaultOnDiskMemoryOptions(),\n ),\n );\n if (storedAccount?.settings != null) {\n account.settings = storedAccount.settings;\n }\n await this.storageService.save(\n account.profile.userId,\n account,\n await this.defaultOnDiskMemoryOptions(),\n );\n await this.saveAccount(\n account,\n this.reconcileOptions(\n { userId: account.profile.userId },\n await this.defaultOnDiskMemoryOptions(),\n ),\n );\n }\n\n protected async scaffoldNewAccountSessionStorage(account: TAccount): Promise {\n const storedAccount = await this.getAccount(\n this.reconcileOptions({ userId: account.profile.userId }, await this.defaultOnDiskOptions()),\n );\n if (storedAccount?.settings != null) {\n account.settings = storedAccount.settings;\n }\n await this.storageService.save(\n account.profile.userId,\n account,\n await this.defaultOnDiskMemoryOptions(),\n );\n await this.saveAccount(\n account,\n this.reconcileOptions({ userId: account.profile.userId }, await this.defaultOnDiskOptions()),\n );\n }\n\n protected async pushAccounts(): Promise {\n await this.state().then((state) => {\n if (state.accounts == null || Object.keys(state.accounts).length < 1) {\n this.accountsSubject.next({});\n return;\n }\n\n this.accountsSubject.next(state.accounts);\n });\n }\n\n protected reconcileOptions(\n requestedOptions: StorageOptions,\n defaultOptions: StorageOptions,\n ): StorageOptions {\n if (requestedOptions == null) {\n return defaultOptions;\n }\n requestedOptions.userId = requestedOptions?.userId ?? defaultOptions.userId;\n requestedOptions.storageLocation =\n requestedOptions?.storageLocation ?? defaultOptions.storageLocation;\n requestedOptions.useSecureStorage =\n requestedOptions?.useSecureStorage ?? defaultOptions.useSecureStorage;\n requestedOptions.htmlStorageLocation =\n requestedOptions?.htmlStorageLocation ?? defaultOptions.htmlStorageLocation;\n requestedOptions.keySuffix = requestedOptions?.keySuffix ?? defaultOptions.keySuffix;\n return requestedOptions;\n }\n\n protected async defaultInMemoryOptions(): Promise {\n return {\n storageLocation: StorageLocation.Memory,\n userId: (await this.state()).activeUserId,\n };\n }\n\n protected async defaultOnDiskOptions(): Promise {\n return {\n storageLocation: StorageLocation.Disk,\n htmlStorageLocation: HtmlStorageLocation.Session,\n userId: (await this.state())?.activeUserId ?? (await this.getActiveUserIdFromStorage()),\n useSecureStorage: false,\n };\n }\n\n protected async defaultOnDiskLocalOptions(): Promise {\n return {\n storageLocation: StorageLocation.Disk,\n htmlStorageLocation: HtmlStorageLocation.Local,\n userId: (await this.state())?.activeUserId ?? (await this.getActiveUserIdFromStorage()),\n useSecureStorage: false,\n };\n }\n\n protected async defaultOnDiskMemoryOptions(): Promise {\n return {\n storageLocation: StorageLocation.Disk,\n htmlStorageLocation: HtmlStorageLocation.Memory,\n userId: (await this.state())?.activeUserId ?? (await this.getUserId()),\n useSecureStorage: false,\n };\n }\n\n protected async defaultSecureStorageOptions(): Promise {\n return {\n storageLocation: StorageLocation.Disk,\n useSecureStorage: true,\n userId: (await this.state())?.activeUserId ?? (await this.getActiveUserIdFromStorage()),\n };\n }\n\n protected async getActiveUserIdFromStorage(): Promise {\n return await this.storageService.get(keys.activeUserId);\n }\n\n protected async removeAccountFromLocalStorage(userId: string = null): Promise {\n userId = userId ?? (await this.state())?.activeUserId;\n const storedAccount = await this.getAccount(\n this.reconcileOptions({ userId: userId }, await this.defaultOnDiskLocalOptions()),\n );\n await this.saveAccount(\n this.resetAccount(storedAccount),\n this.reconcileOptions({ userId: userId }, await this.defaultOnDiskLocalOptions()),\n );\n }\n\n protected async removeAccountFromSessionStorage(userId: string = null): Promise {\n userId = userId ?? (await this.state())?.activeUserId;\n const storedAccount = await this.getAccount(\n this.reconcileOptions({ userId: userId }, await this.defaultOnDiskOptions()),\n );\n await this.saveAccount(\n this.resetAccount(storedAccount),\n this.reconcileOptions({ userId: userId }, await this.defaultOnDiskOptions()),\n );\n }\n\n protected async removeAccountFromSecureStorage(userId: string = null): Promise {\n userId = userId ?? (await this.state())?.activeUserId;\n await this.setUserKeyAutoUnlock(null, { userId: userId });\n await this.setUserKeyBiometric(null, { userId: userId });\n await this.setCryptoMasterKeyAuto(null, { userId: userId });\n await this.setCryptoMasterKeyBiometric(null, { userId: userId });\n await this.setCryptoMasterKeyB64(null, { userId: userId });\n }\n\n protected async removeAccountFromMemory(userId: string = null): Promise {\n await this.updateState(async (state) => {\n userId = userId ?? state.activeUserId;\n delete state.accounts[userId];\n\n this.deleteDiskCache(userId);\n\n return state;\n });\n // TODO: Invert this logic, we should remove accounts based on logged out emit\n await this.accountService.setAccountStatus(userId as UserId, AuthenticationStatus.LoggedOut);\n }\n\n // settings persist even on reset, and are not affected by this method\n protected resetAccount(account: TAccount) {\n const persistentAccountInformation = {\n settings: account.settings,\n keys: { deviceKey: account.keys.deviceKey },\n adminAuthRequest: account.adminAuthRequest,\n };\n return Object.assign(this.createAccount(), persistentAccountInformation);\n }\n\n protected async clearDecryptedDataForActiveUser(): Promise {\n await this.updateState(async (state) => {\n const userId = state?.activeUserId;\n if (userId != null && state?.accounts[userId]?.data != null) {\n state.accounts[userId].data = new AccountData();\n }\n\n return state;\n });\n }\n\n protected createAccount(init: Partial = null): TAccount {\n return this.stateFactory.createAccount(init);\n }\n\n protected createGlobals(init: Partial = null): TGlobalState {\n return this.stateFactory.createGlobal(init);\n }\n\n protected async deAuthenticateAccount(userId: string): Promise {\n // We must have a manual call to clear tokens as we can't leverage state provider to clean\n // up our data as we have secure storage in the mix.\n await this.tokenService.clearTokens(userId as UserId);\n await this.setLastActive(null, { userId: userId });\n await this.updateState(async (state) => {\n state.authenticatedAccounts = state.authenticatedAccounts.filter((id) => id !== userId);\n\n await this.storageService.save(keys.authenticatedAccounts, state.authenticatedAccounts);\n\n return state;\n });\n }\n\n protected async removeAccountFromDisk(userId: string) {\n await this.removeAccountFromSessionStorage(userId);\n await this.removeAccountFromLocalStorage(userId);\n await this.removeAccountFromSecureStorage(userId);\n }\n\n async nextUpActiveUser() {\n const accounts = (await this.state())?.accounts;\n if (accounts == null || Object.keys(accounts).length < 1) {\n return null;\n }\n\n let newActiveUser;\n for (const userId in accounts) {\n if (userId == null) {\n continue;\n }\n if (await this.getIsAuthenticated({ userId: userId })) {\n newActiveUser = userId;\n break;\n }\n newActiveUser = null;\n }\n return newActiveUser as UserId;\n }\n\n protected async dynamicallySetActiveUser() {\n const newActiveUser = await this.nextUpActiveUser();\n await this.setActiveUser(newActiveUser);\n return newActiveUser;\n }\n\n protected async saveSecureStorageKey(\n key: string,\n value: T,\n options?: StorageOptions,\n ) {\n return value == null\n ? await this.secureStorageService.remove(`${options.userId}${key}`, options)\n : await this.secureStorageService.save(`${options.userId}${key}`, value, options);\n }\n\n protected async state(): Promise> {\n const state = await this.memoryStorageService.get>(keys.state, {\n deserializer: (s) => State.fromJSON(s, this.accountDeserializer),\n });\n return state;\n }\n\n private async setState(\n state: State,\n ): Promise> {\n await this.memoryStorageService.save(keys.state, state);\n return state;\n }\n\n protected async updateState(\n stateUpdater: (state: State) => Promise>,\n ): Promise> {\n return await this.state().then(async (state) => {\n const updatedState = await stateUpdater(state);\n if (updatedState == null) {\n throw new Error(\"Attempted to update state to null value\");\n }\n\n return await this.setState(updatedState);\n });\n }\n\n private setDiskCache(key: string, value: TAccount, options?: StorageOptions) {\n if (this.useAccountCache) {\n this.accountDiskCache.value[key] = value;\n this.accountDiskCache.next(this.accountDiskCache.value);\n }\n }\n\n protected deleteDiskCache(key: string) {\n if (this.useAccountCache) {\n delete this.accountDiskCache.value[key];\n this.accountDiskCache.next(this.accountDiskCache.value);\n }\n }\n}\n\nfunction withPrototypeForArrayMembers(\n memberConstructor: new (...args: any[]) => T,\n memberConverter: (input: any) => T = (i) => i,\n): (\n target: any,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor,\n) => { value: (...args: any[]) => Promise } {\n return (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n const originalMethod = descriptor.value;\n\n return {\n value: function (...args: any[]) {\n const originalResult: Promise = originalMethod.apply(this, args);\n\n if (!Utils.isPromise(originalResult)) {\n throw new Error(\n `Error applying prototype to stored value -- result is not a promise for method ${String(\n propertyKey,\n )}`,\n );\n }\n\n return originalResult.then((result) => {\n if (result == null) {\n return null;\n } else if (!(result instanceof Array)) {\n throw new Error(\n `Attempted to retrieve non array type from state as an array for method ${String(\n propertyKey,\n )}`,\n );\n } else {\n return result.map((r) => {\n return r == null ||\n r.constructor.name === memberConstructor.prototype.constructor.name\n ? r\n : memberConverter(\n Object.create(memberConstructor.prototype, Object.getOwnPropertyDescriptors(r)),\n );\n });\n }\n });\n },\n };\n };\n}\n\nfunction withPrototypeForObjectValues(\n valuesConstructor: new (...args: any[]) => T,\n valuesConverter: (input: any) => T = (i) => i,\n): (\n target: any,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor,\n) => { value: (...args: any[]) => Promise<{ [key: string]: T }> } {\n return (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n const originalMethod = descriptor.value;\n\n return {\n value: function (...args: any[]) {\n const originalResult: Promise<{ [key: string]: T }> = originalMethod.apply(this, args);\n\n if (!Utils.isPromise(originalResult)) {\n throw new Error(\n `Error applying prototype to stored value -- result is not a promise for method ${String(\n propertyKey,\n )}`,\n );\n }\n\n return originalResult.then((result) => {\n if (result == null) {\n return null;\n } else {\n for (const [key, val] of Object.entries(result)) {\n result[key] =\n val == null || val.constructor.name === valuesConstructor.prototype.constructor.name\n ? valuesConverter(val)\n : valuesConverter(\n Object.create(\n valuesConstructor.prototype,\n Object.getOwnPropertyDescriptors(val),\n ),\n );\n }\n\n return result as { [key: string]: T };\n }\n });\n },\n };\n };\n}\n","import { AbstractStorageService, ObservableStorageService } from \"../abstractions/storage.service\";\n// eslint-disable-next-line import/no-restricted-paths\nimport { ClientLocations, StorageLocation } from \"../state/state-definition\";\n\nexport type PossibleLocation = StorageLocation | ClientLocations[keyof ClientLocations];\n\n/**\n * A provider for getting client specific computed storage locations and services.\n */\nexport class StorageServiceProvider {\n constructor(\n protected readonly diskStorageService: AbstractStorageService & ObservableStorageService,\n protected readonly memoryStorageService: AbstractStorageService & ObservableStorageService,\n ) {}\n\n /**\n * Computes the location and corresponding service for a given client.\n *\n * **NOTE** The default implementation does not respect client overrides and if clients\n * have special overrides they are responsible for implementing this service.\n * @param defaultLocation The default location to use if no client specific override is preferred.\n * @param overrides Client specific overrides\n * @returns The computed storage location and corresponding storage service to use to get/store state.\n * @throws If there is no configured storage service for the given inputs.\n */\n get(\n defaultLocation: PossibleLocation,\n overrides: Partial,\n ): [location: PossibleLocation, service: AbstractStorageService & ObservableStorageService] {\n switch (defaultLocation) {\n case \"disk\":\n return [defaultLocation, this.diskStorageService];\n case \"memory\":\n return [defaultLocation, this.memoryStorageService];\n default:\n throw new Error(`Unexpected location: ${defaultLocation}`);\n }\n }\n}\n","export class DecryptParameters {\n encKey: T;\n data: T;\n iv: T;\n macKey: T;\n mac: T;\n macData: T;\n}\n","import { Observable } from \"rxjs\";\n\nimport { UserId } from \"../../types/guid\";\n\nimport { StateUpdateOptions } from \"./state-update-options\";\n\nexport type CombinedState = readonly [userId: UserId, state: T];\n\n/**\n * A helper object for interacting with state that is scoped to a specific user.\n */\nexport interface UserState {\n /**\n * Emits a stream of data.\n */\n readonly state$: Observable;\n\n /**\n * Emits a stream of data alongside the user id the data corresponds to.\n */\n readonly combinedState$: Observable>;\n}\n\nexport const activeMarker: unique symbol = Symbol(\"active\");\nexport interface ActiveUserState extends UserState {\n readonly [activeMarker]: true;\n /**\n * Updates backing stores for the active user.\n * @param configureState function that takes the current state and returns the new state\n * @param options Defaults to @see {module:state-update-options#DEFAULT_OPTIONS}\n * @param options.shouldUpdate A callback for determining if you want to update state. Defaults to () => true\n * @param options.combineLatestWith An observable that you want to combine with the current state for callbacks. Defaults to null\n * @param options.msTimeout A timeout for how long you are willing to wait for a `combineLatestWith` option to complete. Defaults to 1000ms. Only applies if `combineLatestWith` is set.\n\n * @returns A promise that must be awaited before your next action to ensure the update has been written to state.\n * Resolves to the new state. If `shouldUpdate` returns false, the promise will resolve to the current state.\n */\n readonly update: (\n configureState: (state: T, dependencies: TCombine) => T,\n options?: StateUpdateOptions,\n ) => Promise<[UserId, T]>;\n}\nexport interface SingleUserState extends UserState {\n readonly userId: UserId;\n\n /**\n * Updates backing stores for the active user.\n * @param configureState function that takes the current state and returns the new state\n * @param options Defaults to @see {module:state-update-options#DEFAULT_OPTIONS}\n * @param options.shouldUpdate A callback for determining if you want to update state. Defaults to () => true\n * @param options.combineLatestWith An observable that you want to combine with the current state for callbacks. Defaults to null\n * @param options.msTimeout A timeout for how long you are willing to wait for a `combineLatestWith` option to complete. Defaults to 1000ms. Only applies if `combineLatestWith` is set.\n\n * @returns A promise that must be awaited before your next action to ensure the update has been written to state.\n * Resolves to the new state. If `shouldUpdate` returns false, the promise will resolve to the current state.\n */\n readonly update: (\n configureState: (state: T, dependencies: TCombine) => T,\n options?: StateUpdateOptions,\n ) => Promise;\n}\n","import { Observable, map, switchMap, firstValueFrom, timeout, throwError, NEVER } from \"rxjs\";\n\nimport { UserId } from \"../../../types/guid\";\nimport { StateUpdateOptions } from \"../state-update-options\";\nimport { UserKeyDefinition } from \"../user-key-definition\";\nimport { ActiveUserState, CombinedState, activeMarker } from \"../user-state\";\nimport { SingleUserStateProvider } from \"../user-state.provider\";\n\nexport class DefaultActiveUserState implements ActiveUserState {\n [activeMarker]: true;\n combinedState$: Observable>;\n state$: Observable;\n\n constructor(\n protected keyDefinition: UserKeyDefinition,\n private activeUserId$: Observable,\n private singleUserStateProvider: SingleUserStateProvider,\n ) {\n this.combinedState$ = this.activeUserId$.pipe(\n switchMap((userId) =>\n userId != null\n ? this.singleUserStateProvider.get(userId, this.keyDefinition).combinedState$\n : NEVER,\n ),\n );\n\n // State should just be combined state without the user id\n this.state$ = this.combinedState$.pipe(map(([_userId, state]) => state));\n }\n\n async update(\n configureState: (state: T, dependency: TCombine) => T,\n options: StateUpdateOptions = {},\n ): Promise<[UserId, T]> {\n const userId = await firstValueFrom(\n this.activeUserId$.pipe(\n timeout({\n first: 1000,\n with: () =>\n throwError(\n () =>\n new Error(\n `Timeout while retrieving active user for key ${this.keyDefinition.fullName}.`,\n ),\n ),\n }),\n ),\n );\n if (userId == null) {\n throw new Error(\n `Error storing ${this.keyDefinition.fullName} for the active user: No active user at this time.`,\n );\n }\n\n return [\n userId,\n await this.singleUserStateProvider\n .get(userId, this.keyDefinition)\n .update(configureState, options),\n ];\n }\n}\n","import { Observable, ReplaySubject, Subject, concatMap, merge, share, timer } from \"rxjs\";\n\nimport { DerivedStateDependencies } from \"../../../types/state\";\nimport {\n AbstractStorageService,\n ObservableStorageService,\n} from \"../../abstractions/storage.service\";\nimport { DeriveDefinition } from \"../derive-definition\";\nimport { DerivedState } from \"../derived-state\";\n\n/**\n * Default derived state\n */\nexport class DefaultDerivedState\n implements DerivedState\n{\n private readonly storageKey: string;\n private forcedValueSubject = new Subject();\n\n state$: Observable;\n\n constructor(\n private parentState$: Observable,\n protected deriveDefinition: DeriveDefinition,\n private memoryStorage: AbstractStorageService & ObservableStorageService,\n private dependencies: TDeps,\n ) {\n this.storageKey = deriveDefinition.storageKey;\n\n const derivedState$ = this.parentState$.pipe(\n concatMap(async (state) => {\n let derivedStateOrPromise = this.deriveDefinition.derive(state, this.dependencies);\n if (derivedStateOrPromise instanceof Promise) {\n derivedStateOrPromise = await derivedStateOrPromise;\n }\n const derivedState = derivedStateOrPromise;\n await this.storeValue(derivedState);\n return derivedState;\n }),\n );\n\n this.state$ = merge(this.forcedValueSubject, derivedState$).pipe(\n share({\n connector: () => {\n return new ReplaySubject(1);\n },\n resetOnRefCountZero: () =>\n timer(this.deriveDefinition.cleanupDelayMs).pipe(\n concatMap(async () => {\n if (this.deriveDefinition.clearOnCleanup) {\n await this.memoryStorage.remove(this.storageKey);\n }\n return true;\n }),\n ),\n }),\n );\n }\n\n async forceValue(value: TTo) {\n await this.storeValue(value);\n this.forcedValueSubject.next(value);\n return value;\n }\n\n private storeValue(value: TTo) {\n return this.memoryStorage.save(this.storageKey, { derived: true, value });\n }\n}\n","import { Observable } from \"rxjs\";\n\nexport const DEFAULT_OPTIONS = {\n shouldUpdate: () => true,\n combineLatestWith: null as Observable,\n msTimeout: 1000,\n};\n\ntype DefinitelyTypedDefault = Omit<\n typeof DEFAULT_OPTIONS,\n \"shouldUpdate\" | \"combineLatestWith\"\n> & {\n shouldUpdate: (state: T, dependency: TCombine) => boolean;\n combineLatestWith?: Observable;\n};\n\nexport type StateUpdateOptions = Partial>;\n\nexport function populateOptionsWithDefault(\n options: StateUpdateOptions,\n): StateUpdateOptions {\n return {\n ...(DEFAULT_OPTIONS as StateUpdateOptions),\n ...options,\n };\n}\n","import { Jsonify } from \"type-fest\";\n\nimport { AbstractStorageService } from \"../../abstractions/storage.service\";\n\nexport async function getStoredValue(\n key: string,\n storage: AbstractStorageService,\n deserializer: (jsonValue: Jsonify) => T,\n) {\n if (storage.valuesRequireDeserialization) {\n const jsonValue = await storage.get>(key);\n const value = deserializer(jsonValue);\n return value;\n } else {\n const value = await storage.get(key);\n return value ?? null;\n }\n}\n","import {\n Observable,\n ReplaySubject,\n defer,\n filter,\n firstValueFrom,\n merge,\n share,\n switchMap,\n timeout,\n timer,\n} from \"rxjs\";\nimport { Jsonify } from \"type-fest\";\n\nimport { StorageKey } from \"../../../types/state\";\nimport {\n AbstractStorageService,\n ObservableStorageService,\n} from \"../../abstractions/storage.service\";\nimport { StateUpdateOptions, populateOptionsWithDefault } from \"../state-update-options\";\n\nimport { getStoredValue } from \"./util\";\n\n// The parts of a KeyDefinition this class cares about to make it work\ntype KeyDefinitionRequirements = {\n deserializer: (jsonState: Jsonify) => T;\n cleanupDelayMs: number;\n};\n\nexport abstract class StateBase> {\n private updatePromise: Promise;\n\n readonly state$: Observable;\n\n constructor(\n protected readonly key: StorageKey,\n protected readonly storageService: AbstractStorageService & ObservableStorageService,\n protected readonly keyDefinition: KeyDef,\n ) {\n const storageUpdate$ = storageService.updates$.pipe(\n filter((storageUpdate) => storageUpdate.key === key),\n switchMap(async (storageUpdate) => {\n if (storageUpdate.updateType === \"remove\") {\n return null;\n }\n\n return await getStoredValue(key, storageService, keyDefinition.deserializer);\n }),\n );\n\n this.state$ = merge(\n defer(() => getStoredValue(key, storageService, keyDefinition.deserializer)),\n storageUpdate$,\n ).pipe(\n share({\n connector: () => new ReplaySubject(1),\n resetOnRefCountZero: () => timer(keyDefinition.cleanupDelayMs),\n }),\n );\n }\n\n async update(\n configureState: (state: T, dependency: TCombine) => T,\n options: StateUpdateOptions = {},\n ): Promise {\n options = populateOptionsWithDefault(options);\n if (this.updatePromise != null) {\n await this.updatePromise;\n }\n\n try {\n this.updatePromise = this.internalUpdate(configureState, options);\n const newState = await this.updatePromise;\n return newState;\n } finally {\n this.updatePromise = null;\n }\n }\n\n private async internalUpdate(\n configureState: (state: T, dependency: TCombine) => T,\n options: StateUpdateOptions,\n ): Promise {\n const currentState = await this.getStateForUpdate();\n const combinedDependencies =\n options.combineLatestWith != null\n ? await firstValueFrom(options.combineLatestWith.pipe(timeout(options.msTimeout)))\n : null;\n\n if (!options.shouldUpdate(currentState, combinedDependencies)) {\n return currentState;\n }\n\n const newState = configureState(currentState, combinedDependencies);\n await this.doStorageSave(newState, currentState);\n return newState;\n }\n\n protected async doStorageSave(newState: T, oldState: T) {\n await this.storageService.save(this.key, newState);\n }\n\n /** For use in update methods, does not wait for update to complete before yielding state.\n * The expectation is that that await is already done\n */\n private async getStateForUpdate() {\n return await getStoredValue(this.key, this.storageService, this.keyDefinition.deserializer);\n }\n}\n","import {\n AbstractStorageService,\n ObservableStorageService,\n} from \"../../abstractions/storage.service\";\nimport { GlobalState } from \"../global-state\";\nimport { KeyDefinition, globalKeyBuilder } from \"../key-definition\";\n\nimport { StateBase } from \"./state-base\";\n\nexport class DefaultGlobalState\n extends StateBase>\n implements GlobalState\n{\n constructor(\n keyDefinition: KeyDefinition,\n chosenLocation: AbstractStorageService & ObservableStorageService,\n ) {\n super(globalKeyBuilder(keyDefinition), chosenLocation, keyDefinition);\n }\n}\n","import { Observable, combineLatest, of } from \"rxjs\";\n\nimport { UserId } from \"../../../types/guid\";\nimport {\n AbstractStorageService,\n ObservableStorageService,\n} from \"../../abstractions/storage.service\";\nimport { StateEventRegistrarService } from \"../state-event-registrar.service\";\nimport { UserKeyDefinition } from \"../user-key-definition\";\nimport { CombinedState, SingleUserState } from \"../user-state\";\n\nimport { StateBase } from \"./state-base\";\n\nexport class DefaultSingleUserState\n extends StateBase>\n implements SingleUserState\n{\n readonly combinedState$: Observable>;\n\n constructor(\n readonly userId: UserId,\n keyDefinition: UserKeyDefinition,\n chosenLocation: AbstractStorageService & ObservableStorageService,\n private stateEventRegistrarService: StateEventRegistrarService,\n ) {\n super(keyDefinition.buildKey(userId), chosenLocation, keyDefinition);\n this.combinedState$ = combineLatest([of(userId), this.state$]);\n }\n\n protected override async doStorageSave(newState: T, oldState: T): Promise {\n await super.doStorageSave(newState, oldState);\n if (newState != null && oldState == null) {\n await this.stateEventRegistrarService.registerEvents(this.keyDefinition);\n }\n }\n}\n","import { BillingSyncConfigApi } from \"../../../billing/models/api/billing-sync-config.api\";\nimport { BaseResponse } from \"../../../models/response/base.response\";\nimport { OrganizationConnectionType } from \"../../enums\";\nimport { ScimConfigApi } from \"../api/scim-config.api\";\n\n/**API response config types for OrganizationConnectionResponse */\nexport type OrganizationConnectionConfigApis = BillingSyncConfigApi | ScimConfigApi;\n\nexport class OrganizationConnectionResponse<\n TConfig extends OrganizationConnectionConfigApis,\n> extends BaseResponse {\n id: string;\n type: OrganizationConnectionType;\n organizationId: string;\n enabled: boolean;\n config: TConfig;\n\n constructor(response: any, configType: { new (response: any): TConfig }) {\n super(response);\n this.id = this.getResponseProperty(\"Id\");\n this.type = this.getResponseProperty(\"Type\");\n this.organizationId = this.getResponseProperty(\"OrganizationId\");\n this.enabled = this.getResponseProperty(\"Enabled\");\n const rawConfig = this.getResponseProperty(\"Config\");\n this.config = rawConfig == null ? null : new configType(rawConfig);\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\nimport { CipherResponse } from \"../../../vault/models/response/cipher.response\";\nimport { CollectionResponse } from \"../../../vault/models/response/collection.response\";\n\nexport class OrganizationExportResponse extends BaseResponse {\n collections: CollectionResponse[];\n ciphers: CipherResponse[];\n\n constructor(response: any) {\n super(response);\n const collections = this.getResponseProperty(\"Collections\");\n if (collections != null) {\n this.collections = collections.map((c: any) => new CollectionResponse(c));\n }\n const ciphers = this.getResponseProperty(\"Ciphers\");\n if (ciphers != null) {\n this.ciphers = ciphers.map((c: any) => new CipherResponse(c));\n }\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\n\nexport class OrganizationSponsorshipSyncStatusResponse extends BaseResponse {\n lastSyncDate?: Date;\n\n constructor(response: any) {\n super(response);\n const lastSyncDate = this.getResponseProperty(\"LastSyncDate\");\n if (lastSyncDate) {\n this.lastSyncDate = new Date(lastSyncDate);\n }\n }\n}\n","import { BaseResponse } from \"../../../../models/response/base.response\";\n\nexport class ProviderOrganizationResponse extends BaseResponse {\n id: string;\n providerId: string;\n organizationId: string;\n key: string;\n settings: string;\n creationDate: string;\n revisionDate: string;\n userCount: number;\n seats?: number;\n plan?: string;\n\n constructor(response: any) {\n super(response);\n this.id = this.getResponseProperty(\"Id\");\n this.providerId = this.getResponseProperty(\"ProviderId\");\n this.organizationId = this.getResponseProperty(\"OrganizationId\");\n this.key = this.getResponseProperty(\"Key\");\n this.settings = this.getResponseProperty(\"Settings\");\n this.creationDate = this.getResponseProperty(\"CreationDate\");\n this.revisionDate = this.getResponseProperty(\"RevisionDate\");\n this.userCount = this.getResponseProperty(\"UserCount\");\n this.seats = this.getResponseProperty(\"Seats\");\n this.plan = this.getResponseProperty(\"Plan\");\n }\n}\n\nexport class ProviderOrganizationOrganizationDetailsResponse extends ProviderOrganizationResponse {\n organizationName: string;\n\n constructor(response: any) {\n super(response);\n this.organizationName = this.getResponseProperty(\"OrganizationName\");\n }\n}\n","import { OrganizationUserBulkPublicKeyResponse } from \"../../../abstractions/organization-user/responses\";\n\nexport class ProviderUserBulkPublicKeyResponse extends OrganizationUserBulkPublicKeyResponse {}\n","import { BaseResponse } from \"../../../../models/response/base.response\";\n\nexport class ProviderUserBulkResponse extends BaseResponse {\n id: string;\n error: string;\n\n constructor(response: any) {\n super(response);\n this.id = this.getResponseProperty(\"Id\");\n this.error = this.getResponseProperty(\"Error\");\n }\n}\n","import { BaseResponse } from \"../../../../models/response/base.response\";\nimport { ProviderUserStatusType, ProviderUserType } from \"../../../enums\";\nimport { PermissionsApi } from \"../../api/permissions.api\";\n\nexport class ProviderUserResponse extends BaseResponse {\n id: string;\n userId: string;\n type: ProviderUserType;\n status: ProviderUserStatusType;\n permissions: PermissionsApi;\n\n constructor(response: any) {\n super(response);\n this.id = this.getResponseProperty(\"Id\");\n this.userId = this.getResponseProperty(\"UserId\");\n this.type = this.getResponseProperty(\"Type\");\n this.status = this.getResponseProperty(\"Status\");\n this.permissions = new PermissionsApi(this.getResponseProperty(\"Permissions\"));\n }\n}\n\nexport class ProviderUserUserDetailsResponse extends ProviderUserResponse {\n name: string;\n email: string;\n\n constructor(response: any) {\n super(response);\n this.name = this.getResponseProperty(\"Name\");\n this.email = this.getResponseProperty(\"Email\");\n }\n}\n","import { BaseResponse } from \"../../../../models/response/base.response\";\n\nexport class ProviderResponse extends BaseResponse {\n id: string;\n name: string;\n businessName: string;\n billingEmail: string;\n creationDate: Date;\n\n constructor(response: any) {\n super(response);\n this.id = this.getResponseProperty(\"Id\");\n this.name = this.getResponseProperty(\"Name\");\n this.businessName = this.getResponseProperty(\"BusinessName\");\n this.billingEmail = this.getResponseProperty(\"BillingEmail\");\n this.creationDate = this.getResponseProperty(\"CreationDate\");\n }\n}\n","import { DeviceType } from \"../../../enums\";\nimport { BaseResponse } from \"../../../models/response/base.response\";\n\nconst RequestTimeOut = 60000 * 15; //15 Minutes\n\nexport class AuthRequestResponse extends BaseResponse {\n id: string;\n publicKey: string;\n requestDeviceType: DeviceType;\n requestIpAddress: string;\n key: string;\n masterPasswordHash: string;\n creationDate: string;\n requestApproved?: boolean;\n responseDate?: string;\n isAnswered: boolean;\n isExpired: boolean;\n\n constructor(response: any) {\n super(response);\n this.id = this.getResponseProperty(\"Id\");\n this.publicKey = this.getResponseProperty(\"PublicKey\");\n this.requestDeviceType = this.getResponseProperty(\"RequestDeviceType\");\n this.requestIpAddress = this.getResponseProperty(\"RequestIpAddress\");\n this.key = this.getResponseProperty(\"Key\");\n this.masterPasswordHash = this.getResponseProperty(\"MasterPasswordHash\");\n this.creationDate = this.getResponseProperty(\"CreationDate\");\n this.requestApproved = this.getResponseProperty(\"RequestApproved\");\n this.responseDate = this.getResponseProperty(\"ResponseDate\");\n\n const requestDate = new Date(this.creationDate);\n const requestDateUTC = Date.UTC(\n requestDate.getUTCFullYear(),\n requestDate.getUTCMonth(),\n requestDate.getDate(),\n requestDate.getUTCHours(),\n requestDate.getUTCMinutes(),\n requestDate.getUTCSeconds(),\n requestDate.getUTCMilliseconds(),\n );\n\n const dateNow = new Date(Date.now());\n const dateNowUTC = Date.UTC(\n dateNow.getUTCFullYear(),\n dateNow.getUTCMonth(),\n dateNow.getDate(),\n dateNow.getUTCHours(),\n dateNow.getUTCMinutes(),\n dateNow.getUTCSeconds(),\n dateNow.getUTCMilliseconds(),\n );\n\n this.isExpired = dateNowUTC - requestDateUTC >= RequestTimeOut;\n this.isAnswered = this.requestApproved != null && this.responseDate != null;\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\n\nexport class DeviceVerificationResponse extends BaseResponse {\n isDeviceVerificationSectionEnabled: boolean;\n unknownDeviceVerificationEnabled: boolean;\n\n constructor(response: any) {\n super(response);\n this.isDeviceVerificationSectionEnabled = this.getResponseProperty(\n \"IsDeviceVerificationSectionEnabled\",\n );\n this.unknownDeviceVerificationEnabled = this.getResponseProperty(\n \"UnknownDeviceVerificationEnabled\",\n );\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\n\nexport class KeyConnectorUserKeyResponse extends BaseResponse {\n key: string;\n\n constructor(response: any) {\n super(response);\n this.key = this.getResponseProperty(\"Key\");\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\nimport { KdfType } from \"../../../platform/enums\";\n\nexport class PreloginResponse extends BaseResponse {\n kdf: KdfType;\n kdfIterations: number;\n kdfMemory?: number;\n kdfParallelism?: number;\n\n constructor(response: any) {\n super(response);\n this.kdf = this.getResponseProperty(\"Kdf\");\n this.kdfIterations = this.getResponseProperty(\"KdfIterations\");\n this.kdfMemory = this.getResponseProperty(\"KdfMemory\");\n this.kdfParallelism = this.getResponseProperty(\"KdfParallelism\");\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\n\nimport { ICaptchaProtectedResponse } from \"./captcha-protected.response\";\n\nexport class RegisterResponse extends BaseResponse implements ICaptchaProtectedResponse {\n captchaBypassToken: string;\n\n constructor(response: any) {\n super(response);\n this.captchaBypassToken = this.getResponseProperty(\"CaptchaBypassToken\");\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\n\nexport class SsoPreValidateResponse extends BaseResponse {\n token: string;\n\n constructor(response: any) {\n super(response);\n this.token = this.getResponseProperty(\"Token\");\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\n\nexport class TwoFactorAuthenticatorResponse extends BaseResponse {\n enabled: boolean;\n key: string;\n\n constructor(response: any) {\n super(response);\n this.enabled = this.getResponseProperty(\"Enabled\");\n this.key = this.getResponseProperty(\"Key\");\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\n\nexport class TwoFactorDuoResponse extends BaseResponse {\n enabled: boolean;\n host: string;\n secretKey: string;\n integrationKey: string;\n\n constructor(response: any) {\n super(response);\n this.enabled = this.getResponseProperty(\"Enabled\");\n this.host = this.getResponseProperty(\"Host\");\n this.secretKey = this.getResponseProperty(\"SecretKey\");\n this.integrationKey = this.getResponseProperty(\"IntegrationKey\");\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\n\nexport class TwoFactorEmailResponse extends BaseResponse {\n enabled: boolean;\n email: string;\n\n constructor(response: any) {\n super(response);\n this.enabled = this.getResponseProperty(\"Enabled\");\n this.email = this.getResponseProperty(\"Email\");\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\nimport { TwoFactorProviderType } from \"../../enums/two-factor-provider-type\";\n\nexport class TwoFactorProviderResponse extends BaseResponse {\n enabled: boolean;\n type: TwoFactorProviderType;\n\n constructor(response: any) {\n super(response);\n this.enabled = this.getResponseProperty(\"Enabled\");\n this.type = this.getResponseProperty(\"Type\");\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\n\nexport class TwoFactorRecoverResponse extends BaseResponse {\n code: string;\n\n constructor(response: any) {\n super(response);\n this.code = this.getResponseProperty(\"Code\");\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\n\nexport class TwoFactorYubiKeyResponse extends BaseResponse {\n enabled: boolean;\n key1: string;\n key2: string;\n key3: string;\n key4: string;\n key5: string;\n nfc: boolean;\n\n constructor(response: any) {\n super(response);\n this.enabled = this.getResponseProperty(\"Enabled\");\n this.key1 = this.getResponseProperty(\"Key1\");\n this.key2 = this.getResponseProperty(\"Key2\");\n this.key3 = this.getResponseProperty(\"Key3\");\n this.key4 = this.getResponseProperty(\"Key4\");\n this.key5 = this.getResponseProperty(\"Key5\");\n this.nfc = this.getResponseProperty(\"Nfc\");\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\n\nimport { BillingInvoiceResponse, BillingTransactionResponse } from \"./billing.response\";\n\nexport class BillingHistoryResponse extends BaseResponse {\n invoices: BillingInvoiceResponse[] = [];\n transactions: BillingTransactionResponse[] = [];\n\n constructor(response: any) {\n super(response);\n const transactions = this.getResponseProperty(\"Transactions\");\n const invoices = this.getResponseProperty(\"Invoices\");\n if (transactions != null) {\n this.transactions = transactions.map((t: any) => new BillingTransactionResponse(t));\n }\n if (invoices != null) {\n this.invoices = invoices.map((i: any) => new BillingInvoiceResponse(i));\n }\n }\n\n get hasNoHistory() {\n return this.invoices.length == 0 && this.transactions.length == 0;\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\n\nimport { BillingSourceResponse } from \"./billing.response\";\n\nexport class BillingPaymentResponse extends BaseResponse {\n balance: number;\n paymentSource: BillingSourceResponse;\n\n constructor(response: any) {\n super(response);\n this.balance = this.getResponseProperty(\"Balance\");\n const paymentSource = this.getResponseProperty(\"PaymentSource\");\n this.paymentSource = paymentSource == null ? null : new BillingSourceResponse(paymentSource);\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\n\nexport class TaxRateResponse extends BaseResponse {\n id: string;\n country: string;\n state: string;\n postalCode: string;\n rate: number;\n\n constructor(response: any) {\n super(response);\n this.id = this.getResponseProperty(\"Id\");\n this.country = this.getResponseProperty(\"Country\");\n this.state = this.getResponseProperty(\"State\");\n this.postalCode = this.getResponseProperty(\"PostalCode\");\n this.rate = this.getResponseProperty(\"Rate\");\n }\n}\n","export class CollectionBulkDeleteRequest {\n ids: string[];\n\n constructor(ids: string[]) {\n this.ids = ids == null ? [] : ids;\n }\n}\n","import { BaseResponse } from \"./base.response\";\n\nexport class BreachAccountResponse extends BaseResponse {\n addedDate: string;\n breachDate: string;\n dataClasses: string[];\n description: string;\n domain: string;\n isActive: boolean;\n isVerified: boolean;\n logoPath: string;\n modifiedDate: string;\n name: string;\n pwnCount: number;\n title: string;\n\n constructor(response: any) {\n super(response);\n this.addedDate = this.getResponseProperty(\"AddedDate\");\n this.breachDate = this.getResponseProperty(\"BreachDate\");\n this.dataClasses = this.getResponseProperty(\"DataClasses\");\n this.description = this.getResponseProperty(\"Description\");\n this.domain = this.getResponseProperty(\"Domain\");\n this.isActive = this.getResponseProperty(\"IsActive\");\n this.isVerified = this.getResponseProperty(\"IsVerified\");\n this.logoPath = this.getResponseProperty(\"LogoPath\");\n this.modifiedDate = this.getResponseProperty(\"ModifiedDate\");\n this.name = this.getResponseProperty(\"Name\");\n this.pwnCount = this.getResponseProperty(\"PwnCount\");\n this.title = this.getResponseProperty(\"Title\");\n }\n}\n","import { BaseResponse } from \"./base.response\";\n\nexport class GlobalDomainResponse extends BaseResponse {\n type: number;\n domains: string[];\n excluded: boolean;\n\n constructor(response: any) {\n super(response);\n this.type = this.getResponseProperty(\"Type\");\n this.domains = this.getResponseProperty(\"Domains\");\n this.excluded = this.getResponseProperty(\"Excluded\");\n }\n}\n","import { BaseResponse } from \"./base.response\";\nimport { GlobalDomainResponse } from \"./global-domain.response\";\n\nexport class DomainsResponse extends BaseResponse {\n equivalentDomains: string[][];\n globalEquivalentDomains: GlobalDomainResponse[] = [];\n\n constructor(response: any) {\n super(response);\n this.equivalentDomains = this.getResponseProperty(\"EquivalentDomains\");\n const globalEquivalentDomains = this.getResponseProperty(\"GlobalEquivalentDomains\");\n if (globalEquivalentDomains != null) {\n this.globalEquivalentDomains = globalEquivalentDomains.map(\n (d: any) => new GlobalDomainResponse(d),\n );\n } else {\n this.globalEquivalentDomains = [];\n }\n }\n}\n","import { BaseResponse } from \"./base.response\";\n\nexport class UserKeyResponse extends BaseResponse {\n userId: string;\n publicKey: string;\n\n constructor(response: any) {\n super(response);\n this.userId = this.getResponseProperty(\"UserId\");\n this.publicKey = this.getResponseProperty(\"PublicKey\");\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\nimport { FileUploadType } from \"../../../platform/enums\";\n\nimport { CipherResponse } from \"./cipher.response\";\n\nexport class AttachmentUploadDataResponse extends BaseResponse {\n attachmentId: string;\n fileUploadType: FileUploadType;\n cipherResponse: CipherResponse;\n cipherMiniResponse: CipherResponse;\n url: string = null;\n constructor(response: any) {\n super(response);\n this.attachmentId = this.getResponseProperty(\"AttachmentId\");\n this.fileUploadType = this.getResponseProperty(\"FileUploadType\");\n const cipherResponse = this.getResponseProperty(\"CipherResponse\");\n const cipherMiniResponse = this.getResponseProperty(\"CipherMiniResponse\");\n this.cipherResponse = cipherResponse == null ? null : new CipherResponse(cipherResponse);\n this.cipherMiniResponse =\n cipherMiniResponse == null ? null : new CipherResponse(cipherMiniResponse);\n this.url = this.getResponseProperty(\"Url\");\n }\n}\n","import { BaseResponse } from \"../../../../models/response/base.response\";\n\nexport class SendFileApi extends BaseResponse {\n id: string;\n fileName: string;\n size: string;\n sizeName: string;\n\n constructor(data: any = null) {\n super(data);\n if (data == null) {\n return;\n }\n this.id = this.getResponseProperty(\"Id\");\n this.fileName = this.getResponseProperty(\"FileName\");\n this.size = this.getResponseProperty(\"Size\");\n this.sizeName = this.getResponseProperty(\"SizeName\");\n }\n}\n","import { BaseResponse } from \"../../../../models/response/base.response\";\n\nexport class SendTextApi extends BaseResponse {\n text: string;\n hidden: boolean;\n\n constructor(data: any = null) {\n super(data);\n if (data == null) {\n return;\n }\n this.text = this.getResponseProperty(\"Text\");\n this.hidden = this.getResponseProperty(\"Hidden\") || false;\n }\n}\n","import { BaseResponse } from \"../../../../models/response/base.response\";\nimport { SendType } from \"../../enums/send-type\";\nimport { SendFileApi } from \"../api/send-file.api\";\nimport { SendTextApi } from \"../api/send-text.api\";\n\nexport class SendResponse extends BaseResponse {\n id: string;\n accessId: string;\n type: SendType;\n name: string;\n notes: string;\n file: SendFileApi;\n text: SendTextApi;\n key: string;\n maxAccessCount?: number;\n accessCount: number;\n revisionDate: string;\n expirationDate: string;\n deletionDate: string;\n password: string;\n disable: boolean;\n hideEmail: boolean;\n\n constructor(response: any) {\n super(response);\n this.id = this.getResponseProperty(\"Id\");\n this.accessId = this.getResponseProperty(\"AccessId\");\n this.type = this.getResponseProperty(\"Type\");\n this.name = this.getResponseProperty(\"Name\");\n this.notes = this.getResponseProperty(\"Notes\");\n this.key = this.getResponseProperty(\"Key\");\n this.maxAccessCount = this.getResponseProperty(\"MaxAccessCount\");\n this.accessCount = this.getResponseProperty(\"AccessCount\");\n this.revisionDate = this.getResponseProperty(\"RevisionDate\");\n this.expirationDate = this.getResponseProperty(\"ExpirationDate\");\n this.deletionDate = this.getResponseProperty(\"DeletionDate\");\n this.password = this.getResponseProperty(\"Password\");\n this.disable = this.getResponseProperty(\"Disabled\") || false;\n this.hideEmail = this.getResponseProperty(\"HideEmail\") || false;\n\n const text = this.getResponseProperty(\"Text\");\n if (text != null) {\n this.text = new SendTextApi(text);\n }\n\n const file = this.getResponseProperty(\"File\");\n if (file != null) {\n this.file = new SendFileApi(file);\n }\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\n\nexport class FolderResponse extends BaseResponse {\n id: string;\n name: string;\n revisionDate: string;\n\n constructor(response: any) {\n super(response);\n this.id = this.getResponseProperty(\"Id\");\n this.name = this.getResponseProperty(\"Name\");\n this.revisionDate = this.getResponseProperty(\"RevisionDate\");\n }\n}\n","import { PolicyResponse } from \"../../../admin-console/models/response/policy.response\";\nimport { BaseResponse } from \"../../../models/response/base.response\";\nimport { DomainsResponse } from \"../../../models/response/domains.response\";\nimport { ProfileResponse } from \"../../../models/response/profile.response\";\nimport { SendResponse } from \"../../../tools/send/models/response/send.response\";\n\nimport { CipherResponse } from \"./cipher.response\";\nimport { CollectionDetailsResponse } from \"./collection.response\";\nimport { FolderResponse } from \"./folder.response\";\n\nexport class SyncResponse extends BaseResponse {\n profile?: ProfileResponse;\n folders: FolderResponse[] = [];\n collections: CollectionDetailsResponse[] = [];\n ciphers: CipherResponse[] = [];\n domains?: DomainsResponse;\n policies?: PolicyResponse[] = [];\n sends: SendResponse[] = [];\n\n constructor(response: any) {\n super(response);\n\n const profile = this.getResponseProperty(\"Profile\");\n if (profile != null) {\n this.profile = new ProfileResponse(profile);\n }\n\n const folders = this.getResponseProperty(\"Folders\");\n if (folders != null) {\n this.folders = folders.map((f: any) => new FolderResponse(f));\n }\n\n const collections = this.getResponseProperty(\"Collections\");\n if (collections != null) {\n this.collections = collections.map((c: any) => new CollectionDetailsResponse(c));\n }\n\n const ciphers = this.getResponseProperty(\"Ciphers\");\n if (ciphers != null) {\n this.ciphers = ciphers.map((c: any) => new CipherResponse(c));\n }\n\n const domains = this.getResponseProperty(\"Domains\");\n if (domains != null) {\n this.domains = new DomainsResponse(domains);\n }\n\n const policies = this.getResponseProperty(\"Policies\");\n if (policies != null) {\n this.policies = policies.map((p: any) => new PolicyResponse(p));\n }\n\n const sends = this.getResponseProperty(\"Sends\");\n if (sends != null) {\n this.sends = sends.map((s: any) => new SendResponse(s));\n }\n }\n}\n","import { ApiService } from \"../abstractions/api.service\";\nimport { AuditService as AuditServiceAbstraction } from \"../abstractions/audit.service\";\nimport { BreachAccountResponse } from \"../models/response/breach-account.response\";\nimport { ErrorResponse } from \"../models/response/error.response\";\nimport { CryptoFunctionService } from \"../platform/abstractions/crypto-function.service\";\nimport { throttle } from \"../platform/misc/throttle\";\nimport { Utils } from \"../platform/misc/utils\";\n\nconst PwnedPasswordsApi = \"https://api.pwnedpasswords.com/range/\";\n\nexport class AuditService implements AuditServiceAbstraction {\n constructor(\n private cryptoFunctionService: CryptoFunctionService,\n private apiService: ApiService,\n ) {}\n\n @throttle(100, () => \"passwordLeaked\")\n async passwordLeaked(password: string): Promise {\n const hashBytes = await this.cryptoFunctionService.hash(password, \"sha1\");\n const hash = Utils.fromBufferToHex(hashBytes).toUpperCase();\n const hashStart = hash.substr(0, 5);\n const hashEnding = hash.substr(5);\n\n const response = await this.apiService.nativeFetch(new Request(PwnedPasswordsApi + hashStart));\n const leakedHashes = await response.text();\n const match = leakedHashes.split(/\\r?\\n/).find((v) => {\n return v.split(\":\")[0] === hashEnding;\n });\n\n return match != null ? parseInt(match.split(\":\")[1], 10) : 0;\n }\n\n async breachedAccounts(username: string): Promise {\n try {\n return await this.apiService.getHibpBreach(username);\n } catch (e) {\n const error = e as ErrorResponse;\n if (error.statusCode === 404) {\n return [];\n }\n throw new Error();\n }\n }\n}\n","/**\n * Use as a Decorator on async functions, it will limit how many times the function can be\n * in-flight at a time.\n *\n * Calls beyond the limit will be queued, and run when one of the active calls finishes\n */\nexport function throttle(limit: number, throttleKey: (args: any[]) => string) {\n return (\n target: any,\n propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<(...args: any[]) => Promise>,\n ) => {\n const originalMethod: () => Promise = descriptor.value;\n const allThrottles = new Map void)[]>>();\n\n const getThrottles = (obj: any) => {\n let throttles = allThrottles.get(obj);\n if (throttles != null) {\n return throttles;\n }\n throttles = new Map void)[]>();\n allThrottles.set(obj, throttles);\n return throttles;\n };\n\n return {\n value: function (...args: any[]) {\n const throttles = getThrottles(this);\n const argsThrottleKey = throttleKey(args);\n let queue = throttles.get(argsThrottleKey);\n if (queue == null) {\n queue = [];\n throttles.set(argsThrottleKey, queue);\n }\n\n return new Promise((resolve, reject) => {\n const exec = () => {\n const onFinally = () => {\n queue.splice(queue.indexOf(exec), 1);\n if (queue.length >= limit) {\n queue[limit - 1]();\n } else if (queue.length === 0) {\n throttles.delete(argsThrottleKey);\n if (throttles.size === 0) {\n allThrottles.delete(this);\n }\n }\n };\n originalMethod\n .apply(this, args)\n .then((val: any) => {\n onFinally();\n return val;\n })\n .catch((err: any) => {\n onFinally();\n throw err;\n })\n .then(resolve, reject);\n };\n queue.push(exec);\n if (queue.length <= limit) {\n exec();\n }\n });\n },\n };\n };\n}\n","import { Jsonify } from \"type-fest\";\n\nimport { EventType } from \"../../enums\";\n\nexport class EventData {\n type: EventType;\n cipherId: string;\n date: string;\n organizationId: string;\n\n static fromJSON(obj: Jsonify): EventData {\n return Object.assign(new EventData(), obj);\n }\n}\n","import { EventData } from \"../../models/data/event.data\";\nimport { KeyDefinition, EVENT_COLLECTION_DISK } from \"../../platform/state\";\n\nexport const EVENT_COLLECTION: KeyDefinition = KeyDefinition.array(\n EVENT_COLLECTION_DISK,\n \"events\",\n {\n deserializer: (s) => EventData.fromJSON(s),\n },\n);\n","import { EventType } from \"../../enums\";\n\nexport class EventRequest {\n type: EventType;\n cipherId: string;\n date: string;\n organizationId: string;\n}\n","import * as lunr from \"lunr\";\n\nimport { SearchService as SearchServiceAbstraction } from \"../abstractions/search.service\";\nimport { UriMatchStrategy } from \"../models/domain/domain-service\";\nimport { I18nService } from \"../platform/abstractions/i18n.service\";\nimport { LogService } from \"../platform/abstractions/log.service\";\nimport { SendView } from \"../tools/send/models/view/send.view\";\nimport { FieldType } from \"../vault/enums\";\nimport { CipherType } from \"../vault/enums/cipher-type\";\nimport { CipherView } from \"../vault/models/view/cipher.view\";\n\nexport class SearchService implements SearchServiceAbstraction {\n private static registeredPipeline = false;\n\n indexedEntityId?: string = null;\n private indexing = false;\n private index: lunr.Index = null;\n private readonly immediateSearchLocales: string[] = [\"zh-CN\", \"zh-TW\", \"ja\", \"ko\", \"vi\"];\n private readonly defaultSearchableMinLength: number = 2;\n private searchableMinLength: number = this.defaultSearchableMinLength;\n\n constructor(\n private logService: LogService,\n private i18nService: I18nService,\n ) {\n this.i18nService.locale$.subscribe((locale) => {\n if (this.immediateSearchLocales.indexOf(locale) !== -1) {\n this.searchableMinLength = 1;\n } else {\n this.searchableMinLength = this.defaultSearchableMinLength;\n }\n });\n\n // Currently have to ensure this is only done a single time. Lunr allows you to register a function\n // multiple times but they will add a warning message to the console. The way they do that breaks when ran on a service worker.\n if (!SearchService.registeredPipeline) {\n SearchService.registeredPipeline = true;\n //register lunr pipeline function\n lunr.Pipeline.registerFunction(this.normalizeAccentsPipelineFunction, \"normalizeAccents\");\n }\n }\n\n clearIndex(): void {\n this.indexedEntityId = null;\n this.index = null;\n }\n\n isSearchable(query: string): boolean {\n query = SearchService.normalizeSearchQuery(query);\n const notSearchable =\n query == null ||\n (this.index == null && query.length < this.searchableMinLength) ||\n (this.index != null && query.length < this.searchableMinLength && query.indexOf(\">\") !== 0);\n return !notSearchable;\n }\n\n indexCiphers(ciphers: CipherView[], indexedEntityId?: string): void {\n if (this.indexing) {\n return;\n }\n\n this.indexing = true;\n this.indexedEntityId = indexedEntityId;\n this.index = null;\n const builder = new lunr.Builder();\n builder.pipeline.add(this.normalizeAccentsPipelineFunction);\n builder.ref(\"id\");\n builder.field(\"shortid\", { boost: 100, extractor: (c: CipherView) => c.id.substr(0, 8) });\n builder.field(\"name\", {\n boost: 10,\n });\n builder.field(\"subtitle\", {\n boost: 5,\n extractor: (c: CipherView) => {\n if (c.subTitle != null && c.type === CipherType.Card) {\n return c.subTitle.replace(/\\*/g, \"\");\n }\n return c.subTitle;\n },\n });\n builder.field(\"notes\");\n builder.field(\"login.username\", {\n extractor: (c: CipherView) =>\n c.type === CipherType.Login && c.login != null ? c.login.username : null,\n });\n builder.field(\"login.uris\", { boost: 2, extractor: (c: CipherView) => this.uriExtractor(c) });\n builder.field(\"fields\", { extractor: (c: CipherView) => this.fieldExtractor(c, false) });\n builder.field(\"fields_joined\", { extractor: (c: CipherView) => this.fieldExtractor(c, true) });\n builder.field(\"attachments\", {\n extractor: (c: CipherView) => this.attachmentExtractor(c, false),\n });\n builder.field(\"attachments_joined\", {\n extractor: (c: CipherView) => this.attachmentExtractor(c, true),\n });\n builder.field(\"organizationid\", { extractor: (c: CipherView) => c.organizationId });\n ciphers = ciphers || [];\n ciphers.forEach((c) => builder.add(c));\n this.index = builder.build();\n\n this.indexing = false;\n\n this.logService.info(\"Finished search indexing\");\n }\n\n async searchCiphers(\n query: string,\n filter: ((cipher: CipherView) => boolean) | ((cipher: CipherView) => boolean)[] = null,\n ciphers: CipherView[],\n ): Promise {\n const results: CipherView[] = [];\n if (query != null) {\n query = SearchService.normalizeSearchQuery(query.trim().toLowerCase());\n }\n if (query === \"\") {\n query = null;\n }\n\n if (ciphers == null) {\n ciphers = [];\n }\n\n if (filter != null && Array.isArray(filter) && filter.length > 0) {\n ciphers = ciphers.filter((c) => filter.every((f) => f == null || f(c)));\n } else if (filter != null) {\n ciphers = ciphers.filter(filter as (cipher: CipherView) => boolean);\n }\n\n if (!this.isSearchable(query)) {\n return ciphers;\n }\n\n if (this.indexing) {\n await new Promise((r) => setTimeout(r, 250));\n if (this.indexing) {\n await new Promise((r) => setTimeout(r, 500));\n }\n }\n\n const index = this.getIndexForSearch();\n if (index == null) {\n // Fall back to basic search if index is not available\n return this.searchCiphersBasic(ciphers, query);\n }\n\n const ciphersMap = new Map();\n ciphers.forEach((c) => ciphersMap.set(c.id, c));\n\n let searchResults: lunr.Index.Result[] = null;\n const isQueryString = query != null && query.length > 1 && query.indexOf(\">\") === 0;\n if (isQueryString) {\n try {\n searchResults = index.search(query.substr(1).trim());\n } catch (e) {\n this.logService.error(e);\n }\n } else {\n const soWild = lunr.Query.wildcard.LEADING | lunr.Query.wildcard.TRAILING;\n searchResults = index.query((q) => {\n lunr.tokenizer(query).forEach((token) => {\n const t = token.toString();\n q.term(t, { fields: [\"name\"], wildcard: soWild });\n q.term(t, { fields: [\"subtitle\"], wildcard: soWild });\n q.term(t, { fields: [\"login.uris\"], wildcard: soWild });\n q.term(t, {});\n });\n });\n }\n\n if (searchResults != null) {\n searchResults.forEach((r) => {\n if (ciphersMap.has(r.ref)) {\n results.push(ciphersMap.get(r.ref));\n }\n });\n }\n return results;\n }\n\n searchCiphersBasic(ciphers: CipherView[], query: string, deleted = false) {\n query = SearchService.normalizeSearchQuery(query.trim().toLowerCase());\n return ciphers.filter((c) => {\n if (deleted !== c.isDeleted) {\n return false;\n }\n if (c.name != null && c.name.toLowerCase().indexOf(query) > -1) {\n return true;\n }\n if (query.length >= 8 && c.id.startsWith(query)) {\n return true;\n }\n if (c.subTitle != null && c.subTitle.toLowerCase().indexOf(query) > -1) {\n return true;\n }\n if (\n c.login &&\n c.login.hasUris &&\n c.login.uris.some((loginUri) => loginUri?.uri?.toLowerCase().indexOf(query) > -1)\n ) {\n return true;\n }\n return false;\n });\n }\n\n searchSends(sends: SendView[], query: string) {\n query = SearchService.normalizeSearchQuery(query.trim().toLocaleLowerCase());\n if (query === null) {\n return sends;\n }\n const sendsMatched: SendView[] = [];\n const lowPriorityMatched: SendView[] = [];\n sends.forEach((s) => {\n if (s.name != null && s.name.toLowerCase().indexOf(query) > -1) {\n sendsMatched.push(s);\n } else if (\n query.length >= 8 &&\n (s.id.startsWith(query) ||\n s.accessId.toLocaleLowerCase().startsWith(query) ||\n (s.file?.id != null && s.file.id.startsWith(query)))\n ) {\n lowPriorityMatched.push(s);\n } else if (s.notes != null && s.notes.toLowerCase().indexOf(query) > -1) {\n lowPriorityMatched.push(s);\n } else if (s.text?.text != null && s.text.text.toLowerCase().indexOf(query) > -1) {\n lowPriorityMatched.push(s);\n } else if (s.file?.fileName != null && s.file.fileName.toLowerCase().indexOf(query) > -1) {\n lowPriorityMatched.push(s);\n }\n });\n return sendsMatched.concat(lowPriorityMatched);\n }\n\n getIndexForSearch(): lunr.Index {\n return this.index;\n }\n\n private fieldExtractor(c: CipherView, joined: boolean) {\n if (!c.hasFields) {\n return null;\n }\n let fields: string[] = [];\n c.fields.forEach((f) => {\n if (f.name != null) {\n fields.push(f.name);\n }\n if (f.type === FieldType.Text && f.value != null) {\n fields.push(f.value);\n }\n });\n fields = fields.filter((f) => f.trim() !== \"\");\n if (fields.length === 0) {\n return null;\n }\n return joined ? fields.join(\" \") : fields;\n }\n\n private attachmentExtractor(c: CipherView, joined: boolean) {\n if (!c.hasAttachments) {\n return null;\n }\n let attachments: string[] = [];\n c.attachments.forEach((a) => {\n if (a != null && a.fileName != null) {\n if (joined && a.fileName.indexOf(\".\") > -1) {\n attachments.push(a.fileName.substr(0, a.fileName.lastIndexOf(\".\")));\n } else {\n attachments.push(a.fileName);\n }\n }\n });\n attachments = attachments.filter((f) => f.trim() !== \"\");\n if (attachments.length === 0) {\n return null;\n }\n return joined ? attachments.join(\" \") : attachments;\n }\n\n private uriExtractor(c: CipherView) {\n if (c.type !== CipherType.Login || c.login == null || !c.login.hasUris) {\n return null;\n }\n const uris: string[] = [];\n c.login.uris.forEach((u) => {\n if (u.uri == null || u.uri === \"\") {\n return;\n }\n if (u.hostname != null) {\n uris.push(u.hostname);\n return;\n }\n let uri = u.uri;\n if (u.match !== UriMatchStrategy.RegularExpression) {\n const protocolIndex = uri.indexOf(\"://\");\n if (protocolIndex > -1) {\n uri = uri.substr(protocolIndex + 3);\n }\n const queryIndex = uri.search(/\\?|&|#/);\n if (queryIndex > -1) {\n uri = uri.substring(0, queryIndex);\n }\n }\n uris.push(uri);\n });\n return uris.length > 0 ? uris : null;\n }\n\n private normalizeAccentsPipelineFunction(token: lunr.Token): any {\n const searchableFields = [\"name\", \"login.username\", \"subtitle\", \"notes\"];\n const fields = (token as any).metadata[\"fields\"];\n const checkFields = fields.every((i: any) => searchableFields.includes(i));\n\n if (checkFields) {\n return SearchService.normalizeSearchQuery(token.toString());\n }\n\n return token;\n }\n\n // Remove accents/diacritics characters from text. This regex is equivalent to the Diacritic unicode property escape, i.e. it will match all diacritic characters.\n static normalizeSearchQuery(query: string): string {\n return query?.normalize(\"NFD\").replace(/[\\u0300-\\u036f]/g, \"\");\n }\n}\n","import { firstValueFrom, timeout } from \"rxjs\";\n\nimport { SearchService } from \"../../abstractions/search.service\";\nimport { VaultTimeoutSettingsService } from \"../../abstractions/vault-timeout/vault-timeout-settings.service\";\nimport { VaultTimeoutService as VaultTimeoutServiceAbstraction } from \"../../abstractions/vault-timeout/vault-timeout.service\";\nimport { AuthService } from \"../../auth/abstractions/auth.service\";\nimport { AuthenticationStatus } from \"../../auth/enums/authentication-status\";\nimport { ClientType } from \"../../enums\";\nimport { VaultTimeoutAction } from \"../../enums/vault-timeout-action.enum\";\nimport { CryptoService } from \"../../platform/abstractions/crypto.service\";\nimport { MessagingService } from \"../../platform/abstractions/messaging.service\";\nimport { PlatformUtilsService } from \"../../platform/abstractions/platform-utils.service\";\nimport { StateService } from \"../../platform/abstractions/state.service\";\nimport { StateEventRunnerService } from \"../../platform/state\";\nimport { UserId } from \"../../types/guid\";\nimport { CipherService } from \"../../vault/abstractions/cipher.service\";\nimport { CollectionService } from \"../../vault/abstractions/collection.service\";\nimport { FolderService } from \"../../vault/abstractions/folder/folder.service.abstraction\";\n\nexport class VaultTimeoutService implements VaultTimeoutServiceAbstraction {\n private inited = false;\n\n constructor(\n private cipherService: CipherService,\n private folderService: FolderService,\n private collectionService: CollectionService,\n private cryptoService: CryptoService,\n protected platformUtilsService: PlatformUtilsService,\n private messagingService: MessagingService,\n private searchService: SearchService,\n private stateService: StateService,\n private authService: AuthService,\n private vaultTimeoutSettingsService: VaultTimeoutSettingsService,\n private stateEventRunnerService: StateEventRunnerService,\n private lockedCallback: (userId?: string) => Promise = null,\n private loggedOutCallback: (expired: boolean, userId?: string) => Promise = null,\n ) {}\n\n async init(checkOnInterval: boolean) {\n if (this.inited) {\n return;\n }\n // TODO: Remove after 2023.10 release (https://bitwarden.atlassian.net/browse/PM-3483)\n await this.migrateKeyForNeverLockIfNeeded();\n\n this.inited = true;\n if (checkOnInterval) {\n this.startCheck();\n }\n }\n\n startCheck() {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.checkVaultTimeout();\n setInterval(() => this.checkVaultTimeout(), 10 * 1000); // check every 10 seconds\n }\n\n async checkVaultTimeout(): Promise {\n // Get whether or not the view is open a single time so it can be compared for each user\n const isViewOpen = await this.platformUtilsService.isViewOpen();\n\n const activeUserId = await firstValueFrom(this.stateService.activeAccount$.pipe(timeout(500)));\n\n const accounts = await firstValueFrom(this.stateService.accounts$);\n for (const userId in accounts) {\n if (userId != null && (await this.shouldLock(userId, activeUserId, isViewOpen))) {\n await this.executeTimeoutAction(userId);\n }\n }\n }\n\n async lock(userId?: string): Promise {\n const authed = await this.stateService.getIsAuthenticated({ userId: userId });\n if (!authed) {\n return;\n }\n\n const availableActions = await firstValueFrom(\n this.vaultTimeoutSettingsService.availableVaultTimeoutActions$(userId),\n );\n const supportsLock = availableActions.includes(VaultTimeoutAction.Lock);\n if (!supportsLock) {\n await this.logOut(userId);\n }\n\n const currentUserId = await this.stateService.getUserId();\n\n if (userId == null || userId === currentUserId) {\n this.searchService.clearIndex();\n await this.folderService.clearCache();\n await this.collectionService.clearActiveUserCache();\n }\n\n await this.stateService.setEverBeenUnlocked(true, { userId: userId });\n await this.stateService.setUserKeyAutoUnlock(null, { userId: userId });\n await this.stateService.setCryptoMasterKeyAuto(null, { userId: userId });\n\n await this.cryptoService.clearUserKey(false, userId);\n await this.cryptoService.clearMasterKey(userId);\n await this.cryptoService.clearOrgKeys(true, userId);\n await this.cryptoService.clearKeyPair(true, userId);\n\n await this.cipherService.clearCache(userId);\n\n await this.stateEventRunnerService.handleEvent(\"lock\", (userId ?? currentUserId) as UserId);\n\n // FIXME: We should send the userId of the user that was locked, in the case of this method being passed\n // undefined then it should give back the currentUserId. Better yet, this method shouldn't take\n // an undefined userId at all. All receivers need to be checked for how they handle getting undefined.\n this.messagingService.send(\"locked\", { userId: userId });\n\n if (this.lockedCallback != null) {\n await this.lockedCallback(userId);\n }\n }\n\n async logOut(userId?: string): Promise {\n if (this.loggedOutCallback != null) {\n await this.loggedOutCallback(false, userId);\n }\n }\n\n private async shouldLock(\n userId: string,\n activeUserId: string,\n isViewOpen: boolean,\n ): Promise {\n if (isViewOpen && userId === activeUserId) {\n // We know a view is open and this is the currently active user\n // which means they are likely looking at their vault\n // and they should not lock.\n return false;\n }\n\n const authStatus = await this.authService.getAuthStatus(userId);\n if (\n authStatus === AuthenticationStatus.Locked ||\n authStatus === AuthenticationStatus.LoggedOut\n ) {\n return false;\n }\n\n const vaultTimeout = await this.vaultTimeoutSettingsService.getVaultTimeout(userId);\n if (vaultTimeout == null || vaultTimeout < 0) {\n return false;\n }\n\n const lastActive = await this.stateService.getLastActive({ userId: userId });\n if (lastActive == null) {\n return false;\n }\n\n const vaultTimeoutSeconds = vaultTimeout * 60;\n const diffSeconds = (new Date().getTime() - lastActive) / 1000;\n return diffSeconds >= vaultTimeoutSeconds;\n }\n\n private async executeTimeoutAction(userId: string): Promise {\n const timeoutAction = await firstValueFrom(\n this.vaultTimeoutSettingsService.vaultTimeoutAction$(userId),\n );\n timeoutAction === VaultTimeoutAction.LogOut\n ? await this.logOut(userId)\n : await this.lock(userId);\n }\n\n private async migrateKeyForNeverLockIfNeeded(): Promise {\n // Web can't set vault timeout to never\n if (this.platformUtilsService.getClientType() == ClientType.Web) {\n return;\n }\n const accounts = await firstValueFrom(this.stateService.accounts$);\n for (const userId in accounts) {\n if (userId != null) {\n await this.cryptoService.migrateAutoKeyIfNeeded(userId);\n // Legacy users should be logged out since we're not on the web vault and can't migrate.\n if (await this.cryptoService.isLegacyUser(null, userId)) {\n await this.logOut(userId);\n }\n }\n }\n }\n}\n","import { SendType } from \"../../enums/send-type\";\nimport { SendFileApi } from \"../api/send-file.api\";\nimport { SendTextApi } from \"../api/send-text.api\";\nimport { Send } from \"../domain/send\";\n\nexport class SendRequest {\n type: SendType;\n fileLength?: number;\n name: string;\n notes: string;\n key: string;\n maxAccessCount?: number;\n expirationDate: string;\n deletionDate: string;\n text: SendTextApi;\n file: SendFileApi;\n password: string;\n disabled: boolean;\n hideEmail: boolean;\n\n constructor(send: Send, fileLength?: number) {\n this.type = send.type;\n this.fileLength = fileLength;\n this.name = send.name ? send.name.encryptedString : null;\n this.notes = send.notes ? send.notes.encryptedString : null;\n this.maxAccessCount = send.maxAccessCount;\n this.expirationDate = send.expirationDate != null ? send.expirationDate.toISOString() : null;\n this.deletionDate = send.deletionDate != null ? send.deletionDate.toISOString() : null;\n this.key = send.key != null ? send.key.encryptedString : null;\n this.password = send.password;\n this.disabled = send.disabled;\n this.hideEmail = send.hideEmail;\n\n switch (this.type) {\n case SendType.Text:\n this.text = new SendTextApi();\n this.text.text = send.text.text != null ? send.text.text.encryptedString : null;\n this.text.hidden = send.text.hidden;\n break;\n case SendType.File:\n this.file = new SendFileApi();\n this.file.fileName = send.file.fileName != null ? send.file.fileName.encryptedString : null;\n break;\n default:\n break;\n }\n }\n}\n","import { BaseResponse } from \"../../../../models/response/base.response\";\nimport { SendType } from \"../../enums/send-type\";\nimport { SendFileApi } from \"../api/send-file.api\";\nimport { SendTextApi } from \"../api/send-text.api\";\n\nexport class SendAccessResponse extends BaseResponse {\n id: string;\n type: SendType;\n name: string;\n file: SendFileApi;\n text: SendTextApi;\n expirationDate: Date;\n creatorIdentifier: string;\n\n constructor(response: any) {\n super(response);\n this.id = this.getResponseProperty(\"Id\");\n this.type = this.getResponseProperty(\"Type\");\n this.name = this.getResponseProperty(\"Name\");\n\n const text = this.getResponseProperty(\"Text\");\n if (text != null) {\n this.text = new SendTextApi(text);\n }\n\n const file = this.getResponseProperty(\"File\");\n if (file != null) {\n this.file = new SendFileApi(file);\n }\n\n this.expirationDate = this.getResponseProperty(\"ExpirationDate\");\n this.creatorIdentifier = this.getResponseProperty(\"CreatorIdentifier\");\n }\n}\n","import { BaseResponse } from \"../../../../models/response/base.response\";\n\nexport class SendFileDownloadDataResponse extends BaseResponse {\n id: string = null;\n url: string = null;\n constructor(response: any) {\n super(response);\n this.id = this.getResponseProperty(\"Id\");\n this.url = this.getResponseProperty(\"Url\");\n }\n}\n","import { BaseResponse } from \"../../../../models/response/base.response\";\nimport { FileUploadType } from \"../../../../platform/enums\";\n\nimport { SendResponse } from \"./send.response\";\n\nexport class SendFileUploadDataResponse extends BaseResponse {\n fileUploadType: FileUploadType;\n sendResponse: SendResponse;\n url: string = null;\n constructor(response: any) {\n super(response);\n this.fileUploadType = this.getResponseProperty(\"FileUploadType\");\n const sendResponse = this.getResponseProperty(\"SendResponse\");\n this.sendResponse = sendResponse == null ? null : new SendResponse(sendResponse);\n this.url = this.getResponseProperty(\"Url\");\n }\n}\n","import { Send } from \"../domain/send\";\n\nimport { SendRequest } from \"./send.request\";\n\nexport class SendWithIdRequest extends SendRequest {\n id: string;\n\n constructor(send: Send) {\n super(send);\n this.id = send.id;\n }\n}\n","import { EncArrayBuffer } from \"../../../platform/models/domain/enc-array-buffer\";\nimport { EncString } from \"../../../platform/models/domain/enc-string\";\nimport { SymmetricCryptoKey } from \"../../../platform/models/domain/symmetric-crypto-key\";\nimport { Cipher } from \"../../models/domain/cipher\";\nimport { CipherResponse } from \"../../models/response/cipher.response\";\n\nexport abstract class CipherFileUploadService {\n upload: (\n cipher: Cipher,\n encFileName: EncString,\n encData: EncArrayBuffer,\n admin: boolean,\n dataEncKey: [SymmetricCryptoKey, EncString],\n ) => Promise;\n}\n","import { CipherView } from \"../view/cipher.view\";\n\nconst CacheTTL = 3000;\n\nexport class SortedCiphersCache {\n private readonly sortedCiphersByUrl: Map = new Map();\n private readonly timeouts: Map = new Map();\n\n constructor(private readonly comparator: (a: CipherView, b: CipherView) => number) {}\n\n isCached(url: string) {\n return this.sortedCiphersByUrl.has(url);\n }\n\n addCiphers(url: string, ciphers: CipherView[]) {\n ciphers.sort(this.comparator);\n this.sortedCiphersByUrl.set(url, new Ciphers(ciphers));\n this.resetTimer(url);\n }\n\n getLastUsed(url: string) {\n this.resetTimer(url);\n return this.isCached(url) ? this.sortedCiphersByUrl.get(url).getLastUsed() : null;\n }\n\n getLastLaunched(url: string) {\n return this.isCached(url) ? this.sortedCiphersByUrl.get(url).getLastLaunched() : null;\n }\n\n getNext(url: string) {\n this.resetTimer(url);\n return this.isCached(url) ? this.sortedCiphersByUrl.get(url).getNext() : null;\n }\n\n updateLastUsedIndex(url: string) {\n if (this.isCached(url)) {\n this.sortedCiphersByUrl.get(url).updateLastUsedIndex();\n }\n }\n\n clear() {\n this.sortedCiphersByUrl.clear();\n this.timeouts.clear();\n }\n\n private resetTimer(url: string) {\n clearTimeout(this.timeouts.get(url));\n this.timeouts.set(\n url,\n setTimeout(() => {\n this.sortedCiphersByUrl.delete(url);\n this.timeouts.delete(url);\n }, CacheTTL),\n );\n }\n}\n\nclass Ciphers {\n lastUsedIndex = -1;\n\n constructor(private readonly ciphers: CipherView[]) {}\n\n getLastUsed() {\n this.lastUsedIndex = Math.max(this.lastUsedIndex, 0);\n return this.ciphers[this.lastUsedIndex];\n }\n\n getLastLaunched() {\n const usedCiphers = this.ciphers.filter((cipher) => cipher.localData?.lastLaunched);\n const sortedCiphers = usedCiphers.sort(\n (x, y) => y.localData.lastLaunched.valueOf() - x.localData.lastLaunched.valueOf(),\n );\n return sortedCiphers[0];\n }\n\n getNextIndex() {\n return (this.lastUsedIndex + 1) % this.ciphers.length;\n }\n\n getNext() {\n return this.ciphers[this.getNextIndex()];\n }\n\n updateLastUsedIndex() {\n this.lastUsedIndex = this.getNextIndex();\n }\n}\n","export class CipherBulkMoveRequest {\n ids: string[];\n folderId: string;\n\n constructor(ids: string[], folderId: string) {\n this.ids = ids == null ? [] : ids;\n this.folderId = folderId;\n }\n}\n","export class CipherBulkRestoreRequest {\n ids: string[];\n organizationId: string;\n\n constructor(ids: string[], organizationId?: string) {\n this.ids = ids == null ? [] : ids;\n this.organizationId = organizationId;\n }\n}\n","import { Cipher } from \"../domain/cipher\";\n\nimport { CipherWithIdRequest } from \"./cipher-with-id.request\";\n\nexport class CipherBulkShareRequest {\n ciphers: CipherWithIdRequest[];\n collectionIds: string[];\n\n constructor(ciphers: Cipher[], collectionIds: string[]) {\n if (ciphers != null) {\n this.ciphers = [];\n ciphers.forEach((c) => {\n this.ciphers.push(new CipherWithIdRequest(c));\n });\n }\n this.collectionIds = collectionIds;\n }\n}\n","import { CipherId, CollectionId, OrganizationId } from \"../../../types/guid\";\n\nexport class CipherBulkUpdateCollectionsRequest {\n organizationId: OrganizationId;\n cipherIds: CipherId[];\n collectionIds: CollectionId[];\n removeCollections: boolean;\n constructor(\n organizationId: OrganizationId,\n cipherIds: CipherId[],\n collectionIds: CollectionId[],\n removeCollections: boolean = false,\n ) {\n this.organizationId = organizationId;\n this.cipherIds = cipherIds;\n this.collectionIds = collectionIds;\n this.removeCollections = removeCollections;\n }\n}\n","import { Cipher } from \"../domain/cipher\";\n\nimport { CipherRequest } from \"./cipher.request\";\n\nexport class CipherCreateRequest {\n cipher: CipherRequest;\n collectionIds: string[];\n\n constructor(cipher: Cipher) {\n this.cipher = new CipherRequest(cipher);\n this.collectionIds = cipher.collectionIds;\n }\n}\n","import { Cipher } from \"../domain/cipher\";\n\nexport class CipherPartialRequest {\n folderId: string;\n favorite: boolean;\n\n constructor(cipher: Cipher) {\n this.folderId = cipher.folderId;\n this.favorite = cipher.favorite;\n }\n}\n","import { Cipher } from \"../domain/cipher\";\n\nimport { CipherRequest } from \"./cipher.request\";\n\nexport class CipherShareRequest {\n cipher: CipherRequest;\n collectionIds: string[];\n\n constructor(cipher: Cipher) {\n this.cipher = new CipherRequest(cipher);\n this.collectionIds = cipher.collectionIds;\n }\n}\n","import { firstValueFrom } from \"rxjs\";\nimport { SemVer } from \"semver\";\n\nimport { ApiService } from \"../../abstractions/api.service\";\nimport { SearchService } from \"../../abstractions/search.service\";\nimport { AutofillSettingsServiceAbstraction } from \"../../autofill/services/autofill-settings.service\";\nimport { DomainSettingsService } from \"../../autofill/services/domain-settings.service\";\nimport { UriMatchStrategySetting } from \"../../models/domain/domain-service\";\nimport { ErrorResponse } from \"../../models/response/error.response\";\nimport { ListResponse } from \"../../models/response/list.response\";\nimport { View } from \"../../models/view/view\";\nimport { ConfigServiceAbstraction } from \"../../platform/abstractions/config/config.service.abstraction\";\nimport { CryptoService } from \"../../platform/abstractions/crypto.service\";\nimport { EncryptService } from \"../../platform/abstractions/encrypt.service\";\nimport { I18nService } from \"../../platform/abstractions/i18n.service\";\nimport { StateService } from \"../../platform/abstractions/state.service\";\nimport { flagEnabled } from \"../../platform/misc/flags\";\nimport { sequentialize } from \"../../platform/misc/sequentialize\";\nimport { Utils } from \"../../platform/misc/utils\";\nimport Domain from \"../../platform/models/domain/domain-base\";\nimport { EncArrayBuffer } from \"../../platform/models/domain/enc-array-buffer\";\nimport { EncString } from \"../../platform/models/domain/enc-string\";\nimport { SymmetricCryptoKey } from \"../../platform/models/domain/symmetric-crypto-key\";\nimport { CipherId, CollectionId, OrganizationId } from \"../../types/guid\";\nimport { OrgKey, UserKey } from \"../../types/key\";\nimport { CipherService as CipherServiceAbstraction } from \"../abstractions/cipher.service\";\nimport { CipherFileUploadService } from \"../abstractions/file-upload/cipher-file-upload.service\";\nimport { FieldType } from \"../enums\";\nimport { CipherType } from \"../enums/cipher-type\";\nimport { CipherData } from \"../models/data/cipher.data\";\nimport { Attachment } from \"../models/domain/attachment\";\nimport { Card } from \"../models/domain/card\";\nimport { Cipher } from \"../models/domain/cipher\";\nimport { Fido2Credential } from \"../models/domain/fido2-credential\";\nimport { Field } from \"../models/domain/field\";\nimport { Identity } from \"../models/domain/identity\";\nimport { Login } from \"../models/domain/login\";\nimport { LoginUri } from \"../models/domain/login-uri\";\nimport { Password } from \"../models/domain/password\";\nimport { SecureNote } from \"../models/domain/secure-note\";\nimport { SortedCiphersCache } from \"../models/domain/sorted-ciphers-cache\";\nimport { CipherBulkDeleteRequest } from \"../models/request/cipher-bulk-delete.request\";\nimport { CipherBulkMoveRequest } from \"../models/request/cipher-bulk-move.request\";\nimport { CipherBulkRestoreRequest } from \"../models/request/cipher-bulk-restore.request\";\nimport { CipherBulkShareRequest } from \"../models/request/cipher-bulk-share.request\";\nimport { CipherBulkUpdateCollectionsRequest } from \"../models/request/cipher-bulk-update-collections.request\";\nimport { CipherCollectionsRequest } from \"../models/request/cipher-collections.request\";\nimport { CipherCreateRequest } from \"../models/request/cipher-create.request\";\nimport { CipherPartialRequest } from \"../models/request/cipher-partial.request\";\nimport { CipherShareRequest } from \"../models/request/cipher-share.request\";\nimport { CipherRequest } from \"../models/request/cipher.request\";\nimport { CipherResponse } from \"../models/response/cipher.response\";\nimport { AttachmentView } from \"../models/view/attachment.view\";\nimport { CipherView } from \"../models/view/cipher.view\";\nimport { FieldView } from \"../models/view/field.view\";\nimport { PasswordHistoryView } from \"../models/view/password-history.view\";\n\nconst CIPHER_KEY_ENC_MIN_SERVER_VER = new SemVer(\"2024.2.0\");\n\nexport class CipherService implements CipherServiceAbstraction {\n private sortedCiphersCache: SortedCiphersCache = new SortedCiphersCache(\n this.sortCiphersByLastUsed,\n );\n\n constructor(\n private cryptoService: CryptoService,\n private domainSettingsService: DomainSettingsService,\n private apiService: ApiService,\n private i18nService: I18nService,\n private searchService: SearchService,\n private stateService: StateService,\n private autofillSettingsService: AutofillSettingsServiceAbstraction,\n private encryptService: EncryptService,\n private cipherFileUploadService: CipherFileUploadService,\n private configService: ConfigServiceAbstraction,\n ) {}\n\n async getDecryptedCipherCache(): Promise {\n const decryptedCiphers = await this.stateService.getDecryptedCiphers();\n return decryptedCiphers;\n }\n\n async setDecryptedCipherCache(value: CipherView[]) {\n // Sometimes we might prematurely decrypt the vault and that will result in no ciphers\n // if we cache it then we may accidentially return it when it's not right, we'd rather try decryption again.\n // We still want to set null though, that is the indicator that the cache isn't valid and we should do decryption.\n if (value == null || value.length !== 0) {\n await this.stateService.setDecryptedCiphers(value);\n }\n if (this.searchService != null) {\n if (value == null) {\n this.searchService.clearIndex();\n } else {\n this.searchService.indexCiphers(value);\n }\n }\n }\n\n async clearCache(userId?: string): Promise {\n await this.clearDecryptedCiphersState(userId);\n }\n\n async encrypt(\n model: CipherView,\n keyForEncryption?: SymmetricCryptoKey,\n keyForCipherKeyDecryption?: SymmetricCryptoKey,\n originalCipher: Cipher = null,\n ): Promise {\n if (model.id != null) {\n if (originalCipher == null) {\n originalCipher = await this.get(model.id);\n }\n if (originalCipher != null) {\n await this.updateModelfromExistingCipher(model, originalCipher);\n }\n this.adjustPasswordHistoryLength(model);\n }\n\n const cipher = new Cipher();\n cipher.id = model.id;\n cipher.folderId = model.folderId;\n cipher.favorite = model.favorite;\n cipher.organizationId = model.organizationId;\n cipher.type = model.type;\n cipher.collectionIds = model.collectionIds;\n cipher.revisionDate = model.revisionDate;\n cipher.reprompt = model.reprompt;\n cipher.edit = model.edit;\n\n if (await this.getCipherKeyEncryptionEnabled()) {\n cipher.key = originalCipher?.key ?? null;\n const userOrOrgKey = await this.getKeyForCipherKeyDecryption(cipher);\n // The keyForEncryption is only used for encrypting the cipher key, not the cipher itself, since cipher key encryption is enabled.\n // If the caller has provided a key for cipher key encryption, use it. Otherwise, use the user or org key.\n keyForEncryption ||= userOrOrgKey;\n // If the caller has provided a key for cipher key decryption, use it. Otherwise, use the user or org key.\n keyForCipherKeyDecryption ||= userOrOrgKey;\n return this.encryptCipherWithCipherKey(\n model,\n cipher,\n keyForEncryption,\n keyForCipherKeyDecryption,\n );\n } else {\n if (keyForEncryption == null && cipher.organizationId != null) {\n keyForEncryption = await this.cryptoService.getOrgKey(cipher.organizationId);\n if (keyForEncryption == null) {\n throw new Error(\"Cannot encrypt cipher for organization. No key.\");\n }\n }\n // We want to ensure that the cipher key is null if cipher key encryption is disabled\n // so that decryption uses the proper key.\n cipher.key = null;\n return this.encryptCipher(model, cipher, keyForEncryption);\n }\n }\n\n async encryptAttachments(\n attachmentsModel: AttachmentView[],\n key: SymmetricCryptoKey,\n ): Promise {\n if (attachmentsModel == null || attachmentsModel.length === 0) {\n return null;\n }\n\n const promises: Promise[] = [];\n const encAttachments: Attachment[] = [];\n attachmentsModel.forEach(async (model) => {\n const attachment = new Attachment();\n attachment.id = model.id;\n attachment.size = model.size;\n attachment.sizeName = model.sizeName;\n attachment.url = model.url;\n const promise = this.encryptObjProperty(\n model,\n attachment,\n {\n fileName: null,\n },\n key,\n ).then(async () => {\n if (model.key != null) {\n attachment.key = await this.cryptoService.encrypt(model.key.key, key);\n }\n encAttachments.push(attachment);\n });\n promises.push(promise);\n });\n\n await Promise.all(promises);\n return encAttachments;\n }\n\n async encryptFields(fieldsModel: FieldView[], key: SymmetricCryptoKey): Promise {\n if (!fieldsModel || !fieldsModel.length) {\n return null;\n }\n\n const self = this;\n const encFields: Field[] = [];\n await fieldsModel.reduce(async (promise, field) => {\n await promise;\n const encField = await self.encryptField(field, key);\n encFields.push(encField);\n }, Promise.resolve());\n\n return encFields;\n }\n\n async encryptField(fieldModel: FieldView, key: SymmetricCryptoKey): Promise {\n const field = new Field();\n field.type = fieldModel.type;\n field.linkedId = fieldModel.linkedId;\n // normalize boolean type field values\n if (fieldModel.type === FieldType.Boolean && fieldModel.value !== \"true\") {\n fieldModel.value = \"false\";\n }\n\n await this.encryptObjProperty(\n fieldModel,\n field,\n {\n name: null,\n value: null,\n },\n key,\n );\n\n return field;\n }\n\n async encryptPasswordHistories(\n phModels: PasswordHistoryView[],\n key: SymmetricCryptoKey,\n ): Promise {\n if (!phModels || !phModels.length) {\n return null;\n }\n\n const self = this;\n const encPhs: Password[] = [];\n await phModels.reduce(async (promise, ph) => {\n await promise;\n const encPh = await self.encryptPasswordHistory(ph, key);\n encPhs.push(encPh);\n }, Promise.resolve());\n\n return encPhs;\n }\n\n async encryptPasswordHistory(\n phModel: PasswordHistoryView,\n key: SymmetricCryptoKey,\n ): Promise {\n const ph = new Password();\n ph.lastUsedDate = phModel.lastUsedDate;\n\n await this.encryptObjProperty(\n phModel,\n ph,\n {\n password: null,\n },\n key,\n );\n\n return ph;\n }\n\n async get(id: string): Promise {\n const ciphers = await this.stateService.getEncryptedCiphers();\n // eslint-disable-next-line\n if (ciphers == null || !ciphers.hasOwnProperty(id)) {\n return null;\n }\n\n const localData = await this.stateService.getLocalData();\n return new Cipher(ciphers[id], localData ? localData[id] : null);\n }\n\n async getAll(): Promise {\n const localData = await this.stateService.getLocalData();\n const ciphers = await this.stateService.getEncryptedCiphers();\n const response: Cipher[] = [];\n for (const id in ciphers) {\n // eslint-disable-next-line\n if (ciphers.hasOwnProperty(id)) {\n response.push(new Cipher(ciphers[id], localData ? localData[id] : null));\n }\n }\n return response;\n }\n\n @sequentialize(() => \"getAllDecrypted\")\n async getAllDecrypted(): Promise {\n if ((await this.getDecryptedCipherCache()) != null) {\n await this.reindexCiphers();\n return await this.getDecryptedCipherCache();\n }\n\n const ciphers = await this.getAll();\n const orgKeys = await this.cryptoService.getOrgKeys();\n const userKey = await this.cryptoService.getUserKeyWithLegacySupport();\n if (Object.keys(orgKeys).length === 0 && userKey == null) {\n // return early if there are no keys to decrypt with\n return;\n }\n\n // Group ciphers by orgId or under 'null' for the user's ciphers\n const grouped = ciphers.reduce(\n (agg, c) => {\n agg[c.organizationId] ??= [];\n agg[c.organizationId].push(c);\n return agg;\n },\n {} as Record,\n );\n\n const decCiphers = (\n await Promise.all(\n Object.entries(grouped).map(([orgId, groupedCiphers]) =>\n this.encryptService.decryptItems(groupedCiphers, orgKeys[orgId] ?? userKey),\n ),\n )\n )\n .flat()\n .sort(this.getLocaleSortingFunction());\n\n await this.setDecryptedCipherCache(decCiphers);\n return decCiphers;\n }\n\n private async reindexCiphers() {\n const userId = await this.stateService.getUserId();\n const reindexRequired =\n this.searchService != null && (this.searchService.indexedEntityId ?? userId) !== userId;\n if (reindexRequired) {\n this.searchService.indexCiphers(await this.getDecryptedCipherCache(), userId);\n }\n }\n\n async getAllDecryptedForGrouping(groupingId: string, folder = true): Promise {\n const ciphers = await this.getAllDecrypted();\n\n return ciphers.filter((cipher) => {\n if (cipher.isDeleted) {\n return false;\n }\n if (folder && cipher.folderId === groupingId) {\n return true;\n } else if (\n !folder &&\n cipher.collectionIds != null &&\n cipher.collectionIds.indexOf(groupingId) > -1\n ) {\n return true;\n }\n\n return false;\n });\n }\n\n async getAllDecryptedForUrl(\n url: string,\n includeOtherTypes?: CipherType[],\n defaultMatch: UriMatchStrategySetting = null,\n ): Promise {\n if (url == null && includeOtherTypes == null) {\n return Promise.resolve([]);\n }\n\n const equivalentDomains = await firstValueFrom(\n this.domainSettingsService.getUrlEquivalentDomains(url),\n );\n const ciphers = await this.getAllDecrypted();\n defaultMatch ??= await firstValueFrom(this.domainSettingsService.defaultUriMatchStrategy$);\n\n return ciphers.filter((cipher) => {\n const cipherIsLogin = cipher.type === CipherType.Login && cipher.login !== null;\n\n if (cipher.deletedDate !== null) {\n return false;\n }\n\n if (\n Array.isArray(includeOtherTypes) &&\n includeOtherTypes.includes(cipher.type) &&\n !cipherIsLogin\n ) {\n return true;\n }\n\n if (cipherIsLogin) {\n return cipher.login.matchesUri(url, equivalentDomains, defaultMatch);\n }\n\n return false;\n });\n }\n\n async getAllFromApiForOrganization(organizationId: string): Promise {\n const response = await this.apiService.getCiphersOrganization(organizationId);\n return await this.decryptOrganizationCiphersResponse(response, organizationId);\n }\n\n async getManyFromApiForOrganization(organizationId: string): Promise {\n const response = await this.apiService.send(\n \"GET\",\n \"/ciphers/organization-details/assigned?organizationId=\" + organizationId,\n null,\n true,\n true,\n );\n return this.decryptOrganizationCiphersResponse(response, organizationId);\n }\n\n private async decryptOrganizationCiphersResponse(\n response: ListResponse,\n organizationId: string,\n ): Promise {\n if (response?.data == null || response.data.length < 1) {\n return [];\n }\n\n const ciphers = response.data.map((cr) => new Cipher(new CipherData(cr)));\n const key = await this.cryptoService.getOrgKey(organizationId);\n const decCiphers = await this.encryptService.decryptItems(ciphers, key);\n\n decCiphers.sort(this.getLocaleSortingFunction());\n return decCiphers;\n }\n\n async getLastUsedForUrl(url: string, autofillOnPageLoad = false): Promise {\n return this.getCipherForUrl(url, true, false, autofillOnPageLoad);\n }\n\n async getLastLaunchedForUrl(url: string, autofillOnPageLoad = false): Promise {\n return this.getCipherForUrl(url, false, true, autofillOnPageLoad);\n }\n\n async getNextCipherForUrl(url: string): Promise {\n return this.getCipherForUrl(url, false, false, false);\n }\n\n updateLastUsedIndexForUrl(url: string) {\n this.sortedCiphersCache.updateLastUsedIndex(url);\n }\n\n async updateLastUsedDate(id: string): Promise {\n let ciphersLocalData = await this.stateService.getLocalData();\n if (!ciphersLocalData) {\n ciphersLocalData = {};\n }\n\n if (ciphersLocalData[id]) {\n ciphersLocalData[id].lastUsedDate = new Date().getTime();\n } else {\n ciphersLocalData[id] = {\n lastUsedDate: new Date().getTime(),\n };\n }\n\n await this.stateService.setLocalData(ciphersLocalData);\n\n const decryptedCipherCache = await this.stateService.getDecryptedCiphers();\n if (!decryptedCipherCache) {\n return;\n }\n\n for (let i = 0; i < decryptedCipherCache.length; i++) {\n const cached = decryptedCipherCache[i];\n if (cached.id === id) {\n cached.localData = ciphersLocalData[id];\n break;\n }\n }\n await this.stateService.setDecryptedCiphers(decryptedCipherCache);\n }\n\n async updateLastLaunchedDate(id: string): Promise {\n let ciphersLocalData = await this.stateService.getLocalData();\n if (!ciphersLocalData) {\n ciphersLocalData = {};\n }\n\n if (ciphersLocalData[id]) {\n ciphersLocalData[id].lastLaunched = new Date().getTime();\n } else {\n ciphersLocalData[id] = {\n lastUsedDate: new Date().getTime(),\n };\n }\n\n await this.stateService.setLocalData(ciphersLocalData);\n\n const decryptedCipherCache = await this.stateService.getDecryptedCiphers();\n if (!decryptedCipherCache) {\n return;\n }\n\n for (let i = 0; i < decryptedCipherCache.length; i++) {\n const cached = decryptedCipherCache[i];\n if (cached.id === id) {\n cached.localData = ciphersLocalData[id];\n break;\n }\n }\n await this.stateService.setDecryptedCiphers(decryptedCipherCache);\n }\n\n async saveNeverDomain(domain: string): Promise {\n if (domain == null) {\n return;\n }\n\n let domains = await firstValueFrom(this.domainSettingsService.neverDomains$);\n if (!domains) {\n domains = {};\n }\n domains[domain] = null;\n await this.domainSettingsService.setNeverDomains(domains);\n }\n\n async createWithServer(cipher: Cipher, orgAdmin?: boolean): Promise {\n let response: CipherResponse;\n if (orgAdmin && cipher.organizationId != null) {\n const request = new CipherCreateRequest(cipher);\n response = await this.apiService.postCipherAdmin(request);\n } else if (cipher.collectionIds != null) {\n const request = new CipherCreateRequest(cipher);\n response = await this.apiService.postCipherCreate(request);\n } else {\n const request = new CipherRequest(cipher);\n response = await this.apiService.postCipher(request);\n }\n cipher.id = response.id;\n\n const data = new CipherData(response, cipher.collectionIds);\n await this.upsert(data);\n }\n\n async updateWithServer(cipher: Cipher, orgAdmin?: boolean, isNotClone?: boolean): Promise {\n let response: CipherResponse;\n if (orgAdmin && isNotClone) {\n const request = new CipherRequest(cipher);\n response = await this.apiService.putCipherAdmin(cipher.id, request);\n } else if (cipher.edit) {\n const request = new CipherRequest(cipher);\n response = await this.apiService.putCipher(cipher.id, request);\n } else {\n const request = new CipherPartialRequest(cipher);\n response = await this.apiService.putPartialCipher(cipher.id, request);\n }\n\n const data = new CipherData(response, cipher.collectionIds);\n await this.upsert(data);\n }\n\n async shareWithServer(\n cipher: CipherView,\n organizationId: string,\n collectionIds: string[],\n ): Promise {\n const attachmentPromises: Promise[] = [];\n if (cipher.attachments != null) {\n cipher.attachments.forEach((attachment) => {\n if (attachment.key == null) {\n attachmentPromises.push(\n this.shareAttachmentWithServer(attachment, cipher.id, organizationId),\n );\n }\n });\n }\n await Promise.all(attachmentPromises);\n\n cipher.organizationId = organizationId;\n cipher.collectionIds = collectionIds;\n const encCipher = await this.encryptSharedCipher(cipher);\n const request = new CipherShareRequest(encCipher);\n const response = await this.apiService.putShareCipher(cipher.id, request);\n const data = new CipherData(response, collectionIds);\n await this.upsert(data);\n }\n\n async shareManyWithServer(\n ciphers: CipherView[],\n organizationId: string,\n collectionIds: string[],\n ): Promise {\n const promises: Promise[] = [];\n const encCiphers: Cipher[] = [];\n for (const cipher of ciphers) {\n cipher.organizationId = organizationId;\n cipher.collectionIds = collectionIds;\n promises.push(\n this.encryptSharedCipher(cipher).then((c) => {\n encCiphers.push(c);\n }),\n );\n }\n await Promise.all(promises);\n const request = new CipherBulkShareRequest(encCiphers, collectionIds);\n try {\n await this.apiService.putShareCiphers(request);\n } catch (e) {\n for (const cipher of ciphers) {\n cipher.organizationId = null;\n cipher.collectionIds = null;\n }\n throw e;\n }\n await this.upsert(encCiphers.map((c) => c.toCipherData()));\n }\n\n saveAttachmentWithServer(cipher: Cipher, unencryptedFile: any, admin = false): Promise {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.readAsArrayBuffer(unencryptedFile);\n reader.onload = async (evt: any) => {\n try {\n const cData = await this.saveAttachmentRawWithServer(\n cipher,\n unencryptedFile.name,\n evt.target.result,\n admin,\n );\n resolve(cData);\n } catch (e) {\n reject(e);\n }\n };\n reader.onerror = () => {\n reject(\"Error reading file.\");\n };\n });\n }\n\n async saveAttachmentRawWithServer(\n cipher: Cipher,\n filename: string,\n data: Uint8Array,\n admin = false,\n ): Promise {\n const encKey = await this.getKeyForCipherKeyDecryption(cipher);\n const cipherKeyEncryptionEnabled = await this.getCipherKeyEncryptionEnabled();\n\n const cipherEncKey =\n cipherKeyEncryptionEnabled && cipher.key != null\n ? (new SymmetricCryptoKey(\n await this.encryptService.decryptToBytes(cipher.key, encKey),\n ) as UserKey)\n : encKey;\n\n //if cipher key encryption is disabled but the item has an individual key,\n //then we rollback to using the user key as the main key of encryption of the item\n //in order to keep item and it's attachments with the same encryption level\n if (cipher.key != null && !cipherKeyEncryptionEnabled) {\n const model = await cipher.decrypt(await this.getKeyForCipherKeyDecryption(cipher));\n cipher = await this.encrypt(model);\n await this.updateWithServer(cipher);\n }\n\n const encFileName = await this.encryptService.encrypt(filename, cipherEncKey);\n\n const dataEncKey = await this.cryptoService.makeDataEncKey(cipherEncKey);\n const encData = await this.encryptService.encryptToBytes(new Uint8Array(data), dataEncKey[0]);\n\n const response = await this.cipherFileUploadService.upload(\n cipher,\n encFileName,\n encData,\n admin,\n dataEncKey,\n );\n\n const cData = new CipherData(response, cipher.collectionIds);\n if (!admin) {\n await this.upsert(cData);\n }\n return new Cipher(cData);\n }\n\n async saveCollectionsWithServer(cipher: Cipher): Promise {\n const request = new CipherCollectionsRequest(cipher.collectionIds);\n await this.apiService.putCipherCollections(cipher.id, request);\n const data = cipher.toCipherData();\n await this.upsert(data);\n }\n\n /**\n * Bulk update collections for many ciphers with the server\n * @param orgId\n * @param cipherIds\n * @param collectionIds\n * @param removeCollections - If true, the collectionIds will be removed from the ciphers, otherwise they will be added\n */\n async bulkUpdateCollectionsWithServer(\n orgId: OrganizationId,\n cipherIds: CipherId[],\n collectionIds: CollectionId[],\n removeCollections: boolean = false,\n ): Promise {\n const request = new CipherBulkUpdateCollectionsRequest(\n orgId,\n cipherIds,\n collectionIds,\n removeCollections,\n );\n\n await this.apiService.send(\"POST\", \"/ciphers/bulk-collections\", request, true, false);\n\n // Update the local state\n const ciphers = await this.stateService.getEncryptedCiphers();\n\n for (const id of cipherIds) {\n const cipher = ciphers[id];\n if (cipher) {\n if (removeCollections) {\n cipher.collectionIds = cipher.collectionIds?.filter(\n (cid) => !collectionIds.includes(cid as CollectionId),\n );\n } else {\n // Append to the collectionIds if it's not already there\n cipher.collectionIds = [...new Set([...(cipher.collectionIds ?? []), ...collectionIds])];\n }\n }\n }\n\n await this.clearCache();\n await this.stateService.setEncryptedCiphers(ciphers);\n }\n\n async upsert(cipher: CipherData | CipherData[]): Promise {\n let ciphers = await this.stateService.getEncryptedCiphers();\n if (ciphers == null) {\n ciphers = {};\n }\n\n if (cipher instanceof CipherData) {\n const c = cipher as CipherData;\n ciphers[c.id] = c;\n } else {\n (cipher as CipherData[]).forEach((c) => {\n ciphers[c.id] = c;\n });\n }\n\n await this.replace(ciphers);\n }\n\n async replace(ciphers: { [id: string]: CipherData }): Promise {\n await this.clearDecryptedCiphersState();\n await this.stateService.setEncryptedCiphers(ciphers);\n }\n\n async clear(userId?: string): Promise {\n await this.clearEncryptedCiphersState(userId);\n await this.clearCache(userId);\n }\n\n async moveManyWithServer(ids: string[], folderId: string): Promise {\n await this.apiService.putMoveCiphers(new CipherBulkMoveRequest(ids, folderId));\n\n let ciphers = await this.stateService.getEncryptedCiphers();\n if (ciphers == null) {\n ciphers = {};\n }\n\n ids.forEach((id) => {\n // eslint-disable-next-line\n if (ciphers.hasOwnProperty(id)) {\n ciphers[id].folderId = folderId;\n }\n });\n\n await this.clearCache();\n await this.stateService.setEncryptedCiphers(ciphers);\n }\n\n async delete(id: string | string[]): Promise {\n const ciphers = await this.stateService.getEncryptedCiphers();\n if (ciphers == null) {\n return;\n }\n\n if (typeof id === \"string\") {\n if (ciphers[id] == null) {\n return;\n }\n delete ciphers[id];\n } else {\n (id as string[]).forEach((i) => {\n delete ciphers[i];\n });\n }\n\n await this.clearCache();\n await this.stateService.setEncryptedCiphers(ciphers);\n }\n\n async deleteWithServer(id: string, asAdmin = false): Promise {\n if (asAdmin) {\n await this.apiService.deleteCipherAdmin(id);\n } else {\n await this.apiService.deleteCipher(id);\n }\n\n await this.delete(id);\n }\n\n async deleteManyWithServer(ids: string[], asAdmin = false): Promise {\n const request = new CipherBulkDeleteRequest(ids);\n if (asAdmin) {\n await this.apiService.deleteManyCiphersAdmin(request);\n } else {\n await this.apiService.deleteManyCiphers(request);\n }\n await this.delete(ids);\n }\n\n async deleteAttachment(id: string, attachmentId: string): Promise {\n const ciphers = await this.stateService.getEncryptedCiphers();\n\n // eslint-disable-next-line\n if (ciphers == null || !ciphers.hasOwnProperty(id) || ciphers[id].attachments == null) {\n return;\n }\n\n for (let i = 0; i < ciphers[id].attachments.length; i++) {\n if (ciphers[id].attachments[i].id === attachmentId) {\n ciphers[id].attachments.splice(i, 1);\n }\n }\n\n await this.clearCache();\n await this.stateService.setEncryptedCiphers(ciphers);\n }\n\n async deleteAttachmentWithServer(id: string, attachmentId: string): Promise {\n try {\n await this.apiService.deleteCipherAttachment(id, attachmentId);\n } catch (e) {\n return Promise.reject((e as ErrorResponse).getSingleMessage());\n }\n await this.deleteAttachment(id, attachmentId);\n }\n\n sortCiphersByLastUsed(a: CipherView, b: CipherView): number {\n const aLastUsed =\n a.localData && a.localData.lastUsedDate ? (a.localData.lastUsedDate as number) : null;\n const bLastUsed =\n b.localData && b.localData.lastUsedDate ? (b.localData.lastUsedDate as number) : null;\n\n const bothNotNull = aLastUsed != null && bLastUsed != null;\n if (bothNotNull && aLastUsed < bLastUsed) {\n return 1;\n }\n if (aLastUsed != null && bLastUsed == null) {\n return -1;\n }\n\n if (bothNotNull && aLastUsed > bLastUsed) {\n return -1;\n }\n if (bLastUsed != null && aLastUsed == null) {\n return 1;\n }\n\n return 0;\n }\n\n sortCiphersByLastUsedThenName(a: CipherView, b: CipherView): number {\n const result = this.sortCiphersByLastUsed(a, b);\n if (result !== 0) {\n return result;\n }\n\n return this.getLocaleSortingFunction()(a, b);\n }\n\n getLocaleSortingFunction(): (a: CipherView, b: CipherView) => number {\n return (a, b) => {\n let aName = a.name;\n let bName = b.name;\n\n if (aName == null && bName != null) {\n return -1;\n }\n if (aName != null && bName == null) {\n return 1;\n }\n if (aName == null && bName == null) {\n return 0;\n }\n\n const result = this.i18nService.collator\n ? this.i18nService.collator.compare(aName, bName)\n : aName.localeCompare(bName);\n\n if (result !== 0 || a.type !== CipherType.Login || b.type !== CipherType.Login) {\n return result;\n }\n\n if (a.login.username != null) {\n aName += a.login.username;\n }\n\n if (b.login.username != null) {\n bName += b.login.username;\n }\n\n return this.i18nService.collator\n ? this.i18nService.collator.compare(aName, bName)\n : aName.localeCompare(bName);\n };\n }\n\n async softDelete(id: string | string[]): Promise {\n const ciphers = await this.stateService.getEncryptedCiphers();\n if (ciphers == null) {\n return;\n }\n\n const setDeletedDate = (cipherId: string) => {\n if (ciphers[cipherId] == null) {\n return;\n }\n ciphers[cipherId].deletedDate = new Date().toISOString();\n };\n\n if (typeof id === \"string\") {\n setDeletedDate(id);\n } else {\n (id as string[]).forEach(setDeletedDate);\n }\n\n await this.clearCache();\n await this.stateService.setEncryptedCiphers(ciphers);\n }\n\n async softDeleteWithServer(id: string, asAdmin = false): Promise {\n if (asAdmin) {\n await this.apiService.putDeleteCipherAdmin(id);\n } else {\n await this.apiService.putDeleteCipher(id);\n }\n\n await this.softDelete(id);\n }\n\n async softDeleteManyWithServer(ids: string[], asAdmin = false): Promise {\n const request = new CipherBulkDeleteRequest(ids);\n if (asAdmin) {\n await this.apiService.putDeleteManyCiphersAdmin(request);\n } else {\n await this.apiService.putDeleteManyCiphers(request);\n }\n\n await this.softDelete(ids);\n }\n\n async restore(\n cipher: { id: string; revisionDate: string } | { id: string; revisionDate: string }[],\n ) {\n const ciphers = await this.stateService.getEncryptedCiphers();\n if (ciphers == null) {\n return;\n }\n\n const clearDeletedDate = (c: { id: string; revisionDate: string }) => {\n if (ciphers[c.id] == null) {\n return;\n }\n ciphers[c.id].deletedDate = null;\n ciphers[c.id].revisionDate = c.revisionDate;\n };\n\n if (cipher.constructor.name === Array.name) {\n (cipher as { id: string; revisionDate: string }[]).forEach(clearDeletedDate);\n } else {\n clearDeletedDate(cipher as { id: string; revisionDate: string });\n }\n\n await this.clearCache();\n await this.stateService.setEncryptedCiphers(ciphers);\n }\n\n async restoreWithServer(id: string, asAdmin = false): Promise {\n let response;\n if (asAdmin) {\n response = await this.apiService.putRestoreCipherAdmin(id);\n } else {\n response = await this.apiService.putRestoreCipher(id);\n }\n\n await this.restore({ id: id, revisionDate: response.revisionDate });\n }\n\n async restoreManyWithServer(\n ids: string[],\n organizationId: string = null,\n asAdmin = false,\n ): Promise {\n let response;\n if (asAdmin) {\n const request = new CipherBulkRestoreRequest(ids, organizationId);\n response = await this.apiService.putRestoreManyCiphersAdmin(request);\n } else {\n const request = new CipherBulkRestoreRequest(ids);\n response = await this.apiService.putRestoreManyCiphers(request);\n }\n\n const restores: { id: string; revisionDate: string }[] = [];\n for (const cipher of response.data) {\n restores.push({ id: cipher.id, revisionDate: cipher.revisionDate });\n }\n await this.restore(restores);\n }\n\n async getKeyForCipherKeyDecryption(cipher: Cipher): Promise {\n return (\n (await this.cryptoService.getOrgKey(cipher.organizationId)) ||\n ((await this.cryptoService.getUserKeyWithLegacySupport()) as UserKey)\n );\n }\n\n // Helpers\n\n // In the case of a cipher that is being shared with an organization, we want to decrypt the\n // cipher key with the user's key and then re-encrypt it with the organization's key.\n private async encryptSharedCipher(model: CipherView): Promise {\n const keyForCipherKeyDecryption = await this.cryptoService.getUserKeyWithLegacySupport();\n return await this.encrypt(model, null, keyForCipherKeyDecryption);\n }\n\n private async updateModelfromExistingCipher(\n model: CipherView,\n originalCipher: Cipher,\n ): Promise {\n const existingCipher = await originalCipher.decrypt(\n await this.getKeyForCipherKeyDecryption(originalCipher),\n );\n model.passwordHistory = existingCipher.passwordHistory || [];\n if (model.type === CipherType.Login && existingCipher.type === CipherType.Login) {\n if (\n existingCipher.login.password != null &&\n existingCipher.login.password !== \"\" &&\n existingCipher.login.password !== model.login.password\n ) {\n const ph = new PasswordHistoryView();\n ph.password = existingCipher.login.password;\n ph.lastUsedDate = model.login.passwordRevisionDate = new Date();\n model.passwordHistory.splice(0, 0, ph);\n } else {\n model.login.passwordRevisionDate = existingCipher.login.passwordRevisionDate;\n }\n }\n if (existingCipher.hasFields) {\n const existingHiddenFields = existingCipher.fields.filter(\n (f) =>\n f.type === FieldType.Hidden &&\n f.name != null &&\n f.name !== \"\" &&\n f.value != null &&\n f.value !== \"\",\n );\n const hiddenFields =\n model.fields == null\n ? []\n : model.fields.filter(\n (f) => f.type === FieldType.Hidden && f.name != null && f.name !== \"\",\n );\n existingHiddenFields.forEach((ef) => {\n const matchedField = hiddenFields.find((f) => f.name === ef.name);\n if (matchedField == null || matchedField.value !== ef.value) {\n const ph = new PasswordHistoryView();\n ph.password = ef.name + \": \" + ef.value;\n ph.lastUsedDate = new Date();\n model.passwordHistory.splice(0, 0, ph);\n }\n });\n }\n }\n\n private adjustPasswordHistoryLength(model: CipherView) {\n if (model.passwordHistory != null && model.passwordHistory.length === 0) {\n model.passwordHistory = null;\n } else if (model.passwordHistory != null && model.passwordHistory.length > 5) {\n // only save last 5 history\n model.passwordHistory = model.passwordHistory.slice(0, 5);\n }\n }\n\n private async shareAttachmentWithServer(\n attachmentView: AttachmentView,\n cipherId: string,\n organizationId: string,\n ): Promise {\n const attachmentResponse = await this.apiService.nativeFetch(\n new Request(attachmentView.url, { cache: \"no-store\" }),\n );\n if (attachmentResponse.status !== 200) {\n throw Error(\"Failed to download attachment: \" + attachmentResponse.status.toString());\n }\n\n const encBuf = await EncArrayBuffer.fromResponse(attachmentResponse);\n const decBuf = await this.cryptoService.decryptFromBytes(encBuf, null);\n\n let encKey: UserKey | OrgKey;\n encKey = await this.cryptoService.getOrgKey(organizationId);\n encKey ||= (await this.cryptoService.getUserKeyWithLegacySupport()) as UserKey;\n\n const dataEncKey = await this.cryptoService.makeDataEncKey(encKey);\n\n const encFileName = await this.encryptService.encrypt(attachmentView.fileName, encKey);\n const encData = await this.encryptService.encryptToBytes(new Uint8Array(decBuf), dataEncKey[0]);\n\n const fd = new FormData();\n try {\n const blob = new Blob([encData.buffer], { type: \"application/octet-stream\" });\n fd.append(\"key\", dataEncKey[1].encryptedString);\n fd.append(\"data\", blob, encFileName.encryptedString);\n } catch (e) {\n if (Utils.isNode && !Utils.isBrowser) {\n fd.append(\"key\", dataEncKey[1].encryptedString);\n fd.append(\n \"data\",\n Buffer.from(encData.buffer) as any,\n {\n filepath: encFileName.encryptedString,\n contentType: \"application/octet-stream\",\n } as any,\n );\n } else {\n throw e;\n }\n }\n\n try {\n await this.apiService.postShareCipherAttachment(\n cipherId,\n attachmentView.id,\n fd,\n organizationId,\n );\n } catch (e) {\n throw new Error((e as ErrorResponse).getSingleMessage());\n }\n }\n\n private async encryptObjProperty(\n model: V,\n obj: D,\n map: any,\n key: SymmetricCryptoKey,\n ): Promise {\n const promises = [];\n const self = this;\n\n for (const prop in map) {\n // eslint-disable-next-line\n if (!map.hasOwnProperty(prop)) {\n continue;\n }\n\n (function (theProp, theObj) {\n const p = Promise.resolve()\n .then(() => {\n const modelProp = (model as any)[map[theProp] || theProp];\n if (modelProp && modelProp !== \"\") {\n return self.cryptoService.encrypt(modelProp, key);\n }\n return null;\n })\n .then((val: EncString) => {\n (theObj as any)[theProp] = val;\n });\n promises.push(p);\n })(prop, obj);\n }\n\n await Promise.all(promises);\n }\n\n private async encryptCipherData(cipher: Cipher, model: CipherView, key: SymmetricCryptoKey) {\n switch (cipher.type) {\n case CipherType.Login:\n cipher.login = new Login();\n cipher.login.passwordRevisionDate = model.login.passwordRevisionDate;\n cipher.login.autofillOnPageLoad = model.login.autofillOnPageLoad;\n await this.encryptObjProperty(\n model.login,\n cipher.login,\n {\n username: null,\n password: null,\n totp: null,\n },\n key,\n );\n\n if (model.login.uris != null) {\n cipher.login.uris = [];\n model.login.uris = model.login.uris.filter((u) => u.uri != null);\n for (let i = 0; i < model.login.uris.length; i++) {\n const loginUri = new LoginUri();\n loginUri.match = model.login.uris[i].match;\n await this.encryptObjProperty(\n model.login.uris[i],\n loginUri,\n {\n uri: null,\n },\n key,\n );\n const uriHash = await this.encryptService.hash(model.login.uris[i].uri, \"sha256\");\n loginUri.uriChecksum = await this.cryptoService.encrypt(uriHash, key);\n cipher.login.uris.push(loginUri);\n }\n }\n\n if (model.login.fido2Credentials != null) {\n cipher.login.fido2Credentials = await Promise.all(\n model.login.fido2Credentials.map(async (viewKey) => {\n const domainKey = new Fido2Credential();\n await this.encryptObjProperty(\n viewKey,\n domainKey,\n {\n credentialId: null,\n keyType: null,\n keyAlgorithm: null,\n keyCurve: null,\n keyValue: null,\n rpId: null,\n rpName: null,\n userHandle: null,\n userName: null,\n userDisplayName: null,\n origin: null,\n },\n key,\n );\n domainKey.counter = await this.cryptoService.encrypt(String(viewKey.counter), key);\n domainKey.discoverable = await this.cryptoService.encrypt(\n String(viewKey.discoverable),\n key,\n );\n domainKey.creationDate = viewKey.creationDate;\n return domainKey;\n }),\n );\n }\n return;\n case CipherType.SecureNote:\n cipher.secureNote = new SecureNote();\n cipher.secureNote.type = model.secureNote.type;\n return;\n case CipherType.Card:\n cipher.card = new Card();\n await this.encryptObjProperty(\n model.card,\n cipher.card,\n {\n cardholderName: null,\n brand: null,\n number: null,\n expMonth: null,\n expYear: null,\n code: null,\n },\n key,\n );\n return;\n case CipherType.Identity:\n cipher.identity = new Identity();\n await this.encryptObjProperty(\n model.identity,\n cipher.identity,\n {\n title: null,\n firstName: null,\n middleName: null,\n lastName: null,\n address1: null,\n address2: null,\n address3: null,\n city: null,\n state: null,\n postalCode: null,\n country: null,\n company: null,\n email: null,\n phone: null,\n ssn: null,\n username: null,\n passportNumber: null,\n licenseNumber: null,\n },\n key,\n );\n return;\n default:\n throw new Error(\"Unknown cipher type.\");\n }\n }\n\n private async getAutofillOnPageLoadDefault() {\n return await firstValueFrom(this.autofillSettingsService.autofillOnPageLoadDefault$);\n }\n\n private async getCipherForUrl(\n url: string,\n lastUsed: boolean,\n lastLaunched: boolean,\n autofillOnPageLoad: boolean,\n ): Promise {\n const cacheKey = autofillOnPageLoad ? \"autofillOnPageLoad-\" + url : url;\n\n if (!this.sortedCiphersCache.isCached(cacheKey)) {\n let ciphers = await this.getAllDecryptedForUrl(url);\n if (!ciphers) {\n return null;\n }\n\n if (autofillOnPageLoad) {\n const autofillOnPageLoadDefault = await this.getAutofillOnPageLoadDefault();\n\n ciphers = ciphers.filter(\n (cipher) =>\n cipher.login.autofillOnPageLoad ||\n (cipher.login.autofillOnPageLoad == null && autofillOnPageLoadDefault !== false),\n );\n if (ciphers.length === 0) {\n return null;\n }\n }\n\n this.sortedCiphersCache.addCiphers(cacheKey, ciphers);\n }\n\n if (lastLaunched) {\n return this.sortedCiphersCache.getLastLaunched(cacheKey);\n } else if (lastUsed) {\n return this.sortedCiphersCache.getLastUsed(cacheKey);\n } else {\n return this.sortedCiphersCache.getNext(cacheKey);\n }\n }\n\n private async clearEncryptedCiphersState(userId?: string) {\n await this.stateService.setEncryptedCiphers(null, { userId: userId });\n }\n\n private async clearDecryptedCiphersState(userId?: string) {\n await this.stateService.setDecryptedCiphers(null, { userId: userId });\n this.clearSortedCiphers();\n }\n\n private clearSortedCiphers() {\n this.sortedCiphersCache.clear();\n }\n\n private async encryptCipher(\n model: CipherView,\n cipher: Cipher,\n key: SymmetricCryptoKey,\n ): Promise {\n await Promise.all([\n this.encryptObjProperty(\n model,\n cipher,\n {\n name: null,\n notes: null,\n },\n key,\n ),\n this.encryptCipherData(cipher, model, key),\n this.encryptFields(model.fields, key).then((fields) => {\n cipher.fields = fields;\n }),\n this.encryptPasswordHistories(model.passwordHistory, key).then((ph) => {\n cipher.passwordHistory = ph;\n }),\n this.encryptAttachments(model.attachments, key).then((attachments) => {\n cipher.attachments = attachments;\n }),\n ]);\n\n return cipher;\n }\n\n private async encryptCipherWithCipherKey(\n model: CipherView,\n cipher: Cipher,\n keyForCipherKeyEncryption: SymmetricCryptoKey,\n keyForCipherKeyDecryption: SymmetricCryptoKey,\n ): Promise {\n // First, we get the key for cipher key encryption, in its decrypted form\n let decryptedCipherKey: SymmetricCryptoKey;\n if (cipher.key == null) {\n decryptedCipherKey = await this.cryptoService.makeCipherKey();\n } else {\n decryptedCipherKey = new SymmetricCryptoKey(\n await this.encryptService.decryptToBytes(cipher.key, keyForCipherKeyDecryption),\n );\n }\n\n // Then, we have to encrypt the cipher key with the proper key.\n cipher.key = await this.encryptService.encrypt(\n decryptedCipherKey.key,\n keyForCipherKeyEncryption,\n );\n\n // Finally, we can encrypt the cipher with the decrypted cipher key.\n return this.encryptCipher(model, cipher, decryptedCipherKey);\n }\n\n private async getCipherKeyEncryptionEnabled(): Promise {\n return (\n flagEnabled(\"enableCipherKeyEncryption\") &&\n (await firstValueFrom(\n this.configService.checkServerMeetsVersionRequirement$(CIPHER_KEY_ENC_MIN_SERVER_VER),\n ))\n );\n }\n}\n","import { firstValueFrom, map, Observable } from \"rxjs\";\nimport { Jsonify } from \"type-fest\";\n\nimport { CryptoService } from \"../../platform/abstractions/crypto.service\";\nimport { I18nService } from \"../../platform/abstractions/i18n.service\";\nimport { Utils } from \"../../platform/misc/utils\";\nimport {\n ActiveUserState,\n KeyDefinition,\n StateProvider,\n COLLECTION_DATA,\n DeriveDefinition,\n DerivedState,\n} from \"../../platform/state\";\nimport { CollectionId, UserId } from \"../../types/guid\";\nimport { CollectionService as CollectionServiceAbstraction } from \"../../vault/abstractions/collection.service\";\nimport { CollectionData } from \"../models/data/collection.data\";\nimport { Collection } from \"../models/domain/collection\";\nimport { TreeNode } from \"../models/domain/tree-node\";\nimport { CollectionView } from \"../models/view/collection.view\";\nimport { ServiceUtils } from \"../service-utils\";\n\nconst ENCRYPTED_COLLECTION_DATA_KEY = KeyDefinition.record(\n COLLECTION_DATA,\n \"collections\",\n {\n deserializer: (jsonData: Jsonify) => CollectionData.fromJSON(jsonData),\n },\n);\n\nconst DECRYPTED_COLLECTION_DATA_KEY = DeriveDefinition.from<\n Record,\n CollectionView[],\n { collectionService: CollectionService }\n>(ENCRYPTED_COLLECTION_DATA_KEY, {\n deserializer: (obj) => obj.map((collection) => CollectionView.fromJSON(collection)),\n derive: async (collections: Record, { collectionService }) => {\n const data: Collection[] = [];\n for (const id in collections ?? {}) {\n const collectionId = id as CollectionId;\n data.push(new Collection(collections[collectionId]));\n }\n return await collectionService.decryptMany(data);\n },\n});\n\nconst NestingDelimiter = \"/\";\n\nexport class CollectionService implements CollectionServiceAbstraction {\n private encryptedCollectionDataState: ActiveUserState>;\n encryptedCollections$: Observable;\n private decryptedCollectionDataState: DerivedState;\n decryptedCollections$: Observable;\n\n decryptedCollectionViews$(ids: CollectionId[]): Observable {\n return this.decryptedCollections$.pipe(\n map((collections) => collections.filter((c) => ids.includes(c.id as CollectionId))),\n );\n }\n\n constructor(\n private cryptoService: CryptoService,\n private i18nService: I18nService,\n protected stateProvider: StateProvider,\n ) {\n this.encryptedCollectionDataState = this.stateProvider.getActive(ENCRYPTED_COLLECTION_DATA_KEY);\n this.encryptedCollections$ = this.encryptedCollectionDataState.state$.pipe(\n map((collections) => {\n const response: Collection[] = [];\n for (const id in collections ?? {}) {\n response.push(new Collection(collections[id as CollectionId]));\n }\n return response;\n }),\n );\n\n this.decryptedCollectionDataState = this.stateProvider.getDerived(\n this.encryptedCollectionDataState.state$,\n DECRYPTED_COLLECTION_DATA_KEY,\n { collectionService: this },\n );\n\n this.decryptedCollections$ = this.decryptedCollectionDataState.state$;\n }\n\n async clearActiveUserCache(): Promise {\n await this.decryptedCollectionDataState.forceValue(null);\n }\n\n async encrypt(model: CollectionView): Promise {\n if (model.organizationId == null) {\n throw new Error(\"Collection has no organization id.\");\n }\n const key = await this.cryptoService.getOrgKey(model.organizationId);\n if (key == null) {\n throw new Error(\"No key for this collection's organization.\");\n }\n const collection = new Collection();\n collection.id = model.id;\n collection.organizationId = model.organizationId;\n collection.readOnly = model.readOnly;\n collection.name = await this.cryptoService.encrypt(model.name, key);\n return collection;\n }\n\n async decryptMany(collections: Collection[]): Promise {\n if (collections == null) {\n return [];\n }\n const decCollections: CollectionView[] = [];\n const promises: Promise[] = [];\n collections.forEach((collection) => {\n promises.push(collection.decrypt().then((c) => decCollections.push(c)));\n });\n await Promise.all(promises);\n return decCollections.sort(Utils.getSortFunction(this.i18nService, \"name\"));\n }\n\n async get(id: string): Promise {\n return (\n (await firstValueFrom(\n this.encryptedCollections$.pipe(map((cs) => cs.find((c) => c.id === id))),\n )) ?? null\n );\n }\n\n async getAll(): Promise {\n return await firstValueFrom(this.encryptedCollections$);\n }\n\n async getAllDecrypted(): Promise {\n return await firstValueFrom(this.decryptedCollections$);\n }\n\n async getAllNested(collections: CollectionView[] = null): Promise[]> {\n if (collections == null) {\n collections = await this.getAllDecrypted();\n }\n const nodes: TreeNode[] = [];\n collections.forEach((c) => {\n const collectionCopy = new CollectionView();\n collectionCopy.id = c.id;\n collectionCopy.organizationId = c.organizationId;\n const parts = c.name != null ? c.name.replace(/^\\/+|\\/+$/g, \"\").split(NestingDelimiter) : [];\n ServiceUtils.nestedTraverse(nodes, 0, parts, collectionCopy, null, NestingDelimiter);\n });\n return nodes;\n }\n\n /**\n * @deprecated August 30 2022: Moved to new Vault Filter Service\n * Remove when Desktop and Browser are updated\n */\n async getNested(id: string): Promise> {\n const collections = await this.getAllNested();\n return ServiceUtils.getTreeNodeObjectFromList(collections, id) as TreeNode;\n }\n\n async upsert(toUpdate: CollectionData | CollectionData[]): Promise {\n if (toUpdate == null) {\n return;\n }\n await this.encryptedCollectionDataState.update((collections) => {\n if (collections == null) {\n collections = {};\n }\n if (Array.isArray(toUpdate)) {\n toUpdate.forEach((c) => {\n collections[c.id] = c;\n });\n } else {\n collections[toUpdate.id] = toUpdate;\n }\n return collections;\n });\n }\n\n async replace(collections: Record): Promise {\n await this.encryptedCollectionDataState.update(() => collections);\n }\n\n async clear(userId?: UserId): Promise {\n if (userId == null) {\n await this.encryptedCollectionDataState.update(() => null);\n await this.decryptedCollectionDataState.forceValue(null);\n } else {\n await this.stateProvider.getUser(userId, ENCRYPTED_COLLECTION_DATA_KEY).update(() => null);\n }\n }\n\n async delete(id: CollectionId | CollectionId[]): Promise {\n await this.encryptedCollectionDataState.update((collections) => {\n if (collections == null) {\n collections = {};\n }\n if (typeof id === \"string\") {\n delete collections[id];\n } else {\n (id as CollectionId[]).forEach((i) => {\n delete collections[i];\n });\n }\n return collections;\n });\n }\n}\n","import { Jsonify } from \"type-fest\";\n\nimport { FolderResponse } from \"../response/folder.response\";\n\nexport class FolderData {\n id: string;\n name: string;\n revisionDate: string;\n\n constructor(response: Partial) {\n this.name = response?.name;\n this.id = response?.id;\n this.revisionDate = response?.revisionDate;\n }\n\n static fromJSON(obj: Jsonify) {\n return Object.assign(new FolderData({}), obj);\n }\n}\n","import { Jsonify } from \"type-fest\";\n\nimport { CryptoService } from \"../../../platform/abstractions/crypto.service\";\nimport { DeriveDefinition, FOLDER_DISK, KeyDefinition } from \"../../../platform/state\";\nimport { FolderService } from \"../../abstractions/folder/folder.service.abstraction\";\nimport { FolderData } from \"../../models/data/folder.data\";\nimport { Folder } from \"../../models/domain/folder\";\nimport { FolderView } from \"../../models/view/folder.view\";\n\nexport const FOLDER_ENCRYPTED_FOLDERS = KeyDefinition.record(FOLDER_DISK, \"folders\", {\n deserializer: (obj: Jsonify) => FolderData.fromJSON(obj),\n});\n\nexport const FOLDER_DECRYPTED_FOLDERS = DeriveDefinition.from<\n Record,\n FolderView[],\n { folderService: FolderService; cryptoService: CryptoService }\n>(FOLDER_ENCRYPTED_FOLDERS, {\n deserializer: (obj) => obj.map((f) => FolderView.fromJSON(f)),\n derive: async (from, { folderService, cryptoService }) => {\n const folders = Object.values(from || {}).map((f) => new Folder(f));\n\n if (await cryptoService.hasUserKey()) {\n return await folderService.decryptFolders(folders);\n } else {\n return [];\n }\n },\n});\n","import { ProviderUserStatusType, ProviderUserType } from \"../../enums\";\nimport { ProfileProviderResponse } from \"../response/profile-provider.response\";\n\nexport class ProviderData {\n id: string;\n name: string;\n status: ProviderUserStatusType;\n type: ProviderUserType;\n enabled: boolean;\n userId: string;\n useEvents: boolean;\n\n constructor(response: ProfileProviderResponse) {\n this.id = response.id;\n this.name = response.name;\n this.status = response.status;\n this.type = response.type;\n this.enabled = response.enabled;\n this.userId = response.userId;\n this.useEvents = response.useEvents;\n }\n}\n","import { firstValueFrom } from \"rxjs\";\n\nimport { UserDecryptionOptionsServiceAbstraction } from \"@bitwarden/auth/common\";\n\nimport { ApiService } from \"../../../abstractions/api.service\";\nimport { InternalOrganizationServiceAbstraction } from \"../../../admin-console/abstractions/organization/organization.service.abstraction\";\nimport { InternalPolicyService } from \"../../../admin-console/abstractions/policy/policy.service.abstraction\";\nimport { ProviderService } from \"../../../admin-console/abstractions/provider.service\";\nimport { OrganizationUserType } from \"../../../admin-console/enums\";\nimport { OrganizationData } from \"../../../admin-console/models/data/organization.data\";\nimport { PolicyData } from \"../../../admin-console/models/data/policy.data\";\nimport { ProviderData } from \"../../../admin-console/models/data/provider.data\";\nimport { PolicyResponse } from \"../../../admin-console/models/response/policy.response\";\nimport { AvatarService } from \"../../../auth/abstractions/avatar.service\";\nimport { KeyConnectorService } from \"../../../auth/abstractions/key-connector.service\";\nimport { ForceSetPasswordReason } from \"../../../auth/models/domain/force-set-password-reason\";\nimport { DomainSettingsService } from \"../../../autofill/services/domain-settings.service\";\nimport { BillingAccountProfileStateService } from \"../../../billing/abstractions/account/billing-account-profile-state.service\";\nimport { DomainsResponse } from \"../../../models/response/domains.response\";\nimport {\n SyncCipherNotification,\n SyncFolderNotification,\n SyncSendNotification,\n} from \"../../../models/response/notification.response\";\nimport { ProfileResponse } from \"../../../models/response/profile.response\";\nimport { CryptoService } from \"../../../platform/abstractions/crypto.service\";\nimport { LogService } from \"../../../platform/abstractions/log.service\";\nimport { MessagingService } from \"../../../platform/abstractions/messaging.service\";\nimport { StateService } from \"../../../platform/abstractions/state.service\";\nimport { sequentialize } from \"../../../platform/misc/sequentialize\";\nimport { SendData } from \"../../../tools/send/models/data/send.data\";\nimport { SendResponse } from \"../../../tools/send/models/response/send.response\";\nimport { SendApiService } from \"../../../tools/send/services/send-api.service.abstraction\";\nimport { InternalSendService } from \"../../../tools/send/services/send.service.abstraction\";\nimport { UserId } from \"../../../types/guid\";\nimport { CipherService } from \"../../../vault/abstractions/cipher.service\";\nimport { FolderApiServiceAbstraction } from \"../../../vault/abstractions/folder/folder-api.service.abstraction\";\nimport { InternalFolderService } from \"../../../vault/abstractions/folder/folder.service.abstraction\";\nimport { SyncService as SyncServiceAbstraction } from \"../../../vault/abstractions/sync/sync.service.abstraction\";\nimport { CipherData } from \"../../../vault/models/data/cipher.data\";\nimport { FolderData } from \"../../../vault/models/data/folder.data\";\nimport { CipherResponse } from \"../../../vault/models/response/cipher.response\";\nimport { FolderResponse } from \"../../../vault/models/response/folder.response\";\nimport { CollectionService } from \"../../abstractions/collection.service\";\nimport { CollectionData } from \"../../models/data/collection.data\";\nimport { CollectionDetailsResponse } from \"../../models/response/collection.response\";\n\nexport class SyncService implements SyncServiceAbstraction {\n syncInProgress = false;\n\n constructor(\n private apiService: ApiService,\n private domainSettingsService: DomainSettingsService,\n private folderService: InternalFolderService,\n private cipherService: CipherService,\n private cryptoService: CryptoService,\n private collectionService: CollectionService,\n private messagingService: MessagingService,\n private policyService: InternalPolicyService,\n private sendService: InternalSendService,\n private logService: LogService,\n private keyConnectorService: KeyConnectorService,\n private stateService: StateService,\n private providerService: ProviderService,\n private folderApiService: FolderApiServiceAbstraction,\n private organizationService: InternalOrganizationServiceAbstraction,\n private sendApiService: SendApiService,\n private userDecryptionOptionsService: UserDecryptionOptionsServiceAbstraction,\n private avatarService: AvatarService,\n private logoutCallback: (expired: boolean) => Promise,\n private billingAccountProfileStateService: BillingAccountProfileStateService,\n ) {}\n\n async getLastSync(): Promise {\n if ((await this.stateService.getUserId()) == null) {\n return null;\n }\n\n const lastSync = await this.stateService.getLastSync();\n if (lastSync) {\n return new Date(lastSync);\n }\n\n return null;\n }\n\n async setLastSync(date: Date, userId?: string): Promise {\n await this.stateService.setLastSync(date.toJSON(), { userId: userId });\n }\n\n @sequentialize(() => \"fullSync\")\n async fullSync(forceSync: boolean, allowThrowOnError = false): Promise {\n this.syncStarted();\n const isAuthenticated = await this.stateService.getIsAuthenticated();\n if (!isAuthenticated) {\n return this.syncCompleted(false);\n }\n\n const now = new Date();\n let needsSync = false;\n try {\n needsSync = await this.needsSyncing(forceSync);\n } catch (e) {\n if (allowThrowOnError) {\n throw e;\n }\n }\n\n if (!needsSync) {\n await this.setLastSync(now);\n return this.syncCompleted(false);\n }\n\n try {\n await this.apiService.refreshIdentityToken();\n const response = await this.apiService.getSync();\n\n await this.syncProfile(response.profile);\n await this.syncFolders(response.folders);\n await this.syncCollections(response.collections);\n await this.syncCiphers(response.ciphers);\n await this.syncSends(response.sends);\n await this.syncSettings(response.domains);\n await this.syncPolicies(response.policies);\n\n await this.setLastSync(now);\n return this.syncCompleted(true);\n } catch (e) {\n if (allowThrowOnError) {\n throw e;\n } else {\n return this.syncCompleted(false);\n }\n }\n }\n\n async syncUpsertFolder(notification: SyncFolderNotification, isEdit: boolean): Promise {\n this.syncStarted();\n if (await this.stateService.getIsAuthenticated()) {\n try {\n const localFolder = await this.folderService.get(notification.id);\n if (\n (!isEdit && localFolder == null) ||\n (isEdit && localFolder != null && localFolder.revisionDate < notification.revisionDate)\n ) {\n const remoteFolder = await this.folderApiService.get(notification.id);\n if (remoteFolder != null) {\n await this.folderService.upsert(new FolderData(remoteFolder));\n this.messagingService.send(\"syncedUpsertedFolder\", { folderId: notification.id });\n return this.syncCompleted(true);\n }\n }\n } catch (e) {\n this.logService.error(e);\n }\n }\n return this.syncCompleted(false);\n }\n\n async syncDeleteFolder(notification: SyncFolderNotification): Promise {\n this.syncStarted();\n if (await this.stateService.getIsAuthenticated()) {\n await this.folderService.delete(notification.id);\n this.messagingService.send(\"syncedDeletedFolder\", { folderId: notification.id });\n this.syncCompleted(true);\n return true;\n }\n return this.syncCompleted(false);\n }\n\n async syncUpsertCipher(notification: SyncCipherNotification, isEdit: boolean): Promise {\n this.syncStarted();\n if (await this.stateService.getIsAuthenticated()) {\n try {\n let shouldUpdate = true;\n const localCipher = await this.cipherService.get(notification.id);\n if (localCipher != null && localCipher.revisionDate >= notification.revisionDate) {\n shouldUpdate = false;\n }\n\n let checkCollections = false;\n if (shouldUpdate) {\n if (isEdit) {\n shouldUpdate = localCipher != null;\n checkCollections = true;\n } else {\n if (notification.collectionIds == null || notification.organizationId == null) {\n shouldUpdate = localCipher == null;\n } else {\n shouldUpdate = false;\n checkCollections = true;\n }\n }\n }\n\n if (\n !shouldUpdate &&\n checkCollections &&\n notification.organizationId != null &&\n notification.collectionIds != null &&\n notification.collectionIds.length > 0\n ) {\n const collections = await this.collectionService.getAll();\n if (collections != null) {\n for (let i = 0; i < collections.length; i++) {\n if (notification.collectionIds.indexOf(collections[i].id) > -1) {\n shouldUpdate = true;\n break;\n }\n }\n }\n }\n\n if (shouldUpdate) {\n const remoteCipher = await this.apiService.getFullCipherDetails(notification.id);\n if (remoteCipher != null) {\n await this.cipherService.upsert(new CipherData(remoteCipher));\n this.messagingService.send(\"syncedUpsertedCipher\", { cipherId: notification.id });\n return this.syncCompleted(true);\n }\n }\n } catch (e) {\n if (e != null && e.statusCode === 404 && isEdit) {\n await this.cipherService.delete(notification.id);\n this.messagingService.send(\"syncedDeletedCipher\", { cipherId: notification.id });\n return this.syncCompleted(true);\n }\n }\n }\n return this.syncCompleted(false);\n }\n\n async syncDeleteCipher(notification: SyncCipherNotification): Promise {\n this.syncStarted();\n if (await this.stateService.getIsAuthenticated()) {\n await this.cipherService.delete(notification.id);\n this.messagingService.send(\"syncedDeletedCipher\", { cipherId: notification.id });\n return this.syncCompleted(true);\n }\n return this.syncCompleted(false);\n }\n\n async syncUpsertSend(notification: SyncSendNotification, isEdit: boolean): Promise {\n this.syncStarted();\n if (await this.stateService.getIsAuthenticated()) {\n try {\n const localSend = this.sendService.get(notification.id);\n if (\n (!isEdit && localSend == null) ||\n (isEdit && localSend != null && localSend.revisionDate < notification.revisionDate)\n ) {\n const remoteSend = await this.sendApiService.getSend(notification.id);\n if (remoteSend != null) {\n await this.sendService.upsert(new SendData(remoteSend));\n this.messagingService.send(\"syncedUpsertedSend\", { sendId: notification.id });\n return this.syncCompleted(true);\n }\n }\n } catch (e) {\n this.logService.error(e);\n }\n }\n return this.syncCompleted(false);\n }\n\n async syncDeleteSend(notification: SyncSendNotification): Promise {\n this.syncStarted();\n if (await this.stateService.getIsAuthenticated()) {\n await this.sendService.delete(notification.id);\n this.messagingService.send(\"syncedDeletedSend\", { sendId: notification.id });\n this.syncCompleted(true);\n return true;\n }\n return this.syncCompleted(false);\n }\n\n // Helpers\n\n private syncStarted() {\n this.syncInProgress = true;\n this.messagingService.send(\"syncStarted\");\n }\n\n private syncCompleted(successfully: boolean): boolean {\n this.syncInProgress = false;\n this.messagingService.send(\"syncCompleted\", { successfully: successfully });\n return successfully;\n }\n\n private async needsSyncing(forceSync: boolean) {\n if (forceSync) {\n return true;\n }\n\n const lastSync = await this.getLastSync();\n if (lastSync == null || lastSync.getTime() === 0) {\n return true;\n }\n\n const response = await this.apiService.getAccountRevisionDate();\n if (new Date(response) <= lastSync) {\n return false;\n }\n return true;\n }\n\n private async syncProfile(response: ProfileResponse) {\n const stamp = await this.stateService.getSecurityStamp();\n if (stamp != null && stamp !== response.securityStamp) {\n if (this.logoutCallback != null) {\n await this.logoutCallback(true);\n }\n\n throw new Error(\"Stamp has changed\");\n }\n\n await this.cryptoService.setMasterKeyEncryptedUserKey(response.key);\n await this.cryptoService.setPrivateKey(response.privateKey);\n await this.cryptoService.setProviderKeys(response.providers);\n await this.cryptoService.setOrgKeys(response.organizations, response.providerOrganizations);\n await this.avatarService.setSyncAvatarColor(response.id as UserId, response.avatarColor);\n await this.stateService.setSecurityStamp(response.securityStamp);\n await this.stateService.setEmailVerified(response.emailVerified);\n\n await this.billingAccountProfileStateService.setHasPremium(\n response.premiumPersonally,\n response.premiumFromOrganization,\n );\n await this.keyConnectorService.setUsesKeyConnector(response.usesKeyConnector);\n\n await this.setForceSetPasswordReasonIfNeeded(response);\n\n const providers: { [id: string]: ProviderData } = {};\n response.providers.forEach((p) => {\n providers[p.id] = new ProviderData(p);\n });\n\n await this.providerService.save(providers);\n\n await this.syncProfileOrganizations(response);\n\n if (await this.keyConnectorService.userNeedsMigration()) {\n await this.keyConnectorService.setConvertAccountRequired(true);\n this.messagingService.send(\"convertAccountToKeyConnector\");\n } else {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.keyConnectorService.removeConvertAccountRequired();\n }\n }\n\n private async setForceSetPasswordReasonIfNeeded(profileResponse: ProfileResponse) {\n // The `forcePasswordReset` flag indicates an admin has reset the user's password and must be updated\n if (profileResponse.forcePasswordReset) {\n await this.stateService.setForceSetPasswordReason(\n ForceSetPasswordReason.AdminForcePasswordReset,\n );\n }\n\n const userDecryptionOptions = await firstValueFrom(\n this.userDecryptionOptionsService.userDecryptionOptions$,\n );\n\n if (userDecryptionOptions === null || userDecryptionOptions === undefined) {\n this.logService.error(\"Sync: Account decryption options are null or undefined.\");\n }\n\n // Even though TDE users should only be in a single org (per single org policy), check\n // through all orgs for the manageResetPassword permission. If they have it in any org,\n // they should be forced to set a password.\n let hasManageResetPasswordPermission = false;\n for (const org of profileResponse.organizations) {\n const isAdmin = org.type === OrganizationUserType.Admin;\n const isOwner = org.type === OrganizationUserType.Owner;\n\n // Note: apparently permissions only come down populated for custom roles.\n if (isAdmin || isOwner || (org.permissions && org.permissions.manageResetPassword)) {\n hasManageResetPasswordPermission = true;\n break;\n }\n }\n\n if (\n userDecryptionOptions.trustedDeviceOption !== undefined &&\n !userDecryptionOptions.hasMasterPassword &&\n hasManageResetPasswordPermission\n ) {\n // TDE user w/out MP went from having no password reset permission to having it.\n // Must set the force password reset reason so the auth guard will redirect to the set password page.\n await this.stateService.setForceSetPasswordReason(\n ForceSetPasswordReason.TdeUserWithoutPasswordHasPasswordResetPermission,\n );\n }\n }\n\n private async syncProfileOrganizations(response: ProfileResponse) {\n const organizations: { [id: string]: OrganizationData } = {};\n response.organizations.forEach((o) => {\n organizations[o.id] = new OrganizationData(o, {\n isMember: true,\n isProviderUser: false,\n });\n });\n\n response.providerOrganizations.forEach((o) => {\n if (organizations[o.id] == null) {\n organizations[o.id] = new OrganizationData(o, {\n isMember: false,\n isProviderUser: true,\n });\n } else {\n organizations[o.id].isProviderUser = true;\n }\n });\n\n await this.organizationService.replace(organizations);\n }\n\n private async syncFolders(response: FolderResponse[]) {\n const folders: { [id: string]: FolderData } = {};\n response.forEach((f) => {\n folders[f.id] = new FolderData(f);\n });\n return await this.folderService.replace(folders);\n }\n\n private async syncCollections(response: CollectionDetailsResponse[]) {\n const collections: { [id: string]: CollectionData } = {};\n response.forEach((c) => {\n collections[c.id] = new CollectionData(c);\n });\n return await this.collectionService.replace(collections);\n }\n\n private async syncCiphers(response: CipherResponse[]) {\n const ciphers: { [id: string]: CipherData } = {};\n response.forEach((c) => {\n ciphers[c.id] = new CipherData(c);\n });\n return await this.cipherService.replace(ciphers);\n }\n\n private async syncSends(response: SendResponse[]) {\n const sends: { [id: string]: SendData } = {};\n response.forEach((s) => {\n sends[s.id] = new SendData(s);\n });\n return await this.sendService.replace(sends);\n }\n\n private async syncSettings(response: DomainsResponse) {\n let eqDomains: string[][] = [];\n if (response != null && response.equivalentDomains != null) {\n eqDomains = eqDomains.concat(response.equivalentDomains);\n }\n\n if (response != null && response.globalEquivalentDomains != null) {\n response.globalEquivalentDomains.forEach((global) => {\n if (global.domains.length > 0) {\n eqDomains.push(global.domains);\n }\n });\n }\n\n return this.domainSettingsService.setEquivalentDomains(eqDomains);\n }\n\n private async syncPolicies(response: PolicyResponse[]) {\n const policies: { [id: string]: PolicyData } = {};\n if (response != null) {\n response.forEach((p) => {\n policies[p.id] = new PolicyData(p);\n });\n }\n return await this.policyService.replace(policies);\n }\n}\n","import { CryptoFunctionService } from \"../../platform/abstractions/crypto-function.service\";\nimport { LogService } from \"../../platform/abstractions/log.service\";\nimport { Utils } from \"../../platform/misc/utils\";\nimport { TotpService as TotpServiceAbstraction } from \"../abstractions/totp.service\";\n\nconst B32Chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567\";\nconst SteamChars = \"23456789BCDFGHJKMNPQRTVWXY\";\n\nexport class TotpService implements TotpServiceAbstraction {\n constructor(\n private cryptoFunctionService: CryptoFunctionService,\n private logService: LogService,\n ) {}\n\n async getCode(key: string): Promise {\n if (key == null) {\n return null;\n }\n let period = 30;\n let alg: \"sha1\" | \"sha256\" | \"sha512\" = \"sha1\";\n let digits = 6;\n let keyB32 = key;\n const isOtpAuth = key.toLowerCase().indexOf(\"otpauth://\") === 0;\n const isSteamAuth = !isOtpAuth && key.toLowerCase().indexOf(\"steam://\") === 0;\n if (isOtpAuth) {\n const params = Utils.getQueryParams(key);\n if (params.has(\"digits\") && params.get(\"digits\") != null) {\n try {\n const digitParams = parseInt(params.get(\"digits\").trim(), null);\n if (digitParams > 10) {\n digits = 10;\n } else if (digitParams > 0) {\n digits = digitParams;\n }\n } catch {\n this.logService.error(\"Invalid digits param.\");\n }\n }\n if (params.has(\"period\") && params.get(\"period\") != null) {\n try {\n const periodParam = parseInt(params.get(\"period\").trim(), null);\n if (periodParam > 0) {\n period = periodParam;\n }\n } catch {\n this.logService.error(\"Invalid period param.\");\n }\n }\n if (params.has(\"secret\") && params.get(\"secret\") != null) {\n keyB32 = params.get(\"secret\");\n }\n if (params.has(\"algorithm\") && params.get(\"algorithm\") != null) {\n const algParam = params.get(\"algorithm\").toLowerCase();\n if (algParam === \"sha1\" || algParam === \"sha256\" || algParam === \"sha512\") {\n alg = algParam;\n }\n }\n } else if (isSteamAuth) {\n keyB32 = key.substr(\"steam://\".length);\n digits = 5;\n }\n\n const epoch = Math.round(new Date().getTime() / 1000.0);\n const timeHex = this.leftPad(this.decToHex(Math.floor(epoch / period)), 16, \"0\");\n const timeBytes = Utils.fromHexToArray(timeHex);\n const keyBytes = this.b32ToBytes(keyB32);\n\n if (!keyBytes.length || !timeBytes.length) {\n return null;\n }\n\n const hash = await this.sign(keyBytes, timeBytes, alg);\n if (hash.length === 0) {\n return null;\n }\n\n const offset = hash[hash.length - 1] & 0xf;\n const binary =\n ((hash[offset] & 0x7f) << 24) |\n ((hash[offset + 1] & 0xff) << 16) |\n ((hash[offset + 2] & 0xff) << 8) |\n (hash[offset + 3] & 0xff);\n\n let otp = \"\";\n if (isSteamAuth) {\n let fullCode = binary & 0x7fffffff;\n for (let i = 0; i < digits; i++) {\n otp += SteamChars[fullCode % SteamChars.length];\n fullCode = Math.trunc(fullCode / SteamChars.length);\n }\n } else {\n otp = (binary % Math.pow(10, digits)).toString();\n otp = this.leftPad(otp, digits, \"0\");\n }\n\n return otp;\n }\n\n getTimeInterval(key: string): number {\n let period = 30;\n if (key != null && key.toLowerCase().indexOf(\"otpauth://\") === 0) {\n const params = Utils.getQueryParams(key);\n if (params.has(\"period\") && params.get(\"period\") != null) {\n try {\n period = parseInt(params.get(\"period\").trim(), null);\n } catch {\n this.logService.error(\"Invalid period param.\");\n }\n }\n }\n return period;\n }\n\n // Helpers\n\n private leftPad(s: string, l: number, p: string): string {\n if (l + 1 >= s.length) {\n s = Array(l + 1 - s.length).join(p) + s;\n }\n return s;\n }\n\n private decToHex(d: number): string {\n return (d < 15.5 ? \"0\" : \"\") + Math.round(d).toString(16);\n }\n\n private b32ToHex(s: string): string {\n s = s.toUpperCase();\n let cleanedInput = \"\";\n\n for (let i = 0; i < s.length; i++) {\n if (B32Chars.indexOf(s[i]) < 0) {\n continue;\n }\n\n cleanedInput += s[i];\n }\n s = cleanedInput;\n\n let bits = \"\";\n let hex = \"\";\n for (let i = 0; i < s.length; i++) {\n const byteIndex = B32Chars.indexOf(s.charAt(i));\n if (byteIndex < 0) {\n continue;\n }\n bits += this.leftPad(byteIndex.toString(2), 5, \"0\");\n }\n for (let i = 0; i + 4 <= bits.length; i += 4) {\n const chunk = bits.substr(i, 4);\n hex = hex + parseInt(chunk, 2).toString(16);\n }\n return hex;\n }\n\n private b32ToBytes(s: string): Uint8Array {\n return Utils.fromHexToArray(this.b32ToHex(s));\n }\n\n private async sign(\n keyBytes: Uint8Array,\n timeBytes: Uint8Array,\n alg: \"sha1\" | \"sha256\" | \"sha512\",\n ) {\n const signature = await this.cryptoFunctionService.hmac(timeBytes, keyBytes, alg);\n return new Uint8Array(signature);\n }\n}\n","import { VAULT_SETTINGS_DISK, KeyDefinition } from \"../../../platform/state\";\n\nexport const USER_ENABLE_PASSKEYS = new KeyDefinition(\n VAULT_SETTINGS_DISK,\n \"enablePasskeys\",\n {\n deserializer: (obj) => obj,\n },\n);\n\nexport const SHOW_CARDS_CURRENT_TAB = new KeyDefinition(\n VAULT_SETTINGS_DISK,\n \"showCardsCurrentTab\",\n {\n deserializer: (obj) => obj,\n },\n);\n\nexport const SHOW_IDENTITIES_CURRENT_TAB = new KeyDefinition(\n VAULT_SETTINGS_DISK,\n \"showIdentitiesCurrentTab\",\n { deserializer: (obj) => obj },\n);\n","import {\n BroadcasterService as BroadcasterServiceAbstraction,\n MessageBase,\n} from \"../abstractions/broadcaster.service\";\n\nexport class BroadcasterService implements BroadcasterServiceAbstraction {\n subscribers: Map void> = new Map<\n string,\n (message: MessageBase) => void\n >();\n\n send(message: MessageBase, id?: string) {\n if (id != null) {\n if (this.subscribers.has(id)) {\n this.subscribers.get(id)(message);\n }\n return;\n }\n\n this.subscribers.forEach((value) => {\n value(message);\n });\n }\n\n subscribe(id: string, messageCallback: (message: MessageBase) => void) {\n this.subscribers.set(id, messageCallback);\n }\n\n unsubscribe(id: string) {\n if (this.subscribers.has(id)) {\n this.subscribers.delete(id);\n }\n }\n}\n","import { Injectable } from \"@angular/core\";\n\nimport { BroadcasterService as BaseBroadcasterService } from \"@bitwarden/common/platform/services/broadcaster.service\";\n\n@Injectable()\nexport class BroadcasterService extends BaseBroadcasterService {}\n","import { Inject, Injectable } from \"@angular/core\";\nimport { fromEvent, map, merge, Observable, of, Subscription, switchMap } from \"rxjs\";\n\nimport { ThemeType } from \"@bitwarden/common/platform/enums\";\nimport { ThemeStateService } from \"@bitwarden/common/platform/theming/theme-state.service\";\n\nimport { SYSTEM_THEME_OBSERVABLE } from \"../../../services/injection-tokens\";\n\nimport { AbstractThemingService } from \"./theming.service.abstraction\";\n\n@Injectable()\nexport class AngularThemingService implements AbstractThemingService {\n /**\n * Creates a system theme observable based on watching the given window.\n * @param window The window that should be watched for system theme changes.\n * @returns An observable that will track the system theme.\n */\n static createSystemThemeFromWindow(window: Window): Observable {\n return merge(\n // This observable should always emit at least once, so go and get the current system theme designation\n of(\n window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n ? ThemeType.Dark\n : ThemeType.Light,\n ),\n // Start listening to changes\n fromEvent(\n window.matchMedia(\"(prefers-color-scheme: dark)\"),\n \"change\",\n ).pipe(map((event) => (event.matches ? ThemeType.Dark : ThemeType.Light))),\n );\n }\n\n readonly theme$ = this.themeStateService.selectedTheme$.pipe(\n switchMap((configuredTheme) => {\n if (configuredTheme === ThemeType.System) {\n return this.systemTheme$;\n }\n\n return of(configuredTheme);\n }),\n );\n\n constructor(\n private themeStateService: ThemeStateService,\n @Inject(SYSTEM_THEME_OBSERVABLE)\n private systemTheme$: Observable,\n ) {}\n\n applyThemeChangesTo(document: Document): Subscription {\n return this.theme$.subscribe((theme) => {\n document.documentElement.classList.remove(\n \"theme_\" + ThemeType.Light,\n \"theme_\" + ThemeType.Dark,\n \"theme_\" + ThemeType.Nord,\n \"theme_\" + ThemeType.SolarizedDark,\n );\n document.documentElement.classList.add(\"theme_\" + theme);\n });\n }\n}\n","import { LOCALE_ID, NgModule } from \"@angular/core\";\nimport { UnwrapOpaque } from \"type-fest\";\n\nimport {\n AuthRequestServiceAbstraction,\n AuthRequestService,\n PinCryptoServiceAbstraction,\n PinCryptoService,\n LoginStrategyServiceAbstraction,\n LoginStrategyService,\n InternalUserDecryptionOptionsServiceAbstraction,\n UserDecryptionOptionsService,\n UserDecryptionOptionsServiceAbstraction,\n} from \"@bitwarden/auth/common\";\nimport { ApiService as ApiServiceAbstraction } from \"@bitwarden/common/abstractions/api.service\";\nimport { AuditService as AuditServiceAbstraction } from \"@bitwarden/common/abstractions/audit.service\";\nimport { EventCollectionService as EventCollectionServiceAbstraction } from \"@bitwarden/common/abstractions/event/event-collection.service\";\nimport { EventUploadService as EventUploadServiceAbstraction } from \"@bitwarden/common/abstractions/event/event-upload.service\";\nimport { NotificationsService as NotificationsServiceAbstraction } from \"@bitwarden/common/abstractions/notifications.service\";\nimport { SearchService as SearchServiceAbstraction } from \"@bitwarden/common/abstractions/search.service\";\nimport { VaultTimeoutSettingsService as VaultTimeoutSettingsServiceAbstraction } from \"@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service\";\nimport { VaultTimeoutService as VaultTimeoutServiceAbstraction } from \"@bitwarden/common/abstractions/vault-timeout/vault-timeout.service\";\nimport { OrganizationApiServiceAbstraction } from \"@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction\";\nimport {\n InternalOrganizationServiceAbstraction,\n OrganizationService as OrganizationServiceAbstraction,\n} from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport { OrgDomainApiServiceAbstraction } from \"@bitwarden/common/admin-console/abstractions/organization-domain/org-domain-api.service.abstraction\";\nimport {\n OrgDomainInternalServiceAbstraction,\n OrgDomainServiceAbstraction,\n} from \"@bitwarden/common/admin-console/abstractions/organization-domain/org-domain.service.abstraction\";\nimport { OrganizationManagementPreferencesService } from \"@bitwarden/common/admin-console/abstractions/organization-management-preferences/organization-management-preferences.service\";\nimport { OrganizationUserService } from \"@bitwarden/common/admin-console/abstractions/organization-user/organization-user.service\";\nimport { PolicyApiServiceAbstraction } from \"@bitwarden/common/admin-console/abstractions/policy/policy-api.service.abstraction\";\nimport {\n InternalPolicyService,\n PolicyService as PolicyServiceAbstraction,\n} from \"@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction\";\nimport { ProviderService as ProviderServiceAbstraction } from \"@bitwarden/common/admin-console/abstractions/provider.service\";\nimport { OrganizationApiService } from \"@bitwarden/common/admin-console/services/organization/organization-api.service\";\nimport { OrganizationService } from \"@bitwarden/common/admin-console/services/organization/organization.service\";\nimport { OrgDomainApiService } from \"@bitwarden/common/admin-console/services/organization-domain/org-domain-api.service\";\nimport { OrgDomainService } from \"@bitwarden/common/admin-console/services/organization-domain/org-domain.service\";\nimport { DefaultOrganizationManagementPreferencesService } from \"@bitwarden/common/admin-console/services/organization-management-preferences/default-organization-management-preferences.service\";\nimport { OrganizationUserServiceImplementation } from \"@bitwarden/common/admin-console/services/organization-user/organization-user.service.implementation\";\nimport { PolicyApiService } from \"@bitwarden/common/admin-console/services/policy/policy-api.service\";\nimport { PolicyService } from \"@bitwarden/common/admin-console/services/policy/policy.service\";\nimport { ProviderService } from \"@bitwarden/common/admin-console/services/provider.service\";\nimport { AccountApiService as AccountApiServiceAbstraction } from \"@bitwarden/common/auth/abstractions/account-api.service\";\nimport {\n AccountService as AccountServiceAbstraction,\n InternalAccountService,\n} from \"@bitwarden/common/auth/abstractions/account.service\";\nimport { AnonymousHubService as AnonymousHubServiceAbstraction } from \"@bitwarden/common/auth/abstractions/anonymous-hub.service\";\nimport { AuthService as AuthServiceAbstraction } from \"@bitwarden/common/auth/abstractions/auth.service\";\nimport { AvatarService as AvatarServiceAbstraction } from \"@bitwarden/common/auth/abstractions/avatar.service\";\nimport { DeviceTrustCryptoServiceAbstraction } from \"@bitwarden/common/auth/abstractions/device-trust-crypto.service.abstraction\";\nimport { DevicesServiceAbstraction } from \"@bitwarden/common/auth/abstractions/devices/devices.service.abstraction\";\nimport { DevicesApiServiceAbstraction } from \"@bitwarden/common/auth/abstractions/devices-api.service.abstraction\";\nimport { KeyConnectorService as KeyConnectorServiceAbstraction } from \"@bitwarden/common/auth/abstractions/key-connector.service\";\nimport { LoginService as LoginServiceAbstraction } from \"@bitwarden/common/auth/abstractions/login.service\";\nimport { PasswordResetEnrollmentServiceAbstraction } from \"@bitwarden/common/auth/abstractions/password-reset-enrollment.service.abstraction\";\nimport { SsoLoginServiceAbstraction } from \"@bitwarden/common/auth/abstractions/sso-login.service.abstraction\";\nimport { TokenService as TokenServiceAbstraction } from \"@bitwarden/common/auth/abstractions/token.service\";\nimport { TwoFactorService as TwoFactorServiceAbstraction } from \"@bitwarden/common/auth/abstractions/two-factor.service\";\nimport { UserVerificationApiServiceAbstraction } from \"@bitwarden/common/auth/abstractions/user-verification/user-verification-api.service.abstraction\";\nimport { UserVerificationService as UserVerificationServiceAbstraction } from \"@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction\";\nimport { WebAuthnLoginApiServiceAbstraction } from \"@bitwarden/common/auth/abstractions/webauthn/webauthn-login-api.service.abstraction\";\nimport { WebAuthnLoginPrfCryptoServiceAbstraction } from \"@bitwarden/common/auth/abstractions/webauthn/webauthn-login-prf-crypto.service.abstraction\";\nimport { WebAuthnLoginServiceAbstraction } from \"@bitwarden/common/auth/abstractions/webauthn/webauthn-login.service.abstraction\";\nimport { AccountApiServiceImplementation } from \"@bitwarden/common/auth/services/account-api.service\";\nimport { AccountServiceImplementation } from \"@bitwarden/common/auth/services/account.service\";\nimport { AnonymousHubService } from \"@bitwarden/common/auth/services/anonymous-hub.service\";\nimport { AuthService } from \"@bitwarden/common/auth/services/auth.service\";\nimport { AvatarService } from \"@bitwarden/common/auth/services/avatar.service\";\nimport { DeviceTrustCryptoService } from \"@bitwarden/common/auth/services/device-trust-crypto.service.implementation\";\nimport { DevicesServiceImplementation } from \"@bitwarden/common/auth/services/devices/devices.service.implementation\";\nimport { DevicesApiServiceImplementation } from \"@bitwarden/common/auth/services/devices-api.service.implementation\";\nimport { KeyConnectorService } from \"@bitwarden/common/auth/services/key-connector.service\";\nimport { LoginService } from \"@bitwarden/common/auth/services/login.service\";\nimport { PasswordResetEnrollmentServiceImplementation } from \"@bitwarden/common/auth/services/password-reset-enrollment.service.implementation\";\nimport { SsoLoginService } from \"@bitwarden/common/auth/services/sso-login.service\";\nimport { TokenService } from \"@bitwarden/common/auth/services/token.service\";\nimport { TwoFactorService } from \"@bitwarden/common/auth/services/two-factor.service\";\nimport { UserVerificationApiService } from \"@bitwarden/common/auth/services/user-verification/user-verification-api.service\";\nimport { UserVerificationService } from \"@bitwarden/common/auth/services/user-verification/user-verification.service\";\nimport { WebAuthnLoginApiService } from \"@bitwarden/common/auth/services/webauthn-login/webauthn-login-api.service\";\nimport { WebAuthnLoginPrfCryptoService } from \"@bitwarden/common/auth/services/webauthn-login/webauthn-login-prf-crypto.service\";\nimport { WebAuthnLoginService } from \"@bitwarden/common/auth/services/webauthn-login/webauthn-login.service\";\nimport {\n AutofillSettingsServiceAbstraction,\n AutofillSettingsService,\n} from \"@bitwarden/common/autofill/services/autofill-settings.service\";\nimport {\n BadgeSettingsServiceAbstraction,\n BadgeSettingsService,\n} from \"@bitwarden/common/autofill/services/badge-settings.service\";\nimport {\n DomainSettingsService,\n DefaultDomainSettingsService,\n} from \"@bitwarden/common/autofill/services/domain-settings.service\";\nimport { BillingAccountProfileStateService } from \"@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service\";\nimport { BillingApiServiceAbstraction } from \"@bitwarden/common/billing/abstractions/billilng-api.service.abstraction\";\nimport { OrganizationBillingServiceAbstraction } from \"@bitwarden/common/billing/abstractions/organization-billing.service\";\nimport { PaymentMethodWarningsServiceAbstraction } from \"@bitwarden/common/billing/abstractions/payment-method-warnings-service.abstraction\";\nimport { DefaultBillingAccountProfileStateService } from \"@bitwarden/common/billing/services/account/billing-account-profile-state.service\";\nimport { BillingApiService } from \"@bitwarden/common/billing/services/billing-api.service\";\nimport { OrganizationBillingService } from \"@bitwarden/common/billing/services/organization-billing.service\";\nimport { PaymentMethodWarningsService } from \"@bitwarden/common/billing/services/payment-method-warnings.service\";\nimport { AppIdService as AppIdServiceAbstraction } from \"@bitwarden/common/platform/abstractions/app-id.service\";\nimport { BroadcasterService as BroadcasterServiceAbstraction } from \"@bitwarden/common/platform/abstractions/broadcaster.service\";\nimport { ConfigApiServiceAbstraction } from \"@bitwarden/common/platform/abstractions/config/config-api.service.abstraction\";\nimport { ConfigServiceAbstraction } from \"@bitwarden/common/platform/abstractions/config/config.service.abstraction\";\nimport { CryptoFunctionService as CryptoFunctionServiceAbstraction } from \"@bitwarden/common/platform/abstractions/crypto-function.service\";\nimport { CryptoService as CryptoServiceAbstraction } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { EncryptService } from \"@bitwarden/common/platform/abstractions/encrypt.service\";\nimport { EnvironmentService } from \"@bitwarden/common/platform/abstractions/environment.service\";\nimport { FileUploadService as FileUploadServiceAbstraction } from \"@bitwarden/common/platform/abstractions/file-upload/file-upload.service\";\nimport { I18nService as I18nServiceAbstraction } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { KeyGenerationService as KeyGenerationServiceAbstraction } from \"@bitwarden/common/platform/abstractions/key-generation.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { MessagingService as MessagingServiceAbstraction } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { PlatformUtilsService as PlatformUtilsServiceAbstraction } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService as StateServiceAbstraction } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { AbstractStorageService } from \"@bitwarden/common/platform/abstractions/storage.service\";\nimport { ValidationService as ValidationServiceAbstraction } from \"@bitwarden/common/platform/abstractions/validation.service\";\nimport {\n BiometricStateService,\n DefaultBiometricStateService,\n} from \"@bitwarden/common/platform/biometrics/biometric-state.service\";\nimport { StateFactory } from \"@bitwarden/common/platform/factories/state-factory\";\nimport { devFlagEnabled, flagEnabled } from \"@bitwarden/common/platform/misc/flags\";\nimport { Account } from \"@bitwarden/common/platform/models/domain/account\";\nimport { GlobalState } from \"@bitwarden/common/platform/models/domain/global-state\";\nimport { AppIdService } from \"@bitwarden/common/platform/services/app-id.service\";\nimport { ConfigApiService } from \"@bitwarden/common/platform/services/config/config-api.service\";\nimport { ConfigService } from \"@bitwarden/common/platform/services/config/config.service\";\nimport { ConsoleLogService } from \"@bitwarden/common/platform/services/console-log.service\";\nimport { CryptoService } from \"@bitwarden/common/platform/services/crypto.service\";\nimport { EncryptServiceImplementation } from \"@bitwarden/common/platform/services/cryptography/encrypt.service.implementation\";\nimport { MultithreadEncryptServiceImplementation } from \"@bitwarden/common/platform/services/cryptography/multithread-encrypt.service.implementation\";\nimport { DefaultEnvironmentService } from \"@bitwarden/common/platform/services/default-environment.service\";\nimport { FileUploadService } from \"@bitwarden/common/platform/services/file-upload/file-upload.service\";\nimport { KeyGenerationService } from \"@bitwarden/common/platform/services/key-generation.service\";\nimport { MigrationBuilderService } from \"@bitwarden/common/platform/services/migration-builder.service\";\nimport { MigrationRunner } from \"@bitwarden/common/platform/services/migration-runner\";\nimport { NoopNotificationsService } from \"@bitwarden/common/platform/services/noop-notifications.service\";\nimport { StateService } from \"@bitwarden/common/platform/services/state.service\";\nimport { StorageServiceProvider } from \"@bitwarden/common/platform/services/storage-service.provider\";\nimport { ValidationService } from \"@bitwarden/common/platform/services/validation.service\";\nimport { WebCryptoFunctionService } from \"@bitwarden/common/platform/services/web-crypto-function.service\";\nimport {\n ActiveUserStateProvider,\n GlobalStateProvider,\n SingleUserStateProvider,\n StateProvider,\n DerivedStateProvider,\n} from \"@bitwarden/common/platform/state\";\n/* eslint-disable import/no-restricted-paths -- We need the implementations to inject, but generally these should not be accessed */\nimport { DefaultActiveUserStateProvider } from \"@bitwarden/common/platform/state/implementations/default-active-user-state.provider\";\nimport { DefaultDerivedStateProvider } from \"@bitwarden/common/platform/state/implementations/default-derived-state.provider\";\nimport { DefaultGlobalStateProvider } from \"@bitwarden/common/platform/state/implementations/default-global-state.provider\";\nimport { DefaultSingleUserStateProvider } from \"@bitwarden/common/platform/state/implementations/default-single-user-state.provider\";\nimport { DefaultStateProvider } from \"@bitwarden/common/platform/state/implementations/default-state.provider\";\nimport { StateEventRegistrarService } from \"@bitwarden/common/platform/state/state-event-registrar.service\";\nimport { StateEventRunnerService } from \"@bitwarden/common/platform/state/state-event-runner.service\";\n/* eslint-enable import/no-restricted-paths */\nimport {\n DefaultThemeStateService,\n ThemeStateService,\n} from \"@bitwarden/common/platform/theming/theme-state.service\";\nimport { ApiService } from \"@bitwarden/common/services/api.service\";\nimport { AuditService } from \"@bitwarden/common/services/audit.service\";\nimport { EventCollectionService } from \"@bitwarden/common/services/event/event-collection.service\";\nimport { EventUploadService } from \"@bitwarden/common/services/event/event-upload.service\";\nimport { NotificationsService } from \"@bitwarden/common/services/notifications.service\";\nimport { SearchService } from \"@bitwarden/common/services/search.service\";\nimport { VaultTimeoutSettingsService } from \"@bitwarden/common/services/vault-timeout/vault-timeout-settings.service\";\nimport { VaultTimeoutService } from \"@bitwarden/common/services/vault-timeout/vault-timeout.service\";\nimport {\n PasswordGenerationService,\n PasswordGenerationServiceAbstraction,\n} from \"@bitwarden/common/tools/generator/password\";\nimport {\n UsernameGenerationService,\n UsernameGenerationServiceAbstraction,\n} from \"@bitwarden/common/tools/generator/username\";\nimport {\n PasswordStrengthService,\n PasswordStrengthServiceAbstraction,\n} from \"@bitwarden/common/tools/password-strength\";\nimport { SendApiService } from \"@bitwarden/common/tools/send/services/send-api.service\";\nimport { SendApiService as SendApiServiceAbstraction } from \"@bitwarden/common/tools/send/services/send-api.service.abstraction\";\nimport { SendService } from \"@bitwarden/common/tools/send/services/send.service\";\nimport {\n InternalSendService,\n SendService as SendServiceAbstraction,\n} from \"@bitwarden/common/tools/send/services/send.service.abstraction\";\nimport { CipherService as CipherServiceAbstraction } from \"@bitwarden/common/vault/abstractions/cipher.service\";\nimport { CollectionService as CollectionServiceAbstraction } from \"@bitwarden/common/vault/abstractions/collection.service\";\nimport { CipherFileUploadService as CipherFileUploadServiceAbstraction } from \"@bitwarden/common/vault/abstractions/file-upload/cipher-file-upload.service\";\nimport { FolderApiServiceAbstraction } from \"@bitwarden/common/vault/abstractions/folder/folder-api.service.abstraction\";\nimport {\n FolderService as FolderServiceAbstraction,\n InternalFolderService,\n} from \"@bitwarden/common/vault/abstractions/folder/folder.service.abstraction\";\nimport { SyncNotifierService as SyncNotifierServiceAbstraction } from \"@bitwarden/common/vault/abstractions/sync/sync-notifier.service.abstraction\";\nimport { SyncService as SyncServiceAbstraction } from \"@bitwarden/common/vault/abstractions/sync/sync.service.abstraction\";\nimport { TotpService as TotpServiceAbstraction } from \"@bitwarden/common/vault/abstractions/totp.service\";\nimport { VaultSettingsService as VaultSettingsServiceAbstraction } from \"@bitwarden/common/vault/abstractions/vault-settings/vault-settings.service\";\nimport { CipherService } from \"@bitwarden/common/vault/services/cipher.service\";\nimport { CollectionService } from \"@bitwarden/common/vault/services/collection.service\";\nimport { CipherFileUploadService } from \"@bitwarden/common/vault/services/file-upload/cipher-file-upload.service\";\nimport { FolderApiService } from \"@bitwarden/common/vault/services/folder/folder-api.service\";\nimport { FolderService } from \"@bitwarden/common/vault/services/folder/folder.service\";\nimport { SyncNotifierService } from \"@bitwarden/common/vault/services/sync/sync-notifier.service\";\nimport { SyncService } from \"@bitwarden/common/vault/services/sync/sync.service\";\nimport { TotpService } from \"@bitwarden/common/vault/services/totp.service\";\nimport { VaultSettingsService } from \"@bitwarden/common/vault/services/vault-settings/vault-settings.service\";\nimport {\n ImportApiService,\n ImportApiServiceAbstraction,\n ImportService,\n ImportServiceAbstraction,\n} from \"@bitwarden/importer/core\";\nimport { PasswordRepromptService } from \"@bitwarden/vault\";\nimport {\n VaultExportService,\n VaultExportServiceAbstraction,\n OrganizationVaultExportService,\n OrganizationVaultExportServiceAbstraction,\n IndividualVaultExportService,\n IndividualVaultExportServiceAbstraction,\n} from \"@bitwarden/vault-export-core\";\n\nimport { AuthGuard } from \"../auth/guards/auth.guard\";\nimport { UnauthGuard } from \"../auth/guards/unauth.guard\";\nimport { FormValidationErrorsService as FormValidationErrorsServiceAbstraction } from \"../platform/abstractions/form-validation-errors.service\";\nimport { BroadcasterService } from \"../platform/services/broadcaster.service\";\nimport { FormValidationErrorsService } from \"../platform/services/form-validation-errors.service\";\nimport { AngularThemingService } from \"../platform/services/theming/angular-theming.service\";\nimport { AbstractThemingService } from \"../platform/services/theming/theming.service.abstraction\";\nimport { safeProvider, SafeProvider } from \"../platform/utils/safe-provider\";\n\nimport {\n LOCALES_DIRECTORY,\n LOCKED_CALLBACK,\n LOGOUT_CALLBACK,\n LOG_MAC_FAILURES,\n MEMORY_STORAGE,\n OBSERVABLE_DISK_STORAGE,\n OBSERVABLE_MEMORY_STORAGE,\n SafeInjectionToken,\n SECURE_STORAGE,\n STATE_FACTORY,\n STATE_SERVICE_USE_CACHE,\n SUPPORTS_SECURE_STORAGE,\n SYSTEM_LANGUAGE,\n SYSTEM_THEME_OBSERVABLE,\n WINDOW,\n} from \"./injection-tokens\";\nimport { ModalService } from \"./modal.service\";\n\n/**\n * Provider definitions used in the ngModule.\n * Add your provider definition here using the safeProvider function as a wrapper. This will give you type safety.\n * If you need help please ask for it, do NOT change the type of this array.\n */\nconst typesafeProviders: Array = [\n safeProvider(AuthGuard),\n safeProvider(UnauthGuard),\n safeProvider(ModalService),\n safeProvider(PasswordRepromptService),\n safeProvider({ provide: WINDOW, useValue: window }),\n safeProvider({\n provide: LOCALE_ID as SafeInjectionToken,\n useFactory: (i18nService: I18nServiceAbstraction) => i18nService.translationLocale,\n deps: [I18nServiceAbstraction],\n }),\n safeProvider({\n provide: SUPPORTS_SECURE_STORAGE,\n useFactory: (platformUtilsService: PlatformUtilsServiceAbstraction) =>\n platformUtilsService.supportsSecureStorage(),\n deps: [PlatformUtilsServiceAbstraction],\n }),\n safeProvider({\n provide: LOCALES_DIRECTORY,\n useValue: \"./locales\",\n }),\n safeProvider({\n provide: SYSTEM_LANGUAGE,\n useFactory: (window: Window) => window.navigator.language,\n deps: [WINDOW],\n }),\n safeProvider({\n provide: STATE_FACTORY,\n useValue: new StateFactory(GlobalState, Account),\n }),\n safeProvider({\n provide: STATE_SERVICE_USE_CACHE,\n useValue: true,\n }),\n safeProvider({\n provide: LOGOUT_CALLBACK,\n useFactory:\n (messagingService: MessagingServiceAbstraction) => (expired: boolean, userId?: string) =>\n Promise.resolve(messagingService.send(\"logout\", { expired: expired, userId: userId })),\n deps: [MessagingServiceAbstraction],\n }),\n safeProvider({\n provide: LOCKED_CALLBACK,\n useValue: null,\n }),\n safeProvider({\n provide: LOG_MAC_FAILURES,\n useValue: true,\n }),\n safeProvider({\n provide: SYSTEM_THEME_OBSERVABLE,\n useFactory: (window: Window) => AngularThemingService.createSystemThemeFromWindow(window),\n deps: [WINDOW],\n }),\n safeProvider({\n provide: ThemeStateService,\n useClass: DefaultThemeStateService,\n deps: [GlobalStateProvider],\n }),\n safeProvider({\n provide: AbstractThemingService,\n useClass: AngularThemingService,\n deps: [ThemeStateService, SYSTEM_THEME_OBSERVABLE],\n }),\n safeProvider({\n provide: AppIdServiceAbstraction,\n useClass: AppIdService,\n deps: [GlobalStateProvider],\n }),\n safeProvider({\n provide: AuditServiceAbstraction,\n useClass: AuditService,\n deps: [CryptoFunctionServiceAbstraction, ApiServiceAbstraction],\n }),\n safeProvider({\n provide: AuthServiceAbstraction,\n useClass: AuthService,\n deps: [\n MessagingServiceAbstraction,\n CryptoServiceAbstraction,\n ApiServiceAbstraction,\n StateServiceAbstraction,\n ],\n }),\n safeProvider({\n provide: LoginStrategyServiceAbstraction,\n useClass: LoginStrategyService,\n deps: [\n CryptoServiceAbstraction,\n ApiServiceAbstraction,\n TokenServiceAbstraction,\n AppIdServiceAbstraction,\n PlatformUtilsServiceAbstraction,\n MessagingServiceAbstraction,\n LogService,\n KeyConnectorServiceAbstraction,\n EnvironmentService,\n StateServiceAbstraction,\n TwoFactorServiceAbstraction,\n I18nServiceAbstraction,\n EncryptService,\n PasswordStrengthServiceAbstraction,\n PolicyServiceAbstraction,\n DeviceTrustCryptoServiceAbstraction,\n AuthRequestServiceAbstraction,\n InternalUserDecryptionOptionsServiceAbstraction,\n GlobalStateProvider,\n BillingAccountProfileStateService,\n ],\n }),\n safeProvider({\n provide: FileUploadServiceAbstraction,\n useClass: FileUploadService,\n deps: [LogService],\n }),\n safeProvider({\n provide: CipherFileUploadServiceAbstraction,\n useClass: CipherFileUploadService,\n deps: [ApiServiceAbstraction, FileUploadServiceAbstraction],\n }),\n safeProvider({\n provide: CipherServiceAbstraction,\n useFactory: (\n cryptoService: CryptoServiceAbstraction,\n domainSettingsService: DomainSettingsService,\n apiService: ApiServiceAbstraction,\n i18nService: I18nServiceAbstraction,\n searchService: SearchServiceAbstraction,\n stateService: StateServiceAbstraction,\n autofillSettingsService: AutofillSettingsServiceAbstraction,\n encryptService: EncryptService,\n fileUploadService: CipherFileUploadServiceAbstraction,\n configService: ConfigServiceAbstraction,\n ) =>\n new CipherService(\n cryptoService,\n domainSettingsService,\n apiService,\n i18nService,\n searchService,\n stateService,\n autofillSettingsService,\n encryptService,\n fileUploadService,\n configService,\n ),\n deps: [\n CryptoServiceAbstraction,\n DomainSettingsService,\n ApiServiceAbstraction,\n I18nServiceAbstraction,\n SearchServiceAbstraction,\n StateServiceAbstraction,\n AutofillSettingsServiceAbstraction,\n EncryptService,\n CipherFileUploadServiceAbstraction,\n ConfigServiceAbstraction,\n ],\n }),\n safeProvider({\n provide: InternalFolderService,\n useClass: FolderService,\n deps: [\n CryptoServiceAbstraction,\n I18nServiceAbstraction,\n CipherServiceAbstraction,\n StateServiceAbstraction,\n StateProvider,\n ],\n }),\n safeProvider({\n provide: FolderServiceAbstraction,\n useExisting: InternalFolderService,\n }),\n safeProvider({\n provide: FolderApiServiceAbstraction,\n useClass: FolderApiService,\n deps: [InternalFolderService, ApiServiceAbstraction],\n }),\n safeProvider({\n provide: AccountApiServiceAbstraction,\n useClass: AccountApiServiceImplementation,\n deps: [\n ApiServiceAbstraction,\n UserVerificationServiceAbstraction,\n LogService,\n InternalAccountService,\n ],\n }),\n safeProvider({\n provide: InternalAccountService,\n useClass: AccountServiceImplementation,\n deps: [MessagingServiceAbstraction, LogService, GlobalStateProvider],\n }),\n safeProvider({\n provide: AccountServiceAbstraction,\n useExisting: InternalAccountService,\n }),\n safeProvider({\n provide: AvatarServiceAbstraction,\n useClass: AvatarService,\n deps: [ApiServiceAbstraction, StateProvider],\n }),\n safeProvider({ provide: LogService, useFactory: () => new ConsoleLogService(false), deps: [] }),\n safeProvider({\n provide: CollectionServiceAbstraction,\n useClass: CollectionService,\n deps: [CryptoServiceAbstraction, I18nServiceAbstraction, StateProvider],\n }),\n safeProvider({\n provide: EnvironmentService,\n useClass: DefaultEnvironmentService,\n deps: [StateProvider, AccountServiceAbstraction],\n }),\n safeProvider({\n provide: InternalUserDecryptionOptionsServiceAbstraction,\n useClass: UserDecryptionOptionsService,\n deps: [StateProvider],\n }),\n safeProvider({\n provide: UserDecryptionOptionsServiceAbstraction,\n useExisting: InternalUserDecryptionOptionsServiceAbstraction,\n }),\n safeProvider({\n provide: TotpServiceAbstraction,\n useClass: TotpService,\n deps: [CryptoFunctionServiceAbstraction, LogService],\n }),\n safeProvider({\n provide: TokenServiceAbstraction,\n useClass: TokenService,\n deps: [\n SingleUserStateProvider,\n GlobalStateProvider,\n SUPPORTS_SECURE_STORAGE,\n SECURE_STORAGE,\n KeyGenerationServiceAbstraction,\n EncryptService,\n LogService,\n ],\n }),\n safeProvider({\n provide: KeyGenerationServiceAbstraction,\n useClass: KeyGenerationService,\n deps: [CryptoFunctionServiceAbstraction],\n }),\n safeProvider({\n provide: CryptoServiceAbstraction,\n useClass: CryptoService,\n deps: [\n KeyGenerationServiceAbstraction,\n CryptoFunctionServiceAbstraction,\n EncryptService,\n PlatformUtilsServiceAbstraction,\n LogService,\n StateServiceAbstraction,\n AccountServiceAbstraction,\n StateProvider,\n ],\n }),\n safeProvider({\n provide: PasswordStrengthServiceAbstraction,\n useClass: PasswordStrengthService,\n deps: [],\n }),\n safeProvider({\n provide: PasswordGenerationServiceAbstraction,\n useClass: PasswordGenerationService,\n deps: [CryptoServiceAbstraction, PolicyServiceAbstraction, StateServiceAbstraction],\n }),\n safeProvider({\n provide: UsernameGenerationServiceAbstraction,\n useClass: UsernameGenerationService,\n deps: [CryptoServiceAbstraction, StateServiceAbstraction, ApiServiceAbstraction],\n }),\n safeProvider({\n provide: ApiServiceAbstraction,\n useClass: ApiService,\n deps: [\n TokenServiceAbstraction,\n PlatformUtilsServiceAbstraction,\n EnvironmentService,\n AppIdServiceAbstraction,\n StateServiceAbstraction,\n LOGOUT_CALLBACK,\n ],\n }),\n safeProvider({\n provide: SendServiceAbstraction,\n useExisting: InternalSendService,\n }),\n safeProvider({\n provide: InternalSendService,\n useClass: SendService,\n deps: [\n CryptoServiceAbstraction,\n I18nServiceAbstraction,\n KeyGenerationServiceAbstraction,\n StateServiceAbstraction,\n ],\n }),\n safeProvider({\n provide: SendApiServiceAbstraction,\n useClass: SendApiService,\n deps: [ApiServiceAbstraction, FileUploadServiceAbstraction, InternalSendService],\n }),\n safeProvider({\n provide: SyncServiceAbstraction,\n useClass: SyncService,\n deps: [\n ApiServiceAbstraction,\n DomainSettingsService,\n InternalFolderService,\n CipherServiceAbstraction,\n CryptoServiceAbstraction,\n CollectionServiceAbstraction,\n MessagingServiceAbstraction,\n InternalPolicyService,\n InternalSendService,\n LogService,\n KeyConnectorServiceAbstraction,\n StateServiceAbstraction,\n ProviderServiceAbstraction,\n FolderApiServiceAbstraction,\n InternalOrganizationServiceAbstraction,\n SendApiServiceAbstraction,\n UserDecryptionOptionsServiceAbstraction,\n AvatarServiceAbstraction,\n LOGOUT_CALLBACK,\n BillingAccountProfileStateService,\n ],\n }),\n safeProvider({ provide: BroadcasterServiceAbstraction, useClass: BroadcasterService, deps: [] }),\n safeProvider({\n provide: VaultTimeoutSettingsServiceAbstraction,\n useClass: VaultTimeoutSettingsService,\n deps: [\n UserDecryptionOptionsServiceAbstraction,\n CryptoServiceAbstraction,\n TokenServiceAbstraction,\n PolicyServiceAbstraction,\n StateServiceAbstraction,\n BiometricStateService,\n ],\n }),\n safeProvider({\n provide: VaultTimeoutService,\n useClass: VaultTimeoutService,\n deps: [\n CipherServiceAbstraction,\n FolderServiceAbstraction,\n CollectionServiceAbstraction,\n CryptoServiceAbstraction,\n PlatformUtilsServiceAbstraction,\n MessagingServiceAbstraction,\n SearchServiceAbstraction,\n StateServiceAbstraction,\n AuthServiceAbstraction,\n VaultTimeoutSettingsServiceAbstraction,\n StateEventRunnerService,\n LOCKED_CALLBACK,\n LOGOUT_CALLBACK,\n ],\n }),\n safeProvider({\n provide: VaultTimeoutServiceAbstraction,\n useExisting: VaultTimeoutService,\n }),\n safeProvider({\n provide: SsoLoginServiceAbstraction,\n useClass: SsoLoginService,\n deps: [StateProvider],\n }),\n safeProvider({\n provide: StateServiceAbstraction,\n useClass: StateService,\n deps: [\n AbstractStorageService,\n SECURE_STORAGE,\n MEMORY_STORAGE,\n LogService,\n STATE_FACTORY,\n AccountServiceAbstraction,\n EnvironmentService,\n TokenServiceAbstraction,\n MigrationRunner,\n STATE_SERVICE_USE_CACHE,\n ],\n }),\n safeProvider({\n provide: ImportApiServiceAbstraction,\n useClass: ImportApiService,\n deps: [ApiServiceAbstraction],\n }),\n safeProvider({\n provide: ImportServiceAbstraction,\n useClass: ImportService,\n deps: [\n CipherServiceAbstraction,\n FolderServiceAbstraction,\n ImportApiServiceAbstraction,\n I18nServiceAbstraction,\n CollectionServiceAbstraction,\n CryptoServiceAbstraction,\n ],\n }),\n safeProvider({\n provide: IndividualVaultExportServiceAbstraction,\n useClass: IndividualVaultExportService,\n deps: [\n FolderServiceAbstraction,\n CipherServiceAbstraction,\n CryptoServiceAbstraction,\n CryptoFunctionServiceAbstraction,\n StateServiceAbstraction,\n ],\n }),\n safeProvider({\n provide: OrganizationVaultExportServiceAbstraction,\n useClass: OrganizationVaultExportService,\n deps: [\n CipherServiceAbstraction,\n ApiServiceAbstraction,\n CryptoServiceAbstraction,\n CryptoFunctionServiceAbstraction,\n StateServiceAbstraction,\n CollectionServiceAbstraction,\n ],\n }),\n safeProvider({\n provide: VaultExportServiceAbstraction,\n useClass: VaultExportService,\n deps: [IndividualVaultExportServiceAbstraction, OrganizationVaultExportServiceAbstraction],\n }),\n safeProvider({\n provide: SearchServiceAbstraction,\n useClass: SearchService,\n deps: [LogService, I18nServiceAbstraction],\n }),\n safeProvider({\n provide: NotificationsServiceAbstraction,\n useClass: devFlagEnabled(\"noopNotifications\") ? NoopNotificationsService : NotificationsService,\n deps: [\n LogService,\n SyncServiceAbstraction,\n AppIdServiceAbstraction,\n ApiServiceAbstraction,\n EnvironmentService,\n LOGOUT_CALLBACK,\n StateServiceAbstraction,\n AuthServiceAbstraction,\n MessagingServiceAbstraction,\n ],\n }),\n safeProvider({\n provide: CryptoFunctionServiceAbstraction,\n useClass: WebCryptoFunctionService,\n deps: [WINDOW],\n }),\n safeProvider({\n provide: EncryptService,\n useFactory: encryptServiceFactory,\n deps: [CryptoFunctionServiceAbstraction, LogService, LOG_MAC_FAILURES],\n }),\n safeProvider({\n provide: EventUploadServiceAbstraction,\n useClass: EventUploadService,\n deps: [ApiServiceAbstraction, StateProvider, LogService, AccountServiceAbstraction],\n }),\n safeProvider({\n provide: EventCollectionServiceAbstraction,\n useClass: EventCollectionService,\n deps: [\n CipherServiceAbstraction,\n StateProvider,\n OrganizationServiceAbstraction,\n EventUploadServiceAbstraction,\n AccountServiceAbstraction,\n ],\n }),\n safeProvider({\n provide: InternalPolicyService,\n useClass: PolicyService,\n deps: [StateProvider, OrganizationServiceAbstraction],\n }),\n safeProvider({\n provide: PolicyServiceAbstraction,\n useExisting: InternalPolicyService,\n }),\n safeProvider({\n provide: PolicyApiServiceAbstraction,\n useClass: PolicyApiService,\n deps: [InternalPolicyService, ApiServiceAbstraction],\n }),\n safeProvider({\n provide: KeyConnectorServiceAbstraction,\n useClass: KeyConnectorService,\n deps: [\n StateServiceAbstraction,\n CryptoServiceAbstraction,\n ApiServiceAbstraction,\n TokenServiceAbstraction,\n LogService,\n OrganizationServiceAbstraction,\n KeyGenerationServiceAbstraction,\n LOGOUT_CALLBACK,\n ],\n }),\n safeProvider({\n provide: UserVerificationServiceAbstraction,\n useClass: UserVerificationService,\n deps: [\n StateServiceAbstraction,\n CryptoServiceAbstraction,\n I18nServiceAbstraction,\n UserVerificationApiServiceAbstraction,\n UserDecryptionOptionsServiceAbstraction,\n PinCryptoServiceAbstraction,\n LogService,\n VaultTimeoutSettingsServiceAbstraction,\n PlatformUtilsServiceAbstraction,\n ],\n }),\n safeProvider({\n provide: InternalOrganizationServiceAbstraction,\n useClass: OrganizationService,\n deps: [StateProvider],\n }),\n safeProvider({\n provide: OrganizationServiceAbstraction,\n useExisting: InternalOrganizationServiceAbstraction,\n }),\n safeProvider({\n provide: OrganizationUserService,\n useClass: OrganizationUserServiceImplementation,\n deps: [ApiServiceAbstraction],\n }),\n safeProvider({\n provide: PasswordResetEnrollmentServiceAbstraction,\n useClass: PasswordResetEnrollmentServiceImplementation,\n deps: [\n OrganizationApiServiceAbstraction,\n AccountServiceAbstraction,\n CryptoServiceAbstraction,\n OrganizationUserService,\n I18nServiceAbstraction,\n ],\n }),\n safeProvider({\n provide: ProviderServiceAbstraction,\n useClass: ProviderService,\n deps: [StateProvider],\n }),\n safeProvider({\n provide: TwoFactorServiceAbstraction,\n useClass: TwoFactorService,\n deps: [I18nServiceAbstraction, PlatformUtilsServiceAbstraction],\n }),\n safeProvider({\n provide: FormValidationErrorsServiceAbstraction,\n useClass: FormValidationErrorsService,\n deps: [],\n }),\n safeProvider({\n provide: UserVerificationApiServiceAbstraction,\n useClass: UserVerificationApiService,\n deps: [ApiServiceAbstraction],\n }),\n safeProvider({\n provide: OrganizationApiServiceAbstraction,\n useClass: OrganizationApiService,\n // This is a slightly odd dependency tree for a specialized api service\n // it depends on SyncService so that new data can be retrieved through the sync\n // rather than updating the OrganizationService directly. Instead OrganizationService\n // subscribes to sync notifications and will update itself based on that.\n deps: [ApiServiceAbstraction, SyncServiceAbstraction],\n }),\n safeProvider({\n provide: SyncNotifierServiceAbstraction,\n useClass: SyncNotifierService,\n deps: [],\n }),\n safeProvider({\n provide: ConfigService,\n useClass: ConfigService,\n deps: [\n StateServiceAbstraction,\n ConfigApiServiceAbstraction,\n AuthServiceAbstraction,\n EnvironmentService,\n LogService,\n StateProvider,\n ],\n }),\n safeProvider({\n provide: ConfigServiceAbstraction,\n useExisting: ConfigService,\n }),\n safeProvider({\n provide: ConfigApiServiceAbstraction,\n useClass: ConfigApiService,\n deps: [ApiServiceAbstraction, AuthServiceAbstraction],\n }),\n safeProvider({\n provide: AnonymousHubServiceAbstraction,\n useClass: AnonymousHubService,\n deps: [EnvironmentService, LoginStrategyServiceAbstraction, LogService],\n }),\n safeProvider({\n provide: ValidationServiceAbstraction,\n useClass: ValidationService,\n deps: [I18nServiceAbstraction, PlatformUtilsServiceAbstraction],\n }),\n safeProvider({\n provide: LoginServiceAbstraction,\n useClass: LoginService,\n deps: [StateServiceAbstraction],\n }),\n safeProvider({\n provide: OrgDomainInternalServiceAbstraction,\n useClass: OrgDomainService,\n deps: [PlatformUtilsServiceAbstraction, I18nServiceAbstraction],\n }),\n safeProvider({\n provide: OrgDomainServiceAbstraction,\n useExisting: OrgDomainInternalServiceAbstraction,\n }),\n safeProvider({\n provide: OrgDomainApiServiceAbstraction,\n useClass: OrgDomainApiService,\n deps: [OrgDomainInternalServiceAbstraction, ApiServiceAbstraction],\n }),\n safeProvider({\n provide: DevicesApiServiceAbstraction,\n useClass: DevicesApiServiceImplementation,\n deps: [ApiServiceAbstraction],\n }),\n safeProvider({\n provide: DevicesServiceAbstraction,\n useClass: DevicesServiceImplementation,\n deps: [DevicesApiServiceAbstraction],\n }),\n safeProvider({\n provide: DeviceTrustCryptoServiceAbstraction,\n useClass: DeviceTrustCryptoService,\n deps: [\n KeyGenerationServiceAbstraction,\n CryptoFunctionServiceAbstraction,\n CryptoServiceAbstraction,\n EncryptService,\n StateServiceAbstraction,\n AppIdServiceAbstraction,\n DevicesApiServiceAbstraction,\n I18nServiceAbstraction,\n PlatformUtilsServiceAbstraction,\n UserDecryptionOptionsServiceAbstraction,\n ],\n }),\n safeProvider({\n provide: AuthRequestServiceAbstraction,\n useClass: AuthRequestService,\n deps: [\n AppIdServiceAbstraction,\n CryptoServiceAbstraction,\n ApiServiceAbstraction,\n StateServiceAbstraction,\n ],\n }),\n safeProvider({\n provide: PinCryptoServiceAbstraction,\n useClass: PinCryptoService,\n deps: [\n StateServiceAbstraction,\n CryptoServiceAbstraction,\n VaultTimeoutSettingsServiceAbstraction,\n LogService,\n ],\n }),\n safeProvider({\n provide: WebAuthnLoginPrfCryptoServiceAbstraction,\n useClass: WebAuthnLoginPrfCryptoService,\n deps: [CryptoFunctionServiceAbstraction],\n }),\n safeProvider({\n provide: WebAuthnLoginApiServiceAbstraction,\n useClass: WebAuthnLoginApiService,\n deps: [ApiServiceAbstraction, EnvironmentService],\n }),\n safeProvider({\n provide: WebAuthnLoginServiceAbstraction,\n useClass: WebAuthnLoginService,\n deps: [\n WebAuthnLoginApiServiceAbstraction,\n LoginStrategyServiceAbstraction,\n WebAuthnLoginPrfCryptoServiceAbstraction,\n WINDOW,\n LogService,\n ],\n }),\n safeProvider({\n provide: StorageServiceProvider,\n useClass: StorageServiceProvider,\n deps: [OBSERVABLE_DISK_STORAGE, OBSERVABLE_MEMORY_STORAGE],\n }),\n safeProvider({\n provide: StateEventRegistrarService,\n useClass: StateEventRegistrarService,\n deps: [GlobalStateProvider, StorageServiceProvider],\n }),\n safeProvider({\n provide: StateEventRunnerService,\n useClass: StateEventRunnerService,\n deps: [GlobalStateProvider, StorageServiceProvider],\n }),\n safeProvider({\n provide: GlobalStateProvider,\n useClass: DefaultGlobalStateProvider,\n deps: [StorageServiceProvider],\n }),\n safeProvider({\n provide: ActiveUserStateProvider,\n useClass: DefaultActiveUserStateProvider,\n deps: [AccountServiceAbstraction, SingleUserStateProvider],\n }),\n safeProvider({\n provide: SingleUserStateProvider,\n useClass: DefaultSingleUserStateProvider,\n deps: [StorageServiceProvider, StateEventRegistrarService],\n }),\n safeProvider({\n provide: DerivedStateProvider,\n useClass: DefaultDerivedStateProvider,\n deps: [OBSERVABLE_MEMORY_STORAGE],\n }),\n safeProvider({\n provide: StateProvider,\n useClass: DefaultStateProvider,\n deps: [\n ActiveUserStateProvider,\n SingleUserStateProvider,\n GlobalStateProvider,\n DerivedStateProvider,\n ],\n }),\n safeProvider({\n provide: OrganizationBillingServiceAbstraction,\n useClass: OrganizationBillingService,\n deps: [\n CryptoServiceAbstraction,\n EncryptService,\n I18nServiceAbstraction,\n OrganizationApiServiceAbstraction,\n ],\n }),\n safeProvider({\n provide: AutofillSettingsServiceAbstraction,\n useClass: AutofillSettingsService,\n deps: [StateProvider, PolicyServiceAbstraction],\n }),\n safeProvider({\n provide: BadgeSettingsServiceAbstraction,\n useClass: BadgeSettingsService,\n deps: [StateProvider],\n }),\n safeProvider({\n provide: DomainSettingsService,\n useClass: DefaultDomainSettingsService,\n deps: [StateProvider],\n }),\n safeProvider({\n provide: BiometricStateService,\n useClass: DefaultBiometricStateService,\n deps: [StateProvider],\n }),\n safeProvider({\n provide: VaultSettingsServiceAbstraction,\n useClass: VaultSettingsService,\n deps: [StateProvider],\n }),\n safeProvider({\n provide: MigrationRunner,\n useClass: MigrationRunner,\n deps: [AbstractStorageService, LogService, MigrationBuilderService],\n }),\n safeProvider({\n provide: MigrationBuilderService,\n useClass: MigrationBuilderService,\n deps: [],\n }),\n safeProvider({\n provide: BillingApiServiceAbstraction,\n useClass: BillingApiService,\n deps: [ApiServiceAbstraction],\n }),\n safeProvider({\n provide: PaymentMethodWarningsServiceAbstraction,\n useClass: PaymentMethodWarningsService,\n deps: [BillingApiServiceAbstraction, StateProvider],\n }),\n safeProvider({\n provide: BillingAccountProfileStateService,\n useClass: DefaultBillingAccountProfileStateService,\n deps: [StateProvider],\n }),\n safeProvider({\n provide: OrganizationManagementPreferencesService,\n useClass: DefaultOrganizationManagementPreferencesService,\n deps: [StateProvider],\n }),\n];\n\nfunction encryptServiceFactory(\n cryptoFunctionservice: CryptoFunctionServiceAbstraction,\n logService: LogService,\n logMacFailures: boolean,\n): EncryptService {\n return flagEnabled(\"multithreadDecryption\")\n ? new MultithreadEncryptServiceImplementation(cryptoFunctionservice, logService, logMacFailures)\n : new EncryptServiceImplementation(cryptoFunctionservice, logService, logMacFailures);\n}\n\n@NgModule({\n declarations: [],\n // Do not register your dependency here! Add it to the typesafeProviders array using the helper function\n providers: typesafeProviders as UnwrapOpaque[],\n})\nexport class JslibServicesModule {}\n","import { ApiService } from \"../../abstractions/api.service\";\nimport { CryptoService } from \"../../platform/abstractions/crypto.service\";\nimport { MessagingService } from \"../../platform/abstractions/messaging.service\";\nimport { StateService } from \"../../platform/abstractions/state.service\";\nimport { KeySuffixOptions } from \"../../platform/enums\";\nimport { AuthService as AuthServiceAbstraction } from \"../abstractions/auth.service\";\nimport { AuthenticationStatus } from \"../enums/authentication-status\";\n\nexport class AuthService implements AuthServiceAbstraction {\n constructor(\n protected messagingService: MessagingService,\n protected cryptoService: CryptoService,\n protected apiService: ApiService,\n protected stateService: StateService,\n ) {}\n\n async getAuthStatus(userId?: string): Promise {\n // If we don't have an access token or userId, we're logged out\n const isAuthenticated = await this.stateService.getIsAuthenticated({ userId: userId });\n if (!isAuthenticated) {\n return AuthenticationStatus.LoggedOut;\n }\n\n // If we don't have a user key in memory, we're locked\n if (!(await this.cryptoService.hasUserKeyInMemory(userId))) {\n // Check if the user has vault timeout set to never and verify that\n // they've never unlocked their vault\n const neverLock =\n (await this.cryptoService.hasUserKeyStored(KeySuffixOptions.Auto, userId)) &&\n !(await this.stateService.getEverBeenUnlocked({ userId: userId }));\n\n if (neverLock) {\n // Attempt to get the key from storage and set it in memory\n const userKey = await this.cryptoService.getUserKeyFromStorage(\n KeySuffixOptions.Auto,\n userId,\n );\n await this.cryptoService.setUserKey(userKey, userId);\n }\n }\n\n // We do another check here in case setting the auto key failed\n const hasKeyInMemory = await this.cryptoService.hasUserKeyInMemory(userId);\n if (!hasKeyInMemory) {\n return AuthenticationStatus.Locked;\n }\n\n return AuthenticationStatus.Unlocked;\n }\n\n logOut(callback: () => void) {\n callback();\n this.messagingService.send(\"loggedOut\");\n }\n}\n","import {\n FileUploadApiMethods,\n FileUploadService as FileUploadServiceAbstraction,\n} from \"../../abstractions/file-upload/file-upload.service\";\nimport { LogService } from \"../../abstractions/log.service\";\nimport { FileUploadType } from \"../../enums\";\nimport { EncArrayBuffer } from \"../../models/domain/enc-array-buffer\";\nimport { EncString } from \"../../models/domain/enc-string\";\n\nimport { AzureFileUploadService } from \"./azure-file-upload.service\";\nimport { BitwardenFileUploadService } from \"./bitwarden-file-upload.service\";\n\nexport class FileUploadService implements FileUploadServiceAbstraction {\n private azureFileUploadService: AzureFileUploadService;\n private bitwardenFileUploadService: BitwardenFileUploadService;\n\n constructor(protected logService: LogService) {\n this.azureFileUploadService = new AzureFileUploadService(logService);\n this.bitwardenFileUploadService = new BitwardenFileUploadService();\n }\n\n async upload(\n uploadData: { url: string; fileUploadType: FileUploadType },\n fileName: EncString,\n encryptedFileData: EncArrayBuffer,\n fileUploadMethods: FileUploadApiMethods,\n ) {\n try {\n switch (uploadData.fileUploadType) {\n case FileUploadType.Direct:\n await this.bitwardenFileUploadService.upload(\n fileName.encryptedString,\n encryptedFileData,\n (fd) => fileUploadMethods.postDirect(fd),\n );\n break;\n case FileUploadType.Azure: {\n await this.azureFileUploadService.upload(\n uploadData.url,\n encryptedFileData,\n fileUploadMethods.renewFileUploadUrl,\n );\n break;\n }\n default:\n throw new Error(\"Unknown file upload type\");\n }\n } catch (e) {\n await fileUploadMethods.rollback();\n throw e;\n }\n }\n}\n","import { ApiService } from \"../../../abstractions/api.service\";\nimport { ErrorResponse } from \"../../../models/response/error.response\";\nimport {\n FileUploadApiMethods,\n FileUploadService,\n} from \"../../../platform/abstractions/file-upload/file-upload.service\";\nimport { Utils } from \"../../../platform/misc/utils\";\nimport { EncArrayBuffer } from \"../../../platform/models/domain/enc-array-buffer\";\nimport { EncString } from \"../../../platform/models/domain/enc-string\";\nimport { SymmetricCryptoKey } from \"../../../platform/models/domain/symmetric-crypto-key\";\nimport { CipherFileUploadService as CipherFileUploadServiceAbstraction } from \"../../abstractions/file-upload/cipher-file-upload.service\";\nimport { Cipher } from \"../../models/domain/cipher\";\nimport { AttachmentRequest } from \"../../models/request/attachment.request\";\nimport { AttachmentUploadDataResponse } from \"../../models/response/attachment-upload-data.response\";\nimport { CipherResponse } from \"../../models/response/cipher.response\";\n\nexport class CipherFileUploadService implements CipherFileUploadServiceAbstraction {\n constructor(\n private apiService: ApiService,\n private fileUploadService: FileUploadService,\n ) {}\n\n async upload(\n cipher: Cipher,\n encFileName: EncString,\n encData: EncArrayBuffer,\n admin: boolean,\n dataEncKey: [SymmetricCryptoKey, EncString],\n ): Promise {\n const request: AttachmentRequest = {\n key: dataEncKey[1].encryptedString,\n fileName: encFileName.encryptedString,\n fileSize: encData.buffer.byteLength,\n adminRequest: admin,\n };\n\n let response: CipherResponse;\n try {\n const uploadDataResponse = await this.apiService.postCipherAttachment(cipher.id, request);\n response = admin ? uploadDataResponse.cipherMiniResponse : uploadDataResponse.cipherResponse;\n await this.fileUploadService.upload(\n uploadDataResponse,\n encFileName,\n encData,\n this.generateMethods(uploadDataResponse, response, request.adminRequest),\n );\n } catch (e) {\n if (\n (e instanceof ErrorResponse && (e as ErrorResponse).statusCode === 404) ||\n (e as ErrorResponse).statusCode === 405\n ) {\n response = await this.legacyServerAttachmentFileUpload(\n request.adminRequest,\n cipher.id,\n encFileName,\n encData,\n dataEncKey[1],\n );\n } else if (e instanceof ErrorResponse) {\n throw new Error((e as ErrorResponse).getSingleMessage());\n } else {\n throw e;\n }\n }\n return response;\n }\n\n private generateMethods(\n uploadData: AttachmentUploadDataResponse,\n response: CipherResponse,\n isAdmin: boolean,\n ): FileUploadApiMethods {\n return {\n postDirect: this.generatePostDirectCallback(uploadData, isAdmin),\n renewFileUploadUrl: this.generateRenewFileUploadUrlCallback(uploadData, response, isAdmin),\n rollback: this.generateRollbackCallback(response, uploadData, isAdmin),\n };\n }\n\n private generatePostDirectCallback(uploadData: AttachmentUploadDataResponse, isAdmin: boolean) {\n return (data: FormData) => {\n const response = isAdmin ? uploadData.cipherMiniResponse : uploadData.cipherResponse;\n return this.apiService.postAttachmentFile(response.id, uploadData.attachmentId, data);\n };\n }\n\n private generateRenewFileUploadUrlCallback(\n uploadData: AttachmentUploadDataResponse,\n response: CipherResponse,\n isAdmin: boolean,\n ) {\n return async () => {\n const renewResponse = await this.apiService.renewAttachmentUploadUrl(\n response.id,\n uploadData.attachmentId,\n );\n return renewResponse?.url;\n };\n }\n\n private generateRollbackCallback(\n response: CipherResponse,\n uploadData: AttachmentUploadDataResponse,\n isAdmin: boolean,\n ) {\n return () => {\n if (isAdmin) {\n return this.apiService.deleteCipherAttachmentAdmin(response.id, uploadData.attachmentId);\n } else {\n return this.apiService.deleteCipherAttachment(response.id, uploadData.attachmentId);\n }\n };\n }\n\n /**\n * @deprecated Mar 25 2021: This method has been deprecated in favor of direct uploads.\n * This method still exists for backward compatibility with old server versions.\n */\n async legacyServerAttachmentFileUpload(\n admin: boolean,\n cipherId: string,\n encFileName: EncString,\n encData: EncArrayBuffer,\n key: EncString,\n ) {\n const fd = new FormData();\n try {\n const blob = new Blob([encData.buffer], { type: \"application/octet-stream\" });\n fd.append(\"key\", key.encryptedString);\n fd.append(\"data\", blob, encFileName.encryptedString);\n } catch (e) {\n if (Utils.isNode && !Utils.isBrowser) {\n fd.append(\"key\", key.encryptedString);\n fd.append(\n \"data\",\n Buffer.from(encData.buffer) as any,\n {\n filepath: encFileName.encryptedString,\n contentType: \"application/octet-stream\",\n } as any,\n );\n } else {\n throw e;\n }\n }\n\n let response: CipherResponse;\n try {\n if (admin) {\n response = await this.apiService.postCipherAttachmentAdminLegacy(cipherId, fd);\n } else {\n response = await this.apiService.postCipherAttachmentLegacy(cipherId, fd);\n }\n } catch (e) {\n throw new Error((e as ErrorResponse).getSingleMessage());\n }\n\n return response;\n }\n}\n","import { Observable, firstValueFrom, map } from \"rxjs\";\n\nimport { CryptoService } from \"../../../platform/abstractions/crypto.service\";\nimport { I18nService } from \"../../../platform/abstractions/i18n.service\";\nimport { StateService } from \"../../../platform/abstractions/state.service\";\nimport { Utils } from \"../../../platform/misc/utils\";\nimport { SymmetricCryptoKey } from \"../../../platform/models/domain/symmetric-crypto-key\";\nimport { ActiveUserState, DerivedState, StateProvider } from \"../../../platform/state\";\nimport { UserId } from \"../../../types/guid\";\nimport { CipherService } from \"../../../vault/abstractions/cipher.service\";\nimport { InternalFolderService as InternalFolderServiceAbstraction } from \"../../../vault/abstractions/folder/folder.service.abstraction\";\nimport { CipherData } from \"../../../vault/models/data/cipher.data\";\nimport { FolderData } from \"../../../vault/models/data/folder.data\";\nimport { Folder } from \"../../../vault/models/domain/folder\";\nimport { FolderView } from \"../../../vault/models/view/folder.view\";\nimport { FOLDER_DECRYPTED_FOLDERS, FOLDER_ENCRYPTED_FOLDERS } from \"../key-state/folder.state\";\n\nexport class FolderService implements InternalFolderServiceAbstraction {\n folders$: Observable;\n folderViews$: Observable;\n\n private encryptedFoldersState: ActiveUserState>;\n private decryptedFoldersState: DerivedState;\n\n constructor(\n private cryptoService: CryptoService,\n private i18nService: I18nService,\n private cipherService: CipherService,\n private stateService: StateService,\n private stateProvider: StateProvider,\n ) {\n this.encryptedFoldersState = this.stateProvider.getActive(FOLDER_ENCRYPTED_FOLDERS);\n this.decryptedFoldersState = this.stateProvider.getDerived(\n this.encryptedFoldersState.state$,\n FOLDER_DECRYPTED_FOLDERS,\n { folderService: this, cryptoService: this.cryptoService },\n );\n\n this.folders$ = this.encryptedFoldersState.state$.pipe(\n map((folderData) => Object.values(folderData).map((f) => new Folder(f))),\n );\n\n this.folderViews$ = this.decryptedFoldersState.state$;\n }\n\n async clearCache(): Promise {\n await this.decryptedFoldersState.forceValue([]);\n }\n\n // TODO: This should be moved to EncryptService or something\n async encrypt(model: FolderView, key?: SymmetricCryptoKey): Promise {\n const folder = new Folder();\n folder.id = model.id;\n folder.name = await this.cryptoService.encrypt(model.name, key);\n return folder;\n }\n\n async get(id: string): Promise {\n const folders = await firstValueFrom(this.folders$);\n\n return folders.find((folder) => folder.id === id);\n }\n\n async getAllFromState(): Promise {\n return await firstValueFrom(this.folders$);\n }\n\n /**\n * @deprecated For the CLI only\n * @param id id of the folder\n */\n async getFromState(id: string): Promise {\n const folder = await this.get(id);\n if (!folder) {\n return null;\n }\n\n return folder;\n }\n\n /**\n * @deprecated Only use in CLI!\n */\n async getAllDecryptedFromState(): Promise {\n return await firstValueFrom(this.folderViews$);\n }\n\n async upsert(folderData: FolderData | FolderData[]): Promise {\n await this.encryptedFoldersState.update((folders) => {\n if (folders == null) {\n folders = {};\n }\n\n if (folderData instanceof FolderData) {\n const f = folderData as FolderData;\n folders[f.id] = f;\n } else {\n (folderData as FolderData[]).forEach((f) => {\n folders[f.id] = f;\n });\n }\n\n return folders;\n });\n }\n\n async replace(folders: { [id: string]: FolderData }): Promise {\n if (!folders) {\n return;\n }\n\n await this.encryptedFoldersState.update(() => {\n const newFolders: Record = { ...folders };\n return newFolders;\n });\n }\n\n async clear(userId?: UserId): Promise {\n if (userId == null) {\n await this.encryptedFoldersState.update(() => ({}));\n await this.decryptedFoldersState.forceValue([]);\n } else {\n await this.stateProvider.getUser(userId, FOLDER_ENCRYPTED_FOLDERS).update(() => ({}));\n }\n }\n\n async delete(id: string | string[]): Promise {\n await this.encryptedFoldersState.update((folders) => {\n if (folders == null) {\n return;\n }\n\n if (typeof id === \"string\") {\n if (folders[id] == null) {\n return;\n }\n delete folders[id];\n } else {\n (id as string[]).forEach((i) => {\n delete folders[i];\n });\n }\n return folders;\n });\n\n // Items in a deleted folder are re-assigned to \"No Folder\"\n const ciphers = await this.stateService.getEncryptedCiphers();\n if (ciphers != null) {\n const updates: CipherData[] = [];\n for (const cId in ciphers) {\n if (ciphers[cId].folderId === id) {\n ciphers[cId].folderId = null;\n updates.push(ciphers[cId]);\n }\n }\n if (updates.length > 0) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.cipherService.upsert(updates);\n }\n }\n }\n\n async decryptFolders(folders: Folder[]) {\n const decryptFolderPromises = folders.map((f) => f.decrypt());\n const decryptedFolders = await Promise.all(decryptFolderPromises);\n\n decryptedFolders.sort(Utils.getSortFunction(this.i18nService, \"name\"));\n\n const noneFolder = new FolderView();\n noneFolder.name = this.i18nService.t(\"noneFolder\");\n decryptedFolders.push(noneFolder);\n return decryptedFolders;\n }\n}\n","import { ApiService } from \"../../../abstractions/api.service\";\nimport { FolderApiServiceAbstraction } from \"../../../vault/abstractions/folder/folder-api.service.abstraction\";\nimport { InternalFolderService } from \"../../../vault/abstractions/folder/folder.service.abstraction\";\nimport { FolderData } from \"../../../vault/models/data/folder.data\";\nimport { Folder } from \"../../../vault/models/domain/folder\";\nimport { FolderRequest } from \"../../../vault/models/request/folder.request\";\nimport { FolderResponse } from \"../../../vault/models/response/folder.response\";\n\nexport class FolderApiService implements FolderApiServiceAbstraction {\n constructor(\n private folderService: InternalFolderService,\n private apiService: ApiService,\n ) {}\n\n async save(folder: Folder): Promise {\n const request = new FolderRequest(folder);\n\n let response: FolderResponse;\n if (folder.id == null) {\n response = await this.postFolder(request);\n folder.id = response.id;\n } else {\n response = await this.putFolder(folder.id, request);\n }\n\n const data = new FolderData(response);\n await this.folderService.upsert(data);\n }\n\n async delete(id: string): Promise {\n await this.deleteFolder(id);\n await this.folderService.delete(id);\n }\n\n async get(id: string): Promise {\n const r = await this.apiService.send(\"GET\", \"/folders/\" + id, null, true, true);\n return new FolderResponse(r);\n }\n\n private async postFolder(request: FolderRequest): Promise {\n const r = await this.apiService.send(\"POST\", \"/folders\", request, true, true);\n return new FolderResponse(r);\n }\n\n async putFolder(id: string, request: FolderRequest): Promise {\n const r = await this.apiService.send(\"PUT\", \"/folders/\" + id, request, true, true);\n return new FolderResponse(r);\n }\n\n private deleteFolder(id: string): Promise {\n return this.apiService.send(\"DELETE\", \"/folders/\" + id, null, true, false);\n }\n}\n","import { ApiService } from \"../../abstractions/api.service\";\nimport { LogService } from \"../../platform/abstractions/log.service\";\nimport { AccountApiService } from \"../abstractions/account-api.service\";\nimport { InternalAccountService } from \"../abstractions/account.service\";\nimport { UserVerificationService } from \"../abstractions/user-verification/user-verification.service.abstraction\";\nimport { Verification } from \"../types/verification\";\n\nexport class AccountApiServiceImplementation implements AccountApiService {\n constructor(\n private apiService: ApiService,\n private userVerificationService: UserVerificationService,\n private logService: LogService,\n private accountService: InternalAccountService,\n ) {}\n\n async deleteAccount(verification: Verification): Promise {\n try {\n const verificationRequest = await this.userVerificationService.buildRequest(verification);\n await this.apiService.send(\"DELETE\", \"/accounts\", verificationRequest, true, false);\n this.accountService.delete();\n } catch (e) {\n this.logService.error(e);\n throw e;\n }\n }\n}\n","import { KdfConfig } from \"../../auth/models/domain/kdf-config\";\nimport { CsprngArray } from \"../../types/csprng\";\nimport { CryptoFunctionService } from \"../abstractions/crypto-function.service\";\nimport { KeyGenerationService as KeyGenerationServiceAbstraction } from \"../abstractions/key-generation.service\";\nimport {\n ARGON2_ITERATIONS,\n ARGON2_MEMORY,\n ARGON2_PARALLELISM,\n KdfType,\n PBKDF2_ITERATIONS,\n} from \"../enums\";\nimport { Utils } from \"../misc/utils\";\nimport { SymmetricCryptoKey } from \"../models/domain/symmetric-crypto-key\";\n\nexport class KeyGenerationService implements KeyGenerationServiceAbstraction {\n constructor(private cryptoFunctionService: CryptoFunctionService) {}\n\n async createKey(bitLength: 256 | 512): Promise {\n const key = await this.cryptoFunctionService.aesGenerateKey(bitLength);\n return new SymmetricCryptoKey(key);\n }\n\n async createKeyWithPurpose(\n bitLength: 128 | 192 | 256 | 512,\n purpose: string,\n salt?: string,\n ): Promise<{ salt: string; material: CsprngArray; derivedKey: SymmetricCryptoKey }> {\n if (salt == null) {\n const bytes = await this.cryptoFunctionService.randomBytes(32);\n salt = Utils.fromBufferToUtf8(bytes);\n }\n const material = await this.cryptoFunctionService.aesGenerateKey(bitLength);\n const key = await this.cryptoFunctionService.hkdf(material, salt, purpose, 64, \"sha256\");\n return { salt, material, derivedKey: new SymmetricCryptoKey(key) };\n }\n\n async deriveKeyFromMaterial(\n material: CsprngArray,\n salt: string,\n purpose: string,\n ): Promise {\n const key = await this.cryptoFunctionService.hkdf(material, salt, purpose, 64, \"sha256\");\n return new SymmetricCryptoKey(key);\n }\n\n async deriveKeyFromPassword(\n password: string | Uint8Array,\n salt: string | Uint8Array,\n kdf: KdfType,\n kdfConfig: KdfConfig,\n ): Promise {\n let key: Uint8Array = null;\n if (kdf == null || kdf === KdfType.PBKDF2_SHA256) {\n if (kdfConfig.iterations == null) {\n kdfConfig.iterations = PBKDF2_ITERATIONS.defaultValue;\n }\n\n key = await this.cryptoFunctionService.pbkdf2(password, salt, \"sha256\", kdfConfig.iterations);\n } else if (kdf == KdfType.Argon2id) {\n if (kdfConfig.iterations == null) {\n kdfConfig.iterations = ARGON2_ITERATIONS.defaultValue;\n }\n\n if (kdfConfig.memory == null) {\n kdfConfig.memory = ARGON2_MEMORY.defaultValue;\n }\n\n if (kdfConfig.parallelism == null) {\n kdfConfig.parallelism = ARGON2_PARALLELISM.defaultValue;\n }\n\n const saltHash = await this.cryptoFunctionService.hash(salt, \"sha256\");\n key = await this.cryptoFunctionService.argon2(\n password,\n saltHash,\n kdfConfig.iterations,\n kdfConfig.memory * 1024, // convert to KiB from MiB\n kdfConfig.parallelism,\n );\n } else {\n throw new Error(\"Unknown Kdf.\");\n }\n return new SymmetricCryptoKey(key);\n }\n}\n","import { firstValueFrom } from \"rxjs\";\n\nimport { ApiService as ApiServiceAbstraction } from \"../abstractions/api.service\";\nimport { OrganizationConnectionType } from \"../admin-console/enums\";\nimport { OrganizationSponsorshipCreateRequest } from \"../admin-console/models/request/organization/organization-sponsorship-create.request\";\nimport { OrganizationSponsorshipRedeemRequest } from \"../admin-console/models/request/organization/organization-sponsorship-redeem.request\";\nimport { OrganizationConnectionRequest } from \"../admin-console/models/request/organization-connection.request\";\nimport { ProviderAddOrganizationRequest } from \"../admin-console/models/request/provider/provider-add-organization.request\";\nimport { ProviderOrganizationCreateRequest } from \"../admin-console/models/request/provider/provider-organization-create.request\";\nimport { ProviderSetupRequest } from \"../admin-console/models/request/provider/provider-setup.request\";\nimport { ProviderUpdateRequest } from \"../admin-console/models/request/provider/provider-update.request\";\nimport { ProviderUserAcceptRequest } from \"../admin-console/models/request/provider/provider-user-accept.request\";\nimport { ProviderUserBulkConfirmRequest } from \"../admin-console/models/request/provider/provider-user-bulk-confirm.request\";\nimport { ProviderUserBulkRequest } from \"../admin-console/models/request/provider/provider-user-bulk.request\";\nimport { ProviderUserConfirmRequest } from \"../admin-console/models/request/provider/provider-user-confirm.request\";\nimport { ProviderUserInviteRequest } from \"../admin-console/models/request/provider/provider-user-invite.request\";\nimport { ProviderUserUpdateRequest } from \"../admin-console/models/request/provider/provider-user-update.request\";\nimport { SelectionReadOnlyRequest } from \"../admin-console/models/request/selection-read-only.request\";\nimport {\n OrganizationConnectionConfigApis,\n OrganizationConnectionResponse,\n} from \"../admin-console/models/response/organization-connection.response\";\nimport { OrganizationExportResponse } from \"../admin-console/models/response/organization-export.response\";\nimport { OrganizationSponsorshipSyncStatusResponse } from \"../admin-console/models/response/organization-sponsorship-sync-status.response\";\nimport {\n ProviderOrganizationOrganizationDetailsResponse,\n ProviderOrganizationResponse,\n} from \"../admin-console/models/response/provider/provider-organization.response\";\nimport { ProviderUserBulkPublicKeyResponse } from \"../admin-console/models/response/provider/provider-user-bulk-public-key.response\";\nimport { ProviderUserBulkResponse } from \"../admin-console/models/response/provider/provider-user-bulk.response\";\nimport {\n ProviderUserResponse,\n ProviderUserUserDetailsResponse,\n} from \"../admin-console/models/response/provider/provider-user.response\";\nimport { ProviderResponse } from \"../admin-console/models/response/provider/provider.response\";\nimport { SelectionReadOnlyResponse } from \"../admin-console/models/response/selection-read-only.response\";\nimport { TokenService } from \"../auth/abstractions/token.service\";\nimport { CreateAuthRequest } from \"../auth/models/request/create-auth.request\";\nimport { DeviceVerificationRequest } from \"../auth/models/request/device-verification.request\";\nimport { EmailTokenRequest } from \"../auth/models/request/email-token.request\";\nimport { EmailRequest } from \"../auth/models/request/email.request\";\nimport { DeviceRequest } from \"../auth/models/request/identity-token/device.request\";\nimport { PasswordTokenRequest } from \"../auth/models/request/identity-token/password-token.request\";\nimport { SsoTokenRequest } from \"../auth/models/request/identity-token/sso-token.request\";\nimport { TokenTwoFactorRequest } from \"../auth/models/request/identity-token/token-two-factor.request\";\nimport { UserApiTokenRequest } from \"../auth/models/request/identity-token/user-api-token.request\";\nimport { WebAuthnLoginTokenRequest } from \"../auth/models/request/identity-token/webauthn-login-token.request\";\nimport { KeyConnectorUserKeyRequest } from \"../auth/models/request/key-connector-user-key.request\";\nimport { PasswordHintRequest } from \"../auth/models/request/password-hint.request\";\nimport { PasswordRequest } from \"../auth/models/request/password.request\";\nimport { PasswordlessAuthRequest } from \"../auth/models/request/passwordless-auth.request\";\nimport { SecretVerificationRequest } from \"../auth/models/request/secret-verification.request\";\nimport { SetKeyConnectorKeyRequest } from \"../auth/models/request/set-key-connector-key.request\";\nimport { SetPasswordRequest } from \"../auth/models/request/set-password.request\";\nimport { TwoFactorEmailRequest } from \"../auth/models/request/two-factor-email.request\";\nimport { TwoFactorProviderRequest } from \"../auth/models/request/two-factor-provider.request\";\nimport { TwoFactorRecoveryRequest } from \"../auth/models/request/two-factor-recovery.request\";\nimport { UpdateProfileRequest } from \"../auth/models/request/update-profile.request\";\nimport { UpdateTempPasswordRequest } from \"../auth/models/request/update-temp-password.request\";\nimport { UpdateTwoFactorAuthenticatorRequest } from \"../auth/models/request/update-two-factor-authenticator.request\";\nimport { UpdateTwoFactorDuoRequest } from \"../auth/models/request/update-two-factor-duo.request\";\nimport { UpdateTwoFactorEmailRequest } from \"../auth/models/request/update-two-factor-email.request\";\nimport { UpdateTwoFactorWebAuthnDeleteRequest } from \"../auth/models/request/update-two-factor-web-authn-delete.request\";\nimport { UpdateTwoFactorWebAuthnRequest } from \"../auth/models/request/update-two-factor-web-authn.request\";\nimport { UpdateTwoFactorYubioOtpRequest } from \"../auth/models/request/update-two-factor-yubio-otp.request\";\nimport { ApiKeyResponse } from \"../auth/models/response/api-key.response\";\nimport { AuthRequestResponse } from \"../auth/models/response/auth-request.response\";\nimport { DeviceVerificationResponse } from \"../auth/models/response/device-verification.response\";\nimport { IdentityCaptchaResponse } from \"../auth/models/response/identity-captcha.response\";\nimport { IdentityTokenResponse } from \"../auth/models/response/identity-token.response\";\nimport { IdentityTwoFactorResponse } from \"../auth/models/response/identity-two-factor.response\";\nimport { KeyConnectorUserKeyResponse } from \"../auth/models/response/key-connector-user-key.response\";\nimport { MasterPasswordPolicyResponse } from \"../auth/models/response/master-password-policy.response\";\nimport { PreloginResponse } from \"../auth/models/response/prelogin.response\";\nimport { RegisterResponse } from \"../auth/models/response/register.response\";\nimport { SsoPreValidateResponse } from \"../auth/models/response/sso-pre-validate.response\";\nimport { TwoFactorAuthenticatorResponse } from \"../auth/models/response/two-factor-authenticator.response\";\nimport { TwoFactorDuoResponse } from \"../auth/models/response/two-factor-duo.response\";\nimport { TwoFactorEmailResponse } from \"../auth/models/response/two-factor-email.response\";\nimport { TwoFactorProviderResponse } from \"../auth/models/response/two-factor-provider.response\";\nimport { TwoFactorRecoverResponse } from \"../auth/models/response/two-factor-recover.response\";\nimport {\n ChallengeResponse,\n TwoFactorWebAuthnResponse,\n} from \"../auth/models/response/two-factor-web-authn.response\";\nimport { TwoFactorYubiKeyResponse } from \"../auth/models/response/two-factor-yubi-key.response\";\nimport { BitPayInvoiceRequest } from \"../billing/models/request/bit-pay-invoice.request\";\nimport { PaymentRequest } from \"../billing/models/request/payment.request\";\nimport { TaxInfoUpdateRequest } from \"../billing/models/request/tax-info-update.request\";\nimport { BillingHistoryResponse } from \"../billing/models/response/billing-history.response\";\nimport { BillingPaymentResponse } from \"../billing/models/response/billing-payment.response\";\nimport { PaymentResponse } from \"../billing/models/response/payment.response\";\nimport { PlanResponse } from \"../billing/models/response/plan.response\";\nimport { SubscriptionResponse } from \"../billing/models/response/subscription.response\";\nimport { TaxInfoResponse } from \"../billing/models/response/tax-info.response\";\nimport { TaxRateResponse } from \"../billing/models/response/tax-rate.response\";\nimport { DeviceType } from \"../enums\";\nimport { VaultTimeoutAction } from \"../enums/vault-timeout-action.enum\";\nimport { CollectionBulkDeleteRequest } from \"../models/request/collection-bulk-delete.request\";\nimport { DeleteRecoverRequest } from \"../models/request/delete-recover.request\";\nimport { EventRequest } from \"../models/request/event.request\";\nimport { KdfRequest } from \"../models/request/kdf.request\";\nimport { KeysRequest } from \"../models/request/keys.request\";\nimport { OrganizationImportRequest } from \"../models/request/organization-import.request\";\nimport { PreloginRequest } from \"../models/request/prelogin.request\";\nimport { RegisterRequest } from \"../models/request/register.request\";\nimport { StorageRequest } from \"../models/request/storage.request\";\nimport { UpdateAvatarRequest } from \"../models/request/update-avatar.request\";\nimport { UpdateDomainsRequest } from \"../models/request/update-domains.request\";\nimport { VerifyDeleteRecoverRequest } from \"../models/request/verify-delete-recover.request\";\nimport { VerifyEmailRequest } from \"../models/request/verify-email.request\";\nimport { BreachAccountResponse } from \"../models/response/breach-account.response\";\nimport { DomainsResponse } from \"../models/response/domains.response\";\nimport { ErrorResponse } from \"../models/response/error.response\";\nimport { EventResponse } from \"../models/response/event.response\";\nimport { ListResponse } from \"../models/response/list.response\";\nimport { ProfileResponse } from \"../models/response/profile.response\";\nimport { UserKeyResponse } from \"../models/response/user-key.response\";\nimport { AppIdService } from \"../platform/abstractions/app-id.service\";\nimport { EnvironmentService } from \"../platform/abstractions/environment.service\";\nimport { PlatformUtilsService } from \"../platform/abstractions/platform-utils.service\";\nimport { StateService } from \"../platform/abstractions/state.service\";\nimport { Utils } from \"../platform/misc/utils\";\nimport { AttachmentRequest } from \"../vault/models/request/attachment.request\";\nimport { CipherBulkDeleteRequest } from \"../vault/models/request/cipher-bulk-delete.request\";\nimport { CipherBulkMoveRequest } from \"../vault/models/request/cipher-bulk-move.request\";\nimport { CipherBulkRestoreRequest } from \"../vault/models/request/cipher-bulk-restore.request\";\nimport { CipherBulkShareRequest } from \"../vault/models/request/cipher-bulk-share.request\";\nimport { CipherCollectionsRequest } from \"../vault/models/request/cipher-collections.request\";\nimport { CipherCreateRequest } from \"../vault/models/request/cipher-create.request\";\nimport { CipherPartialRequest } from \"../vault/models/request/cipher-partial.request\";\nimport { CipherShareRequest } from \"../vault/models/request/cipher-share.request\";\nimport { CipherRequest } from \"../vault/models/request/cipher.request\";\nimport { CollectionRequest } from \"../vault/models/request/collection.request\";\nimport { AttachmentUploadDataResponse } from \"../vault/models/response/attachment-upload-data.response\";\nimport { AttachmentResponse } from \"../vault/models/response/attachment.response\";\nimport { CipherResponse } from \"../vault/models/response/cipher.response\";\nimport {\n CollectionAccessDetailsResponse,\n CollectionDetailsResponse,\n CollectionResponse,\n} from \"../vault/models/response/collection.response\";\nimport { SyncResponse } from \"../vault/models/response/sync.response\";\n\n/**\n * @deprecated The `ApiService` class is deprecated and calls should be extracted into individual\n * api services. The `send` method is still allowed to be used within api services. For background\n * of this decision please read https://contributing.bitwarden.com/architecture/adr/refactor-api-service.\n */\nexport class ApiService implements ApiServiceAbstraction {\n private device: DeviceType;\n private deviceType: string;\n private isWebClient = false;\n private isDesktopClient = false;\n\n constructor(\n private tokenService: TokenService,\n private platformUtilsService: PlatformUtilsService,\n private environmentService: EnvironmentService,\n private appIdService: AppIdService,\n private stateService: StateService,\n private logoutCallback: (expired: boolean) => Promise,\n private customUserAgent: string = null,\n ) {\n this.device = platformUtilsService.getDevice();\n this.deviceType = this.device.toString();\n this.isWebClient =\n this.device === DeviceType.IEBrowser ||\n this.device === DeviceType.ChromeBrowser ||\n this.device === DeviceType.EdgeBrowser ||\n this.device === DeviceType.FirefoxBrowser ||\n this.device === DeviceType.OperaBrowser ||\n this.device === DeviceType.SafariBrowser ||\n this.device === DeviceType.UnknownBrowser ||\n this.device === DeviceType.VivaldiBrowser;\n this.isDesktopClient =\n this.device === DeviceType.WindowsDesktop ||\n this.device === DeviceType.MacOsDesktop ||\n this.device === DeviceType.LinuxDesktop ||\n this.device === DeviceType.WindowsCLI ||\n this.device === DeviceType.MacOsCLI ||\n this.device === DeviceType.LinuxCLI;\n }\n\n // Auth APIs\n\n async postIdentityToken(\n request:\n | UserApiTokenRequest\n | PasswordTokenRequest\n | SsoTokenRequest\n | WebAuthnLoginTokenRequest,\n ): Promise {\n const headers = new Headers({\n \"Content-Type\": \"application/x-www-form-urlencoded; charset=utf-8\",\n Accept: \"application/json\",\n \"Device-Type\": this.deviceType,\n });\n if (this.customUserAgent != null) {\n headers.set(\"User-Agent\", this.customUserAgent);\n }\n request.alterIdentityTokenHeaders(headers);\n\n const identityToken =\n request instanceof UserApiTokenRequest\n ? request.toIdentityToken()\n : request.toIdentityToken(this.platformUtilsService.getClientType());\n\n const env = await firstValueFrom(this.environmentService.environment$);\n\n const response = await this.fetch(\n new Request(env.getIdentityUrl() + \"/connect/token\", {\n body: this.qsStringify(identityToken),\n credentials: await this.getCredentials(),\n cache: \"no-store\",\n headers: headers,\n method: \"POST\",\n }),\n );\n\n let responseJson: any = null;\n if (this.isJsonResponse(response)) {\n responseJson = await response.json();\n }\n\n if (responseJson != null) {\n if (response.status === 200) {\n return new IdentityTokenResponse(responseJson);\n } else if (\n response.status === 400 &&\n responseJson.TwoFactorProviders2 &&\n Object.keys(responseJson.TwoFactorProviders2).length\n ) {\n return new IdentityTwoFactorResponse(responseJson);\n } else if (\n response.status === 400 &&\n responseJson.HCaptcha_SiteKey &&\n Object.keys(responseJson.HCaptcha_SiteKey).length\n ) {\n return new IdentityCaptchaResponse(responseJson);\n }\n }\n\n return Promise.reject(new ErrorResponse(responseJson, response.status, true));\n }\n\n async refreshIdentityToken(): Promise {\n try {\n await this.doAuthRefresh();\n } catch (e) {\n return Promise.reject(null);\n }\n }\n\n // TODO: PM-3519: Create and move to AuthRequest Api service\n async postAuthRequest(request: CreateAuthRequest): Promise {\n const r = await this.send(\"POST\", \"/auth-requests/\", request, false, true);\n return new AuthRequestResponse(r);\n }\n async postAdminAuthRequest(request: CreateAuthRequest): Promise {\n const r = await this.send(\"POST\", \"/auth-requests/admin-request\", request, true, true);\n return new AuthRequestResponse(r);\n }\n\n async getAuthResponse(id: string, accessCode: string): Promise {\n const path = `/auth-requests/${id}/response?code=${accessCode}`;\n const r = await this.send(\"GET\", path, null, false, true);\n return new AuthRequestResponse(r);\n }\n\n async getAuthRequest(id: string): Promise {\n const path = `/auth-requests/${id}`;\n const r = await this.send(\"GET\", path, null, true, true);\n return new AuthRequestResponse(r);\n }\n\n async putAuthRequest(id: string, request: PasswordlessAuthRequest): Promise {\n const path = `/auth-requests/${id}`;\n const r = await this.send(\"PUT\", path, request, true, true);\n return new AuthRequestResponse(r);\n }\n\n async getAuthRequests(): Promise> {\n const path = `/auth-requests/`;\n const r = await this.send(\"GET\", path, null, true, true);\n return new ListResponse(r, AuthRequestResponse);\n }\n\n async getLastAuthRequest(): Promise {\n const requests = await this.getAuthRequests();\n const activeRequests = requests.data.filter((m) => !m.isAnswered && !m.isExpired);\n const lastRequest = activeRequests.sort((a: AuthRequestResponse, b: AuthRequestResponse) =>\n a.creationDate.localeCompare(b.creationDate),\n )[activeRequests.length - 1];\n return lastRequest;\n }\n\n // Account APIs\n\n async getProfile(): Promise {\n const r = await this.send(\"GET\", \"/accounts/profile\", null, true, true);\n return new ProfileResponse(r);\n }\n\n async getUserSubscription(): Promise {\n const r = await this.send(\"GET\", \"/accounts/subscription\", null, true, true);\n return new SubscriptionResponse(r);\n }\n\n async getTaxInfo(): Promise {\n const r = await this.send(\"GET\", \"/accounts/tax\", null, true, true);\n return new TaxInfoResponse(r);\n }\n\n async putProfile(request: UpdateProfileRequest): Promise {\n const r = await this.send(\"PUT\", \"/accounts/profile\", request, true, true);\n return new ProfileResponse(r);\n }\n\n async putAvatar(request: UpdateAvatarRequest): Promise {\n const r = await this.send(\"PUT\", \"/accounts/avatar\", request, true, true);\n return new ProfileResponse(r);\n }\n\n putTaxInfo(request: TaxInfoUpdateRequest): Promise {\n return this.send(\"PUT\", \"/accounts/tax\", request, true, false);\n }\n\n async postPrelogin(request: PreloginRequest): Promise {\n const env = await firstValueFrom(this.environmentService.environment$);\n const r = await this.send(\n \"POST\",\n \"/accounts/prelogin\",\n request,\n false,\n true,\n env.getIdentityUrl(),\n );\n return new PreloginResponse(r);\n }\n\n postEmailToken(request: EmailTokenRequest): Promise {\n return this.send(\"POST\", \"/accounts/email-token\", request, true, false);\n }\n\n postEmail(request: EmailRequest): Promise {\n return this.send(\"POST\", \"/accounts/email\", request, true, false);\n }\n\n postPassword(request: PasswordRequest): Promise {\n return this.send(\"POST\", \"/accounts/password\", request, true, false);\n }\n\n setPassword(request: SetPasswordRequest): Promise {\n return this.send(\"POST\", \"/accounts/set-password\", request, true, false);\n }\n\n postSetKeyConnectorKey(request: SetKeyConnectorKeyRequest): Promise {\n return this.send(\"POST\", \"/accounts/set-key-connector-key\", request, true, false);\n }\n\n postSecurityStamp(request: SecretVerificationRequest): Promise {\n return this.send(\"POST\", \"/accounts/security-stamp\", request, true, false);\n }\n\n async getAccountRevisionDate(): Promise {\n const r = await this.send(\"GET\", \"/accounts/revision-date\", null, true, true);\n return r as number;\n }\n\n postPasswordHint(request: PasswordHintRequest): Promise {\n return this.send(\"POST\", \"/accounts/password-hint\", request, false, false);\n }\n\n async postRegister(request: RegisterRequest): Promise {\n const env = await firstValueFrom(this.environmentService.environment$);\n const r = await this.send(\n \"POST\",\n \"/accounts/register\",\n request,\n false,\n true,\n env.getIdentityUrl(),\n );\n return new RegisterResponse(r);\n }\n\n async postPremium(data: FormData): Promise {\n const r = await this.send(\"POST\", \"/accounts/premium\", data, true, true);\n return new PaymentResponse(r);\n }\n\n postReinstatePremium(): Promise {\n return this.send(\"POST\", \"/accounts/reinstate-premium\", null, true, false);\n }\n\n async postAccountStorage(request: StorageRequest): Promise {\n const r = await this.send(\"POST\", \"/accounts/storage\", request, true, true);\n return new PaymentResponse(r);\n }\n\n postAccountPayment(request: PaymentRequest): Promise {\n return this.send(\"POST\", \"/accounts/payment\", request, true, false);\n }\n\n postAccountLicense(data: FormData): Promise {\n return this.send(\"POST\", \"/accounts/license\", data, true, false);\n }\n\n postAccountKeys(request: KeysRequest): Promise {\n return this.send(\"POST\", \"/accounts/keys\", request, true, false);\n }\n\n postAccountVerifyEmail(): Promise {\n return this.send(\"POST\", \"/accounts/verify-email\", null, true, false);\n }\n\n postAccountVerifyEmailToken(request: VerifyEmailRequest): Promise {\n return this.send(\"POST\", \"/accounts/verify-email-token\", request, false, false);\n }\n\n postAccountVerifyPassword(\n request: SecretVerificationRequest,\n ): Promise {\n return this.send(\"POST\", \"/accounts/verify-password\", request, true, true);\n }\n\n postAccountRecoverDelete(request: DeleteRecoverRequest): Promise {\n return this.send(\"POST\", \"/accounts/delete-recover\", request, false, false);\n }\n\n postAccountRecoverDeleteToken(request: VerifyDeleteRecoverRequest): Promise {\n return this.send(\"POST\", \"/accounts/delete-recover-token\", request, false, false);\n }\n\n postAccountKdf(request: KdfRequest): Promise {\n return this.send(\"POST\", \"/accounts/kdf\", request, true, false);\n }\n\n async deleteSsoUser(organizationId: string): Promise {\n return this.send(\"DELETE\", \"/accounts/sso/\" + organizationId, null, true, false);\n }\n\n async getSsoUserIdentifier(): Promise {\n return this.send(\"GET\", \"/accounts/sso/user-identifier\", null, true, true);\n }\n\n async postUserApiKey(id: string, request: SecretVerificationRequest): Promise {\n const r = await this.send(\"POST\", \"/accounts/api-key\", request, true, true);\n return new ApiKeyResponse(r);\n }\n\n async postUserRotateApiKey(\n id: string,\n request: SecretVerificationRequest,\n ): Promise {\n const r = await this.send(\"POST\", \"/accounts/rotate-api-key\", request, true, true);\n return new ApiKeyResponse(r);\n }\n\n putUpdateTempPassword(request: UpdateTempPasswordRequest): Promise {\n return this.send(\"PUT\", \"/accounts/update-temp-password\", request, true, false);\n }\n\n postConvertToKeyConnector(): Promise {\n return this.send(\"POST\", \"/accounts/convert-to-key-connector\", null, true, false);\n }\n\n // Account Billing APIs\n\n async getUserBillingHistory(): Promise {\n const r = await this.send(\"GET\", \"/accounts/billing/history\", null, true, true);\n return new BillingHistoryResponse(r);\n }\n\n async getUserBillingPayment(): Promise {\n const r = await this.send(\"GET\", \"/accounts/billing/payment-method\", null, true, true);\n return new BillingPaymentResponse(r);\n }\n\n // Cipher APIs\n\n async getCipher(id: string): Promise {\n const r = await this.send(\"GET\", \"/ciphers/\" + id, null, true, true);\n return new CipherResponse(r);\n }\n\n async getFullCipherDetails(id: string): Promise {\n const r = await this.send(\"GET\", \"/ciphers/\" + id + \"/details\", null, true, true);\n return new CipherResponse(r);\n }\n\n async getCipherAdmin(id: string): Promise {\n const r = await this.send(\"GET\", \"/ciphers/\" + id + \"/admin\", null, true, true);\n return new CipherResponse(r);\n }\n\n async getCiphersOrganization(organizationId: string): Promise> {\n const r = await this.send(\n \"GET\",\n \"/ciphers/organization-details?organizationId=\" + organizationId,\n null,\n true,\n true,\n );\n return new ListResponse(r, CipherResponse);\n }\n\n async postCipher(request: CipherRequest): Promise {\n const r = await this.send(\"POST\", \"/ciphers\", request, true, true);\n return new CipherResponse(r);\n }\n\n async postCipherCreate(request: CipherCreateRequest): Promise {\n const r = await this.send(\"POST\", \"/ciphers/create\", request, true, true);\n return new CipherResponse(r);\n }\n\n async postCipherAdmin(request: CipherCreateRequest): Promise {\n const r = await this.send(\"POST\", \"/ciphers/admin\", request, true, true);\n return new CipherResponse(r);\n }\n\n async putCipher(id: string, request: CipherRequest): Promise {\n const r = await this.send(\"PUT\", \"/ciphers/\" + id, request, true, true);\n return new CipherResponse(r);\n }\n\n async putPartialCipher(id: string, request: CipherPartialRequest): Promise {\n const r = await this.send(\"PUT\", \"/ciphers/\" + id + \"/partial\", request, true, true);\n return new CipherResponse(r);\n }\n\n async putCipherAdmin(id: string, request: CipherRequest): Promise {\n const r = await this.send(\"PUT\", \"/ciphers/\" + id + \"/admin\", request, true, true);\n return new CipherResponse(r);\n }\n\n deleteCipher(id: string): Promise {\n return this.send(\"DELETE\", \"/ciphers/\" + id, null, true, false);\n }\n\n deleteCipherAdmin(id: string): Promise {\n return this.send(\"DELETE\", \"/ciphers/\" + id + \"/admin\", null, true, false);\n }\n\n deleteManyCiphers(request: CipherBulkDeleteRequest): Promise {\n return this.send(\"DELETE\", \"/ciphers\", request, true, false);\n }\n\n deleteManyCiphersAdmin(request: CipherBulkDeleteRequest): Promise {\n return this.send(\"DELETE\", \"/ciphers/admin\", request, true, false);\n }\n\n putMoveCiphers(request: CipherBulkMoveRequest): Promise {\n return this.send(\"PUT\", \"/ciphers/move\", request, true, false);\n }\n\n async putShareCipher(id: string, request: CipherShareRequest): Promise {\n const r = await this.send(\"PUT\", \"/ciphers/\" + id + \"/share\", request, true, true);\n return new CipherResponse(r);\n }\n\n putShareCiphers(request: CipherBulkShareRequest): Promise {\n return this.send(\"PUT\", \"/ciphers/share\", request, true, false);\n }\n\n putCipherCollections(id: string, request: CipherCollectionsRequest): Promise {\n return this.send(\"PUT\", \"/ciphers/\" + id + \"/collections\", request, true, false);\n }\n\n putCipherCollectionsAdmin(id: string, request: CipherCollectionsRequest): Promise {\n return this.send(\"PUT\", \"/ciphers/\" + id + \"/collections-admin\", request, true, false);\n }\n\n postPurgeCiphers(\n request: SecretVerificationRequest,\n organizationId: string = null,\n ): Promise {\n let path = \"/ciphers/purge\";\n if (organizationId != null) {\n path += \"?organizationId=\" + organizationId;\n }\n return this.send(\"POST\", path, request, true, false);\n }\n\n putDeleteCipher(id: string): Promise {\n return this.send(\"PUT\", \"/ciphers/\" + id + \"/delete\", null, true, false);\n }\n\n putDeleteCipherAdmin(id: string): Promise {\n return this.send(\"PUT\", \"/ciphers/\" + id + \"/delete-admin\", null, true, false);\n }\n\n putDeleteManyCiphers(request: CipherBulkDeleteRequest): Promise {\n return this.send(\"PUT\", \"/ciphers/delete\", request, true, false);\n }\n\n putDeleteManyCiphersAdmin(request: CipherBulkDeleteRequest): Promise {\n return this.send(\"PUT\", \"/ciphers/delete-admin\", request, true, false);\n }\n\n async putRestoreCipher(id: string): Promise {\n const r = await this.send(\"PUT\", \"/ciphers/\" + id + \"/restore\", null, true, true);\n return new CipherResponse(r);\n }\n\n async putRestoreCipherAdmin(id: string): Promise {\n const r = await this.send(\"PUT\", \"/ciphers/\" + id + \"/restore-admin\", null, true, true);\n return new CipherResponse(r);\n }\n\n async putRestoreManyCiphers(\n request: CipherBulkRestoreRequest,\n ): Promise> {\n const r = await this.send(\"PUT\", \"/ciphers/restore\", request, true, true);\n return new ListResponse(r, CipherResponse);\n }\n\n async putRestoreManyCiphersAdmin(\n request: CipherBulkRestoreRequest,\n ): Promise> {\n const r = await this.send(\"PUT\", \"/ciphers/restore-admin\", request, true, true);\n return new ListResponse(r, CipherResponse);\n }\n\n // Attachments APIs\n\n async getAttachmentData(\n cipherId: string,\n attachmentId: string,\n emergencyAccessId?: string,\n ): Promise {\n const path =\n (emergencyAccessId != null ? \"/emergency-access/\" + emergencyAccessId + \"/\" : \"/ciphers/\") +\n cipherId +\n \"/attachment/\" +\n attachmentId;\n const r = await this.send(\"GET\", path, null, true, true);\n return new AttachmentResponse(r);\n }\n\n async postCipherAttachment(\n id: string,\n request: AttachmentRequest,\n ): Promise {\n const r = await this.send(\"POST\", \"/ciphers/\" + id + \"/attachment/v2\", request, true, true);\n return new AttachmentUploadDataResponse(r);\n }\n\n /**\n * @deprecated Mar 25 2021: This method has been deprecated in favor of direct uploads.\n * This method still exists for backward compatibility with old server versions.\n */\n async postCipherAttachmentLegacy(id: string, data: FormData): Promise {\n const r = await this.send(\"POST\", \"/ciphers/\" + id + \"/attachment\", data, true, true);\n return new CipherResponse(r);\n }\n\n /**\n * @deprecated Mar 25 2021: This method has been deprecated in favor of direct uploads.\n * This method still exists for backward compatibility with old server versions.\n */\n async postCipherAttachmentAdminLegacy(id: string, data: FormData): Promise {\n const r = await this.send(\"POST\", \"/ciphers/\" + id + \"/attachment-admin\", data, true, true);\n return new CipherResponse(r);\n }\n\n deleteCipherAttachment(id: string, attachmentId: string): Promise {\n return this.send(\"DELETE\", \"/ciphers/\" + id + \"/attachment/\" + attachmentId, null, true, false);\n }\n\n deleteCipherAttachmentAdmin(id: string, attachmentId: string): Promise {\n return this.send(\n \"DELETE\",\n \"/ciphers/\" + id + \"/attachment/\" + attachmentId + \"/admin\",\n null,\n true,\n false,\n );\n }\n\n postShareCipherAttachment(\n id: string,\n attachmentId: string,\n data: FormData,\n organizationId: string,\n ): Promise {\n return this.send(\n \"POST\",\n \"/ciphers/\" + id + \"/attachment/\" + attachmentId + \"/share?organizationId=\" + organizationId,\n data,\n true,\n false,\n );\n }\n\n async renewAttachmentUploadUrl(\n id: string,\n attachmentId: string,\n ): Promise {\n const r = await this.send(\n \"GET\",\n \"/ciphers/\" + id + \"/attachment/\" + attachmentId + \"/renew\",\n null,\n true,\n true,\n );\n return new AttachmentUploadDataResponse(r);\n }\n\n postAttachmentFile(id: string, attachmentId: string, data: FormData): Promise {\n return this.send(\"POST\", \"/ciphers/\" + id + \"/attachment/\" + attachmentId, data, true, false);\n }\n\n // Collections APIs\n\n async getCollectionAccessDetails(\n organizationId: string,\n id: string,\n ): Promise {\n const r = await this.send(\n \"GET\",\n \"/organizations/\" + organizationId + \"/collections/\" + id + \"/details\",\n null,\n true,\n true,\n );\n return new CollectionAccessDetailsResponse(r);\n }\n\n async getUserCollections(): Promise> {\n const r = await this.send(\"GET\", \"/collections\", null, true, true);\n return new ListResponse(r, CollectionResponse);\n }\n\n async getCollections(organizationId: string): Promise> {\n const r = await this.send(\n \"GET\",\n \"/organizations/\" + organizationId + \"/collections\",\n null,\n true,\n true,\n );\n return new ListResponse(r, CollectionResponse);\n }\n\n async getManyCollectionsWithAccessDetails(\n organizationId: string,\n ): Promise> {\n const r = await this.send(\n \"GET\",\n \"/organizations/\" + organizationId + \"/collections/details\",\n null,\n true,\n true,\n );\n return new ListResponse(r, CollectionAccessDetailsResponse);\n }\n\n async getCollectionUsers(\n organizationId: string,\n id: string,\n ): Promise {\n const r = await this.send(\n \"GET\",\n \"/organizations/\" + organizationId + \"/collections/\" + id + \"/users\",\n null,\n true,\n true,\n );\n return r.map((dr: any) => new SelectionReadOnlyResponse(dr));\n }\n\n async postCollection(\n organizationId: string,\n request: CollectionRequest,\n ): Promise {\n const r = await this.send(\n \"POST\",\n \"/organizations/\" + organizationId + \"/collections\",\n request,\n true,\n true,\n );\n return new CollectionDetailsResponse(r);\n }\n\n async putCollection(\n organizationId: string,\n id: string,\n request: CollectionRequest,\n ): Promise {\n const r = await this.send(\n \"PUT\",\n \"/organizations/\" + organizationId + \"/collections/\" + id,\n request,\n true,\n true,\n );\n return new CollectionDetailsResponse(r);\n }\n\n async putCollectionUsers(\n organizationId: string,\n id: string,\n request: SelectionReadOnlyRequest[],\n ): Promise {\n await this.send(\n \"PUT\",\n \"/organizations/\" + organizationId + \"/collections/\" + id + \"/users\",\n request,\n true,\n false,\n );\n }\n\n deleteCollection(organizationId: string, id: string): Promise {\n return this.send(\n \"DELETE\",\n \"/organizations/\" + organizationId + \"/collections/\" + id,\n null,\n true,\n false,\n );\n }\n\n deleteManyCollections(organizationId: string, collectionIds: string[]): Promise {\n return this.send(\n \"DELETE\",\n \"/organizations/\" + organizationId + \"/collections\",\n new CollectionBulkDeleteRequest(collectionIds),\n true,\n false,\n );\n }\n\n deleteCollectionUser(\n organizationId: string,\n id: string,\n organizationUserId: string,\n ): Promise {\n return this.send(\n \"DELETE\",\n \"/organizations/\" + organizationId + \"/collections/\" + id + \"/user/\" + organizationUserId,\n null,\n true,\n false,\n );\n }\n\n // Groups APIs\n\n async getGroupUsers(organizationId: string, id: string): Promise {\n const r = await this.send(\n \"GET\",\n \"/organizations/\" + organizationId + \"/groups/\" + id + \"/users\",\n null,\n true,\n true,\n );\n return r;\n }\n\n async putGroupUsers(organizationId: string, id: string, request: string[]): Promise {\n await this.send(\n \"PUT\",\n \"/organizations/\" + organizationId + \"/groups/\" + id + \"/users\",\n request,\n true,\n false,\n );\n }\n\n deleteGroupUser(organizationId: string, id: string, organizationUserId: string): Promise {\n return this.send(\n \"DELETE\",\n \"/organizations/\" + organizationId + \"/groups/\" + id + \"/user/\" + organizationUserId,\n null,\n true,\n false,\n );\n }\n\n // Plan APIs\n\n async getPlans(): Promise> {\n const r = await this.send(\"GET\", \"/plans\", null, false, true);\n return new ListResponse(r, PlanResponse);\n }\n\n async postPublicImportDirectory(request: OrganizationImportRequest): Promise {\n return this.send(\"POST\", \"/public/organization/import\", request, true, false);\n }\n\n async getTaxRates(): Promise> {\n const r = await this.send(\"GET\", \"/plans/sales-tax-rates/\", null, true, true);\n return new ListResponse(r, TaxRateResponse);\n }\n\n // Settings APIs\n\n async getSettingsDomains(): Promise {\n const r = await this.send(\"GET\", \"/settings/domains\", null, true, true);\n return new DomainsResponse(r);\n }\n\n async putSettingsDomains(request: UpdateDomainsRequest): Promise {\n const r = await this.send(\"PUT\", \"/settings/domains\", request, true, true);\n return new DomainsResponse(r);\n }\n\n // Sync APIs\n\n async getSync(): Promise {\n const path = this.isDesktopClient || this.isWebClient ? \"/sync?excludeDomains=true\" : \"/sync\";\n const r = await this.send(\"GET\", path, null, true, true);\n return new SyncResponse(r);\n }\n\n // Two-factor APIs\n\n async getTwoFactorProviders(): Promise> {\n const r = await this.send(\"GET\", \"/two-factor\", null, true, true);\n return new ListResponse(r, TwoFactorProviderResponse);\n }\n\n async getTwoFactorOrganizationProviders(\n organizationId: string,\n ): Promise> {\n const r = await this.send(\n \"GET\",\n \"/organizations/\" + organizationId + \"/two-factor\",\n null,\n true,\n true,\n );\n return new ListResponse(r, TwoFactorProviderResponse);\n }\n\n async getTwoFactorAuthenticator(\n request: SecretVerificationRequest,\n ): Promise {\n const r = await this.send(\"POST\", \"/two-factor/get-authenticator\", request, true, true);\n return new TwoFactorAuthenticatorResponse(r);\n }\n\n async getTwoFactorEmail(request: SecretVerificationRequest): Promise {\n const r = await this.send(\"POST\", \"/two-factor/get-email\", request, true, true);\n return new TwoFactorEmailResponse(r);\n }\n\n async getTwoFactorDuo(request: SecretVerificationRequest): Promise {\n const r = await this.send(\"POST\", \"/two-factor/get-duo\", request, true, true);\n return new TwoFactorDuoResponse(r);\n }\n\n async getTwoFactorOrganizationDuo(\n organizationId: string,\n request: SecretVerificationRequest,\n ): Promise {\n const r = await this.send(\n \"POST\",\n \"/organizations/\" + organizationId + \"/two-factor/get-duo\",\n request,\n true,\n true,\n );\n return new TwoFactorDuoResponse(r);\n }\n\n async getTwoFactorYubiKey(request: SecretVerificationRequest): Promise {\n const r = await this.send(\"POST\", \"/two-factor/get-yubikey\", request, true, true);\n return new TwoFactorYubiKeyResponse(r);\n }\n\n async getTwoFactorWebAuthn(\n request: SecretVerificationRequest,\n ): Promise {\n const r = await this.send(\"POST\", \"/two-factor/get-webauthn\", request, true, true);\n return new TwoFactorWebAuthnResponse(r);\n }\n\n async getTwoFactorWebAuthnChallenge(\n request: SecretVerificationRequest,\n ): Promise {\n const r = await this.send(\"POST\", \"/two-factor/get-webauthn-challenge\", request, true, true);\n return new ChallengeResponse(r);\n }\n\n async getTwoFactorRecover(request: SecretVerificationRequest): Promise {\n const r = await this.send(\"POST\", \"/two-factor/get-recover\", request, true, true);\n return new TwoFactorRecoverResponse(r);\n }\n\n async putTwoFactorAuthenticator(\n request: UpdateTwoFactorAuthenticatorRequest,\n ): Promise {\n const r = await this.send(\"PUT\", \"/two-factor/authenticator\", request, true, true);\n return new TwoFactorAuthenticatorResponse(r);\n }\n\n async putTwoFactorEmail(request: UpdateTwoFactorEmailRequest): Promise {\n const r = await this.send(\"PUT\", \"/two-factor/email\", request, true, true);\n return new TwoFactorEmailResponse(r);\n }\n\n async putTwoFactorDuo(request: UpdateTwoFactorDuoRequest): Promise {\n const r = await this.send(\"PUT\", \"/two-factor/duo\", request, true, true);\n return new TwoFactorDuoResponse(r);\n }\n\n async putTwoFactorOrganizationDuo(\n organizationId: string,\n request: UpdateTwoFactorDuoRequest,\n ): Promise {\n const r = await this.send(\n \"PUT\",\n \"/organizations/\" + organizationId + \"/two-factor/duo\",\n request,\n true,\n true,\n );\n return new TwoFactorDuoResponse(r);\n }\n\n async putTwoFactorYubiKey(\n request: UpdateTwoFactorYubioOtpRequest,\n ): Promise {\n const r = await this.send(\"PUT\", \"/two-factor/yubikey\", request, true, true);\n return new TwoFactorYubiKeyResponse(r);\n }\n\n async putTwoFactorWebAuthn(\n request: UpdateTwoFactorWebAuthnRequest,\n ): Promise {\n const response = request.deviceResponse.response as AuthenticatorAttestationResponse;\n const data: any = Object.assign({}, request);\n\n data.deviceResponse = {\n id: request.deviceResponse.id,\n rawId: btoa(request.deviceResponse.id),\n type: request.deviceResponse.type,\n extensions: request.deviceResponse.getClientExtensionResults(),\n response: {\n AttestationObject: Utils.fromBufferToB64(response.attestationObject),\n clientDataJson: Utils.fromBufferToB64(response.clientDataJSON),\n },\n };\n\n const r = await this.send(\"PUT\", \"/two-factor/webauthn\", data, true, true);\n return new TwoFactorWebAuthnResponse(r);\n }\n\n async deleteTwoFactorWebAuthn(\n request: UpdateTwoFactorWebAuthnDeleteRequest,\n ): Promise {\n const r = await this.send(\"DELETE\", \"/two-factor/webauthn\", request, true, true);\n return new TwoFactorWebAuthnResponse(r);\n }\n\n async putTwoFactorDisable(request: TwoFactorProviderRequest): Promise {\n const r = await this.send(\"PUT\", \"/two-factor/disable\", request, true, true);\n return new TwoFactorProviderResponse(r);\n }\n\n async putTwoFactorOrganizationDisable(\n organizationId: string,\n request: TwoFactorProviderRequest,\n ): Promise {\n const r = await this.send(\n \"PUT\",\n \"/organizations/\" + organizationId + \"/two-factor/disable\",\n request,\n true,\n true,\n );\n return new TwoFactorProviderResponse(r);\n }\n\n postTwoFactorRecover(request: TwoFactorRecoveryRequest): Promise {\n return this.send(\"POST\", \"/two-factor/recover\", request, false, false);\n }\n\n postTwoFactorEmailSetup(request: TwoFactorEmailRequest): Promise {\n return this.send(\"POST\", \"/two-factor/send-email\", request, true, false);\n }\n\n postTwoFactorEmail(request: TwoFactorEmailRequest): Promise {\n return this.send(\"POST\", \"/two-factor/send-email-login\", request, false, false);\n }\n\n async getDeviceVerificationSettings(): Promise {\n const r = await this.send(\n \"GET\",\n \"/two-factor/get-device-verification-settings\",\n null,\n true,\n true,\n );\n return new DeviceVerificationResponse(r);\n }\n\n async putDeviceVerificationSettings(\n request: DeviceVerificationRequest,\n ): Promise {\n const r = await this.send(\n \"PUT\",\n \"/two-factor/device-verification-settings\",\n request,\n true,\n true,\n );\n return new DeviceVerificationResponse(r);\n }\n\n // Organization APIs\n\n async getCloudCommunicationsEnabled(): Promise {\n const r = await this.send(\"GET\", \"/organizations/connections/enabled\", null, true, true);\n return r as boolean;\n }\n\n async getOrganizationConnection(\n id: string,\n type: OrganizationConnectionType,\n configType: { new (response: any): TConfig },\n ): Promise> {\n const r = await this.send(\"GET\", `/organizations/connections/${id}/${type}`, null, true, true);\n return new OrganizationConnectionResponse(r, configType);\n }\n\n async createOrganizationConnection(\n request: OrganizationConnectionRequest,\n configType: { new (response: any): TConfig },\n ): Promise> {\n const r = await this.send(\"POST\", \"/organizations/connections/\", request, true, true);\n return new OrganizationConnectionResponse(r, configType);\n }\n\n async updateOrganizationConnection(\n request: OrganizationConnectionRequest,\n configType: { new (response: any): TConfig },\n organizationConnectionId?: string,\n ): Promise> {\n const r = await this.send(\n \"PUT\",\n \"/organizations/connections/\" + organizationConnectionId,\n request,\n true,\n true,\n );\n return new OrganizationConnectionResponse(r, configType);\n }\n\n async deleteOrganizationConnection(id: string): Promise {\n return this.send(\"DELETE\", \"/organizations/connections/\" + id, null, true, false);\n }\n\n // Provider APIs\n\n async postProviderSetup(id: string, request: ProviderSetupRequest) {\n const r = await this.send(\"POST\", \"/providers/\" + id + \"/setup\", request, true, true);\n return new ProviderResponse(r);\n }\n\n async getProvider(id: string) {\n const r = await this.send(\"GET\", \"/providers/\" + id, null, true, true);\n return new ProviderResponse(r);\n }\n\n async putProvider(id: string, request: ProviderUpdateRequest) {\n const r = await this.send(\"PUT\", \"/providers/\" + id, request, true, true);\n return new ProviderResponse(r);\n }\n\n // Provider User APIs\n\n async getProviderUsers(\n providerId: string,\n ): Promise> {\n const r = await this.send(\"GET\", \"/providers/\" + providerId + \"/users\", null, true, true);\n return new ListResponse(r, ProviderUserUserDetailsResponse);\n }\n\n async getProviderUser(providerId: string, id: string): Promise {\n const r = await this.send(\"GET\", \"/providers/\" + providerId + \"/users/\" + id, null, true, true);\n return new ProviderUserResponse(r);\n }\n\n postProviderUserInvite(providerId: string, request: ProviderUserInviteRequest): Promise {\n return this.send(\"POST\", \"/providers/\" + providerId + \"/users/invite\", request, true, false);\n }\n\n postProviderUserReinvite(providerId: string, id: string): Promise {\n return this.send(\n \"POST\",\n \"/providers/\" + providerId + \"/users/\" + id + \"/reinvite\",\n null,\n true,\n false,\n );\n }\n\n async postManyProviderUserReinvite(\n providerId: string,\n request: ProviderUserBulkRequest,\n ): Promise> {\n const r = await this.send(\n \"POST\",\n \"/providers/\" + providerId + \"/users/reinvite\",\n request,\n true,\n true,\n );\n return new ListResponse(r, ProviderUserBulkResponse);\n }\n\n async postProviderUserBulkConfirm(\n providerId: string,\n request: ProviderUserBulkConfirmRequest,\n ): Promise> {\n const r = await this.send(\n \"POST\",\n \"/providers/\" + providerId + \"/users/confirm\",\n request,\n true,\n true,\n );\n return new ListResponse(r, ProviderUserBulkResponse);\n }\n\n async deleteManyProviderUsers(\n providerId: string,\n request: ProviderUserBulkRequest,\n ): Promise> {\n const r = await this.send(\"DELETE\", \"/providers/\" + providerId + \"/users\", request, true, true);\n return new ListResponse(r, ProviderUserBulkResponse);\n }\n\n postProviderUserAccept(\n providerId: string,\n id: string,\n request: ProviderUserAcceptRequest,\n ): Promise {\n return this.send(\n \"POST\",\n \"/providers/\" + providerId + \"/users/\" + id + \"/accept\",\n request,\n true,\n false,\n );\n }\n\n postProviderUserConfirm(\n providerId: string,\n id: string,\n request: ProviderUserConfirmRequest,\n ): Promise {\n return this.send(\n \"POST\",\n \"/providers/\" + providerId + \"/users/\" + id + \"/confirm\",\n request,\n true,\n false,\n );\n }\n\n async postProviderUsersPublicKey(\n providerId: string,\n request: ProviderUserBulkRequest,\n ): Promise> {\n const r = await this.send(\n \"POST\",\n \"/providers/\" + providerId + \"/users/public-keys\",\n request,\n true,\n true,\n );\n return new ListResponse(r, ProviderUserBulkPublicKeyResponse);\n }\n\n putProviderUser(\n providerId: string,\n id: string,\n request: ProviderUserUpdateRequest,\n ): Promise {\n return this.send(\"PUT\", \"/providers/\" + providerId + \"/users/\" + id, request, true, false);\n }\n\n deleteProviderUser(providerId: string, id: string): Promise {\n return this.send(\"DELETE\", \"/providers/\" + providerId + \"/users/\" + id, null, true, false);\n }\n\n // Provider Organization APIs\n\n async getProviderClients(\n providerId: string,\n ): Promise> {\n const r = await this.send(\n \"GET\",\n \"/providers/\" + providerId + \"/organizations\",\n null,\n true,\n true,\n );\n return new ListResponse(r, ProviderOrganizationOrganizationDetailsResponse);\n }\n\n postProviderAddOrganization(\n providerId: string,\n request: ProviderAddOrganizationRequest,\n ): Promise {\n return this.send(\n \"POST\",\n \"/providers/\" + providerId + \"/organizations/add\",\n request,\n true,\n false,\n );\n }\n\n async postProviderCreateOrganization(\n providerId: string,\n request: ProviderOrganizationCreateRequest,\n ): Promise {\n const r = await this.send(\n \"POST\",\n \"/providers/\" + providerId + \"/organizations\",\n request,\n true,\n true,\n );\n return new ProviderOrganizationResponse(r);\n }\n\n deleteProviderOrganization(providerId: string, id: string): Promise {\n return this.send(\n \"DELETE\",\n \"/providers/\" + providerId + \"/organizations/\" + id,\n null,\n true,\n false,\n );\n }\n\n // Event APIs\n\n async getEvents(start: string, end: string, token: string): Promise> {\n const r = await this.send(\n \"GET\",\n this.addEventParameters(\"/events\", start, end, token),\n null,\n true,\n true,\n );\n return new ListResponse(r, EventResponse);\n }\n\n async getEventsCipher(\n id: string,\n start: string,\n end: string,\n token: string,\n ): Promise> {\n const r = await this.send(\n \"GET\",\n this.addEventParameters(\"/ciphers/\" + id + \"/events\", start, end, token),\n null,\n true,\n true,\n );\n return new ListResponse(r, EventResponse);\n }\n\n async getEventsOrganization(\n id: string,\n start: string,\n end: string,\n token: string,\n ): Promise> {\n const r = await this.send(\n \"GET\",\n this.addEventParameters(\"/organizations/\" + id + \"/events\", start, end, token),\n null,\n true,\n true,\n );\n return new ListResponse(r, EventResponse);\n }\n\n async getEventsOrganizationUser(\n organizationId: string,\n id: string,\n start: string,\n end: string,\n token: string,\n ): Promise> {\n const r = await this.send(\n \"GET\",\n this.addEventParameters(\n \"/organizations/\" + organizationId + \"/users/\" + id + \"/events\",\n start,\n end,\n token,\n ),\n null,\n true,\n true,\n );\n return new ListResponse(r, EventResponse);\n }\n\n async getEventsProvider(\n id: string,\n start: string,\n end: string,\n token: string,\n ): Promise> {\n const r = await this.send(\n \"GET\",\n this.addEventParameters(\"/providers/\" + id + \"/events\", start, end, token),\n null,\n true,\n true,\n );\n return new ListResponse(r, EventResponse);\n }\n\n async getEventsProviderUser(\n providerId: string,\n id: string,\n start: string,\n end: string,\n token: string,\n ): Promise> {\n const r = await this.send(\n \"GET\",\n this.addEventParameters(\n \"/providers/\" + providerId + \"/users/\" + id + \"/events\",\n start,\n end,\n token,\n ),\n null,\n true,\n true,\n );\n return new ListResponse(r, EventResponse);\n }\n\n async postEventsCollect(request: EventRequest[]): Promise {\n const authHeader = await this.getActiveBearerToken();\n const headers = new Headers({\n \"Device-Type\": this.deviceType,\n Authorization: \"Bearer \" + authHeader,\n \"Content-Type\": \"application/json; charset=utf-8\",\n });\n if (this.customUserAgent != null) {\n headers.set(\"User-Agent\", this.customUserAgent);\n }\n const env = await firstValueFrom(this.environmentService.environment$);\n const response = await this.fetch(\n new Request(env.getEventsUrl() + \"/collect\", {\n cache: \"no-store\",\n credentials: await this.getCredentials(),\n method: \"POST\",\n body: JSON.stringify(request),\n headers: headers,\n }),\n );\n if (response.status !== 200) {\n return Promise.reject(\"Event post failed.\");\n }\n }\n\n // User APIs\n\n async getUserPublicKey(id: string): Promise {\n const r = await this.send(\"GET\", \"/users/\" + id + \"/public-key\", null, true, true);\n return new UserKeyResponse(r);\n }\n\n // HIBP APIs\n\n async getHibpBreach(username: string): Promise {\n const r = await this.send(\"GET\", \"/hibp/breach?username=\" + username, null, true, true);\n return r.map((a: any) => new BreachAccountResponse(a));\n }\n\n // Misc\n\n async postBitPayInvoice(request: BitPayInvoiceRequest): Promise {\n const r = await this.send(\"POST\", \"/bitpay-invoice\", request, true, true);\n return r as string;\n }\n\n async postSetupPayment(): Promise {\n const r = await this.send(\"POST\", \"/setup-payment\", null, true, true);\n return r as string;\n }\n\n // Key Connector\n\n async getMasterKeyFromKeyConnector(\n keyConnectorUrl: string,\n ): Promise {\n const authHeader = await this.getActiveBearerToken();\n\n const response = await this.fetch(\n new Request(keyConnectorUrl + \"/user-keys\", {\n cache: \"no-store\",\n method: \"GET\",\n headers: new Headers({\n Accept: \"application/json\",\n Authorization: \"Bearer \" + authHeader,\n }),\n }),\n );\n\n if (response.status !== 200) {\n const error = await this.handleError(response, false, true);\n return Promise.reject(error);\n }\n\n return new KeyConnectorUserKeyResponse(await response.json());\n }\n\n async postUserKeyToKeyConnector(\n keyConnectorUrl: string,\n request: KeyConnectorUserKeyRequest,\n ): Promise {\n const authHeader = await this.getActiveBearerToken();\n\n const response = await this.fetch(\n new Request(keyConnectorUrl + \"/user-keys\", {\n cache: \"no-store\",\n method: \"POST\",\n headers: new Headers({\n Accept: \"application/json\",\n Authorization: \"Bearer \" + authHeader,\n \"Content-Type\": \"application/json; charset=utf-8\",\n }),\n body: JSON.stringify(request),\n }),\n );\n\n if (response.status !== 200) {\n const error = await this.handleError(response, false, true);\n return Promise.reject(error);\n }\n }\n\n async getKeyConnectorAlive(keyConnectorUrl: string) {\n const response = await this.fetch(\n new Request(keyConnectorUrl + \"/alive\", {\n cache: \"no-store\",\n method: \"GET\",\n headers: new Headers({\n Accept: \"application/json\",\n \"Content-Type\": \"application/json; charset=utf-8\",\n }),\n }),\n );\n\n if (response.status !== 200) {\n const error = await this.handleError(response, false, true);\n return Promise.reject(error);\n }\n }\n\n async getOrganizationExport(organizationId: string): Promise {\n const r = await this.send(\n \"GET\",\n \"/organizations/\" + organizationId + \"/export\",\n null,\n true,\n true,\n );\n return new OrganizationExportResponse(r);\n }\n\n // Helpers\n\n async getActiveBearerToken(): Promise {\n let accessToken = await this.tokenService.getAccessToken();\n if (await this.tokenService.tokenNeedsRefresh()) {\n await this.doAuthRefresh();\n accessToken = await this.tokenService.getAccessToken();\n }\n return accessToken;\n }\n\n async fetch(request: Request): Promise {\n if (request.method === \"GET\") {\n request.headers.set(\"Cache-Control\", \"no-store\");\n request.headers.set(\"Pragma\", \"no-cache\");\n }\n request.headers.set(\"Bitwarden-Client-Name\", this.platformUtilsService.getClientType());\n request.headers.set(\n \"Bitwarden-Client-Version\",\n await this.platformUtilsService.getApplicationVersionNumber(),\n );\n return this.nativeFetch(request);\n }\n\n nativeFetch(request: Request): Promise {\n return fetch(request);\n }\n\n async preValidateSso(identifier: string): Promise {\n if (identifier == null || identifier === \"\") {\n throw new Error(\"Organization Identifier was not provided.\");\n }\n const headers = new Headers({\n Accept: \"application/json\",\n \"Device-Type\": this.deviceType,\n });\n if (this.customUserAgent != null) {\n headers.set(\"User-Agent\", this.customUserAgent);\n }\n\n const env = await firstValueFrom(this.environmentService.environment$);\n const path = `/sso/prevalidate?domainHint=${encodeURIComponent(identifier)}`;\n const response = await this.fetch(\n new Request(env.getIdentityUrl() + path, {\n cache: \"no-store\",\n credentials: await this.getCredentials(),\n headers: headers,\n method: \"GET\",\n }),\n );\n\n if (response.status === 200) {\n const body = await response.json();\n return new SsoPreValidateResponse(body);\n } else {\n const error = await this.handleError(response, false, true);\n return Promise.reject(error);\n }\n }\n\n async postCreateSponsorship(\n sponsoredOrgId: string,\n request: OrganizationSponsorshipCreateRequest,\n ): Promise {\n return await this.send(\n \"POST\",\n \"/organization/sponsorship/\" +\n (this.platformUtilsService.isSelfHost() ? \"self-hosted/\" : \"\") +\n sponsoredOrgId +\n \"/families-for-enterprise\",\n request,\n true,\n false,\n );\n }\n\n async getSponsorshipSyncStatus(\n sponsoredOrgId: string,\n ): Promise {\n const response = await this.send(\n \"GET\",\n \"/organization/sponsorship/\" + sponsoredOrgId + \"/sync-status\",\n null,\n true,\n true,\n );\n return new OrganizationSponsorshipSyncStatusResponse(response);\n }\n\n async deleteRevokeSponsorship(sponsoringOrganizationId: string): Promise {\n return await this.send(\n \"DELETE\",\n \"/organization/sponsorship/\" +\n (this.platformUtilsService.isSelfHost() ? \"self-hosted/\" : \"\") +\n sponsoringOrganizationId,\n null,\n true,\n false,\n );\n }\n\n async deleteRemoveSponsorship(sponsoringOrgId: string): Promise {\n return await this.send(\n \"DELETE\",\n \"/organization/sponsorship/sponsored/\" + sponsoringOrgId,\n null,\n true,\n false,\n );\n }\n\n async postPreValidateSponsorshipToken(sponsorshipToken: string): Promise {\n const r = await this.send(\n \"POST\",\n \"/organization/sponsorship/validate-token?sponsorshipToken=\" +\n encodeURIComponent(sponsorshipToken),\n null,\n true,\n true,\n );\n return r as boolean;\n }\n\n async postRedeemSponsorship(\n sponsorshipToken: string,\n request: OrganizationSponsorshipRedeemRequest,\n ): Promise {\n return await this.send(\n \"POST\",\n \"/organization/sponsorship/redeem?sponsorshipToken=\" + encodeURIComponent(sponsorshipToken),\n request,\n true,\n false,\n );\n }\n\n async postResendSponsorshipOffer(sponsoringOrgId: string): Promise {\n return await this.send(\n \"POST\",\n \"/organization/sponsorship/\" + sponsoringOrgId + \"/families-for-enterprise/resend\",\n null,\n true,\n false,\n );\n }\n\n protected async doAuthRefresh(): Promise {\n const refreshToken = await this.tokenService.getRefreshToken();\n if (refreshToken != null && refreshToken !== \"\") {\n return this.doRefreshToken();\n }\n\n const clientId = await this.tokenService.getClientId();\n const clientSecret = await this.tokenService.getClientSecret();\n if (!Utils.isNullOrWhitespace(clientId) && !Utils.isNullOrWhitespace(clientSecret)) {\n return this.doApiTokenRefresh();\n }\n\n throw new Error(\"Cannot refresh token, no refresh token or api keys are stored\");\n }\n\n protected async doRefreshToken(): Promise {\n const refreshToken = await this.tokenService.getRefreshToken();\n if (refreshToken == null || refreshToken === \"\") {\n throw new Error();\n }\n const headers = new Headers({\n \"Content-Type\": \"application/x-www-form-urlencoded; charset=utf-8\",\n Accept: \"application/json\",\n \"Device-Type\": this.deviceType,\n });\n if (this.customUserAgent != null) {\n headers.set(\"User-Agent\", this.customUserAgent);\n }\n\n const env = await firstValueFrom(this.environmentService.environment$);\n const decodedToken = await this.tokenService.decodeAccessToken();\n const response = await this.fetch(\n new Request(env.getIdentityUrl() + \"/connect/token\", {\n body: this.qsStringify({\n grant_type: \"refresh_token\",\n client_id: decodedToken.client_id,\n refresh_token: refreshToken,\n }),\n cache: \"no-store\",\n credentials: await this.getCredentials(),\n headers: headers,\n method: \"POST\",\n }),\n );\n\n if (response.status === 200) {\n const responseJson = await response.json();\n const tokenResponse = new IdentityTokenResponse(responseJson);\n\n const vaultTimeoutAction = await this.stateService.getVaultTimeoutAction();\n const vaultTimeout = await this.stateService.getVaultTimeout();\n\n await this.tokenService.setTokens(\n tokenResponse.accessToken,\n vaultTimeoutAction as VaultTimeoutAction,\n vaultTimeout,\n tokenResponse.refreshToken,\n );\n } else {\n const error = await this.handleError(response, true, true);\n return Promise.reject(error);\n }\n }\n\n protected async doApiTokenRefresh(): Promise {\n const clientId = await this.tokenService.getClientId();\n const clientSecret = await this.tokenService.getClientSecret();\n\n const appId = await this.appIdService.getAppId();\n const deviceRequest = new DeviceRequest(appId, this.platformUtilsService);\n const tokenRequest = new UserApiTokenRequest(\n clientId,\n clientSecret,\n new TokenTwoFactorRequest(),\n deviceRequest,\n );\n\n const response = await this.postIdentityToken(tokenRequest);\n if (!(response instanceof IdentityTokenResponse)) {\n throw new Error(\"Invalid response received when refreshing api token\");\n }\n\n const vaultTimeoutAction = await this.stateService.getVaultTimeoutAction();\n const vaultTimeout = await this.stateService.getVaultTimeout();\n\n await this.tokenService.setAccessToken(\n response.accessToken,\n vaultTimeoutAction as VaultTimeoutAction,\n vaultTimeout,\n );\n }\n\n async send(\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\",\n path: string,\n body: any,\n authed: boolean,\n hasResponse: boolean,\n apiUrl?: string,\n alterHeaders?: (headers: Headers) => void,\n ): Promise {\n const env = await firstValueFrom(this.environmentService.environment$);\n apiUrl = Utils.isNullOrWhitespace(apiUrl) ? env.getApiUrl() : apiUrl;\n\n // Prevent directory traversal from malicious paths\n const pathParts = path.split(\"?\");\n const requestUrl =\n apiUrl + Utils.normalizePath(pathParts[0]) + (pathParts.length > 1 ? `?${pathParts[1]}` : \"\");\n\n const headers = new Headers({\n \"Device-Type\": this.deviceType,\n });\n if (this.customUserAgent != null) {\n headers.set(\"User-Agent\", this.customUserAgent);\n }\n\n const requestInit: RequestInit = {\n cache: \"no-store\",\n credentials: await this.getCredentials(),\n method: method,\n };\n\n if (authed) {\n const authHeader = await this.getActiveBearerToken();\n headers.set(\"Authorization\", \"Bearer \" + authHeader);\n }\n if (body != null) {\n if (typeof body === \"string\") {\n requestInit.body = body;\n headers.set(\"Content-Type\", \"application/x-www-form-urlencoded; charset=utf-8\");\n } else if (typeof body === \"object\") {\n if (body instanceof FormData) {\n requestInit.body = body;\n } else {\n headers.set(\"Content-Type\", \"application/json; charset=utf-8\");\n requestInit.body = JSON.stringify(body);\n }\n }\n }\n if (hasResponse) {\n headers.set(\"Accept\", \"application/json\");\n }\n if (alterHeaders != null) {\n alterHeaders(headers);\n }\n\n requestInit.headers = headers;\n const response = await this.fetch(new Request(requestUrl, requestInit));\n\n const responseType = response.headers.get(\"content-type\");\n const responseIsJson = responseType != null && responseType.indexOf(\"application/json\") !== -1;\n if (hasResponse && response.status === 200 && responseIsJson) {\n const responseJson = await response.json();\n return responseJson;\n } else if (response.status !== 200) {\n const error = await this.handleError(response, false, authed);\n return Promise.reject(error);\n }\n }\n\n private async handleError(\n response: Response,\n tokenError: boolean,\n authed: boolean,\n ): Promise {\n let responseJson: any = null;\n if (this.isJsonResponse(response)) {\n responseJson = await response.json();\n } else if (this.isTextResponse(response)) {\n responseJson = { Message: await response.text() };\n }\n\n if (authed) {\n if (\n response.status === 401 ||\n response.status === 403 ||\n (tokenError &&\n response.status === 400 &&\n responseJson != null &&\n responseJson.error === \"invalid_grant\")\n ) {\n await this.logoutCallback(true);\n return null;\n }\n }\n\n return new ErrorResponse(responseJson, response.status, tokenError);\n }\n\n private qsStringify(params: any): string {\n return Object.keys(params)\n .map((key) => {\n return encodeURIComponent(key) + \"=\" + encodeURIComponent(params[key]);\n })\n .join(\"&\");\n }\n\n private async getCredentials(): Promise {\n const env = await firstValueFrom(this.environmentService.environment$);\n if (!this.isWebClient || env.hasBaseUrl()) {\n return \"include\";\n }\n return undefined;\n }\n\n private addEventParameters(base: string, start: string, end: string, token: string) {\n if (start != null) {\n base += \"?start=\" + start;\n }\n if (end != null) {\n base += base.indexOf(\"?\") > -1 ? \"&\" : \"?\";\n base += \"end=\" + end;\n }\n if (token != null) {\n base += base.indexOf(\"?\") > -1 ? \"&\" : \"?\";\n base += \"continuationToken=\" + token;\n }\n return base;\n }\n\n private isJsonResponse(response: Response): boolean {\n const typeHeader = response.headers.get(\"content-type\");\n return typeHeader != null && typeHeader.indexOf(\"application/json\") > -1;\n }\n\n private isTextResponse(response: Response): boolean {\n const typeHeader = response.headers.get(\"content-type\");\n return typeHeader != null && typeHeader.indexOf(\"text\") > -1;\n }\n}\n","import { BehaviorSubject, Observable, concatMap, distinctUntilChanged, map } from \"rxjs\";\n\nimport { CryptoService } from \"../../../platform/abstractions/crypto.service\";\nimport { I18nService } from \"../../../platform/abstractions/i18n.service\";\nimport { KeyGenerationService } from \"../../../platform/abstractions/key-generation.service\";\nimport { StateService } from \"../../../platform/abstractions/state.service\";\nimport { KdfType } from \"../../../platform/enums\";\nimport { Utils } from \"../../../platform/misc/utils\";\nimport { EncArrayBuffer } from \"../../../platform/models/domain/enc-array-buffer\";\nimport { EncString } from \"../../../platform/models/domain/enc-string\";\nimport { SymmetricCryptoKey } from \"../../../platform/models/domain/symmetric-crypto-key\";\nimport { UserKey } from \"../../../types/key\";\nimport { SendType } from \"../enums/send-type\";\nimport { SendData } from \"../models/data/send.data\";\nimport { Send } from \"../models/domain/send\";\nimport { SendFile } from \"../models/domain/send-file\";\nimport { SendText } from \"../models/domain/send-text\";\nimport { SendWithIdRequest } from \"../models/request/send-with-id.request\";\nimport { SendView } from \"../models/view/send.view\";\nimport { SEND_KDF_ITERATIONS } from \"../send-kdf\";\n\nimport { InternalSendService as InternalSendServiceAbstraction } from \"./send.service.abstraction\";\n\nexport class SendService implements InternalSendServiceAbstraction {\n readonly sendKeySalt = \"bitwarden-send\";\n readonly sendKeyPurpose = \"send\";\n\n protected _sends: BehaviorSubject = new BehaviorSubject([]);\n protected _sendViews: BehaviorSubject = new BehaviorSubject([]);\n\n sends$ = this._sends.asObservable();\n sendViews$ = this._sendViews.asObservable();\n\n constructor(\n private cryptoService: CryptoService,\n private i18nService: I18nService,\n private keyGenerationService: KeyGenerationService,\n private stateService: StateService,\n ) {\n this.stateService.activeAccountUnlocked$\n .pipe(\n concatMap(async (unlocked) => {\n if (Utils.global.bitwardenContainerService == null) {\n return;\n }\n\n if (!unlocked) {\n this._sends.next([]);\n this._sendViews.next([]);\n return;\n }\n\n const data = await this.stateService.getEncryptedSends();\n\n await this.updateObservables(data);\n }),\n )\n .subscribe();\n }\n\n async clearCache(): Promise {\n await this._sendViews.next([]);\n }\n\n async encrypt(\n model: SendView,\n file: File | ArrayBuffer,\n password: string,\n key?: SymmetricCryptoKey,\n ): Promise<[Send, EncArrayBuffer]> {\n let fileData: EncArrayBuffer = null;\n const send = new Send();\n send.id = model.id;\n send.type = model.type;\n send.disabled = model.disabled;\n send.hideEmail = model.hideEmail;\n send.maxAccessCount = model.maxAccessCount;\n if (model.key == null) {\n const key = await this.keyGenerationService.createKeyWithPurpose(\n 128,\n this.sendKeyPurpose,\n this.sendKeySalt,\n );\n model.key = key.material;\n model.cryptoKey = key.derivedKey;\n }\n if (password != null) {\n const passwordKey = await this.keyGenerationService.deriveKeyFromPassword(\n password,\n model.key,\n KdfType.PBKDF2_SHA256,\n { iterations: SEND_KDF_ITERATIONS },\n );\n send.password = passwordKey.keyB64;\n }\n send.key = await this.cryptoService.encrypt(model.key, key);\n send.name = await this.cryptoService.encrypt(model.name, model.cryptoKey);\n send.notes = await this.cryptoService.encrypt(model.notes, model.cryptoKey);\n if (send.type === SendType.Text) {\n send.text = new SendText();\n send.text.text = await this.cryptoService.encrypt(model.text.text, model.cryptoKey);\n send.text.hidden = model.text.hidden;\n } else if (send.type === SendType.File) {\n send.file = new SendFile();\n if (file != null) {\n if (file instanceof ArrayBuffer) {\n const [name, data] = await this.encryptFileData(\n model.file.fileName,\n file,\n model.cryptoKey,\n );\n send.file.fileName = name;\n fileData = data;\n } else {\n fileData = await this.parseFile(send, file, model.cryptoKey);\n }\n }\n }\n\n return [send, fileData];\n }\n\n get(id: string): Send {\n const sends = this._sends.getValue();\n return sends.find((send) => send.id === id);\n }\n\n get$(id: string): Observable {\n return this.sends$.pipe(\n distinctUntilChanged((oldSends, newSends) => {\n const oldSend = oldSends.find((oldSend) => oldSend.id === id);\n const newSend = newSends.find((newSend) => newSend.id === id);\n if (!oldSend || !newSend) {\n // If either oldSend or newSend is not found, consider them different\n return false;\n }\n\n // Compare each property of the old and new Send objects\n const allPropertiesSame = Object.keys(newSend).every((key) => {\n if (\n (oldSend[key as keyof Send] != null && newSend[key as keyof Send] === null) ||\n (oldSend[key as keyof Send] === null && newSend[key as keyof Send] != null)\n ) {\n // If a key from either old or new send is not found, and the key from the other send has a value, consider them different\n return false;\n }\n\n switch (key) {\n case \"name\":\n case \"notes\":\n case \"key\":\n if (oldSend[key] === null && newSend[key] === null) {\n return true;\n }\n\n return oldSend[key].encryptedString === newSend[key].encryptedString;\n case \"text\":\n if (oldSend[key].text == null && newSend[key].text == null) {\n return true;\n }\n if (\n (oldSend[key].text != null && newSend[key].text == null) ||\n (oldSend[key].text == null && newSend[key].text != null)\n ) {\n return false;\n }\n return oldSend[key].text.encryptedString === newSend[key].text.encryptedString;\n case \"file\":\n //Files are never updated so never will be changed.\n return true;\n case \"revisionDate\":\n case \"expirationDate\":\n case \"deletionDate\":\n if (oldSend[key] === null && newSend[key] === null) {\n return true;\n }\n return oldSend[key].getTime() === newSend[key].getTime();\n default:\n // For other properties, compare directly\n return oldSend[key as keyof Send] === newSend[key as keyof Send];\n }\n });\n\n return allPropertiesSame;\n }),\n map((sends) => sends.find((o) => o.id === id)),\n );\n }\n\n async getFromState(id: string): Promise {\n const sends = await this.stateService.getEncryptedSends();\n // eslint-disable-next-line\n if (sends == null || !sends.hasOwnProperty(id)) {\n return null;\n }\n\n return new Send(sends[id]);\n }\n\n async getAll(): Promise {\n const sends = await this.stateService.getEncryptedSends();\n const response: Send[] = [];\n for (const id in sends) {\n // eslint-disable-next-line\n if (sends.hasOwnProperty(id)) {\n response.push(new Send(sends[id]));\n }\n }\n return response;\n }\n\n async getAllDecryptedFromState(): Promise {\n let decSends = await this.stateService.getDecryptedSends();\n if (decSends != null) {\n return decSends;\n }\n\n decSends = [];\n const hasKey = await this.cryptoService.hasUserKey();\n if (!hasKey) {\n throw new Error(\"No user key found.\");\n }\n\n const promises: Promise[] = [];\n const sends = await this.getAll();\n sends.forEach((send) => {\n promises.push(send.decrypt().then((f) => decSends.push(f)));\n });\n\n await Promise.all(promises);\n decSends.sort(Utils.getSortFunction(this.i18nService, \"name\"));\n\n await this.stateService.setDecryptedSends(decSends);\n return decSends;\n }\n\n async upsert(send: SendData | SendData[]): Promise {\n let sends = await this.stateService.getEncryptedSends();\n if (sends == null) {\n sends = {};\n }\n if (send instanceof SendData) {\n const s = send as SendData;\n sends[s.id] = s;\n } else {\n (send as SendData[]).forEach((s) => {\n sends[s.id] = s;\n });\n }\n\n await this.replace(sends);\n }\n\n async clear(userId?: string): Promise {\n if (userId == null || userId == (await this.stateService.getUserId())) {\n this._sends.next([]);\n this._sendViews.next([]);\n }\n await this.stateService.setDecryptedSends(null, { userId: userId });\n await this.stateService.setEncryptedSends(null, { userId: userId });\n }\n\n async delete(id: string | string[]): Promise {\n const sends = await this.stateService.getEncryptedSends();\n if (sends == null) {\n return;\n }\n\n if (typeof id === \"string\") {\n if (sends[id] == null) {\n return;\n }\n delete sends[id];\n } else {\n (id as string[]).forEach((i) => {\n delete sends[i];\n });\n }\n\n await this.replace(sends);\n }\n\n async replace(sends: { [id: string]: SendData }): Promise {\n await this.updateObservables(sends);\n await this.stateService.setEncryptedSends(sends);\n }\n\n async getRotatedKeys(newUserKey: UserKey): Promise {\n if (newUserKey == null) {\n throw new Error(\"New user key is required for rotation.\");\n }\n\n const requests = await Promise.all(\n this._sends.value.map(async (send) => {\n const sendKey = await this.cryptoService.decryptToBytes(send.key);\n send.key = await this.cryptoService.encrypt(sendKey, newUserKey);\n return new SendWithIdRequest(send);\n }),\n );\n // separate return for easier debugging\n return requests;\n }\n\n private parseFile(send: Send, file: File, key: SymmetricCryptoKey): Promise {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.readAsArrayBuffer(file);\n reader.onload = async (evt) => {\n try {\n const [name, data] = await this.encryptFileData(\n file.name,\n evt.target.result as ArrayBuffer,\n key,\n );\n send.file.fileName = name;\n resolve(data);\n } catch (e) {\n reject(e);\n }\n };\n reader.onerror = () => {\n reject(\"Error reading file.\");\n };\n });\n }\n\n private async encryptFileData(\n fileName: string,\n data: ArrayBuffer,\n key: SymmetricCryptoKey,\n ): Promise<[EncString, EncArrayBuffer]> {\n const encFileName = await this.cryptoService.encrypt(fileName, key);\n const encFileData = await this.cryptoService.encryptToBytes(new Uint8Array(data), key);\n return [encFileName, encFileData];\n }\n\n private async updateObservables(sendsMap: { [id: string]: SendData }) {\n const sends = Object.values(sendsMap || {}).map((f) => new Send(f));\n this._sends.next(sends);\n\n if (await this.cryptoService.hasUserKey()) {\n this._sendViews.next(await this.decryptSends(sends));\n }\n }\n\n private async decryptSends(sends: Send[]) {\n const decryptSendPromises = sends.map((s) => s.decrypt());\n const decryptedSends = await Promise.all(decryptSendPromises);\n\n decryptedSends.sort(Utils.getSortFunction(this.i18nService, \"name\"));\n return decryptedSends;\n }\n}\n","import { ApiService } from \"../../../abstractions/api.service\";\nimport { ErrorResponse } from \"../../../models/response/error.response\";\nimport { ListResponse } from \"../../../models/response/list.response\";\nimport {\n FileUploadApiMethods,\n FileUploadService,\n} from \"../../../platform/abstractions/file-upload/file-upload.service\";\nimport { Utils } from \"../../../platform/misc/utils\";\nimport { EncArrayBuffer } from \"../../../platform/models/domain/enc-array-buffer\";\nimport { SendType } from \"../enums/send-type\";\nimport { SendData } from \"../models/data/send.data\";\nimport { Send } from \"../models/domain/send\";\nimport { SendAccessRequest } from \"../models/request/send-access.request\";\nimport { SendRequest } from \"../models/request/send.request\";\nimport { SendAccessResponse } from \"../models/response/send-access.response\";\nimport { SendFileDownloadDataResponse } from \"../models/response/send-file-download-data.response\";\nimport { SendFileUploadDataResponse } from \"../models/response/send-file-upload-data.response\";\nimport { SendResponse } from \"../models/response/send.response\";\nimport { SendAccessView } from \"../models/view/send-access.view\";\n\nimport { SendApiService as SendApiServiceAbstraction } from \"./send-api.service.abstraction\";\nimport { InternalSendService } from \"./send.service.abstraction\";\n\nexport class SendApiService implements SendApiServiceAbstraction {\n constructor(\n private apiService: ApiService,\n private fileUploadService: FileUploadService,\n private sendService: InternalSendService,\n ) {}\n\n async getSend(id: string): Promise {\n const r = await this.apiService.send(\"GET\", \"/sends/\" + id, null, true, true);\n return new SendResponse(r);\n }\n\n async postSendAccess(\n id: string,\n request: SendAccessRequest,\n apiUrl?: string,\n ): Promise {\n const addSendIdHeader = (headers: Headers) => {\n headers.set(\"Send-Id\", id);\n };\n const r = await this.apiService.send(\n \"POST\",\n \"/sends/access/\" + id,\n request,\n false,\n true,\n apiUrl,\n addSendIdHeader,\n );\n return new SendAccessResponse(r);\n }\n\n async getSendFileDownloadData(\n send: SendAccessView,\n request: SendAccessRequest,\n apiUrl?: string,\n ): Promise {\n const addSendIdHeader = (headers: Headers) => {\n headers.set(\"Send-Id\", send.id);\n };\n const r = await this.apiService.send(\n \"POST\",\n \"/sends/\" + send.id + \"/access/file/\" + send.file.id,\n request,\n false,\n true,\n apiUrl,\n addSendIdHeader,\n );\n return new SendFileDownloadDataResponse(r);\n }\n\n async getSends(): Promise> {\n const r = await this.apiService.send(\"GET\", \"/sends\", null, true, true);\n return new ListResponse(r, SendResponse);\n }\n\n async postSend(request: SendRequest): Promise {\n const r = await this.apiService.send(\"POST\", \"/sends\", request, true, true);\n return new SendResponse(r);\n }\n\n async postFileTypeSend(request: SendRequest): Promise {\n const r = await this.apiService.send(\"POST\", \"/sends/file/v2\", request, true, true);\n return new SendFileUploadDataResponse(r);\n }\n\n async renewSendFileUploadUrl(\n sendId: string,\n fileId: string,\n ): Promise {\n const r = await this.apiService.send(\n \"GET\",\n \"/sends/\" + sendId + \"/file/\" + fileId,\n null,\n true,\n true,\n );\n return new SendFileUploadDataResponse(r);\n }\n\n postSendFile(sendId: string, fileId: string, data: FormData): Promise {\n return this.apiService.send(\"POST\", \"/sends/\" + sendId + \"/file/\" + fileId, data, true, false);\n }\n\n /**\n * @deprecated Mar 25 2021: This method has been deprecated in favor of direct uploads.\n * This method still exists for backward compatibility with old server versions.\n */\n async postSendFileLegacy(data: FormData): Promise {\n const r = await this.apiService.send(\"POST\", \"/sends/file\", data, true, true);\n return new SendResponse(r);\n }\n\n async putSend(id: string, request: SendRequest): Promise {\n const r = await this.apiService.send(\"PUT\", \"/sends/\" + id, request, true, true);\n return new SendResponse(r);\n }\n\n async putSendRemovePassword(id: string): Promise {\n const r = await this.apiService.send(\n \"PUT\",\n \"/sends/\" + id + \"/remove-password\",\n null,\n true,\n true,\n );\n return new SendResponse(r);\n }\n\n deleteSend(id: string): Promise {\n return this.apiService.send(\"DELETE\", \"/sends/\" + id, null, true, false);\n }\n\n async save(sendData: [Send, EncArrayBuffer]): Promise {\n const response = await this.upload(sendData);\n\n const data = new SendData(response);\n await this.sendService.upsert(data);\n }\n\n async delete(id: string): Promise {\n await this.deleteSend(id);\n await this.sendService.delete(id);\n }\n\n async removePassword(id: string): Promise {\n const response = await this.putSendRemovePassword(id);\n const data = new SendData(response);\n await this.sendService.upsert(data);\n }\n\n // Send File Upload methods\n\n private async upload(sendData: [Send, EncArrayBuffer]): Promise {\n const request = new SendRequest(sendData[0], sendData[1]?.buffer.byteLength);\n let response: SendResponse;\n if (sendData[0].id == null) {\n if (sendData[0].type === SendType.Text) {\n response = await this.postSend(request);\n } else {\n try {\n const uploadDataResponse = await this.postFileTypeSend(request);\n response = uploadDataResponse.sendResponse;\n await this.fileUploadService.upload(\n uploadDataResponse,\n sendData[0].file.fileName,\n sendData[1],\n this.generateMethods(uploadDataResponse, response),\n );\n } catch (e) {\n if (e instanceof ErrorResponse && (e as ErrorResponse).statusCode === 404) {\n response = await this.legacyServerSendFileUpload(sendData, request);\n } else if (e instanceof ErrorResponse) {\n throw new Error((e as ErrorResponse).getSingleMessage());\n } else {\n throw e;\n }\n }\n }\n sendData[0].id = response.id;\n sendData[0].accessId = response.accessId;\n } else {\n response = await this.putSend(sendData[0].id, request);\n }\n return response;\n }\n\n private generateMethods(\n uploadData: SendFileUploadDataResponse,\n response: SendResponse,\n ): FileUploadApiMethods {\n return {\n postDirect: this.generatePostDirectCallback(response),\n renewFileUploadUrl: this.generateRenewFileUploadUrlCallback(response.id, response.file.id),\n rollback: this.generateRollbackCallback(response.id),\n };\n }\n\n private generatePostDirectCallback(sendResponse: SendResponse) {\n return (data: FormData) => {\n return this.postSendFile(sendResponse.id, sendResponse.file.id, data);\n };\n }\n\n private generateRenewFileUploadUrlCallback(sendId: string, fileId: string) {\n return async () => {\n const renewResponse = await this.renewSendFileUploadUrl(sendId, fileId);\n return renewResponse?.url;\n };\n }\n\n private generateRollbackCallback(sendId: string) {\n return () => {\n return this.deleteSend(sendId);\n };\n }\n\n /**\n * @deprecated Mar 25 2021: This method has been deprecated in favor of direct uploads.\n * This method still exists for backward compatibility with old server versions.\n */\n async legacyServerSendFileUpload(\n sendData: [Send, EncArrayBuffer],\n request: SendRequest,\n ): Promise {\n const fd = new FormData();\n try {\n const blob = new Blob([sendData[1].buffer], { type: \"application/octet-stream\" });\n fd.append(\"model\", JSON.stringify(request));\n fd.append(\"data\", blob, sendData[0].file.fileName.encryptedString);\n } catch (e) {\n if (Utils.isNode && !Utils.isBrowser) {\n fd.append(\"model\", JSON.stringify(request));\n fd.append(\n \"data\",\n Buffer.from(sendData[1].buffer) as any,\n {\n filepath: sendData[0].file.fileName.encryptedString,\n contentType: \"application/octet-stream\",\n } as any,\n );\n } else {\n throw e;\n }\n }\n return await this.postSendFileLegacy(fd);\n }\n}\n","import { defer, firstValueFrom } from \"rxjs\";\n\nimport { UserDecryptionOptionsServiceAbstraction } from \"@bitwarden/auth/common\";\n\nimport { VaultTimeoutSettingsService as VaultTimeoutSettingsServiceAbstraction } from \"../../abstractions/vault-timeout/vault-timeout-settings.service\";\nimport { PolicyService } from \"../../admin-console/abstractions/policy/policy.service.abstraction\";\nimport { PolicyType } from \"../../admin-console/enums\";\nimport { TokenService } from \"../../auth/abstractions/token.service\";\nimport { VaultTimeoutAction } from \"../../enums/vault-timeout-action.enum\";\nimport { CryptoService } from \"../../platform/abstractions/crypto.service\";\nimport { StateService } from \"../../platform/abstractions/state.service\";\nimport { BiometricStateService } from \"../../platform/biometrics/biometric-state.service\";\nimport { UserId } from \"../../types/guid\";\n\n/**\n * - DISABLED: No Pin set\n * - PERSISTENT: Pin is set and survives client reset\n * - TRANSIENT: Pin is set and requires password unlock after client reset\n */\nexport type PinLockType = \"DISABLED\" | \"PERSISTANT\" | \"TRANSIENT\";\n\nexport class VaultTimeoutSettingsService implements VaultTimeoutSettingsServiceAbstraction {\n constructor(\n private userDecryptionOptionsService: UserDecryptionOptionsServiceAbstraction,\n private cryptoService: CryptoService,\n private tokenService: TokenService,\n private policyService: PolicyService,\n private stateService: StateService,\n private biometricStateService: BiometricStateService,\n ) {}\n\n async setVaultTimeoutOptions(timeout: number, action: VaultTimeoutAction): Promise {\n // We swap these tokens from being on disk for lock actions, and in memory for logout actions\n // Get them here to set them to their new location after changing the timeout action and clearing if needed\n const accessToken = await this.tokenService.getAccessToken();\n const refreshToken = await this.tokenService.getRefreshToken();\n const clientId = await this.tokenService.getClientId();\n const clientSecret = await this.tokenService.getClientSecret();\n\n await this.stateService.setVaultTimeout(timeout);\n\n const currentAction = await this.stateService.getVaultTimeoutAction();\n\n if (\n (timeout != null || timeout === 0) &&\n action === VaultTimeoutAction.LogOut &&\n action !== currentAction\n ) {\n // if we have a vault timeout and the action is log out, reset tokens\n await this.tokenService.clearTokens();\n }\n\n await this.stateService.setVaultTimeoutAction(action);\n\n await this.tokenService.setTokens(accessToken, action, timeout, refreshToken, [\n clientId,\n clientSecret,\n ]);\n\n await this.cryptoService.refreshAdditionalKeys();\n }\n\n availableVaultTimeoutActions$(userId?: string) {\n return defer(() => this.getAvailableVaultTimeoutActions(userId));\n }\n\n async isPinLockSet(userId?: string): Promise {\n // we can't check the protected pin for both because old accounts only\n // used it for MP on Restart\n const pinIsEnabled = !!(await this.stateService.getProtectedPin({ userId }));\n const aUserKeyPinIsSet = !!(await this.stateService.getPinKeyEncryptedUserKey({ userId }));\n const anOldUserKeyPinIsSet = !!(await this.stateService.getEncryptedPinProtected({ userId }));\n\n if (aUserKeyPinIsSet || anOldUserKeyPinIsSet) {\n return \"PERSISTANT\";\n } else if (pinIsEnabled && !aUserKeyPinIsSet && !anOldUserKeyPinIsSet) {\n return \"TRANSIENT\";\n } else {\n return \"DISABLED\";\n }\n }\n\n async isBiometricLockSet(userId?: string): Promise {\n const biometricUnlockPromise =\n userId == null\n ? firstValueFrom(this.biometricStateService.biometricUnlockEnabled$)\n : this.biometricStateService.getBiometricUnlockEnabled(userId as UserId);\n return await biometricUnlockPromise;\n }\n\n async getVaultTimeout(userId?: UserId): Promise {\n const vaultTimeout = await this.stateService.getVaultTimeout({ userId });\n const policies = await firstValueFrom(\n this.policyService.getAll$(PolicyType.MaximumVaultTimeout, userId),\n );\n\n if (policies?.length) {\n // Remove negative values, and ensure it's smaller than maximum allowed value according to policy\n let timeout = Math.min(vaultTimeout, policies[0].data.minutes);\n\n if (vaultTimeout == null || timeout < 0) {\n timeout = policies[0].data.minutes;\n }\n\n // TODO @jlf0dev: Can we move this somwhere else? Maybe add it to the initialization process?\n // ( Apparently I'm the one that reviewed the original PR that added this :) )\n // We really shouldn't need to set the value here, but multiple services relies on this value being correct.\n if (vaultTimeout !== timeout) {\n await this.stateService.setVaultTimeout(timeout, { userId });\n }\n\n return timeout;\n }\n\n return vaultTimeout;\n }\n\n vaultTimeoutAction$(userId?: UserId) {\n return defer(() => this.getVaultTimeoutAction(userId));\n }\n\n async getVaultTimeoutAction(userId?: UserId): Promise {\n const availableActions = await this.getAvailableVaultTimeoutActions();\n if (availableActions.length === 1) {\n return availableActions[0];\n }\n\n const vaultTimeoutAction = await this.stateService.getVaultTimeoutAction({ userId: userId });\n const policies = await firstValueFrom(\n this.policyService.getAll$(PolicyType.MaximumVaultTimeout, userId),\n );\n\n if (policies?.length) {\n const action = policies[0].data.action;\n // We really shouldn't need to set the value here, but multiple services relies on this value being correct.\n if (action && vaultTimeoutAction !== action) {\n await this.stateService.setVaultTimeoutAction(action, { userId: userId });\n }\n if (action && availableActions.includes(action)) {\n return action;\n }\n }\n\n if (vaultTimeoutAction == null) {\n // Depends on whether or not the user has a master password\n const defaultValue = (await this.userHasMasterPassword(userId))\n ? VaultTimeoutAction.Lock\n : VaultTimeoutAction.LogOut;\n // We really shouldn't need to set the value here, but multiple services relies on this value being correct.\n await this.stateService.setVaultTimeoutAction(defaultValue, { userId: userId });\n return defaultValue;\n }\n\n return vaultTimeoutAction === VaultTimeoutAction.LogOut\n ? VaultTimeoutAction.LogOut\n : VaultTimeoutAction.Lock;\n }\n\n private async getAvailableVaultTimeoutActions(userId?: string): Promise {\n const availableActions = [VaultTimeoutAction.LogOut];\n\n const canLock =\n (await this.userHasMasterPassword(userId)) ||\n (await this.isPinLockSet(userId)) !== \"DISABLED\" ||\n (await this.isBiometricLockSet(userId));\n\n if (canLock) {\n availableActions.push(VaultTimeoutAction.Lock);\n }\n\n return availableActions;\n }\n\n async clear(userId?: string): Promise {\n await this.stateService.setEverBeenUnlocked(false, { userId: userId });\n await this.cryptoService.clearPinKeys(userId);\n }\n\n private async userHasMasterPassword(userId: string): Promise {\n if (userId) {\n const decryptionOptions = await firstValueFrom(\n this.userDecryptionOptionsService.userDecryptionOptionsById$(userId),\n );\n\n if (decryptionOptions?.hasMasterPassword != undefined) {\n return decryptionOptions.hasMasterPassword;\n }\n }\n return await firstValueFrom(this.userDecryptionOptionsService.hasMasterPassword$);\n }\n}\n","import { NotificationsService as NotificationsServiceAbstraction } from \"../../abstractions/notifications.service\";\nimport { LogService } from \"../abstractions/log.service\";\n\nexport class NoopNotificationsService implements NotificationsServiceAbstraction {\n constructor(private logService: LogService) {}\n\n init(): Promise {\n this.logService.info(\n \"Initializing no-op notification service, no push notifications will be received\",\n );\n return Promise.resolve();\n }\n\n updateConnection(sync?: boolean): Promise {\n this.logService.info(\"Updating notification service connection\");\n return Promise.resolve();\n }\n\n reconnectFromActivity(): Promise {\n this.logService.info(\"Reconnecting notification service from activity\");\n return Promise.resolve();\n }\n\n disconnectFromInactivity(): Promise {\n this.logService.info(\"Disconnecting notification service from inactivity\");\n return Promise.resolve();\n }\n}\n","import * as signalR from \"@microsoft/signalr\";\nimport * as signalRMsgPack from \"@microsoft/signalr-protocol-msgpack\";\nimport { firstValueFrom } from \"rxjs\";\n\nimport { ApiService } from \"../abstractions/api.service\";\nimport { NotificationsService as NotificationsServiceAbstraction } from \"../abstractions/notifications.service\";\nimport { AuthService } from \"../auth/abstractions/auth.service\";\nimport { AuthenticationStatus } from \"../auth/enums/authentication-status\";\nimport { NotificationType } from \"../enums\";\nimport {\n NotificationResponse,\n SyncCipherNotification,\n SyncFolderNotification,\n SyncSendNotification,\n} from \"../models/response/notification.response\";\nimport { AppIdService } from \"../platform/abstractions/app-id.service\";\nimport { EnvironmentService } from \"../platform/abstractions/environment.service\";\nimport { LogService } from \"../platform/abstractions/log.service\";\nimport { MessagingService } from \"../platform/abstractions/messaging.service\";\nimport { StateService } from \"../platform/abstractions/state.service\";\nimport { SyncService } from \"../vault/abstractions/sync/sync.service.abstraction\";\n\nexport class NotificationsService implements NotificationsServiceAbstraction {\n private signalrConnection: signalR.HubConnection;\n private url: string;\n private connected = false;\n private inited = false;\n private inactive = false;\n private reconnectTimer: any = null;\n\n constructor(\n private logService: LogService,\n private syncService: SyncService,\n private appIdService: AppIdService,\n private apiService: ApiService,\n private environmentService: EnvironmentService,\n private logoutCallback: (expired: boolean) => Promise,\n private stateService: StateService,\n private authService: AuthService,\n private messagingService: MessagingService,\n ) {\n this.environmentService.environment$.subscribe(() => {\n if (!this.inited) {\n return;\n }\n\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.init();\n });\n }\n\n async init(): Promise {\n this.inited = false;\n this.url = (await firstValueFrom(this.environmentService.environment$)).getNotificationsUrl();\n\n // Set notifications server URL to `https://-` to effectively disable communication\n // with the notifications server from the client app\n if (this.url === \"https://-\") {\n return;\n }\n\n if (this.signalrConnection != null) {\n this.signalrConnection.off(\"ReceiveMessage\");\n this.signalrConnection.off(\"Heartbeat\");\n await this.signalrConnection.stop();\n this.connected = false;\n this.signalrConnection = null;\n }\n\n this.signalrConnection = new signalR.HubConnectionBuilder()\n .withUrl(this.url + \"/hub\", {\n accessTokenFactory: () => this.apiService.getActiveBearerToken(),\n skipNegotiation: true,\n transport: signalR.HttpTransportType.WebSockets,\n })\n .withHubProtocol(new signalRMsgPack.MessagePackHubProtocol() as signalR.IHubProtocol)\n // .configureLogging(signalR.LogLevel.Trace)\n .build();\n\n this.signalrConnection.on(\"ReceiveMessage\", (data: any) =>\n this.processNotification(new NotificationResponse(data)),\n );\n // eslint-disable-next-line\n this.signalrConnection.on(\"Heartbeat\", (data: any) => {\n /*console.log('Heartbeat!');*/\n });\n this.signalrConnection.onclose(() => {\n this.connected = false;\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.reconnect(true);\n });\n this.inited = true;\n if (await this.isAuthedAndUnlocked()) {\n await this.reconnect(false);\n }\n }\n\n async updateConnection(sync = false): Promise {\n if (!this.inited) {\n return;\n }\n try {\n if (await this.isAuthedAndUnlocked()) {\n await this.reconnect(sync);\n } else {\n await this.signalrConnection.stop();\n }\n } catch (e) {\n this.logService.error(e.toString());\n }\n }\n\n async reconnectFromActivity(): Promise {\n this.inactive = false;\n if (this.inited && !this.connected) {\n await this.reconnect(true);\n }\n }\n\n async disconnectFromInactivity(): Promise {\n this.inactive = true;\n if (this.inited && this.connected) {\n await this.signalrConnection.stop();\n }\n }\n\n private async processNotification(notification: NotificationResponse) {\n const appId = await this.appIdService.getAppId();\n if (notification == null || notification.contextId === appId) {\n return;\n }\n\n const isAuthenticated = await this.stateService.getIsAuthenticated();\n const payloadUserId = notification.payload.userId || notification.payload.UserId;\n const myUserId = await this.stateService.getUserId();\n if (isAuthenticated && payloadUserId != null && payloadUserId !== myUserId) {\n return;\n }\n\n switch (notification.type) {\n case NotificationType.SyncCipherCreate:\n case NotificationType.SyncCipherUpdate:\n await this.syncService.syncUpsertCipher(\n notification.payload as SyncCipherNotification,\n notification.type === NotificationType.SyncCipherUpdate,\n );\n break;\n case NotificationType.SyncCipherDelete:\n case NotificationType.SyncLoginDelete:\n await this.syncService.syncDeleteCipher(notification.payload as SyncCipherNotification);\n break;\n case NotificationType.SyncFolderCreate:\n case NotificationType.SyncFolderUpdate:\n await this.syncService.syncUpsertFolder(\n notification.payload as SyncFolderNotification,\n notification.type === NotificationType.SyncFolderUpdate,\n );\n break;\n case NotificationType.SyncFolderDelete:\n await this.syncService.syncDeleteFolder(notification.payload as SyncFolderNotification);\n break;\n case NotificationType.SyncVault:\n case NotificationType.SyncCiphers:\n case NotificationType.SyncSettings:\n if (isAuthenticated) {\n await this.syncService.fullSync(false);\n }\n break;\n case NotificationType.SyncOrganizations:\n if (isAuthenticated) {\n // An organization update may not have bumped the user's account revision date, so force a sync\n await this.syncService.fullSync(true);\n }\n break;\n case NotificationType.SyncOrgKeys:\n if (isAuthenticated) {\n await this.syncService.fullSync(true);\n // Stop so a reconnect can be made\n await this.signalrConnection.stop();\n }\n break;\n case NotificationType.LogOut:\n if (isAuthenticated) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.logoutCallback(true);\n }\n break;\n case NotificationType.SyncSendCreate:\n case NotificationType.SyncSendUpdate:\n await this.syncService.syncUpsertSend(\n notification.payload as SyncSendNotification,\n notification.type === NotificationType.SyncSendUpdate,\n );\n break;\n case NotificationType.SyncSendDelete:\n await this.syncService.syncDeleteSend(notification.payload as SyncSendNotification);\n break;\n case NotificationType.AuthRequest:\n if (await this.stateService.getApproveLoginRequests()) {\n this.messagingService.send(\"openLoginApproval\", {\n notificationId: notification.payload.id,\n });\n }\n break;\n default:\n break;\n }\n }\n\n private async reconnect(sync: boolean) {\n if (this.reconnectTimer != null) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n if (this.connected || !this.inited || this.inactive) {\n return;\n }\n const authedAndUnlocked = await this.isAuthedAndUnlocked();\n if (!authedAndUnlocked) {\n return;\n }\n\n try {\n await this.signalrConnection.start();\n this.connected = true;\n if (sync) {\n await this.syncService.fullSync(false);\n }\n } catch (e) {\n this.logService.error(e);\n }\n\n if (!this.connected) {\n this.reconnectTimer = setTimeout(() => this.reconnect(sync), this.random(120000, 300000));\n }\n }\n\n private async isAuthedAndUnlocked() {\n const authStatus = await this.authService.getAuthStatus();\n return authStatus >= AuthenticationStatus.Unlocked;\n }\n\n private random(min: number, max: number) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n }\n}\n","import * as argon2 from \"argon2-browser\";\nimport * as forge from \"node-forge\";\n\nimport { Utils } from \"../../platform/misc/utils\";\nimport { CsprngArray } from \"../../types/csprng\";\nimport { CryptoFunctionService } from \"../abstractions/crypto-function.service\";\nimport { DecryptParameters } from \"../models/domain/decrypt-parameters\";\nimport { SymmetricCryptoKey } from \"../models/domain/symmetric-crypto-key\";\n\nexport class WebCryptoFunctionService implements CryptoFunctionService {\n private crypto: Crypto;\n private subtle: SubtleCrypto;\n private wasmSupported: boolean;\n\n constructor(globalContext: Window | typeof global) {\n this.crypto = typeof globalContext.crypto !== \"undefined\" ? globalContext.crypto : null;\n this.subtle =\n !!this.crypto && typeof this.crypto.subtle !== \"undefined\" ? this.crypto.subtle : null;\n this.wasmSupported = this.checkIfWasmSupported();\n }\n\n async pbkdf2(\n password: string | Uint8Array,\n salt: string | Uint8Array,\n algorithm: \"sha256\" | \"sha512\",\n iterations: number,\n ): Promise {\n const wcLen = algorithm === \"sha256\" ? 256 : 512;\n const passwordBuf = this.toBuf(password);\n const saltBuf = this.toBuf(salt);\n\n const pbkdf2Params: Pbkdf2Params = {\n name: \"PBKDF2\",\n salt: saltBuf,\n iterations: iterations,\n hash: { name: this.toWebCryptoAlgorithm(algorithm) },\n };\n\n const impKey = await this.subtle.importKey(\n \"raw\",\n passwordBuf,\n { name: \"PBKDF2\" } as any,\n false,\n [\"deriveBits\"],\n );\n const buffer = await this.subtle.deriveBits(pbkdf2Params as any, impKey, wcLen);\n return new Uint8Array(buffer);\n }\n\n async argon2(\n password: string | Uint8Array,\n salt: string | Uint8Array,\n iterations: number,\n memory: number,\n parallelism: number,\n ): Promise {\n if (!this.wasmSupported) {\n throw \"Webassembly support is required for the Argon2 KDF feature.\";\n }\n\n const passwordArr = new Uint8Array(this.toBuf(password));\n const saltArr = new Uint8Array(this.toBuf(salt));\n\n const result = await argon2.hash({\n pass: passwordArr,\n salt: saltArr,\n time: iterations,\n mem: memory,\n parallelism: parallelism,\n hashLen: 32,\n type: argon2.ArgonType.Argon2id,\n });\n argon2.unloadRuntime();\n return result.hash;\n }\n\n async hkdf(\n ikm: Uint8Array,\n salt: string | Uint8Array,\n info: string | Uint8Array,\n outputByteSize: number,\n algorithm: \"sha256\" | \"sha512\",\n ): Promise {\n const saltBuf = this.toBuf(salt);\n const infoBuf = this.toBuf(info);\n\n const hkdfParams: HkdfParams = {\n name: \"HKDF\",\n salt: saltBuf,\n info: infoBuf,\n hash: { name: this.toWebCryptoAlgorithm(algorithm) },\n };\n\n const impKey = await this.subtle.importKey(\"raw\", ikm, { name: \"HKDF\" } as any, false, [\n \"deriveBits\",\n ]);\n const buffer = await this.subtle.deriveBits(hkdfParams as any, impKey, outputByteSize * 8);\n return new Uint8Array(buffer);\n }\n\n // ref: https://tools.ietf.org/html/rfc5869\n async hkdfExpand(\n prk: Uint8Array,\n info: string | Uint8Array,\n outputByteSize: number,\n algorithm: \"sha256\" | \"sha512\",\n ): Promise {\n const hashLen = algorithm === \"sha256\" ? 32 : 64;\n if (outputByteSize > 255 * hashLen) {\n throw new Error(\"outputByteSize is too large.\");\n }\n const prkArr = new Uint8Array(prk);\n if (prkArr.length < hashLen) {\n throw new Error(\"prk is too small.\");\n }\n const infoBuf = this.toBuf(info);\n const infoArr = new Uint8Array(infoBuf);\n let runningOkmLength = 0;\n let previousT = new Uint8Array(0);\n const n = Math.ceil(outputByteSize / hashLen);\n const okm = new Uint8Array(n * hashLen);\n for (let i = 0; i < n; i++) {\n const t = new Uint8Array(previousT.length + infoArr.length + 1);\n t.set(previousT);\n t.set(infoArr, previousT.length);\n t.set([i + 1], t.length - 1);\n previousT = new Uint8Array(await this.hmac(t, prk, algorithm));\n okm.set(previousT, runningOkmLength);\n runningOkmLength += previousT.length;\n if (runningOkmLength >= outputByteSize) {\n break;\n }\n }\n return okm.slice(0, outputByteSize);\n }\n\n async hash(\n value: string | Uint8Array,\n algorithm: \"sha1\" | \"sha256\" | \"sha512\" | \"md5\",\n ): Promise {\n if (algorithm === \"md5\") {\n const md = forge.md.md5.create();\n const valueBytes = this.toByteString(value);\n md.update(valueBytes, \"raw\");\n return Utils.fromByteStringToArray(md.digest().data);\n }\n\n const valueBuf = this.toBuf(value);\n const buffer = await this.subtle.digest(\n { name: this.toWebCryptoAlgorithm(algorithm) },\n valueBuf,\n );\n return new Uint8Array(buffer);\n }\n\n async hmac(\n value: Uint8Array,\n key: Uint8Array,\n algorithm: \"sha1\" | \"sha256\" | \"sha512\",\n ): Promise {\n const signingAlgorithm = {\n name: \"HMAC\",\n hash: { name: this.toWebCryptoAlgorithm(algorithm) },\n };\n\n const impKey = await this.subtle.importKey(\"raw\", key, signingAlgorithm, false, [\"sign\"]);\n const buffer = await this.subtle.sign(signingAlgorithm, impKey, value);\n return new Uint8Array(buffer);\n }\n\n // Safely compare two values in a way that protects against timing attacks (Double HMAC Verification).\n // ref: https://www.nccgroup.trust/us/about-us/newsroom-and-events/blog/2011/february/double-hmac-verification/\n // ref: https://paragonie.com/blog/2015/11/preventing-timing-attacks-on-string-comparison-with-double-hmac-strategy\n async compare(a: Uint8Array, b: Uint8Array): Promise {\n const macKey = await this.randomBytes(32);\n const signingAlgorithm = {\n name: \"HMAC\",\n hash: { name: \"SHA-256\" },\n };\n const impKey = await this.subtle.importKey(\"raw\", macKey, signingAlgorithm, false, [\"sign\"]);\n const mac1 = await this.subtle.sign(signingAlgorithm, impKey, a);\n const mac2 = await this.subtle.sign(signingAlgorithm, impKey, b);\n\n if (mac1.byteLength !== mac2.byteLength) {\n return false;\n }\n\n const arr1 = new Uint8Array(mac1);\n const arr2 = new Uint8Array(mac2);\n for (let i = 0; i < arr2.length; i++) {\n if (arr1[i] !== arr2[i]) {\n return false;\n }\n }\n\n return true;\n }\n\n hmacFast(value: string, key: string, algorithm: \"sha1\" | \"sha256\" | \"sha512\"): Promise {\n const hmac = forge.hmac.create();\n hmac.start(algorithm, key);\n hmac.update(value);\n const bytes = hmac.digest().getBytes();\n return Promise.resolve(bytes);\n }\n\n async compareFast(a: string, b: string): Promise {\n const rand = await this.randomBytes(32);\n const bytes = new Uint32Array(rand);\n const buffer = forge.util.createBuffer();\n for (let i = 0; i < bytes.length; i++) {\n buffer.putInt32(bytes[i]);\n }\n const macKey = buffer.getBytes();\n\n const hmac = forge.hmac.create();\n hmac.start(\"sha256\", macKey);\n hmac.update(a);\n const mac1 = hmac.digest().getBytes();\n\n hmac.start(null, null);\n hmac.update(b);\n const mac2 = hmac.digest().getBytes();\n\n const equals = mac1 === mac2;\n return equals;\n }\n\n async aesEncrypt(data: Uint8Array, iv: Uint8Array, key: Uint8Array): Promise {\n const impKey = await this.subtle.importKey(\"raw\", key, { name: \"AES-CBC\" } as any, false, [\n \"encrypt\",\n ]);\n const buffer = await this.subtle.encrypt({ name: \"AES-CBC\", iv: iv }, impKey, data);\n return new Uint8Array(buffer);\n }\n\n aesDecryptFastParameters(\n data: string,\n iv: string,\n mac: string,\n key: SymmetricCryptoKey,\n ): DecryptParameters {\n const p = new DecryptParameters();\n if (key.meta != null) {\n p.encKey = key.meta.encKeyByteString;\n p.macKey = key.meta.macKeyByteString;\n }\n\n if (p.encKey == null) {\n p.encKey = forge.util.decode64(key.encKeyB64);\n }\n p.data = forge.util.decode64(data);\n p.iv = forge.util.decode64(iv);\n p.macData = p.iv + p.data;\n if (p.macKey == null && key.macKeyB64 != null) {\n p.macKey = forge.util.decode64(key.macKeyB64);\n }\n if (mac != null) {\n p.mac = forge.util.decode64(mac);\n }\n\n // cache byte string keys for later\n if (key.meta == null) {\n key.meta = {};\n }\n if (key.meta.encKeyByteString == null) {\n key.meta.encKeyByteString = p.encKey;\n }\n if (p.macKey != null && key.meta.macKeyByteString == null) {\n key.meta.macKeyByteString = p.macKey;\n }\n\n return p;\n }\n\n aesDecryptFast(parameters: DecryptParameters, mode: \"cbc\" | \"ecb\"): Promise {\n const decipher = (forge as any).cipher.createDecipher(\n this.toWebCryptoAesMode(mode),\n parameters.encKey,\n );\n const options = {} as any;\n if (mode === \"cbc\") {\n options.iv = parameters.iv;\n }\n const dataBuffer = (forge as any).util.createBuffer(parameters.data);\n decipher.start(options);\n decipher.update(dataBuffer);\n decipher.finish();\n const val = decipher.output.toString();\n return Promise.resolve(val);\n }\n\n async aesDecrypt(\n data: Uint8Array,\n iv: Uint8Array,\n key: Uint8Array,\n mode: \"cbc\" | \"ecb\",\n ): Promise {\n if (mode === \"ecb\") {\n // Web crypto does not support AES-ECB mode, so we need to do this in forge.\n const params = new DecryptParameters();\n params.data = this.toByteString(data);\n params.encKey = this.toByteString(key);\n const result = await this.aesDecryptFast(params, \"ecb\");\n return Utils.fromByteStringToArray(result);\n }\n const impKey = await this.subtle.importKey(\"raw\", key, { name: \"AES-CBC\" } as any, false, [\n \"decrypt\",\n ]);\n const buffer = await this.subtle.decrypt({ name: \"AES-CBC\", iv: iv }, impKey, data);\n return new Uint8Array(buffer);\n }\n\n async rsaEncrypt(\n data: Uint8Array,\n publicKey: Uint8Array,\n algorithm: \"sha1\" | \"sha256\",\n ): Promise {\n // Note: Edge browser requires that we specify name and hash for both key import and decrypt.\n // We cannot use the proper types here.\n const rsaParams = {\n name: \"RSA-OAEP\",\n hash: { name: this.toWebCryptoAlgorithm(algorithm) },\n };\n const impKey = await this.subtle.importKey(\"spki\", publicKey, rsaParams, false, [\"encrypt\"]);\n const buffer = await this.subtle.encrypt(rsaParams, impKey, data);\n return new Uint8Array(buffer);\n }\n\n async rsaDecrypt(\n data: Uint8Array,\n privateKey: Uint8Array,\n algorithm: \"sha1\" | \"sha256\",\n ): Promise {\n // Note: Edge browser requires that we specify name and hash for both key import and decrypt.\n // We cannot use the proper types here.\n const rsaParams = {\n name: \"RSA-OAEP\",\n hash: { name: this.toWebCryptoAlgorithm(algorithm) },\n };\n const impKey = await this.subtle.importKey(\"pkcs8\", privateKey, rsaParams, false, [\"decrypt\"]);\n const buffer = await this.subtle.decrypt(rsaParams, impKey, data);\n return new Uint8Array(buffer);\n }\n\n async rsaExtractPublicKey(privateKey: Uint8Array): Promise {\n const rsaParams = {\n name: \"RSA-OAEP\",\n // Have to specify some algorithm\n hash: { name: this.toWebCryptoAlgorithm(\"sha1\") },\n };\n const impPrivateKey = await this.subtle.importKey(\"pkcs8\", privateKey, rsaParams, true, [\n \"decrypt\",\n ]);\n const jwkPrivateKey = await this.subtle.exportKey(\"jwk\", impPrivateKey);\n const jwkPublicKeyParams = {\n kty: \"RSA\",\n e: jwkPrivateKey.e,\n n: jwkPrivateKey.n,\n alg: \"RSA-OAEP\",\n ext: true,\n };\n const impPublicKey = await this.subtle.importKey(\"jwk\", jwkPublicKeyParams, rsaParams, true, [\n \"encrypt\",\n ]);\n const buffer = await this.subtle.exportKey(\"spki\", impPublicKey);\n return new Uint8Array(buffer);\n }\n\n async aesGenerateKey(bitLength = 128 | 192 | 256 | 512): Promise {\n if (bitLength === 512) {\n // 512 bit keys are not supported in WebCrypto, so we concat two 256 bit keys\n const key1 = await this.aesGenerateKey(256);\n const key2 = await this.aesGenerateKey(256);\n return new Uint8Array([...key1, ...key2]) as CsprngArray;\n }\n const aesParams = {\n name: \"AES-CBC\",\n length: bitLength,\n };\n\n const key = await this.subtle.generateKey(aesParams, true, [\"encrypt\", \"decrypt\"]);\n const rawKey = await this.subtle.exportKey(\"raw\", key);\n return new Uint8Array(rawKey) as CsprngArray;\n }\n\n async rsaGenerateKeyPair(length: 1024 | 2048 | 4096): Promise<[Uint8Array, Uint8Array]> {\n const rsaParams = {\n name: \"RSA-OAEP\",\n modulusLength: length,\n publicExponent: new Uint8Array([0x01, 0x00, 0x01]), // 65537\n // Have to specify some algorithm\n hash: { name: this.toWebCryptoAlgorithm(\"sha1\") },\n };\n const keyPair = await this.subtle.generateKey(rsaParams, true, [\"encrypt\", \"decrypt\"]);\n const publicKey = await this.subtle.exportKey(\"spki\", keyPair.publicKey);\n const privateKey = await this.subtle.exportKey(\"pkcs8\", keyPair.privateKey);\n return [new Uint8Array(publicKey), new Uint8Array(privateKey)];\n }\n\n randomBytes(length: number): Promise {\n const arr = new Uint8Array(length);\n this.crypto.getRandomValues(arr);\n return Promise.resolve(arr as CsprngArray);\n }\n\n private toBuf(value: string | Uint8Array): Uint8Array {\n let buf: Uint8Array;\n if (typeof value === \"string\") {\n buf = Utils.fromUtf8ToArray(value);\n } else {\n buf = value;\n }\n return buf;\n }\n\n private toByteString(value: string | Uint8Array): string {\n let bytes: string;\n if (typeof value === \"string\") {\n bytes = forge.util.encodeUtf8(value);\n } else {\n bytes = Utils.fromBufferToByteString(value);\n }\n return bytes;\n }\n\n private toWebCryptoAlgorithm(algorithm: \"sha1\" | \"sha256\" | \"sha512\" | \"md5\"): string {\n if (algorithm === \"md5\") {\n throw new Error(\"MD5 is not supported in WebCrypto.\");\n }\n return algorithm === \"sha1\" ? \"SHA-1\" : algorithm === \"sha256\" ? \"SHA-256\" : \"SHA-512\";\n }\n\n private toWebCryptoAesMode(mode: \"cbc\" | \"ecb\"): string {\n return mode === \"cbc\" ? \"AES-CBC\" : \"AES-ECB\";\n }\n\n // ref: https://stackoverflow.com/a/47880734/1090359\n private checkIfWasmSupported(): boolean {\n try {\n if (typeof WebAssembly === \"object\" && typeof WebAssembly.instantiate === \"function\") {\n const module = new WebAssembly.Module(\n Uint8Array.of(0x0, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00),\n );\n if (module instanceof WebAssembly.Module) {\n return new WebAssembly.Instance(module) instanceof WebAssembly.Instance;\n }\n }\n } catch {\n return false;\n }\n return false;\n }\n}\n","import { firstValueFrom, map } from \"rxjs\";\n\nimport { ApiService } from \"../../abstractions/api.service\";\nimport { EventUploadService as EventUploadServiceAbstraction } from \"../../abstractions/event/event-upload.service\";\nimport { AccountService } from \"../../auth/abstractions/account.service\";\nimport { AuthenticationStatus } from \"../../auth/enums/authentication-status\";\nimport { EventData } from \"../../models/data/event.data\";\nimport { EventRequest } from \"../../models/request/event.request\";\nimport { LogService } from \"../../platform/abstractions/log.service\";\nimport { StateProvider } from \"../../platform/state\";\nimport { UserId } from \"../../types/guid\";\n\nimport { EVENT_COLLECTION } from \"./key-definitions\";\n\nexport class EventUploadService implements EventUploadServiceAbstraction {\n private inited = false;\n constructor(\n private apiService: ApiService,\n private stateProvider: StateProvider,\n private logService: LogService,\n private accountService: AccountService,\n ) {}\n\n init(checkOnInterval: boolean) {\n if (this.inited) {\n return;\n }\n\n this.inited = true;\n if (checkOnInterval) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.uploadEvents();\n setInterval(() => this.uploadEvents(), 60 * 1000); // check every 60 seconds\n }\n }\n\n /** Upload the event collection from state.\n * @param userId upload events for provided user. If not active user will be used.\n */\n async uploadEvents(userId?: UserId): Promise {\n if (!userId) {\n userId = await firstValueFrom(this.stateProvider.activeUserId$);\n }\n\n // Get the auth status from the provided user or the active user\n const userAuth$ = this.accountService.accounts$.pipe(\n map((accounts) => accounts[userId]?.status === AuthenticationStatus.Unlocked),\n );\n\n const isAuthenticated = await firstValueFrom(userAuth$);\n if (!isAuthenticated) {\n return;\n }\n\n const eventCollection = await this.takeEvents(userId);\n\n if (eventCollection == null || eventCollection.length === 0) {\n return;\n }\n const request = eventCollection.map((e) => {\n const req = new EventRequest();\n req.type = e.type;\n req.cipherId = e.cipherId;\n req.date = e.date;\n req.organizationId = e.organizationId;\n return req;\n });\n try {\n await this.apiService.postEventsCollect(request);\n } catch (e) {\n this.logService.error(e);\n // Add the events back to state if there was an error and they were not uploaded.\n await this.stateProvider.setUserState(EVENT_COLLECTION, eventCollection, userId);\n }\n }\n\n /** Return user's events and then clear them from state\n * @param userId the user to grab and clear events for\n */\n private async takeEvents(userId: UserId): Promise {\n let taken = null;\n await this.stateProvider.getUser(userId, EVENT_COLLECTION).update((current) => {\n taken = current ?? [];\n return [];\n });\n\n return taken;\n }\n}\n","import { firstValueFrom, map, from, zip } from \"rxjs\";\n\nimport { EventCollectionService as EventCollectionServiceAbstraction } from \"../../abstractions/event/event-collection.service\";\nimport { EventUploadService } from \"../../abstractions/event/event-upload.service\";\nimport { OrganizationService } from \"../../admin-console/abstractions/organization/organization.service.abstraction\";\nimport { AccountService } from \"../../auth/abstractions/account.service\";\nimport { AuthenticationStatus } from \"../../auth/enums/authentication-status\";\nimport { EventType } from \"../../enums\";\nimport { EventData } from \"../../models/data/event.data\";\nimport { StateProvider } from \"../../platform/state\";\nimport { CipherService } from \"../../vault/abstractions/cipher.service\";\n\nimport { EVENT_COLLECTION } from \"./key-definitions\";\n\nexport class EventCollectionService implements EventCollectionServiceAbstraction {\n constructor(\n private cipherService: CipherService,\n private stateProvider: StateProvider,\n private organizationService: OrganizationService,\n private eventUploadService: EventUploadService,\n private accountService: AccountService,\n ) {}\n\n /** Adds an event to the active user's event collection\n * @param eventType the event type to be added\n * @param cipherId if provided the id of the cipher involved in the event\n * @param uploadImmediately in some cases the recorded events should be uploaded right after being added\n * @param organizationId the organizationId involved in the event. If the cipherId is not provided an organizationId is required\n */\n async collect(\n eventType: EventType,\n cipherId: string = null,\n uploadImmediately = false,\n organizationId: string = null,\n ): Promise {\n const userId = await firstValueFrom(this.stateProvider.activeUserId$);\n const eventStore = this.stateProvider.getUser(userId, EVENT_COLLECTION);\n\n if (!(await this.shouldUpdate(cipherId, organizationId))) {\n return;\n }\n\n const event = new EventData();\n event.type = eventType;\n event.cipherId = cipherId;\n event.date = new Date().toISOString();\n event.organizationId = organizationId;\n\n await eventStore.update((events) => {\n events = events ?? [];\n events.push(event);\n return events;\n });\n\n if (uploadImmediately) {\n await this.eventUploadService.uploadEvents();\n }\n }\n\n /** Verifies if the event collection should be updated for the provided information\n * @param cipherId the cipher for the event\n * @param organizationId the organization for the event\n */\n private async shouldUpdate(\n cipherId: string = null,\n organizationId: string = null,\n ): Promise {\n const orgIds$ = this.organizationService.organizations$.pipe(\n map((orgs) => orgs?.filter((o) => o.useEvents)?.map((x) => x.id) ?? []),\n );\n\n const cipher$ = from(this.cipherService.get(cipherId));\n\n const [accountInfo, orgIds, cipher] = await firstValueFrom(\n zip(this.accountService.activeAccount$, orgIds$, cipher$),\n );\n\n // The user must be authorized\n if (accountInfo.status != AuthenticationStatus.Unlocked) {\n return false;\n }\n\n // User must have organizations assigned to them\n if (orgIds == null || orgIds.length == 0) {\n return false;\n }\n\n // If the cipher is null there must be an organization id provided\n if (cipher == null && organizationId == null) {\n return false;\n }\n\n // If the cipher is present it must be in the user's org list\n if (cipher != null && !orgIds.includes(cipher?.organizationId)) {\n return false;\n }\n\n // If the organization id is provided it must be in the user's org list\n if (organizationId != null && !orgIds.includes(organizationId)) {\n return false;\n }\n\n return true;\n }\n}\n","import { firstValueFrom } from \"rxjs\";\n\nimport { ApiService } from \"../../../abstractions/api.service\";\nimport { HttpStatusCode } from \"../../../enums\";\nimport { ErrorResponse } from \"../../../models/response/error.response\";\nimport { ListResponse } from \"../../../models/response/list.response\";\nimport { Utils } from \"../../../platform/misc/utils\";\nimport { PolicyApiServiceAbstraction } from \"../../abstractions/policy/policy-api.service.abstraction\";\nimport { InternalPolicyService } from \"../../abstractions/policy/policy.service.abstraction\";\nimport { PolicyType } from \"../../enums\";\nimport { PolicyData } from \"../../models/data/policy.data\";\nimport { MasterPasswordPolicyOptions } from \"../../models/domain/master-password-policy-options\";\nimport { Policy } from \"../../models/domain/policy\";\nimport { PolicyRequest } from \"../../models/request/policy.request\";\nimport { PolicyResponse } from \"../../models/response/policy.response\";\n\nexport class PolicyApiService implements PolicyApiServiceAbstraction {\n constructor(\n private policyService: InternalPolicyService,\n private apiService: ApiService,\n ) {}\n\n async getPolicy(organizationId: string, type: PolicyType): Promise {\n const r = await this.apiService.send(\n \"GET\",\n \"/organizations/\" + organizationId + \"/policies/\" + type,\n null,\n true,\n true,\n );\n return new PolicyResponse(r);\n }\n\n async getPolicies(organizationId: string): Promise> {\n const r = await this.apiService.send(\n \"GET\",\n \"/organizations/\" + organizationId + \"/policies\",\n null,\n true,\n true,\n );\n return new ListResponse(r, PolicyResponse);\n }\n\n async getPoliciesByToken(\n organizationId: string,\n token: string,\n email: string,\n organizationUserId: string,\n ): Promise> {\n const r = await this.apiService.send(\n \"GET\",\n \"/organizations/\" +\n organizationId +\n \"/policies/token?\" +\n \"token=\" +\n encodeURIComponent(token) +\n \"&email=\" +\n Utils.encodeRFC3986URIComponent(email) +\n \"&organizationUserId=\" +\n organizationUserId,\n null,\n false,\n true,\n );\n return new ListResponse(r, PolicyResponse);\n }\n\n private async getMasterPasswordPolicyResponseForOrgUser(\n organizationId: string,\n ): Promise {\n const response = await this.apiService.send(\n \"GET\",\n \"/organizations/\" + organizationId + \"/policies/master-password\",\n null,\n true,\n true,\n );\n\n return new PolicyResponse(response);\n }\n\n async getMasterPasswordPolicyOptsForOrgUser(\n orgId: string,\n ): Promise {\n try {\n const masterPasswordPolicyResponse =\n await this.getMasterPasswordPolicyResponseForOrgUser(orgId);\n\n const masterPasswordPolicy = Policy.fromResponse(masterPasswordPolicyResponse);\n\n if (!masterPasswordPolicy) {\n return null;\n }\n\n return await firstValueFrom(\n this.policyService.masterPasswordPolicyOptions$([masterPasswordPolicy]),\n );\n } catch (error) {\n // If policy not found, return null\n if (error instanceof ErrorResponse && error.statusCode === HttpStatusCode.NotFound) {\n return null;\n }\n // otherwise rethrow error\n throw error;\n }\n }\n\n async putPolicy(organizationId: string, type: PolicyType, request: PolicyRequest): Promise {\n const r = await this.apiService.send(\n \"PUT\",\n \"/organizations/\" + organizationId + \"/policies/\" + type,\n request,\n true,\n true,\n );\n const response = new PolicyResponse(r);\n const data = new PolicyData(response);\n await this.policyService.upsert(data);\n }\n}\n","import { ApiService } from \"../../abstractions/api.service\";\nimport { OrganizationService } from \"../../admin-console/abstractions/organization/organization.service.abstraction\";\nimport { OrganizationUserType } from \"../../admin-console/enums\";\nimport { KeysRequest } from \"../../models/request/keys.request\";\nimport { CryptoService } from \"../../platform/abstractions/crypto.service\";\nimport { KeyGenerationService } from \"../../platform/abstractions/key-generation.service\";\nimport { LogService } from \"../../platform/abstractions/log.service\";\nimport { StateService } from \"../../platform/abstractions/state.service\";\nimport { Utils } from \"../../platform/misc/utils\";\nimport { SymmetricCryptoKey } from \"../../platform/models/domain/symmetric-crypto-key\";\nimport { MasterKey } from \"../../types/key\";\nimport { KeyConnectorService as KeyConnectorServiceAbstraction } from \"../abstractions/key-connector.service\";\nimport { TokenService } from \"../abstractions/token.service\";\nimport { KdfConfig } from \"../models/domain/kdf-config\";\nimport { KeyConnectorUserKeyRequest } from \"../models/request/key-connector-user-key.request\";\nimport { SetKeyConnectorKeyRequest } from \"../models/request/set-key-connector-key.request\";\nimport { IdentityTokenResponse } from \"../models/response/identity-token.response\";\n\nexport class KeyConnectorService implements KeyConnectorServiceAbstraction {\n constructor(\n private stateService: StateService,\n private cryptoService: CryptoService,\n private apiService: ApiService,\n private tokenService: TokenService,\n private logService: LogService,\n private organizationService: OrganizationService,\n private keyGenerationService: KeyGenerationService,\n private logoutCallback: (expired: boolean, userId?: string) => Promise,\n ) {}\n\n setUsesKeyConnector(usesKeyConnector: boolean) {\n return this.stateService.setUsesKeyConnector(usesKeyConnector);\n }\n\n async getUsesKeyConnector(): Promise {\n return await this.stateService.getUsesKeyConnector();\n }\n\n async userNeedsMigration() {\n const loggedInUsingSso = await this.tokenService.getIsExternal();\n const requiredByOrganization = (await this.getManagingOrganization()) != null;\n const userIsNotUsingKeyConnector = !(await this.getUsesKeyConnector());\n\n return loggedInUsingSso && requiredByOrganization && userIsNotUsingKeyConnector;\n }\n\n async migrateUser() {\n const organization = await this.getManagingOrganization();\n const masterKey = await this.cryptoService.getMasterKey();\n const keyConnectorRequest = new KeyConnectorUserKeyRequest(masterKey.encKeyB64);\n\n try {\n await this.apiService.postUserKeyToKeyConnector(\n organization.keyConnectorUrl,\n keyConnectorRequest,\n );\n } catch (e) {\n this.handleKeyConnectorError(e);\n }\n\n await this.apiService.postConvertToKeyConnector();\n }\n\n // TODO: UserKey should be renamed to MasterKey and typed accordingly\n async setMasterKeyFromUrl(url: string) {\n try {\n const masterKeyResponse = await this.apiService.getMasterKeyFromKeyConnector(url);\n const keyArr = Utils.fromB64ToArray(masterKeyResponse.key);\n const masterKey = new SymmetricCryptoKey(keyArr) as MasterKey;\n await this.cryptoService.setMasterKey(masterKey);\n } catch (e) {\n this.handleKeyConnectorError(e);\n }\n }\n\n async getManagingOrganization() {\n const orgs = await this.organizationService.getAll();\n return orgs.find(\n (o) =>\n o.keyConnectorEnabled &&\n o.type !== OrganizationUserType.Admin &&\n o.type !== OrganizationUserType.Owner &&\n !o.isProviderUser,\n );\n }\n\n async convertNewSsoUserToKeyConnector(tokenResponse: IdentityTokenResponse, orgId: string) {\n // TODO: Remove after tokenResponse.keyConnectorUrl is deprecated in 2023.10 release (https://bitwarden.atlassian.net/browse/PM-3537)\n const {\n kdf,\n kdfIterations,\n kdfMemory,\n kdfParallelism,\n keyConnectorUrl: legacyKeyConnectorUrl,\n userDecryptionOptions,\n } = tokenResponse;\n const password = await this.keyGenerationService.createKey(512);\n const kdfConfig = new KdfConfig(kdfIterations, kdfMemory, kdfParallelism);\n\n const masterKey = await this.cryptoService.makeMasterKey(\n password.keyB64,\n await this.tokenService.getEmail(),\n kdf,\n kdfConfig,\n );\n const keyConnectorRequest = new KeyConnectorUserKeyRequest(masterKey.encKeyB64);\n await this.cryptoService.setMasterKey(masterKey);\n\n const userKey = await this.cryptoService.makeUserKey(masterKey);\n await this.cryptoService.setUserKey(userKey[0]);\n await this.cryptoService.setMasterKeyEncryptedUserKey(userKey[1].encryptedString);\n\n const [pubKey, privKey] = await this.cryptoService.makeKeyPair();\n\n try {\n const keyConnectorUrl =\n legacyKeyConnectorUrl ?? userDecryptionOptions?.keyConnectorOption?.keyConnectorUrl;\n await this.apiService.postUserKeyToKeyConnector(keyConnectorUrl, keyConnectorRequest);\n } catch (e) {\n this.handleKeyConnectorError(e);\n }\n\n const keys = new KeysRequest(pubKey, privKey.encryptedString);\n const setPasswordRequest = new SetKeyConnectorKeyRequest(\n userKey[1].encryptedString,\n kdf,\n kdfConfig,\n orgId,\n keys,\n );\n await this.apiService.postSetKeyConnectorKey(setPasswordRequest);\n }\n\n async setConvertAccountRequired(status: boolean) {\n await this.stateService.setConvertAccountToKeyConnector(status);\n }\n\n async getConvertAccountRequired(): Promise {\n return await this.stateService.getConvertAccountToKeyConnector();\n }\n\n async removeConvertAccountRequired() {\n await this.stateService.setConvertAccountToKeyConnector(null);\n }\n\n async clear() {\n await this.removeConvertAccountRequired();\n }\n\n private handleKeyConnectorError(e: any) {\n this.logService.error(e);\n if (this.logoutCallback != null) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.logoutCallback(false);\n }\n throw new Error(\"Key Connector error\");\n }\n}\n","import { firstValueFrom } from \"rxjs\";\n\nimport { UserDecryptionOptionsServiceAbstraction } from \"@bitwarden/auth/common\";\n\nimport { PinCryptoServiceAbstraction } from \"../../../../../auth/src/common/abstractions/pin-crypto.service.abstraction\";\nimport { VaultTimeoutSettingsService as VaultTimeoutSettingsServiceAbstraction } from \"../../../abstractions/vault-timeout/vault-timeout-settings.service\";\nimport { CryptoService } from \"../../../platform/abstractions/crypto.service\";\nimport { I18nService } from \"../../../platform/abstractions/i18n.service\";\nimport { LogService } from \"../../../platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"../../../platform/abstractions/platform-utils.service\";\nimport { StateService } from \"../../../platform/abstractions/state.service\";\nimport { KeySuffixOptions } from \"../../../platform/enums/key-suffix-options.enum\";\nimport { UserKey } from \"../../../types/key\";\nimport { UserVerificationApiServiceAbstraction } from \"../../abstractions/user-verification/user-verification-api.service.abstraction\";\nimport { UserVerificationService as UserVerificationServiceAbstraction } from \"../../abstractions/user-verification/user-verification.service.abstraction\";\nimport { VerificationType } from \"../../enums/verification-type\";\nimport { SecretVerificationRequest } from \"../../models/request/secret-verification.request\";\nimport { VerifyOTPRequest } from \"../../models/request/verify-otp.request\";\nimport { UserVerificationOptions } from \"../../types/user-verification-options\";\nimport {\n MasterPasswordVerification,\n OtpVerification,\n PinVerification,\n ServerSideVerification,\n Verification,\n VerificationWithSecret,\n verificationHasSecret,\n} from \"../../types/verification\";\n\n/**\n * Used for general-purpose user verification throughout the app.\n * Use it to verify the input collected by UserVerificationComponent.\n */\nexport class UserVerificationService implements UserVerificationServiceAbstraction {\n constructor(\n private stateService: StateService,\n private cryptoService: CryptoService,\n private i18nService: I18nService,\n private userVerificationApiService: UserVerificationApiServiceAbstraction,\n private userDecryptionOptionsService: UserDecryptionOptionsServiceAbstraction,\n private pinCryptoService: PinCryptoServiceAbstraction,\n private logService: LogService,\n private vaultTimeoutSettingsService: VaultTimeoutSettingsServiceAbstraction,\n private platformUtilsService: PlatformUtilsService,\n ) {}\n\n async getAvailableVerificationOptions(\n verificationType: keyof UserVerificationOptions,\n ): Promise {\n if (verificationType === \"client\") {\n const [userHasMasterPassword, pinLockType, biometricsLockSet, biometricsUserKeyStored] =\n await Promise.all([\n this.hasMasterPasswordAndMasterKeyHash(),\n this.vaultTimeoutSettingsService.isPinLockSet(),\n this.vaultTimeoutSettingsService.isBiometricLockSet(),\n this.cryptoService.hasUserKeyStored(KeySuffixOptions.Biometric),\n ]);\n\n // note: we do not need to check this.platformUtilsService.supportsBiometric() because\n // we can just use the logic below which works for both desktop & the browser extension.\n\n return {\n client: {\n masterPassword: userHasMasterPassword,\n pin: pinLockType !== \"DISABLED\",\n biometrics:\n biometricsLockSet &&\n (biometricsUserKeyStored || !this.platformUtilsService.supportsSecureStorage()),\n },\n server: {\n masterPassword: false,\n otp: false,\n },\n };\n } else {\n // server\n // Don't check if have MP hash locally, because we are going to send the secret to the server to be verified.\n const userHasMasterPassword = await this.hasMasterPassword();\n\n return {\n client: {\n masterPassword: false,\n pin: false,\n biometrics: false,\n },\n server: { masterPassword: userHasMasterPassword, otp: !userHasMasterPassword },\n };\n }\n }\n\n /**\n * Create a new request model to be used for server-side verification\n * @param verification User-supplied verification data (Master Password or OTP)\n * @param requestClass The request model to create\n * @param alreadyHashed Whether the master password is already hashed\n */\n async buildRequest(\n verification: ServerSideVerification,\n requestClass?: new () => T,\n alreadyHashed?: boolean,\n ) {\n this.validateSecretInput(verification);\n\n const request =\n requestClass != null ? new requestClass() : (new SecretVerificationRequest() as T);\n\n if (verification.type === VerificationType.OTP) {\n request.otp = verification.secret;\n } else {\n let masterKey = await this.cryptoService.getMasterKey();\n if (!masterKey && !alreadyHashed) {\n masterKey = await this.cryptoService.makeMasterKey(\n verification.secret,\n await this.stateService.getEmail(),\n await this.stateService.getKdfType(),\n await this.stateService.getKdfConfig(),\n );\n }\n request.masterPasswordHash = alreadyHashed\n ? verification.secret\n : await this.cryptoService.hashMasterKey(verification.secret, masterKey);\n }\n\n return request;\n }\n\n /**\n * Used to verify Master Password, PIN, or biometrics client-side, or send the OTP to the server for verification (with no other data)\n * Generally used for client-side verification only.\n * @param verification User-supplied verification data (OTP, MP, PIN, or biometrics)\n */\n async verifyUser(verification: Verification): Promise {\n if (verificationHasSecret(verification)) {\n this.validateSecretInput(verification);\n }\n\n switch (verification.type) {\n case VerificationType.OTP:\n return this.verifyUserByOTP(verification);\n case VerificationType.MasterPassword:\n return this.verifyUserByMasterPassword(verification);\n case VerificationType.PIN:\n return this.verifyUserByPIN(verification);\n case VerificationType.Biometrics:\n return this.verifyUserByBiometrics();\n default: {\n // Compile-time check for exhaustive switch\n const _exhaustiveCheck: never = verification;\n return _exhaustiveCheck;\n }\n }\n }\n\n private async verifyUserByOTP(verification: OtpVerification): Promise {\n const request = new VerifyOTPRequest(verification.secret);\n try {\n await this.userVerificationApiService.postAccountVerifyOTP(request);\n } catch (e) {\n throw new Error(this.i18nService.t(\"invalidVerificationCode\"));\n }\n return true;\n }\n\n private async verifyUserByMasterPassword(\n verification: MasterPasswordVerification,\n ): Promise {\n let masterKey = await this.cryptoService.getMasterKey();\n if (!masterKey) {\n masterKey = await this.cryptoService.makeMasterKey(\n verification.secret,\n await this.stateService.getEmail(),\n await this.stateService.getKdfType(),\n await this.stateService.getKdfConfig(),\n );\n }\n const passwordValid = await this.cryptoService.compareAndUpdateKeyHash(\n verification.secret,\n masterKey,\n );\n if (!passwordValid) {\n throw new Error(this.i18nService.t(\"invalidMasterPassword\"));\n }\n // TODO: we should re-evaluate later on if user verification should have the side effect of modifying state. Probably not.\n await this.cryptoService.setMasterKey(masterKey);\n return true;\n }\n\n private async verifyUserByPIN(verification: PinVerification): Promise {\n const userKey = await this.pinCryptoService.decryptUserKeyWithPin(verification.secret);\n\n return userKey != null;\n }\n\n private async verifyUserByBiometrics(): Promise {\n let userKey: UserKey;\n // Biometrics crashes and doesn't return a value if the user cancels the prompt\n try {\n userKey = await this.cryptoService.getUserKeyFromStorage(KeySuffixOptions.Biometric);\n } catch (e) {\n this.logService.error(`Biometrics User Verification failed: ${e.message}`);\n // So, any failures should be treated as a failed verification\n return false;\n }\n\n return userKey != null;\n }\n\n async requestOTP() {\n await this.userVerificationApiService.postAccountRequestOTP();\n }\n\n /**\n * Check if user has master password or can only use passwordless technologies to log in\n * Note: This only checks the server, not the local state\n * @param userId The user id to check. If not provided, the current user is used\n * @returns True if the user has a master password\n * @deprecated Use UserDecryptionOptionsService.hasMasterPassword$ instead\n */\n async hasMasterPassword(userId?: string): Promise {\n if (userId) {\n const decryptionOptions = await firstValueFrom(\n this.userDecryptionOptionsService.userDecryptionOptionsById$(userId),\n );\n\n if (decryptionOptions?.hasMasterPassword != undefined) {\n return decryptionOptions.hasMasterPassword;\n }\n }\n return await firstValueFrom(this.userDecryptionOptionsService.hasMasterPassword$);\n }\n\n async hasMasterPasswordAndMasterKeyHash(userId?: string): Promise {\n return (\n (await this.hasMasterPassword(userId)) &&\n (await this.cryptoService.getMasterKeyHash()) != null\n );\n }\n\n private validateSecretInput(verification: VerificationWithSecret) {\n if (verification?.secret == null || verification.secret === \"\") {\n switch (verification.type) {\n case VerificationType.OTP:\n throw new Error(this.i18nService.t(\"verificationCodeRequired\"));\n case VerificationType.MasterPassword:\n throw new Error(this.i18nService.t(\"masterPasswordRequired\"));\n case VerificationType.PIN:\n throw new Error(this.i18nService.t(\"pinRequired\"));\n }\n }\n }\n}\n","import { VerificationType } from \"../enums/verification-type\";\n\nexport type OtpVerification = { type: VerificationType.OTP; secret: string };\nexport type MasterPasswordVerification = { type: VerificationType.MasterPassword; secret: string };\nexport type PinVerification = { type: VerificationType.PIN; secret: string };\nexport type BiometricsVerification = { type: VerificationType.Biometrics };\n\nexport type VerificationWithSecret = OtpVerification | MasterPasswordVerification | PinVerification;\nexport type VerificationWithoutSecret = BiometricsVerification;\n\nexport type Verification = VerificationWithSecret | VerificationWithoutSecret;\n\nexport function verificationHasSecret(\n verification: Verification,\n): verification is VerificationWithSecret {\n return \"secret\" in verification;\n}\n\nexport type ServerSideVerification = OtpVerification | MasterPasswordVerification;\n","import { ApiService } from \"../../../abstractions/api.service\";\nimport { ListResponse } from \"../../../models/response/list.response\";\nimport { OrganizationUserService } from \"../../abstractions/organization-user/organization-user.service\";\nimport {\n OrganizationUserAcceptInitRequest,\n OrganizationUserAcceptRequest,\n OrganizationUserBulkConfirmRequest,\n OrganizationUserConfirmRequest,\n OrganizationUserInviteRequest,\n OrganizationUserResetPasswordEnrollmentRequest,\n OrganizationUserResetPasswordRequest,\n OrganizationUserUpdateRequest,\n} from \"../../abstractions/organization-user/requests\";\nimport {\n OrganizationUserBulkPublicKeyResponse,\n OrganizationUserBulkResponse,\n OrganizationUserDetailsResponse,\n OrganizationUserResetPasswordDetailsResponse,\n OrganizationUserUserDetailsResponse,\n} from \"../../abstractions/organization-user/responses\";\n\nimport { OrganizationUserBulkRequest } from \"./requests\";\n\nexport class OrganizationUserServiceImplementation implements OrganizationUserService {\n constructor(private apiService: ApiService) {}\n\n async getOrganizationUser(\n organizationId: string,\n id: string,\n options?: {\n includeGroups?: boolean;\n },\n ): Promise {\n const params = new URLSearchParams();\n\n if (options?.includeGroups) {\n params.set(\"includeGroups\", \"true\");\n }\n\n const r = await this.apiService.send(\n \"GET\",\n `/organizations/${organizationId}/users/${id}?${params.toString()}`,\n null,\n true,\n true,\n );\n return new OrganizationUserDetailsResponse(r);\n }\n\n async getOrganizationUserGroups(organizationId: string, id: string): Promise {\n const r = await this.apiService.send(\n \"GET\",\n \"/organizations/\" + organizationId + \"/users/\" + id + \"/groups\",\n null,\n true,\n true,\n );\n return r;\n }\n\n async getAllUsers(\n organizationId: string,\n options?: {\n includeCollections?: boolean;\n includeGroups?: boolean;\n },\n ): Promise> {\n const params = new URLSearchParams();\n\n if (options?.includeCollections) {\n params.set(\"includeCollections\", \"true\");\n }\n if (options?.includeGroups) {\n params.set(\"includeGroups\", \"true\");\n }\n\n const r = await this.apiService.send(\n \"GET\",\n `/organizations/${organizationId}/users?${params.toString()}`,\n null,\n true,\n true,\n );\n return new ListResponse(r, OrganizationUserUserDetailsResponse);\n }\n\n async getOrganizationUserResetPasswordDetails(\n organizationId: string,\n id: string,\n ): Promise {\n const r = await this.apiService.send(\n \"GET\",\n \"/organizations/\" + organizationId + \"/users/\" + id + \"/reset-password-details\",\n null,\n true,\n true,\n );\n return new OrganizationUserResetPasswordDetailsResponse(r);\n }\n\n postOrganizationUserInvite(\n organizationId: string,\n request: OrganizationUserInviteRequest,\n ): Promise {\n return this.apiService.send(\n \"POST\",\n \"/organizations/\" + organizationId + \"/users/invite\",\n request,\n true,\n false,\n );\n }\n\n postOrganizationUserReinvite(organizationId: string, id: string): Promise {\n return this.apiService.send(\n \"POST\",\n \"/organizations/\" + organizationId + \"/users/\" + id + \"/reinvite\",\n null,\n true,\n false,\n );\n }\n\n async postManyOrganizationUserReinvite(\n organizationId: string,\n ids: string[],\n ): Promise> {\n const r = await this.apiService.send(\n \"POST\",\n \"/organizations/\" + organizationId + \"/users/reinvite\",\n new OrganizationUserBulkRequest(ids),\n true,\n true,\n );\n return new ListResponse(r, OrganizationUserBulkResponse);\n }\n\n postOrganizationUserAcceptInit(\n organizationId: string,\n id: string,\n request: OrganizationUserAcceptInitRequest,\n ): Promise {\n return this.apiService.send(\n \"POST\",\n \"/organizations/\" + organizationId + \"/users/\" + id + \"/accept-init\",\n request,\n true,\n false,\n );\n }\n\n postOrganizationUserAccept(\n organizationId: string,\n id: string,\n request: OrganizationUserAcceptRequest,\n ): Promise {\n return this.apiService.send(\n \"POST\",\n \"/organizations/\" + organizationId + \"/users/\" + id + \"/accept\",\n request,\n true,\n false,\n );\n }\n\n postOrganizationUserConfirm(\n organizationId: string,\n id: string,\n request: OrganizationUserConfirmRequest,\n ): Promise {\n return this.apiService.send(\n \"POST\",\n \"/organizations/\" + organizationId + \"/users/\" + id + \"/confirm\",\n request,\n true,\n false,\n );\n }\n\n async postOrganizationUsersPublicKey(\n organizationId: string,\n ids: string[],\n ): Promise> {\n const r = await this.apiService.send(\n \"POST\",\n \"/organizations/\" + organizationId + \"/users/public-keys\",\n new OrganizationUserBulkRequest(ids),\n true,\n true,\n );\n return new ListResponse(r, OrganizationUserBulkPublicKeyResponse);\n }\n\n async postOrganizationUserBulkConfirm(\n organizationId: string,\n request: OrganizationUserBulkConfirmRequest,\n ): Promise> {\n const r = await this.apiService.send(\n \"POST\",\n \"/organizations/\" + organizationId + \"/users/confirm\",\n request,\n true,\n true,\n );\n return new ListResponse(r, OrganizationUserBulkResponse);\n }\n\n async putOrganizationUserBulkEnableSecretsManager(\n organizationId: string,\n ids: string[],\n ): Promise {\n await this.apiService.send(\n \"PUT\",\n \"/organizations/\" + organizationId + \"/users/enable-secrets-manager\",\n new OrganizationUserBulkRequest(ids),\n true,\n false,\n );\n }\n\n putOrganizationUser(\n organizationId: string,\n id: string,\n request: OrganizationUserUpdateRequest,\n ): Promise {\n return this.apiService.send(\n \"PUT\",\n \"/organizations/\" + organizationId + \"/users/\" + id,\n request,\n true,\n false,\n );\n }\n\n putOrganizationUserResetPasswordEnrollment(\n organizationId: string,\n userId: string,\n request: OrganizationUserResetPasswordEnrollmentRequest,\n ): Promise {\n return this.apiService.send(\n \"PUT\",\n \"/organizations/\" + organizationId + \"/users/\" + userId + \"/reset-password-enrollment\",\n request,\n true,\n false,\n );\n }\n\n putOrganizationUserResetPassword(\n organizationId: string,\n id: string,\n request: OrganizationUserResetPasswordRequest,\n ): Promise {\n return this.apiService.send(\n \"PUT\",\n \"/organizations/\" + organizationId + \"/users/\" + id + \"/reset-password\",\n request,\n true,\n false,\n );\n }\n\n deleteOrganizationUser(organizationId: string, id: string): Promise {\n return this.apiService.send(\n \"DELETE\",\n \"/organizations/\" + organizationId + \"/users/\" + id,\n null,\n true,\n false,\n );\n }\n\n async deleteManyOrganizationUsers(\n organizationId: string,\n ids: string[],\n ): Promise> {\n const r = await this.apiService.send(\n \"DELETE\",\n \"/organizations/\" + organizationId + \"/users\",\n new OrganizationUserBulkRequest(ids),\n true,\n true,\n );\n return new ListResponse(r, OrganizationUserBulkResponse);\n }\n\n revokeOrganizationUser(organizationId: string, id: string): Promise {\n return this.apiService.send(\n \"PUT\",\n \"/organizations/\" + organizationId + \"/users/\" + id + \"/revoke\",\n null,\n true,\n false,\n );\n }\n\n async revokeManyOrganizationUsers(\n organizationId: string,\n ids: string[],\n ): Promise> {\n const r = await this.apiService.send(\n \"PUT\",\n \"/organizations/\" + organizationId + \"/users/revoke\",\n new OrganizationUserBulkRequest(ids),\n true,\n true,\n );\n return new ListResponse(r, OrganizationUserBulkResponse);\n }\n\n restoreOrganizationUser(organizationId: string, id: string): Promise {\n return this.apiService.send(\n \"PUT\",\n \"/organizations/\" + organizationId + \"/users/\" + id + \"/restore\",\n null,\n true,\n false,\n );\n }\n\n async restoreManyOrganizationUsers(\n organizationId: string,\n ids: string[],\n ): Promise> {\n const r = await this.apiService.send(\n \"PUT\",\n \"/organizations/\" + organizationId + \"/users/restore\",\n new OrganizationUserBulkRequest(ids),\n true,\n true,\n );\n return new ListResponse(r, OrganizationUserBulkResponse);\n }\n}\n","import { firstValueFrom, map } from \"rxjs\";\n\nimport { OrganizationApiServiceAbstraction } from \"../../admin-console/abstractions/organization/organization-api.service.abstraction\";\nimport { OrganizationUserService } from \"../../admin-console/abstractions/organization-user/organization-user.service\";\nimport { OrganizationUserResetPasswordEnrollmentRequest } from \"../../admin-console/abstractions/organization-user/requests\";\nimport { CryptoService } from \"../../platform/abstractions/crypto.service\";\nimport { I18nService } from \"../../platform/abstractions/i18n.service\";\nimport { Utils } from \"../../platform/misc/utils\";\nimport { UserKey } from \"../../types/key\";\nimport { AccountService } from \"../abstractions/account.service\";\nimport { PasswordResetEnrollmentServiceAbstraction } from \"../abstractions/password-reset-enrollment.service.abstraction\";\n\nexport class PasswordResetEnrollmentServiceImplementation\n implements PasswordResetEnrollmentServiceAbstraction\n{\n constructor(\n protected organizationApiService: OrganizationApiServiceAbstraction,\n protected accountService: AccountService,\n protected cryptoService: CryptoService,\n protected organizationUserService: OrganizationUserService,\n protected i18nService: I18nService,\n ) {}\n\n async enrollIfRequired(organizationSsoIdentifier: string): Promise {\n const orgAutoEnrollStatusResponse =\n await this.organizationApiService.getAutoEnrollStatus(organizationSsoIdentifier);\n\n if (!orgAutoEnrollStatusResponse.resetPasswordEnabled) {\n await this.enroll(orgAutoEnrollStatusResponse.id, null, null);\n }\n }\n\n async enroll(organizationId: string): Promise;\n async enroll(organizationId: string, userId: string, userKey: UserKey): Promise;\n async enroll(organizationId: string, userId?: string, userKey?: UserKey): Promise {\n const orgKeyResponse = await this.organizationApiService.getKeys(organizationId);\n if (orgKeyResponse == null) {\n throw new Error(this.i18nService.t(\"resetPasswordOrgKeysError\"));\n }\n\n const orgPublicKey = Utils.fromB64ToArray(orgKeyResponse.publicKey);\n\n userId =\n userId ?? (await firstValueFrom(this.accountService.activeAccount$.pipe(map((a) => a?.id))));\n userKey = userKey ?? (await this.cryptoService.getUserKey(userId));\n // RSA Encrypt user's userKey.key with organization public key\n const encryptedKey = await this.cryptoService.rsaEncrypt(userKey.key, orgPublicKey);\n\n const resetRequest = new OrganizationUserResetPasswordEnrollmentRequest();\n resetRequest.resetPasswordKey = encryptedKey.encryptedString;\n\n await this.organizationUserService.putOrganizationUserResetPasswordEnrollment(\n organizationId,\n userId,\n resetRequest,\n );\n }\n}\n","import { UntypedFormGroup, ValidationErrors } from \"@angular/forms\";\n\nimport {\n FormGroupControls,\n FormValidationErrorsService as FormValidationErrorsAbstraction,\n AllValidationErrors,\n} from \"../abstractions/form-validation-errors.service\";\n\nexport class FormValidationErrorsService implements FormValidationErrorsAbstraction {\n getFormValidationErrors(controls: FormGroupControls): AllValidationErrors[] {\n let errors: AllValidationErrors[] = [];\n Object.keys(controls).forEach((key) => {\n const control = controls[key];\n if (control instanceof UntypedFormGroup) {\n errors = errors.concat(this.getFormValidationErrors(control.controls));\n }\n\n const controlErrors: ValidationErrors = controls[key].errors;\n if (controlErrors !== null) {\n Object.keys(controlErrors).forEach((keyError) => {\n errors.push({\n controlName: key,\n errorName: keyError,\n });\n });\n }\n });\n\n return errors;\n }\n}\n","import { ApiService } from \"../../../abstractions/api.service\";\nimport { UserVerificationApiServiceAbstraction } from \"../../abstractions/user-verification/user-verification-api.service.abstraction\";\nimport { VerifyOTPRequest } from \"../../models/request/verify-otp.request\";\n\nexport class UserVerificationApiService implements UserVerificationApiServiceAbstraction {\n constructor(private apiService: ApiService) {}\n\n postAccountVerifyOTP(request: VerifyOTPRequest): Promise {\n return this.apiService.send(\"POST\", \"/accounts/verify-otp\", request, true, false);\n }\n async postAccountRequestOTP(): Promise {\n return this.apiService.send(\"POST\", \"/accounts/request-otp\", null, true, false);\n }\n}\n","import { ApiService } from \"../../../abstractions/api.service\";\nimport { OrganizationApiKeyRequest } from \"../../../admin-console/models/request/organization-api-key.request\";\nimport { OrganizationSsoRequest } from \"../../../auth/models/request/organization-sso.request\";\nimport { SecretVerificationRequest } from \"../../../auth/models/request/secret-verification.request\";\nimport { ApiKeyResponse } from \"../../../auth/models/response/api-key.response\";\nimport { OrganizationSsoResponse } from \"../../../auth/models/response/organization-sso.response\";\nimport { OrganizationSmSubscriptionUpdateRequest } from \"../../../billing/models/request/organization-sm-subscription-update.request\";\nimport { OrganizationSubscriptionUpdateRequest } from \"../../../billing/models/request/organization-subscription-update.request\";\nimport { OrganizationTaxInfoUpdateRequest } from \"../../../billing/models/request/organization-tax-info-update.request\";\nimport { PaymentRequest } from \"../../../billing/models/request/payment.request\";\nimport { SecretsManagerSubscribeRequest } from \"../../../billing/models/request/sm-subscribe.request\";\nimport { BillingResponse } from \"../../../billing/models/response/billing.response\";\nimport { OrganizationSubscriptionResponse } from \"../../../billing/models/response/organization-subscription.response\";\nimport { PaymentResponse } from \"../../../billing/models/response/payment.response\";\nimport { TaxInfoResponse } from \"../../../billing/models/response/tax-info.response\";\nimport { ImportDirectoryRequest } from \"../../../models/request/import-directory.request\";\nimport { SeatRequest } from \"../../../models/request/seat.request\";\nimport { StorageRequest } from \"../../../models/request/storage.request\";\nimport { VerifyBankRequest } from \"../../../models/request/verify-bank.request\";\nimport { ListResponse } from \"../../../models/response/list.response\";\nimport { SyncService } from \"../../../vault/abstractions/sync/sync.service.abstraction\";\nimport { OrganizationApiServiceAbstraction } from \"../../abstractions/organization/organization-api.service.abstraction\";\nimport { OrganizationApiKeyType } from \"../../enums\";\nimport { OrganizationCollectionManagementUpdateRequest } from \"../../models/request/organization-collection-management-update.request\";\nimport { OrganizationCreateRequest } from \"../../models/request/organization-create.request\";\nimport { OrganizationKeysRequest } from \"../../models/request/organization-keys.request\";\nimport { OrganizationUpdateRequest } from \"../../models/request/organization-update.request\";\nimport { OrganizationUpgradeRequest } from \"../../models/request/organization-upgrade.request\";\nimport { OrganizationApiKeyInformationResponse } from \"../../models/response/organization-api-key-information.response\";\nimport { OrganizationAutoEnrollStatusResponse } from \"../../models/response/organization-auto-enroll-status.response\";\nimport { OrganizationKeysResponse } from \"../../models/response/organization-keys.response\";\nimport { OrganizationResponse } from \"../../models/response/organization.response\";\nimport { ProfileOrganizationResponse } from \"../../models/response/profile-organization.response\";\n\nexport class OrganizationApiService implements OrganizationApiServiceAbstraction {\n constructor(\n private apiService: ApiService,\n private syncService: SyncService,\n ) {}\n\n async get(id: string): Promise {\n const r = await this.apiService.send(\"GET\", \"/organizations/\" + id, null, true, true);\n return new OrganizationResponse(r);\n }\n\n async getBilling(id: string): Promise {\n const r = await this.apiService.send(\n \"GET\",\n \"/organizations/\" + id + \"/billing\",\n null,\n true,\n true,\n );\n return new BillingResponse(r);\n }\n\n async getSubscription(id: string): Promise {\n const r = await this.apiService.send(\n \"GET\",\n \"/organizations/\" + id + \"/subscription\",\n null,\n true,\n true,\n );\n return new OrganizationSubscriptionResponse(r);\n }\n\n async getLicense(id: string, installationId: string): Promise {\n return this.apiService.send(\n \"GET\",\n \"/organizations/\" + id + \"/license?installationId=\" + installationId,\n null,\n true,\n true,\n );\n }\n\n async getAutoEnrollStatus(identifier: string): Promise {\n const r = await this.apiService.send(\n \"GET\",\n \"/organizations/\" + identifier + \"/auto-enroll-status\",\n null,\n true,\n true,\n );\n return new OrganizationAutoEnrollStatusResponse(r);\n }\n\n async create(request: OrganizationCreateRequest): Promise {\n const r = await this.apiService.send(\"POST\", \"/organizations\", request, true, true);\n // Forcing a sync will notify organization service that they need to repull\n await this.syncService.fullSync(true);\n return new OrganizationResponse(r);\n }\n\n async createLicense(data: FormData): Promise {\n const r = await this.apiService.send(\n \"POST\",\n \"/organizations/licenses/self-hosted\",\n data,\n true,\n true,\n );\n return new OrganizationResponse(r);\n }\n\n async save(id: string, request: OrganizationUpdateRequest): Promise {\n const r = await this.apiService.send(\"PUT\", \"/organizations/\" + id, request, true, true);\n const data = new OrganizationResponse(r);\n await this.syncService.fullSync(true);\n return data;\n }\n\n async updatePayment(id: string, request: PaymentRequest): Promise {\n return this.apiService.send(\"POST\", \"/organizations/\" + id + \"/payment\", request, true, false);\n }\n\n async upgrade(id: string, request: OrganizationUpgradeRequest): Promise {\n const r = await this.apiService.send(\n \"POST\",\n \"/organizations/\" + id + \"/upgrade\",\n request,\n true,\n true,\n );\n return new PaymentResponse(r);\n }\n\n async updatePasswordManagerSeats(\n id: string,\n request: OrganizationSubscriptionUpdateRequest,\n ): Promise {\n return this.apiService.send(\n \"POST\",\n \"/organizations/\" + id + \"/subscription\",\n request,\n true,\n false,\n );\n }\n\n async updateSecretsManagerSubscription(\n id: string,\n request: OrganizationSmSubscriptionUpdateRequest,\n ): Promise {\n return this.apiService.send(\n \"POST\",\n \"/organizations/\" + id + \"/sm-subscription\",\n request,\n true,\n false,\n );\n }\n\n async updateSeats(id: string, request: SeatRequest): Promise {\n const r = await this.apiService.send(\n \"POST\",\n \"/organizations/\" + id + \"/seat\",\n request,\n true,\n true,\n );\n return new PaymentResponse(r);\n }\n\n async updateStorage(id: string, request: StorageRequest): Promise {\n const r = await this.apiService.send(\n \"POST\",\n \"/organizations/\" + id + \"/storage\",\n request,\n true,\n true,\n );\n return new PaymentResponse(r);\n }\n\n async verifyBank(id: string, request: VerifyBankRequest): Promise {\n await this.apiService.send(\n \"POST\",\n \"/organizations/\" + id + \"/verify-bank\",\n request,\n true,\n false,\n );\n }\n\n async reinstate(id: string): Promise {\n return this.apiService.send(\"POST\", \"/organizations/\" + id + \"/reinstate\", null, true, false);\n }\n\n async leave(id: string): Promise {\n await this.apiService.send(\"POST\", \"/organizations/\" + id + \"/leave\", null, true, false);\n await this.syncService.fullSync(true);\n }\n\n async delete(id: string, request: SecretVerificationRequest): Promise {\n await this.apiService.send(\"DELETE\", \"/organizations/\" + id, request, true, false);\n await this.syncService.fullSync(true);\n }\n\n async updateLicense(id: string, data: FormData): Promise {\n await this.apiService.send(\n \"POST\",\n \"/organizations/licenses/self-hosted/\" + id,\n data,\n true,\n false,\n );\n }\n\n async importDirectory(organizationId: string, request: ImportDirectoryRequest): Promise {\n return this.apiService.send(\n \"POST\",\n \"/organizations/\" + organizationId + \"/import\",\n request,\n true,\n false,\n );\n }\n\n async getOrCreateApiKey(id: string, request: OrganizationApiKeyRequest): Promise {\n const r = await this.apiService.send(\n \"POST\",\n \"/organizations/\" + id + \"/api-key\",\n request,\n true,\n true,\n );\n return new ApiKeyResponse(r);\n }\n\n async getApiKeyInformation(\n id: string,\n organizationApiKeyType: OrganizationApiKeyType = null,\n ): Promise> {\n const uri =\n organizationApiKeyType === null\n ? \"/organizations/\" + id + \"/api-key-information\"\n : \"/organizations/\" + id + \"/api-key-information/\" + organizationApiKeyType;\n const r = await this.apiService.send(\"GET\", uri, null, true, true);\n return new ListResponse(r, OrganizationApiKeyInformationResponse);\n }\n\n async rotateApiKey(id: string, request: OrganizationApiKeyRequest): Promise {\n const r = await this.apiService.send(\n \"POST\",\n \"/organizations/\" + id + \"/rotate-api-key\",\n request,\n true,\n true,\n );\n return new ApiKeyResponse(r);\n }\n\n async getTaxInfo(id: string): Promise {\n const r = await this.apiService.send(\"GET\", \"/organizations/\" + id + \"/tax\", null, true, true);\n return new TaxInfoResponse(r);\n }\n\n async updateTaxInfo(id: string, request: OrganizationTaxInfoUpdateRequest): Promise {\n // Can't broadcast anything because the response doesn't have content\n return this.apiService.send(\"PUT\", \"/organizations/\" + id + \"/tax\", request, true, false);\n }\n\n async getKeys(id: string): Promise {\n const r = await this.apiService.send(\"GET\", \"/organizations/\" + id + \"/keys\", null, true, true);\n return new OrganizationKeysResponse(r);\n }\n\n async updateKeys(\n id: string,\n request: OrganizationKeysRequest,\n ): Promise {\n const r = await this.apiService.send(\n \"POST\",\n \"/organizations/\" + id + \"/keys\",\n request,\n true,\n true,\n );\n // Not broadcasting anything because data on this response doesn't correspond to `Organization`\n return new OrganizationKeysResponse(r);\n }\n\n async getSso(id: string): Promise {\n const r = await this.apiService.send(\"GET\", \"/organizations/\" + id + \"/sso\", null, true, true);\n return new OrganizationSsoResponse(r);\n }\n\n async updateSso(id: string, request: OrganizationSsoRequest): Promise {\n const r = await this.apiService.send(\n \"POST\",\n \"/organizations/\" + id + \"/sso\",\n request,\n true,\n true,\n );\n // Not broadcasting anything because data on this response doesn't correspond to `Organization`\n return new OrganizationSsoResponse(r);\n }\n\n async selfHostedSyncLicense(id: string) {\n await this.apiService.send(\n \"POST\",\n \"/organizations/licenses/self-hosted/\" + id + \"/sync/\",\n null,\n true,\n false,\n );\n }\n\n async subscribeToSecretsManager(\n id: string,\n request: SecretsManagerSubscribeRequest,\n ): Promise {\n const r = await this.apiService.send(\n \"POST\",\n \"/organizations/\" + id + \"/subscribe-secrets-manager\",\n request,\n true,\n true,\n );\n return new ProfileOrganizationResponse(r);\n }\n\n async updateCollectionManagement(\n id: string,\n request: OrganizationCollectionManagementUpdateRequest,\n ): Promise {\n const r = await this.apiService.send(\n \"PUT\",\n \"/organizations/\" + id + \"/collection-management\",\n request,\n true,\n true,\n );\n const data = new OrganizationResponse(r);\n await this.syncService.fullSync(true);\n return data;\n }\n\n async enableCollectionEnhancements(id: string): Promise {\n await this.apiService.send(\n \"POST\",\n \"/organizations/\" + id + \"/enable-collection-enhancements\",\n null,\n true,\n false,\n );\n await this.syncService.fullSync(true);\n }\n}\n","import { Observable } from \"rxjs\";\n\nimport { SyncEventArgs } from \"../../types/sync-event-args\";\n\nexport abstract class SyncNotifierService {\n sync$: Observable;\n next: (event: SyncEventArgs) => void;\n}\n","import { Subject } from \"rxjs\";\n\nimport { SyncNotifierService as SyncNotifierServiceAbstraction } from \"../../abstractions/sync/sync-notifier.service.abstraction\";\nimport { SyncEventArgs } from \"../../types/sync-event-args\";\n\n/**\n * This class should most likely have 0 dependencies because it will hopefully\n * be rolled into SyncService once upon a time.\n */\nexport class SyncNotifierService implements SyncNotifierServiceAbstraction {\n private _sync = new Subject();\n\n sync$ = this._sync.asObservable();\n\n next(event: SyncEventArgs): void {\n this._sync.next(event);\n }\n}\n","import { ApiService } from \"../../../abstractions/api.service\";\nimport { AuthService } from \"../../../auth/abstractions/auth.service\";\nimport { AuthenticationStatus } from \"../../../auth/enums/authentication-status\";\nimport { ConfigApiServiceAbstraction } from \"../../abstractions/config/config-api.service.abstraction\";\nimport { ServerConfigResponse } from \"../../models/response/server-config.response\";\n\nexport class ConfigApiService implements ConfigApiServiceAbstraction {\n constructor(\n private apiService: ApiService,\n private authService: AuthService,\n ) {}\n\n async get(): Promise {\n const authed: boolean =\n (await this.authService.getAuthStatus()) !== AuthenticationStatus.LoggedOut;\n\n const r = await this.apiService.send(\"GET\", \"/config\", null, authed, true);\n return new ServerConfigResponse(r);\n }\n}\n","import {\n HttpTransportType,\n HubConnection,\n HubConnectionBuilder,\n IHubProtocol,\n} from \"@microsoft/signalr\";\nimport { MessagePackHubProtocol } from \"@microsoft/signalr-protocol-msgpack\";\nimport { firstValueFrom } from \"rxjs\";\n\nimport { LoginStrategyServiceAbstraction } from \"../../../../auth/src/common/abstractions/login-strategy.service\";\nimport {\n AuthRequestPushNotification,\n NotificationResponse,\n} from \"../../models/response/notification.response\";\nimport { EnvironmentService } from \"../../platform/abstractions/environment.service\";\nimport { LogService } from \"../../platform/abstractions/log.service\";\nimport { AnonymousHubService as AnonymousHubServiceAbstraction } from \"../abstractions/anonymous-hub.service\";\n\nexport class AnonymousHubService implements AnonymousHubServiceAbstraction {\n private anonHubConnection: HubConnection;\n private url: string;\n\n constructor(\n private environmentService: EnvironmentService,\n private loginStrategyService: LoginStrategyServiceAbstraction,\n private logService: LogService,\n ) {}\n\n async createHubConnection(token: string) {\n this.url = (await firstValueFrom(this.environmentService.environment$)).getNotificationsUrl();\n\n this.anonHubConnection = new HubConnectionBuilder()\n .withUrl(this.url + \"/anonymous-hub?Token=\" + token, {\n skipNegotiation: true,\n transport: HttpTransportType.WebSockets,\n })\n .withHubProtocol(new MessagePackHubProtocol() as IHubProtocol)\n .build();\n\n this.anonHubConnection.start().catch((error) => this.logService.error(error));\n\n this.anonHubConnection.on(\"AuthRequestResponseRecieved\", (data: any) => {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.ProcessNotification(new NotificationResponse(data));\n });\n }\n\n stopHubConnection() {\n if (this.anonHubConnection) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.anonHubConnection.stop();\n }\n }\n\n private async ProcessNotification(notification: NotificationResponse) {\n await this.loginStrategyService.sendAuthRequestPushNotification(\n notification.payload as AuthRequestPushNotification,\n );\n }\n}\n","import { ErrorResponse } from \"../../models/response/error.response\";\nimport { I18nService } from \"../abstractions/i18n.service\";\nimport { PlatformUtilsService } from \"../abstractions/platform-utils.service\";\nimport { ValidationService as ValidationServiceAbstraction } from \"../abstractions/validation.service\";\n\nexport class ValidationService implements ValidationServiceAbstraction {\n constructor(\n private i18nService: I18nService,\n private platformUtilsService: PlatformUtilsService,\n ) {}\n\n showError(data: any): string[] {\n const defaultErrorMessage = this.i18nService.t(\"unexpectedError\");\n let errors: string[] = [];\n\n if (data != null && typeof data === \"string\") {\n errors.push(data);\n } else if (data == null || typeof data !== \"object\") {\n errors.push(defaultErrorMessage);\n } else if (data.validationErrors != null) {\n errors = errors.concat((data as ErrorResponse).getAllMessages());\n } else {\n errors.push(data.message ? data.message : defaultErrorMessage);\n }\n\n if (errors.length === 1) {\n this.platformUtilsService.showToast(\"error\", this.i18nService.t(\"errorOccurred\"), errors[0]);\n } else if (errors.length > 1) {\n this.platformUtilsService.showToast(\"error\", this.i18nService.t(\"errorOccurred\"), errors, {\n timeout: 5000 * errors.length,\n });\n }\n\n return errors;\n }\n}\n","import { BehaviorSubject } from \"rxjs\";\n\nimport { I18nService } from \"../../../platform/abstractions/i18n.service\";\nimport { PlatformUtilsService } from \"../../../platform/abstractions/platform-utils.service\";\nimport { OrgDomainInternalServiceAbstraction } from \"../../abstractions/organization-domain/org-domain.service.abstraction\";\nimport { OrganizationDomainResponse } from \"../../abstractions/organization-domain/responses/organization-domain.response\";\n\nexport class OrgDomainService implements OrgDomainInternalServiceAbstraction {\n protected _orgDomains$: BehaviorSubject = new BehaviorSubject([]);\n\n orgDomains$ = this._orgDomains$.asObservable();\n\n constructor(\n private platformUtilsService: PlatformUtilsService,\n private i18nService: I18nService,\n ) {}\n\n get(orgDomainId: string): OrganizationDomainResponse {\n const orgDomains: OrganizationDomainResponse[] = this._orgDomains$.getValue();\n\n return orgDomains.find((orgDomain) => orgDomain.id === orgDomainId);\n }\n\n copyDnsTxt(dnsTxt: string): void {\n this.platformUtilsService.copyToClipboard(dnsTxt);\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"valueCopied\", this.i18nService.t(\"dnsTxtRecord\")),\n );\n }\n\n upsert(orgDomains: OrganizationDomainResponse[]): void {\n const existingOrgDomains: OrganizationDomainResponse[] = this._orgDomains$.getValue();\n\n orgDomains.forEach((orgDomain: OrganizationDomainResponse) => {\n // Determine if passed in orgDomain exists in existing array:\n const index = existingOrgDomains.findIndex(\n (existingOrgDomain) => existingOrgDomain.id === orgDomain.id,\n );\n if (index !== -1) {\n existingOrgDomains[index] = orgDomain;\n } else {\n existingOrgDomains.push(orgDomain);\n }\n });\n\n this._orgDomains$.next(existingOrgDomains);\n }\n\n replace(orgDomains: OrganizationDomainResponse[]): void {\n this._orgDomains$.next(orgDomains);\n }\n\n clearCache(): void {\n this._orgDomains$.next([]);\n }\n\n delete(orgDomainIds: string[]): void {\n const existingOrgDomains: OrganizationDomainResponse[] = this._orgDomains$.getValue();\n\n orgDomainIds.forEach((orgDomainId: string) => {\n const index = existingOrgDomains.findIndex(\n (existingOrgDomain) => existingOrgDomain.id === orgDomainId,\n );\n if (index !== -1) {\n existingOrgDomains.splice(index, 1);\n }\n });\n\n this._orgDomains$.next(existingOrgDomains);\n }\n}\n","import { ApiService } from \"../../../abstractions/api.service\";\nimport { ListResponse } from \"../../../models/response/list.response\";\nimport { OrgDomainApiServiceAbstraction } from \"../../abstractions/organization-domain/org-domain-api.service.abstraction\";\nimport { OrgDomainInternalServiceAbstraction } from \"../../abstractions/organization-domain/org-domain.service.abstraction\";\nimport { OrganizationDomainSsoDetailsResponse } from \"../../abstractions/organization-domain/responses/organization-domain-sso-details.response\";\nimport { OrganizationDomainResponse } from \"../../abstractions/organization-domain/responses/organization-domain.response\";\n\nimport { OrganizationDomainSsoDetailsRequest } from \"./requests/organization-domain-sso-details.request\";\nimport { OrganizationDomainRequest } from \"./requests/organization-domain.request\";\n\nexport class OrgDomainApiService implements OrgDomainApiServiceAbstraction {\n constructor(\n private orgDomainService: OrgDomainInternalServiceAbstraction,\n private apiService: ApiService,\n ) {}\n\n async getAllByOrgId(orgId: string): Promise> {\n const listResponse: ListResponse = await this.apiService.send(\n \"GET\",\n `/organizations/${orgId}/domain`,\n null,\n true,\n true,\n );\n\n const orgDomains = listResponse.data.map(\n (resultOrgDomain: any) => new OrganizationDomainResponse(resultOrgDomain),\n );\n\n this.orgDomainService.replace(orgDomains);\n\n return orgDomains;\n }\n\n async getByOrgIdAndOrgDomainId(\n orgId: string,\n orgDomainId: string,\n ): Promise {\n const result = await this.apiService.send(\n \"GET\",\n `/organizations/${orgId}/domain/${orgDomainId}`,\n null,\n true,\n true,\n );\n\n const response = new OrganizationDomainResponse(result);\n\n this.orgDomainService.upsert([response]);\n\n return response;\n }\n\n async post(\n orgId: string,\n orgDomainReq: OrganizationDomainRequest,\n ): Promise {\n const result = await this.apiService.send(\n \"POST\",\n `/organizations/${orgId}/domain`,\n orgDomainReq,\n true,\n true,\n );\n\n const response = new OrganizationDomainResponse(result);\n\n this.orgDomainService.upsert([response]);\n\n return response;\n }\n\n async verify(orgId: string, orgDomainId: string): Promise {\n const result = await this.apiService.send(\n \"POST\",\n `/organizations/${orgId}/domain/${orgDomainId}/verify`,\n null,\n true,\n true,\n );\n\n const response = new OrganizationDomainResponse(result);\n\n this.orgDomainService.upsert([response]);\n\n return response;\n }\n\n async delete(orgId: string, orgDomainId: string): Promise {\n await this.apiService.send(\n \"DELETE\",\n `/organizations/${orgId}/domain/${orgDomainId}`,\n null,\n true,\n false,\n );\n this.orgDomainService.delete([orgDomainId]);\n }\n\n async getClaimedOrgDomainByEmail(email: string): Promise {\n const result = await this.apiService.send(\n \"POST\",\n `/organizations/domain/sso/details`,\n new OrganizationDomainSsoDetailsRequest(email),\n false, // anonymous\n true,\n );\n const response = new OrganizationDomainSsoDetailsResponse(result);\n\n return response;\n }\n}\n","import { ApiService } from \"../../abstractions/api.service\";\nimport { ListResponse } from \"../../models/response/list.response\";\nimport { Utils } from \"../../platform/misc/utils\";\nimport { DeviceResponse } from \"../abstractions/devices/responses/device.response\";\nimport { DevicesApiServiceAbstraction } from \"../abstractions/devices-api.service.abstraction\";\nimport { SecretVerificationRequest } from \"../models/request/secret-verification.request\";\nimport { UpdateDevicesTrustRequest } from \"../models/request/update-devices-trust.request\";\nimport { ProtectedDeviceResponse } from \"../models/response/protected-device.response\";\n\nimport { TrustedDeviceKeysRequest } from \"./devices/requests/trusted-device-keys.request\";\n\nexport class DevicesApiServiceImplementation implements DevicesApiServiceAbstraction {\n constructor(private apiService: ApiService) {}\n\n async getKnownDevice(email: string, deviceIdentifier: string): Promise {\n const r = await this.apiService.send(\n \"GET\",\n \"/devices/knowndevice\",\n null,\n false,\n true,\n null,\n (headers) => {\n headers.set(\"X-Device-Identifier\", deviceIdentifier);\n headers.set(\"X-Request-Email\", Utils.fromUtf8ToUrlB64(email));\n },\n );\n return r as boolean;\n }\n\n /**\n * Get device by identifier\n * @param deviceIdentifier - client generated id (not device id in DB)\n */\n async getDeviceByIdentifier(deviceIdentifier: string): Promise {\n const r = await this.apiService.send(\n \"GET\",\n `/devices/identifier/${deviceIdentifier}`,\n null,\n true,\n true,\n );\n return new DeviceResponse(r);\n }\n\n async getDevices(): Promise> {\n const r = await this.apiService.send(\"GET\", \"/devices\", null, true, true, null);\n return new ListResponse(r, DeviceResponse);\n }\n\n async updateTrustedDeviceKeys(\n deviceIdentifier: string,\n devicePublicKeyEncryptedUserKey: string,\n userKeyEncryptedDevicePublicKey: string,\n deviceKeyEncryptedDevicePrivateKey: string,\n ): Promise {\n const request = new TrustedDeviceKeysRequest(\n devicePublicKeyEncryptedUserKey,\n userKeyEncryptedDevicePublicKey,\n deviceKeyEncryptedDevicePrivateKey,\n );\n\n const result = await this.apiService.send(\n \"PUT\",\n `/devices/${deviceIdentifier}/keys`,\n request,\n true,\n true,\n );\n\n return new DeviceResponse(result);\n }\n\n async updateTrust(\n updateDevicesTrustRequestModel: UpdateDevicesTrustRequest,\n deviceIdentifier: string,\n ): Promise {\n await this.apiService.send(\n \"POST\",\n \"/devices/update-trust\",\n updateDevicesTrustRequestModel,\n true,\n false,\n null,\n (headers) => {\n headers.set(\"Device-Identifier\", deviceIdentifier);\n },\n );\n }\n\n async getDeviceKeys(\n deviceIdentifier: string,\n secretVerificationRequest: SecretVerificationRequest,\n ): Promise {\n const result = await this.apiService.send(\n \"POST\",\n `/devices/${deviceIdentifier}/retrieve-keys`,\n secretVerificationRequest,\n true,\n true,\n );\n return new ProtectedDeviceResponse(result);\n }\n}\n","import { Observable, defer, map } from \"rxjs\";\n\nimport { ListResponse } from \"../../../models/response/list.response\";\nimport { DevicesServiceAbstraction } from \"../../abstractions/devices/devices.service.abstraction\";\nimport { DeviceResponse } from \"../../abstractions/devices/responses/device.response\";\nimport { DeviceView } from \"../../abstractions/devices/views/device.view\";\nimport { DevicesApiServiceAbstraction } from \"../../abstractions/devices-api.service.abstraction\";\n\n/**\n * @class DevicesServiceImplementation\n * @implements {DevicesServiceAbstraction}\n * @description Observable based data store service for Devices.\n * note: defer is used to convert the promises to observables and to ensure\n * that observables are created for each subscription\n * (i.e., promsise --> observables are cold until subscribed to)\n */\nexport class DevicesServiceImplementation implements DevicesServiceAbstraction {\n constructor(private devicesApiService: DevicesApiServiceAbstraction) {}\n\n /**\n * @description Gets the list of all devices.\n */\n getDevices$(): Observable> {\n return defer(() => this.devicesApiService.getDevices()).pipe(\n map((deviceResponses: ListResponse) => {\n return deviceResponses.data.map((deviceResponse: DeviceResponse) => {\n return new DeviceView(deviceResponse);\n });\n }),\n );\n }\n\n /**\n * @description Gets the device with the specified identifier.\n */\n getDeviceByIdentifier$(deviceIdentifier: string): Observable {\n return defer(() => this.devicesApiService.getDeviceByIdentifier(deviceIdentifier)).pipe(\n map((deviceResponse: DeviceResponse) => new DeviceView(deviceResponse)),\n );\n }\n\n /**\n * @description Checks if a device is known for a user by user's email and device's identifier.\n */\n isDeviceKnownForUser$(email: string, deviceIdentifier: string): Observable {\n return defer(() => this.devicesApiService.getKnownDevice(email, deviceIdentifier));\n }\n\n /**\n * @description Updates the keys for the specified device.\n */\n\n updateTrustedDeviceKeys$(\n deviceIdentifier: string,\n devicePublicKeyEncryptedUserKey: string,\n userKeyEncryptedDevicePublicKey: string,\n deviceKeyEncryptedDevicePrivateKey: string,\n ): Observable {\n return defer(() =>\n this.devicesApiService.updateTrustedDeviceKeys(\n deviceIdentifier,\n devicePublicKeyEncryptedUserKey,\n userKeyEncryptedDevicePublicKey,\n deviceKeyEncryptedDevicePrivateKey,\n ),\n ).pipe(map((deviceResponse: DeviceResponse) => new DeviceView(deviceResponse)));\n }\n}\n","import { firstValueFrom, map, Observable } from \"rxjs\";\n\nimport { UserDecryptionOptionsServiceAbstraction } from \"@bitwarden/auth/common\";\n\nimport { AppIdService } from \"../../platform/abstractions/app-id.service\";\nimport { CryptoFunctionService } from \"../../platform/abstractions/crypto-function.service\";\nimport { CryptoService } from \"../../platform/abstractions/crypto.service\";\nimport { EncryptService } from \"../../platform/abstractions/encrypt.service\";\nimport { I18nService } from \"../../platform/abstractions/i18n.service\";\nimport { KeyGenerationService } from \"../../platform/abstractions/key-generation.service\";\nimport { PlatformUtilsService } from \"../../platform/abstractions/platform-utils.service\";\nimport { StateService } from \"../../platform/abstractions/state.service\";\nimport { EncString } from \"../../platform/models/domain/enc-string\";\nimport { SymmetricCryptoKey } from \"../../platform/models/domain/symmetric-crypto-key\";\nimport { UserKey, DeviceKey } from \"../../types/key\";\nimport { DeviceTrustCryptoServiceAbstraction } from \"../abstractions/device-trust-crypto.service.abstraction\";\nimport { DeviceResponse } from \"../abstractions/devices/responses/device.response\";\nimport { DevicesApiServiceAbstraction } from \"../abstractions/devices-api.service.abstraction\";\nimport { SecretVerificationRequest } from \"../models/request/secret-verification.request\";\nimport {\n DeviceKeysUpdateRequest,\n UpdateDevicesTrustRequest,\n} from \"../models/request/update-devices-trust.request\";\n\nexport class DeviceTrustCryptoService implements DeviceTrustCryptoServiceAbstraction {\n supportsDeviceTrust$: Observable;\n\n constructor(\n private keyGenerationService: KeyGenerationService,\n private cryptoFunctionService: CryptoFunctionService,\n private cryptoService: CryptoService,\n private encryptService: EncryptService,\n private stateService: StateService,\n private appIdService: AppIdService,\n private devicesApiService: DevicesApiServiceAbstraction,\n private i18nService: I18nService,\n private platformUtilsService: PlatformUtilsService,\n private userDecryptionOptionsService: UserDecryptionOptionsServiceAbstraction,\n ) {\n this.supportsDeviceTrust$ = this.userDecryptionOptionsService.userDecryptionOptions$.pipe(\n map((options) => options?.trustedDeviceOption != null ?? false),\n );\n }\n\n /**\n * @description Retrieves the users choice to trust the device which can only happen after decryption\n * Note: this value should only be used once and then reset\n */\n async getShouldTrustDevice(): Promise {\n return await this.stateService.getShouldTrustDevice();\n }\n\n async setShouldTrustDevice(value: boolean): Promise {\n await this.stateService.setShouldTrustDevice(value);\n }\n\n async trustDeviceIfRequired(): Promise {\n const shouldTrustDevice = await this.getShouldTrustDevice();\n if (shouldTrustDevice) {\n await this.trustDevice();\n // reset the trust choice\n await this.setShouldTrustDevice(false);\n }\n }\n\n async trustDevice(): Promise {\n // Attempt to get user key\n const userKey: UserKey = await this.cryptoService.getUserKey();\n\n // If user key is not found, throw error\n if (!userKey) {\n throw new Error(\"User symmetric key not found\");\n }\n\n // Generate deviceKey\n const deviceKey = await this.makeDeviceKey();\n\n // Generate asymmetric RSA key pair: devicePrivateKey, devicePublicKey\n const [devicePublicKey, devicePrivateKey] =\n await this.cryptoFunctionService.rsaGenerateKeyPair(2048);\n\n const [\n devicePublicKeyEncryptedUserKey,\n userKeyEncryptedDevicePublicKey,\n deviceKeyEncryptedDevicePrivateKey,\n ] = await Promise.all([\n // Encrypt user key with the DevicePublicKey\n this.cryptoService.rsaEncrypt(userKey.key, devicePublicKey),\n\n // Encrypt devicePublicKey with user key\n this.encryptService.encrypt(devicePublicKey, userKey),\n\n // Encrypt devicePrivateKey with deviceKey\n this.encryptService.encrypt(devicePrivateKey, deviceKey),\n ]);\n\n // Send encrypted keys to server\n const deviceIdentifier = await this.appIdService.getAppId();\n const deviceResponse = await this.devicesApiService.updateTrustedDeviceKeys(\n deviceIdentifier,\n devicePublicKeyEncryptedUserKey.encryptedString,\n userKeyEncryptedDevicePublicKey.encryptedString,\n deviceKeyEncryptedDevicePrivateKey.encryptedString,\n );\n\n // store device key in local/secure storage if enc keys posted to server successfully\n await this.setDeviceKey(deviceKey);\n\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"deviceTrusted\"));\n\n return deviceResponse;\n }\n\n async rotateDevicesTrust(newUserKey: UserKey, masterPasswordHash: string): Promise {\n const currentDeviceKey = await this.getDeviceKey();\n if (currentDeviceKey == null) {\n // If the current device doesn't have a device key available to it, then we can't\n // rotate any trust at all, so early return.\n return;\n }\n\n // At this point of rotating their keys, they should still have their old user key in state\n const oldUserKey = await firstValueFrom(this.cryptoService.activeUserKey$);\n\n const deviceIdentifier = await this.appIdService.getAppId();\n const secretVerificationRequest = new SecretVerificationRequest();\n secretVerificationRequest.masterPasswordHash = masterPasswordHash;\n\n // Get the keys that are used in rotating a devices keys from the server\n const currentDeviceKeys = await this.devicesApiService.getDeviceKeys(\n deviceIdentifier,\n secretVerificationRequest,\n );\n\n // Decrypt the existing device public key with the old user key\n const decryptedDevicePublicKey = await this.encryptService.decryptToBytes(\n currentDeviceKeys.encryptedPublicKey,\n oldUserKey,\n );\n\n // Encrypt the brand new user key with the now-decrypted public key for the device\n const encryptedNewUserKey = await this.cryptoService.rsaEncrypt(\n newUserKey.key,\n decryptedDevicePublicKey,\n );\n\n // Re-encrypt the device public key with the new user key\n const encryptedDevicePublicKey = await this.encryptService.encrypt(\n decryptedDevicePublicKey,\n newUserKey,\n );\n\n const currentDeviceUpdateRequest = new DeviceKeysUpdateRequest();\n currentDeviceUpdateRequest.encryptedUserKey = encryptedNewUserKey.encryptedString;\n currentDeviceUpdateRequest.encryptedPublicKey = encryptedDevicePublicKey.encryptedString;\n\n // TODO: For device management, allow this method to take an array of device ids that can be looped over and individually rotated\n // then it can be added to trustRequest.otherDevices.\n\n const trustRequest = new UpdateDevicesTrustRequest();\n trustRequest.masterPasswordHash = masterPasswordHash;\n trustRequest.currentDevice = currentDeviceUpdateRequest;\n trustRequest.otherDevices = [];\n\n await this.devicesApiService.updateTrust(trustRequest, deviceIdentifier);\n }\n\n async getDeviceKey(): Promise {\n return await this.stateService.getDeviceKey();\n }\n\n private async setDeviceKey(deviceKey: DeviceKey | null): Promise {\n await this.stateService.setDeviceKey(deviceKey);\n }\n\n private async makeDeviceKey(): Promise {\n // Create 512-bit device key\n return (await this.keyGenerationService.createKey(512)) as DeviceKey;\n }\n\n async decryptUserKeyWithDeviceKey(\n encryptedDevicePrivateKey: EncString,\n encryptedUserKey: EncString,\n deviceKey?: DeviceKey,\n ): Promise {\n // If device key provided use it, otherwise try to retrieve from storage\n deviceKey ||= await this.getDeviceKey();\n\n if (!deviceKey) {\n // User doesn't have a device key anymore so device is untrusted\n return null;\n }\n\n try {\n // attempt to decrypt encryptedDevicePrivateKey with device key\n const devicePrivateKey = await this.encryptService.decryptToBytes(\n encryptedDevicePrivateKey,\n deviceKey,\n );\n\n // Attempt to decrypt encryptedUserDataKey with devicePrivateKey\n const userKey = await this.cryptoService.rsaDecrypt(\n encryptedUserKey.encryptedString,\n devicePrivateKey,\n );\n\n return new SymmetricCryptoKey(userKey) as UserKey;\n } catch (e) {\n // If either decryption effort fails, we want to remove the device key\n await this.setDeviceKey(null);\n\n return null;\n }\n }\n}\n","import { CryptoFunctionService } from \"../../../platform/abstractions/crypto-function.service\";\nimport { SymmetricCryptoKey } from \"../../../platform/models/domain/symmetric-crypto-key\";\nimport { PrfKey } from \"../../../types/key\";\nimport { WebAuthnLoginPrfCryptoServiceAbstraction } from \"../../abstractions/webauthn/webauthn-login-prf-crypto.service.abstraction\";\n\nconst LoginWithPrfSalt = \"passwordless-login\";\n\nexport class WebAuthnLoginPrfCryptoService implements WebAuthnLoginPrfCryptoServiceAbstraction {\n constructor(private cryptoFunctionService: CryptoFunctionService) {}\n\n async getLoginWithPrfSalt(): Promise {\n return await this.cryptoFunctionService.hash(LoginWithPrfSalt, \"sha256\");\n }\n\n async createSymmetricKeyFromPrf(prf: ArrayBuffer): Promise {\n return (await this.stretchKey(new Uint8Array(prf))) as PrfKey;\n }\n\n private async stretchKey(key: Uint8Array): Promise {\n const newKey = new Uint8Array(64);\n const encKey = await this.cryptoFunctionService.hkdfExpand(key, \"enc\", 32, \"sha256\");\n const macKey = await this.cryptoFunctionService.hkdfExpand(key, \"mac\", 32, \"sha256\");\n newKey.set(new Uint8Array(encKey));\n newKey.set(new Uint8Array(macKey), 32);\n return new SymmetricCryptoKey(newKey);\n }\n}\n","import { firstValueFrom } from \"rxjs\";\n\nimport { ApiService } from \"../../../abstractions/api.service\";\nimport { EnvironmentService } from \"../../../platform/abstractions/environment.service\";\nimport { WebAuthnLoginApiServiceAbstraction } from \"../../abstractions/webauthn/webauthn-login-api.service.abstraction\";\n\nimport { CredentialAssertionOptionsResponse } from \"./response/credential-assertion-options.response\";\n\nexport class WebAuthnLoginApiService implements WebAuthnLoginApiServiceAbstraction {\n constructor(\n private apiService: ApiService,\n private environmentService: EnvironmentService,\n ) {}\n\n async getCredentialAssertionOptions(): Promise {\n const env = await firstValueFrom(this.environmentService.environment$);\n const response = await this.apiService.send(\n \"GET\",\n `/accounts/webauthn/assertion-options`,\n null,\n false,\n true,\n env.getIdentityUrl(),\n );\n return new CredentialAssertionOptionsResponse(response);\n }\n}\n","import { LoginStrategyServiceAbstraction, WebAuthnLoginCredentials } from \"@bitwarden/auth/common\";\n\nimport { LogService } from \"../../../platform/abstractions/log.service\";\nimport { PrfKey } from \"../../../types/key\";\nimport { WebAuthnLoginApiServiceAbstraction } from \"../../abstractions/webauthn/webauthn-login-api.service.abstraction\";\nimport { WebAuthnLoginPrfCryptoServiceAbstraction } from \"../../abstractions/webauthn/webauthn-login-prf-crypto.service.abstraction\";\nimport { WebAuthnLoginServiceAbstraction } from \"../../abstractions/webauthn/webauthn-login.service.abstraction\";\nimport { AuthResult } from \"../../models/domain/auth-result\";\nimport { WebAuthnLoginCredentialAssertionOptionsView } from \"../../models/view/webauthn-login/webauthn-login-credential-assertion-options.view\";\nimport { WebAuthnLoginCredentialAssertionView } from \"../../models/view/webauthn-login/webauthn-login-credential-assertion.view\";\n\nimport { WebAuthnLoginAssertionResponseRequest } from \"./request/webauthn-login-assertion-response.request\";\n\nexport class WebAuthnLoginService implements WebAuthnLoginServiceAbstraction {\n private navigatorCredentials: CredentialsContainer;\n\n constructor(\n private webAuthnLoginApiService: WebAuthnLoginApiServiceAbstraction,\n private loginStrategyService: LoginStrategyServiceAbstraction,\n private webAuthnLoginPrfCryptoService: WebAuthnLoginPrfCryptoServiceAbstraction,\n private window: Window,\n private logService?: LogService,\n ) {\n this.navigatorCredentials = this.window.navigator.credentials;\n }\n\n async getCredentialAssertionOptions(): Promise {\n const response = await this.webAuthnLoginApiService.getCredentialAssertionOptions();\n return new WebAuthnLoginCredentialAssertionOptionsView(response.options, response.token);\n }\n\n async assertCredential(\n credentialAssertionOptions: WebAuthnLoginCredentialAssertionOptionsView,\n ): Promise {\n const nativeOptions: CredentialRequestOptions = {\n publicKey: credentialAssertionOptions.options,\n };\n // TODO: Remove `any` when typescript typings add support for PRF\n nativeOptions.publicKey.extensions = {\n prf: { eval: { first: await this.webAuthnLoginPrfCryptoService.getLoginWithPrfSalt() } },\n } as any;\n\n try {\n const response = await this.navigatorCredentials.get(nativeOptions);\n if (!(response instanceof PublicKeyCredential)) {\n return undefined;\n }\n // TODO: Remove `any` when typescript typings add support for PRF\n const prfResult = (response.getClientExtensionResults() as any).prf?.results?.first;\n let symmetricPrfKey: PrfKey | undefined;\n if (prfResult != undefined) {\n symmetricPrfKey =\n await this.webAuthnLoginPrfCryptoService.createSymmetricKeyFromPrf(prfResult);\n }\n\n const deviceResponse = new WebAuthnLoginAssertionResponseRequest(response);\n\n // Verify that we aren't going to send PRF information to the server in any case.\n // Note: this will only happen if a dev has done something wrong.\n if (\"prf\" in deviceResponse.extensions) {\n throw new Error(\"PRF information is not allowed to be sent to the server.\");\n }\n\n return new WebAuthnLoginCredentialAssertionView(\n credentialAssertionOptions.token,\n deviceResponse,\n symmetricPrfKey,\n );\n } catch (error) {\n this.logService?.error(error);\n return undefined;\n }\n }\n\n async logIn(assertion: WebAuthnLoginCredentialAssertionView): Promise {\n const credential = new WebAuthnLoginCredentials(\n assertion.token,\n assertion.deviceResponse,\n assertion.prfKey,\n );\n const result = await this.loginStrategyService.logIn(credential);\n return result;\n }\n}\n","import { StorageServiceProvider } from \"../../services/storage-service.provider\";\nimport { GlobalState } from \"../global-state\";\nimport { GlobalStateProvider } from \"../global-state.provider\";\nimport { KeyDefinition } from \"../key-definition\";\n\nimport { DefaultGlobalState } from \"./default-global-state\";\n\nexport class DefaultGlobalStateProvider implements GlobalStateProvider {\n private globalStateCache: Record> = {};\n\n constructor(private storageServiceProvider: StorageServiceProvider) {}\n\n get(keyDefinition: KeyDefinition): GlobalState {\n const [location, storageService] = this.storageServiceProvider.get(\n keyDefinition.stateDefinition.defaultStorageLocation,\n keyDefinition.stateDefinition.storageLocationOverrides,\n );\n const cacheKey = this.buildCacheKey(location, keyDefinition);\n const existingGlobalState = this.globalStateCache[cacheKey];\n if (existingGlobalState != null) {\n // The cast into the actual generic is safe because of rules around key definitions\n // being unique.\n return existingGlobalState as DefaultGlobalState;\n }\n\n const newGlobalState = new DefaultGlobalState(keyDefinition, storageService);\n\n this.globalStateCache[cacheKey] = newGlobalState;\n return newGlobalState;\n }\n\n private buildCacheKey(location: string, keyDefinition: KeyDefinition) {\n return `${location}_${keyDefinition.fullName}`;\n }\n}\n","import { Observable, distinctUntilChanged, map } from \"rxjs\";\n\nimport { AccountService } from \"../../../auth/abstractions/account.service\";\nimport { UserId } from \"../../../types/guid\";\nimport { KeyDefinition } from \"../key-definition\";\nimport { UserKeyDefinition, isUserKeyDefinition } from \"../user-key-definition\";\nimport { ActiveUserState } from \"../user-state\";\nimport { ActiveUserStateProvider, SingleUserStateProvider } from \"../user-state.provider\";\n\nimport { DefaultActiveUserState } from \"./default-active-user-state\";\n\nexport class DefaultActiveUserStateProvider implements ActiveUserStateProvider {\n activeUserId$: Observable;\n\n constructor(\n private readonly accountService: AccountService,\n private readonly singleUserStateProvider: SingleUserStateProvider,\n ) {\n this.activeUserId$ = this.accountService.activeAccount$.pipe(\n map((account) => account?.id),\n // To avoid going to storage when we don't need to, only get updates when there is a true change.\n distinctUntilChanged((a, b) => (a == null || b == null ? a == b : a === b)), // Treat null and undefined as equal\n );\n }\n\n get(keyDefinition: KeyDefinition | UserKeyDefinition): ActiveUserState {\n if (!isUserKeyDefinition(keyDefinition)) {\n keyDefinition = UserKeyDefinition.fromBaseKeyDefinition(keyDefinition);\n }\n\n // All other providers cache the creation of their corresponding `State` objects, this instance\n // doesn't need to do that since it calls `SingleUserStateProvider` it will go through their caching\n // layer, because of that, the creation of this instance is quite simple and not worth caching.\n return new DefaultActiveUserState(\n keyDefinition,\n this.activeUserId$,\n this.singleUserStateProvider,\n );\n }\n}\n","import { UserId } from \"../../../types/guid\";\nimport { StorageServiceProvider } from \"../../services/storage-service.provider\";\nimport { KeyDefinition } from \"../key-definition\";\nimport { StateEventRegistrarService } from \"../state-event-registrar.service\";\nimport { UserKeyDefinition, isUserKeyDefinition } from \"../user-key-definition\";\nimport { SingleUserState } from \"../user-state\";\nimport { SingleUserStateProvider } from \"../user-state.provider\";\n\nimport { DefaultSingleUserState } from \"./default-single-user-state\";\n\nexport class DefaultSingleUserStateProvider implements SingleUserStateProvider {\n private cache: Record> = {};\n\n constructor(\n private readonly storageServiceProvider: StorageServiceProvider,\n private readonly stateEventRegistrarService: StateEventRegistrarService,\n ) {}\n\n get(\n userId: UserId,\n keyDefinition: KeyDefinition | UserKeyDefinition,\n ): SingleUserState {\n if (!isUserKeyDefinition(keyDefinition)) {\n keyDefinition = UserKeyDefinition.fromBaseKeyDefinition(keyDefinition);\n }\n const [location, storageService] = this.storageServiceProvider.get(\n keyDefinition.stateDefinition.defaultStorageLocation,\n keyDefinition.stateDefinition.storageLocationOverrides,\n );\n const cacheKey = this.buildCacheKey(location, userId, keyDefinition);\n const existingUserState = this.cache[cacheKey];\n if (existingUserState != null) {\n // I have to cast out of the unknown generic but this should be safe if rules\n // around domain token are made\n return existingUserState as SingleUserState;\n }\n\n const newUserState = new DefaultSingleUserState(\n userId,\n keyDefinition,\n storageService,\n this.stateEventRegistrarService,\n );\n this.cache[cacheKey] = newUserState;\n return newUserState;\n }\n\n private buildCacheKey(\n location: string,\n userId: UserId,\n keyDefinition: UserKeyDefinition,\n ) {\n return `${location}_${keyDefinition.fullName}_${userId}`;\n }\n}\n","import { Observable } from \"rxjs\";\n\nimport { DerivedStateDependencies } from \"../../../types/state\";\nimport {\n AbstractStorageService,\n ObservableStorageService,\n} from \"../../abstractions/storage.service\";\nimport { DeriveDefinition } from \"../derive-definition\";\nimport { DerivedState } from \"../derived-state\";\nimport { DerivedStateProvider } from \"../derived-state.provider\";\n\nimport { DefaultDerivedState } from \"./default-derived-state\";\n\nexport class DefaultDerivedStateProvider implements DerivedStateProvider {\n private cache: Record> = {};\n\n constructor(protected memoryStorage: AbstractStorageService & ObservableStorageService) {}\n\n get(\n parentState$: Observable,\n deriveDefinition: DeriveDefinition,\n dependencies: TDeps,\n ): DerivedState {\n const cacheKey = deriveDefinition.buildCacheKey();\n const existingDerivedState = this.cache[cacheKey];\n if (existingDerivedState != null) {\n // I have to cast out of the unknown generic but this should be safe if rules\n // around domain token are made\n return existingDerivedState as DefaultDerivedState;\n }\n\n const newDerivedState = this.buildDerivedState(parentState$, deriveDefinition, dependencies);\n this.cache[cacheKey] = newDerivedState;\n return newDerivedState;\n }\n\n protected buildDerivedState(\n parentState$: Observable,\n deriveDefinition: DeriveDefinition,\n dependencies: TDeps,\n ): DerivedState {\n return new DefaultDerivedState(\n parentState$,\n deriveDefinition,\n this.memoryStorage,\n dependencies,\n );\n }\n}\n","import { Observable, filter, of, switchMap, take } from \"rxjs\";\n\nimport { UserId } from \"../../../types/guid\";\nimport { DerivedStateDependencies } from \"../../../types/state\";\nimport { DeriveDefinition } from \"../derive-definition\";\nimport { DerivedState } from \"../derived-state\";\nimport { DerivedStateProvider } from \"../derived-state.provider\";\nimport { GlobalStateProvider } from \"../global-state.provider\";\nimport { KeyDefinition } from \"../key-definition\";\nimport { StateProvider } from \"../state.provider\";\nimport { UserKeyDefinition } from \"../user-key-definition\";\nimport { ActiveUserStateProvider, SingleUserStateProvider } from \"../user-state.provider\";\n\nexport class DefaultStateProvider implements StateProvider {\n activeUserId$: Observable;\n constructor(\n private readonly activeUserStateProvider: ActiveUserStateProvider,\n private readonly singleUserStateProvider: SingleUserStateProvider,\n private readonly globalStateProvider: GlobalStateProvider,\n private readonly derivedStateProvider: DerivedStateProvider,\n ) {\n this.activeUserId$ = this.activeUserStateProvider.activeUserId$;\n }\n\n getUserState$(\n keyDefinition: KeyDefinition | UserKeyDefinition,\n userId?: UserId,\n ): Observable {\n if (userId) {\n return this.getUser(userId, keyDefinition).state$;\n } else {\n return this.activeUserId$.pipe(\n filter((userId) => userId != null), // Filter out null-ish user ids since we can't get state for a null user id\n take(1),\n switchMap((userId) => this.getUser(userId, keyDefinition).state$),\n );\n }\n }\n\n getUserStateOrDefault$(\n keyDefinition: KeyDefinition | UserKeyDefinition,\n config: { userId: UserId | undefined; defaultValue?: T },\n ): Observable {\n const { userId, defaultValue = null } = config;\n if (userId) {\n return this.getUser(userId, keyDefinition).state$;\n } else {\n return this.activeUserId$.pipe(\n take(1),\n switchMap((userId) =>\n userId != null ? this.getUser(userId, keyDefinition).state$ : of(defaultValue),\n ),\n );\n }\n }\n\n async setUserState(\n keyDefinition: KeyDefinition | UserKeyDefinition,\n value: T,\n userId?: UserId,\n ): Promise<[UserId, T]> {\n if (userId) {\n return [userId, await this.getUser(userId, keyDefinition).update(() => value)];\n } else {\n return await this.getActive(keyDefinition).update(() => value);\n }\n }\n\n getActive: InstanceType[\"get\"] =\n this.activeUserStateProvider.get.bind(this.activeUserStateProvider);\n getUser: InstanceType[\"get\"] =\n this.singleUserStateProvider.get.bind(this.singleUserStateProvider);\n getGlobal: InstanceType[\"get\"] = this.globalStateProvider.get.bind(\n this.globalStateProvider,\n );\n getDerived: (\n parentState$: Observable,\n deriveDefinition: DeriveDefinition,\n dependencies: TDeps,\n ) => DerivedState = this.derivedStateProvider.get.bind(this.derivedStateProvider);\n}\n","import { OrganizationApiServiceAbstraction as OrganizationApiService } from \"../../admin-console/abstractions/organization/organization-api.service.abstraction\";\nimport { OrganizationCreateRequest } from \"../../admin-console/models/request/organization-create.request\";\nimport { OrganizationKeysRequest } from \"../../admin-console/models/request/organization-keys.request\";\nimport { OrganizationResponse } from \"../../admin-console/models/response/organization.response\";\nimport { CryptoService } from \"../../platform/abstractions/crypto.service\";\nimport { EncryptService } from \"../../platform/abstractions/encrypt.service\";\nimport { I18nService } from \"../../platform/abstractions/i18n.service\";\nimport { EncString } from \"../../platform/models/domain/enc-string\";\nimport { OrgKey } from \"../../types/key\";\nimport {\n OrganizationBillingServiceAbstraction,\n OrganizationInformation,\n PaymentInformation,\n PlanInformation,\n SubscriptionInformation,\n} from \"../abstractions/organization-billing.service\";\nimport { PlanType } from \"../enums\";\n\ninterface OrganizationKeys {\n encryptedKey: EncString;\n publicKey: string;\n encryptedPrivateKey: EncString;\n encryptedCollectionName: EncString;\n}\n\nexport class OrganizationBillingService implements OrganizationBillingServiceAbstraction {\n constructor(\n private cryptoService: CryptoService,\n private encryptService: EncryptService,\n private i18nService: I18nService,\n private organizationApiService: OrganizationApiService,\n ) {}\n\n async purchaseSubscription(subscription: SubscriptionInformation): Promise {\n const request = new OrganizationCreateRequest();\n\n const organizationKeys = await this.makeOrganizationKeys();\n\n this.setOrganizationKeys(request, organizationKeys);\n\n this.setOrganizationInformation(request, subscription.organization);\n\n this.setPlanInformation(request, subscription.plan);\n\n this.setPaymentInformation(request, subscription.payment);\n\n return await this.organizationApiService.create(request);\n }\n\n async startFree(subscription: SubscriptionInformation): Promise {\n const request = new OrganizationCreateRequest();\n\n const organizationKeys = await this.makeOrganizationKeys();\n\n this.setOrganizationKeys(request, organizationKeys);\n\n this.setOrganizationInformation(request, subscription.organization);\n\n this.setPlanInformation(request, subscription.plan);\n\n return await this.organizationApiService.create(request);\n }\n\n private async makeOrganizationKeys(): Promise {\n const [encryptedKey, key] = await this.cryptoService.makeOrgKey();\n const [publicKey, encryptedPrivateKey] = await this.cryptoService.makeKeyPair(key);\n const encryptedCollectionName = await this.encryptService.encrypt(\n this.i18nService.t(\"defaultCollection\"),\n key,\n );\n return {\n encryptedKey,\n publicKey,\n encryptedPrivateKey,\n encryptedCollectionName,\n };\n }\n\n private prohibitsAdditionalSeats(planType: PlanType) {\n switch (planType) {\n case PlanType.Free:\n case PlanType.FamiliesAnnually:\n case PlanType.FamiliesAnnually2019:\n case PlanType.TeamsStarter:\n return true;\n default:\n return false;\n }\n }\n\n private setOrganizationInformation(\n request: OrganizationCreateRequest,\n information: OrganizationInformation,\n ): void {\n request.name = information.name;\n request.businessName = information.businessName;\n request.billingEmail = information.billingEmail;\n request.initiationPath = information.initiationPath;\n }\n\n private setOrganizationKeys(request: OrganizationCreateRequest, keys: OrganizationKeys): void {\n request.key = keys.encryptedKey.encryptedString;\n request.keys = new OrganizationKeysRequest(\n keys.publicKey,\n keys.encryptedPrivateKey.encryptedString,\n );\n request.collectionName = keys.encryptedCollectionName.encryptedString;\n }\n\n private setPaymentInformation(\n request: OrganizationCreateRequest,\n information: PaymentInformation,\n ) {\n const [paymentToken, paymentMethodType] = information.paymentMethod;\n request.paymentToken = paymentToken;\n request.paymentMethodType = paymentMethodType;\n\n const billingInformation = information.billing;\n request.billingAddressPostalCode = billingInformation.postalCode;\n request.billingAddressCountry = billingInformation.country;\n\n if (billingInformation.taxId) {\n request.taxIdNumber = billingInformation.taxId;\n request.billingAddressLine1 = billingInformation.addressLine1;\n request.billingAddressLine2 = billingInformation.addressLine2;\n request.billingAddressCity = billingInformation.city;\n request.billingAddressState = billingInformation.state;\n }\n }\n\n private setPlanInformation(\n request: OrganizationCreateRequest,\n information: PlanInformation,\n ): void {\n request.planType = information.type;\n\n if (this.prohibitsAdditionalSeats(request.planType)) {\n request.useSecretsManager = information.subscribeToSecretsManager;\n request.isFromSecretsManagerTrial = information.isFromSecretsManagerTrial;\n return;\n }\n\n request.additionalSeats = information.passwordManagerSeats;\n\n if (information.subscribeToSecretsManager) {\n request.useSecretsManager = true;\n request.isFromSecretsManagerTrial = information.isFromSecretsManagerTrial;\n request.additionalSmSeats = information.secretsManagerSeats;\n request.additionalServiceAccounts = information.secretsManagerServiceAccounts;\n }\n\n if (information.storage) {\n request.additionalStorageGb = information.storage;\n }\n }\n}\n","import { Observable } from \"rxjs\";\n/**\n * Service for managing vault settings.\n */\nexport abstract class VaultSettingsService {\n /**\n * An observable monitoring the state of the enable passkeys setting.\n * The observable updates when the setting changes.\n */\n enablePasskeys$: Observable;\n /**\n * An observable monitoring the state of the show cards on the current tab.\n */\n showCardsCurrentTab$: Observable;\n /**\n * An observable monitoring the state of the show identities on the current tab.\n */\n showIdentitiesCurrentTab$: Observable;\n /**\n\n /**\n * Saves the enable passkeys setting to disk.\n * @param value The new value for the passkeys setting.\n */\n setEnablePasskeys: (value: boolean) => Promise;\n /**\n * Saves the show cards on tab page setting to disk.\n * @param value The new value for the show cards on tab page setting.\n */\n setShowCardsCurrentTab: (value: boolean) => Promise;\n /**\n * Saves the show identities on tab page setting to disk.\n * @param value The new value for the show identities on tab page setting.\n */\n setShowIdentitiesCurrentTab: (value: boolean) => Promise;\n}\n","import { Observable, map } from \"rxjs\";\n\nimport { ActiveUserState, GlobalState, StateProvider } from \"../../../platform/state\";\nimport { VaultSettingsService as VaultSettingsServiceAbstraction } from \"../../abstractions/vault-settings/vault-settings.service\";\nimport {\n SHOW_CARDS_CURRENT_TAB,\n SHOW_IDENTITIES_CURRENT_TAB,\n USER_ENABLE_PASSKEYS,\n} from \"../key-state/vault-settings.state\";\n\n/**\n * {@link VaultSettingsServiceAbstraction}\n */\nexport class VaultSettingsService implements VaultSettingsServiceAbstraction {\n private enablePasskeysState: GlobalState =\n this.stateProvider.getGlobal(USER_ENABLE_PASSKEYS);\n /**\n * {@link VaultSettingsServiceAbstraction.enablePasskeys$}\n */\n readonly enablePasskeys$: Observable = this.enablePasskeysState.state$.pipe(\n map((x) => x ?? true),\n );\n\n private showCardsCurrentTabState: ActiveUserState =\n this.stateProvider.getActive(SHOW_CARDS_CURRENT_TAB);\n /**\n * {@link VaultSettingsServiceAbstraction.showCardsCurrentTab$}\n */\n readonly showCardsCurrentTab$: Observable = this.showCardsCurrentTabState.state$.pipe(\n map((x) => x ?? true),\n );\n\n private showIdentitiesCurrentTabState: ActiveUserState = this.stateProvider.getActive(\n SHOW_IDENTITIES_CURRENT_TAB,\n );\n /**\n * {@link VaultSettingsServiceAbstraction.showIdentitiesCurrentTab$}\n */\n readonly showIdentitiesCurrentTab$: Observable =\n this.showIdentitiesCurrentTabState.state$.pipe(map((x) => x ?? true));\n\n constructor(private stateProvider: StateProvider) {}\n\n /**\n * {@link VaultSettingsServiceAbstraction.setShowCardsCurrentTab}\n */\n async setShowCardsCurrentTab(value: boolean): Promise {\n await this.showCardsCurrentTabState.update(() => value);\n }\n\n /**\n * {@link VaultSettingsServiceAbstraction.setDontShowIdentitiesCurrentTab}\n */\n async setShowIdentitiesCurrentTab(value: boolean): Promise {\n await this.showIdentitiesCurrentTabState.update(() => value);\n }\n\n /**\n * {@link VaultSettingsServiceAbstraction.setEnablePasskeys}\n */\n async setEnablePasskeys(value: boolean): Promise {\n await this.enablePasskeysState.update(() => value);\n }\n}\n","import { ApiService } from \"../../abstractions/api.service\";\nimport { BillingApiServiceAbstraction } from \"../../billing/abstractions/billilng-api.service.abstraction\";\nimport { SubscriptionCancellationRequest } from \"../../billing/models/request/subscription-cancellation.request\";\nimport { OrganizationBillingStatusResponse } from \"../../billing/models/response/organization-billing-status.response\";\n\nexport class BillingApiService implements BillingApiServiceAbstraction {\n constructor(private apiService: ApiService) {}\n\n cancelOrganizationSubscription(\n organizationId: string,\n request: SubscriptionCancellationRequest,\n ): Promise {\n return this.apiService.send(\n \"POST\",\n \"/organizations/\" + organizationId + \"/cancel\",\n request,\n true,\n false,\n );\n }\n\n cancelPremiumUserSubscription(request: SubscriptionCancellationRequest): Promise {\n return this.apiService.send(\"POST\", \"/accounts/cancel\", request, true, false);\n }\n\n async getBillingStatus(id: string): Promise {\n const r = await this.apiService.send(\n \"GET\",\n \"/organizations/\" + id + \"/billing-status\",\n null,\n true,\n true,\n );\n\n return new OrganizationBillingStatusResponse(r);\n }\n}\n","import { firstValueFrom, map, Observable } from \"rxjs\";\n\nimport { ActiveUserState, StateProvider } from \"../../platform/state\";\nimport { BillingApiServiceAbstraction as BillingApiService } from \"../abstractions/billilng-api.service.abstraction\";\nimport { PaymentMethodWarningsServiceAbstraction } from \"../abstractions/payment-method-warnings-service.abstraction\";\nimport { PAYMENT_METHOD_WARNINGS_KEY } from \"../models/billing-keys.state\";\nimport { PaymentMethodWarning } from \"../models/domain/payment-method-warning\";\n\nexport class PaymentMethodWarningsService implements PaymentMethodWarningsServiceAbstraction {\n private paymentMethodWarningsState: ActiveUserState>;\n paymentMethodWarnings$: Observable>;\n\n constructor(\n private billingApiService: BillingApiService,\n private stateProvider: StateProvider,\n ) {\n this.paymentMethodWarningsState = this.stateProvider.getActive(PAYMENT_METHOD_WARNINGS_KEY);\n this.paymentMethodWarnings$ = this.paymentMethodWarningsState.state$;\n }\n\n async acknowledge(organizationId: string): Promise {\n await this.paymentMethodWarningsState.update((state) => {\n const current = state[organizationId];\n state[organizationId] = {\n ...current,\n acknowledged: true,\n };\n return state;\n });\n }\n\n async removeSubscriptionRisk(organizationId: string): Promise {\n await this.paymentMethodWarningsState.update((state) => {\n const current = state[organizationId];\n state[organizationId] = {\n ...current,\n risksSubscriptionFailure: false,\n };\n return state;\n });\n }\n\n async clear(): Promise {\n await this.paymentMethodWarningsState.update(() => ({}));\n }\n\n async update(organizationId: string): Promise {\n const warning = await firstValueFrom(\n this.paymentMethodWarningsState.state$.pipe(\n map((state) => (!state ? null : state[organizationId])),\n ),\n );\n if (!warning || warning.savedAt < this.getOneWeekAgo()) {\n const { organizationName, risksSubscriptionFailure } =\n await this.billingApiService.getBillingStatus(organizationId);\n await this.paymentMethodWarningsState.update((state) => {\n state ??= {};\n state[organizationId] = {\n organizationName,\n risksSubscriptionFailure,\n acknowledged: false,\n savedAt: new Date(),\n };\n return state;\n });\n }\n }\n\n private getOneWeekAgo = (): Date => {\n const date = new Date();\n date.setDate(date.getDate() - 7);\n return date;\n };\n}\n","import { Subject } from \"rxjs\";\n\nimport { AbstractMemoryStorageService, StorageUpdate } from \"../abstractions/storage.service\";\n\nexport class MemoryStorageService extends AbstractMemoryStorageService {\n protected store = new Map();\n private updatesSubject = new Subject();\n\n get valuesRequireDeserialization(): boolean {\n return false;\n }\n get updates$() {\n return this.updatesSubject.asObservable();\n }\n\n get(key: string): Promise {\n if (this.store.has(key)) {\n const obj = this.store.get(key);\n return Promise.resolve(obj as T);\n }\n return Promise.resolve(null);\n }\n\n async has(key: string): Promise {\n return (await this.get(key)) != null;\n }\n\n save(key: string, obj: T): Promise {\n if (obj == null) {\n return this.remove(key);\n }\n // TODO: Remove once foreground/background contexts are separated in browser\n // Needed to ensure ownership of all memory by the context running the storage service\n const toStore = structuredClone(obj);\n this.store.set(key, toStore);\n this.updatesSubject.next({ key, updateType: \"save\" });\n return Promise.resolve();\n }\n\n remove(key: string): Promise {\n this.store.delete(key);\n this.updatesSubject.next({ key, updateType: \"remove\" });\n return Promise.resolve();\n }\n\n getBypassCache(key: string): Promise {\n return this.get(key);\n }\n}\n","import { Injectable } from \"@angular/core\";\nimport { Subject } from \"rxjs\";\n\nimport {\n AbstractStorageService,\n StorageUpdate,\n} from \"@bitwarden/common/platform/abstractions/storage.service\";\nimport { HtmlStorageLocation } from \"@bitwarden/common/platform/enums\";\nimport { StorageOptions } from \"@bitwarden/common/platform/models/domain/storage-options\";\n\n@Injectable()\nexport class HtmlStorageService implements AbstractStorageService {\n private updatesSubject = new Subject();\n\n get defaultOptions(): StorageOptions {\n return { htmlStorageLocation: HtmlStorageLocation.Session };\n }\n\n get valuesRequireDeserialization(): boolean {\n return true;\n }\n updates$;\n\n constructor() {\n this.updates$ = this.updatesSubject.asObservable();\n }\n\n get(key: string, options: StorageOptions = this.defaultOptions): Promise {\n let json: string = null;\n switch (options.htmlStorageLocation) {\n case HtmlStorageLocation.Local:\n json = window.localStorage.getItem(key);\n break;\n case HtmlStorageLocation.Session:\n default:\n json = window.sessionStorage.getItem(key);\n break;\n }\n\n if (json != null) {\n const obj = JSON.parse(json);\n return Promise.resolve(obj as T);\n }\n return Promise.resolve(null);\n }\n\n async has(key: string, options: StorageOptions = this.defaultOptions): Promise {\n return (await this.get(key, options)) != null;\n }\n\n save(key: string, obj: any, options: StorageOptions = this.defaultOptions): Promise {\n if (obj == null) {\n return this.remove(key, options);\n }\n\n if (obj instanceof Set) {\n obj = Array.from(obj);\n }\n\n const json = JSON.stringify(obj);\n switch (options.htmlStorageLocation) {\n case HtmlStorageLocation.Local:\n window.localStorage.setItem(key, json);\n break;\n case HtmlStorageLocation.Session:\n default:\n window.sessionStorage.setItem(key, json);\n break;\n }\n this.updatesSubject.next({ key, updateType: \"save\" });\n return Promise.resolve();\n }\n\n remove(key: string, options: StorageOptions = this.defaultOptions): Promise {\n switch (options.htmlStorageLocation) {\n case HtmlStorageLocation.Local:\n window.localStorage.removeItem(key);\n break;\n case HtmlStorageLocation.Session:\n default:\n window.sessionStorage.removeItem(key);\n break;\n }\n this.updatesSubject.next({ key, updateType: \"remove\" });\n return Promise.resolve();\n }\n}\n","import { TranslationService as TranslationServiceAbstraction } from \"../abstractions/translation.service\";\n\nexport abstract class TranslationService implements TranslationServiceAbstraction {\n // First locale is the default (English)\n supportedTranslationLocales: string[] = [\"en\"];\n defaultLocale = \"en\";\n abstract translationLocale: string;\n collator: Intl.Collator;\n localeNames = new Map([\n [\"af\", \"Afrikaans\"],\n [\"ar\", \"العربية الفصحى\"],\n [\"az\", \"Azərbaycanca\"],\n [\"be\", \"Беларуская\"],\n [\"bg\", \"български\"],\n [\"bn\", \"বাংলা\"],\n [\"bs\", \"bosanski jezik\"],\n [\"ca\", \"català\"],\n [\"cs\", \"čeština\"],\n [\"cy\", \"Cymraeg, y Gymraeg\"],\n [\"da\", \"dansk\"],\n [\"de\", \"Deutsch\"],\n [\"el\", \"Ελληνικά\"],\n [\"en\", \"English\"],\n [\"en-GB\", \"English (British)\"],\n [\"en-IN\", \"English (India)\"],\n [\"eo\", \"Esperanto\"],\n [\"es\", \"español\"],\n [\"et\", \"eesti\"],\n [\"eu\", \"euskara\"],\n [\"fa\", \"فارسی\"],\n [\"fi\", \"suomi\"],\n [\"fil\", \"Wikang Filipino\"],\n [\"fr\", \"français\"],\n [\"gl\", \"galego\"],\n [\"he\", \"עברית\"],\n [\"hi\", \"हिन्दी\"],\n [\"hr\", \"hrvatski\"],\n [\"hu\", \"magyar\"],\n [\"id\", \"Bahasa Indonesia\"],\n [\"it\", \"italiano\"],\n [\"ja\", \"日本語\"],\n [\"ka\", \"ქართული\"],\n [\"km\", \"ខ្មែរ, ខេមរភាសា, ភាសាខ្មែរ\"],\n [\"kn\", \"ಕನ್ನಡ\"],\n [\"ko\", \"한국어\"],\n [\"lt\", \"lietuvių kalba\"],\n [\"lv\", \"Latvietis\"],\n [\"me\", \"црногорски\"],\n [\"ml\", \"മലയാളം\"],\n [\"mr\", \"मराठी\"],\n [\"my\", \"ဗမာစကား\"],\n [\"nb\", \"norsk (bokmål)\"],\n [\"ne\", \"नेपाली\"],\n [\"nl\", \"Nederlands\"],\n [\"nn\", \"Norsk Nynorsk\"],\n [\"or\", \"ଓଡ଼ିଆ\"],\n [\"pl\", \"polski\"],\n [\"pt-BR\", \"português do Brasil\"],\n [\"pt-PT\", \"português\"],\n [\"ro\", \"română\"],\n [\"ru\", \"русский\"],\n [\"si\", \"සිංහල\"],\n [\"sk\", \"slovenčina\"],\n [\"sl\", \"Slovenski jezik, Slovenščina\"],\n [\"sr\", \"Српски\"],\n [\"sv\", \"svenska\"],\n [\"te\", \"తెలుగు\"],\n [\"th\", \"ไทย\"],\n [\"tr\", \"Türkçe\"],\n [\"uk\", \"українська\"],\n [\"vi\", \"Tiếng Việt\"],\n [\"zh-CN\", \"中文(中国大陆)\"],\n [\"zh-TW\", \"中文(台灣)\"],\n ]);\n\n protected inited: boolean;\n protected defaultMessages: any = {};\n protected localeMessages: any = {};\n\n constructor(\n protected systemLanguage: string,\n protected localesDirectory: string,\n protected getLocalesJson: (formattedLocale: string) => Promise,\n ) {\n this.systemLanguage = systemLanguage.replace(\"_\", \"-\");\n }\n\n async init(locale?: string) {\n if (this.inited) {\n throw new Error(\"i18n already initialized.\");\n }\n if (this.supportedTranslationLocales == null || this.supportedTranslationLocales.length === 0) {\n throw new Error(\"supportedTranslationLocales not set.\");\n }\n\n this.inited = true;\n this.translationLocale = locale != null ? locale : this.systemLanguage;\n\n try {\n this.collator = new Intl.Collator(this.translationLocale, {\n numeric: true,\n sensitivity: \"base\",\n });\n } catch {\n this.collator = null;\n }\n\n if (this.supportedTranslationLocales.indexOf(this.translationLocale) === -1) {\n this.translationLocale = this.translationLocale.slice(0, 2);\n\n if (this.supportedTranslationLocales.indexOf(this.translationLocale) === -1) {\n this.translationLocale = this.defaultLocale;\n }\n }\n\n if (this.localesDirectory != null) {\n await this.loadMessages(this.translationLocale, this.localeMessages);\n if (this.translationLocale !== this.defaultLocale) {\n await this.loadMessages(this.defaultLocale, this.defaultMessages);\n }\n }\n }\n\n t(id: string, p1?: string, p2?: string, p3?: string): string {\n return this.translate(id, p1, p2, p3);\n }\n\n translate(id: string, p1?: string | number, p2?: string | number, p3?: string | number): string {\n let result: string;\n // eslint-disable-next-line\n if (this.localeMessages.hasOwnProperty(id) && this.localeMessages[id]) {\n result = this.localeMessages[id];\n // eslint-disable-next-line\n } else if (this.defaultMessages.hasOwnProperty(id) && this.defaultMessages[id]) {\n result = this.defaultMessages[id];\n } else {\n result = \"\";\n }\n\n if (result !== \"\") {\n if (p1 != null) {\n result = result.split(\"__$1__\").join(p1.toString());\n }\n if (p2 != null) {\n result = result.split(\"__$2__\").join(p2.toString());\n }\n if (p3 != null) {\n result = result.split(\"__$3__\").join(p3.toString());\n }\n }\n\n return result;\n }\n\n protected async loadMessages(locale: string, messagesObj: any): Promise {\n const formattedLocale = locale.replace(\"-\", \"_\");\n const locales = await this.getLocalesJson(formattedLocale);\n for (const prop in locales) {\n // eslint-disable-next-line\n if (!locales.hasOwnProperty(prop)) {\n continue;\n }\n messagesObj[prop] = locales[prop].message;\n\n if (locales[prop].placeholders) {\n for (const placeProp in locales[prop].placeholders) {\n if (\n !locales[prop].placeholders.hasOwnProperty(placeProp) || // eslint-disable-line\n !locales[prop].placeholders[placeProp].content\n ) {\n continue;\n }\n\n const replaceToken = \"\\\\$\" + placeProp.toUpperCase() + \"\\\\$\";\n let replaceContent = locales[prop].placeholders[placeProp].content;\n if (replaceContent === \"$1\" || replaceContent === \"$2\" || replaceContent === \"$3\") {\n replaceContent = \"__$\" + replaceContent + \"__\";\n }\n messagesObj[prop] = messagesObj[prop].replace(\n new RegExp(replaceToken, \"g\"),\n replaceContent,\n );\n }\n }\n }\n }\n}\n","import { Observable, firstValueFrom, map } from \"rxjs\";\n\nimport { I18nService as I18nServiceAbstraction } from \"../abstractions/i18n.service\";\nimport { GlobalState, GlobalStateProvider, KeyDefinition, TRANSLATION_DISK } from \"../state\";\n\nimport { TranslationService } from \"./translation.service\";\n\nconst LOCALE_KEY = new KeyDefinition(TRANSLATION_DISK, \"locale\", {\n deserializer: (value) => value,\n});\n\nexport class I18nService extends TranslationService implements I18nServiceAbstraction {\n translationLocale: string;\n protected translationLocaleState: GlobalState;\n userSetLocale$: Observable;\n locale$: Observable;\n\n constructor(\n protected systemLanguage: string,\n protected localesDirectory: string,\n protected getLocalesJson: (formattedLocale: string) => Promise,\n globalStateProvider: GlobalStateProvider,\n ) {\n super(systemLanguage, localesDirectory, getLocalesJson);\n this.translationLocaleState = globalStateProvider.get(LOCALE_KEY);\n this.userSetLocale$ = this.translationLocaleState.state$;\n this.locale$ = this.userSetLocale$.pipe(map((locale) => locale ?? this.translationLocale));\n }\n\n async setLocale(locale: string): Promise {\n await this.translationLocaleState.update(() => locale);\n }\n\n override async init() {\n const storedLocale = await firstValueFrom(this.translationLocaleState.state$);\n await super.init(storedLocale);\n }\n}\n","// Please leave 'en' where it is, as it's our fallback language in case no translation can be found\nexport const SupportedTranslationLocales: string[] = [\n \"en\",\n \"af\",\n \"ar\",\n \"az\",\n \"be\",\n \"bg\",\n \"bn\",\n \"bs\",\n \"ca\",\n \"cs\",\n \"cy\",\n \"da\",\n \"de\",\n \"el\",\n \"en-GB\",\n \"en-IN\",\n \"eo\",\n \"es\",\n \"et\",\n \"eu\",\n \"fa\",\n \"fi\",\n \"fil\",\n \"fr\",\n \"gl\",\n \"he\",\n \"hi\",\n \"hr\",\n \"hu\",\n \"id\",\n \"it\",\n \"ja\",\n \"ka\",\n \"km\",\n \"kn\",\n \"ko\",\n \"lv\",\n \"ml\",\n \"mr\",\n \"my\",\n \"nb\",\n \"ne\",\n \"nl\",\n \"nn\",\n \"or\",\n \"pl\",\n \"pt-PT\",\n \"pt-BR\",\n \"ro\",\n \"ru\",\n \"si\",\n \"sk\",\n \"sl\",\n \"sr\",\n \"sv\",\n \"te\",\n \"th\",\n \"tr\",\n \"uk\",\n \"vi\",\n \"zh-CN\",\n \"zh-TW\",\n];\n","import { ReplaySubject } from \"rxjs\";\n\nimport { AccountService } from \"@bitwarden/common/auth/abstractions/account.service\";\nimport {\n Environment,\n Region,\n RegionConfig,\n Urls,\n} from \"@bitwarden/common/platform/abstractions/environment.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\nimport {\n CloudEnvironment,\n DefaultEnvironmentService,\n SelfHostedEnvironment,\n} from \"@bitwarden/common/platform/services/default-environment.service\";\nimport { StateProvider } from \"@bitwarden/common/platform/state\";\n\n/**\n * Web specific environment service. Ensures that the urls are set from the window location.\n */\nexport class WebEnvironmentService extends DefaultEnvironmentService {\n constructor(\n private win: Window,\n stateProvider: StateProvider,\n accountService: AccountService,\n ) {\n super(stateProvider, accountService);\n\n // The web vault always uses the current location as the base url\n const urls = process.env.URLS as Urls;\n urls.base ??= this.win.location.origin;\n\n // Find the region\n const domain = Utils.getDomain(this.win.location.href);\n const region = this.availableRegions().find((r) => Utils.getDomain(r.urls.webVault) === domain);\n\n let environment: Environment;\n if (region) {\n environment = new WebCloudEnvironment(region, urls);\n } else {\n environment = new SelfHostedEnvironment(urls);\n }\n\n // Override the environment observable with a replay subject\n const subject = new ReplaySubject(1);\n subject.next(environment);\n this.environment$ = subject.asObservable();\n }\n\n // Web cannot set environment\n async setEnvironment(region: Region, urls?: Urls): Promise {\n return;\n }\n}\n\nclass WebCloudEnvironment extends CloudEnvironment {\n constructor(config: RegionConfig, urls: Urls) {\n super(config);\n // We override the urls to avoid CORS issues\n this.urls = urls;\n }\n}\n","import { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { AbstractStorageService } from \"@bitwarden/common/platform/abstractions/storage.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\nimport { MigrationBuilderService } from \"@bitwarden/common/platform/services/migration-builder.service\";\nimport { MigrationRunner } from \"@bitwarden/common/platform/services/migration-runner\";\nimport { MigrationHelper } from \"@bitwarden/common/state-migrations/migration-helper\";\n\nimport { WindowStorageService } from \"./window-storage.service\";\n\nexport class WebMigrationRunner extends MigrationRunner {\n constructor(\n diskStorage: AbstractStorageService,\n logService: LogService,\n migrationBuilderService: MigrationBuilderService,\n private diskLocalStorage: WindowStorageService,\n ) {\n super(diskStorage, logService, migrationBuilderService);\n }\n\n override async run(): Promise {\n // Run the default migration against session storage\n await super.run();\n\n // run web disk local specific migrations\n const migrationBuilder = this.migrationBuilderService.build();\n\n let stateVersion = await this.diskLocalStorage.get(\"stateVersion\");\n if (stateVersion == null) {\n // Web has never stored a state version in disk local before\n // TODO: Is this a good number?\n stateVersion = 12;\n }\n\n // Run migrations again specifically for web `localStorage`.\n const helper = new WebMigrationHelper(stateVersion, this.diskLocalStorage, this.logService);\n\n await migrationBuilder.migrate(helper);\n }\n}\n\nclass WebMigrationHelper extends MigrationHelper {\n private readonly diskLocalStorageService: WindowStorageService;\n\n constructor(\n currentVersion: number,\n storageService: WindowStorageService,\n logService: LogService,\n ) {\n super(currentVersion, storageService, logService, \"web-disk-local\");\n this.diskLocalStorageService = storageService;\n }\n\n override async getAccounts(): Promise<\n { userId: string; account: ExpectedAccountType }[]\n > {\n // Get all the keys of things stored in `localStorage`\n const keys = this.diskLocalStorageService.getKeys();\n\n const accounts: { userId: string; account: ExpectedAccountType }[] = [];\n\n for (const key of keys) {\n // Is this is likely a userid\n if (!Utils.isGuid(key)) {\n continue;\n }\n\n const accountCandidate = await this.diskLocalStorageService.get(key);\n\n // If there isn't data at that key location, don't bother\n if (accountCandidate == null) {\n continue;\n }\n\n // The legacy account object was always an object, if\n // it is some other primitive, it's like a false positive.\n if (typeof accountCandidate !== \"object\") {\n continue;\n }\n\n accounts.push({ userId: key, account: accountCandidate as ExpectedAccountType });\n }\n\n // TODO: Cache this for future calls?\n return accounts;\n }\n}\n","import { Observable, Subject } from \"rxjs\";\n\nimport {\n AbstractStorageService,\n ObservableStorageService,\n StorageUpdate,\n} from \"@bitwarden/common/platform/abstractions/storage.service\";\nimport { StorageOptions } from \"@bitwarden/common/platform/models/domain/storage-options\";\n\nexport class WindowStorageService implements AbstractStorageService, ObservableStorageService {\n private readonly updatesSubject = new Subject();\n\n updates$: Observable;\n constructor(private readonly storage: Storage) {\n this.updates$ = this.updatesSubject.asObservable();\n }\n\n get valuesRequireDeserialization(): boolean {\n return true;\n }\n\n get(key: string, options?: StorageOptions): Promise {\n const jsonValue = this.storage.getItem(key);\n if (jsonValue != null) {\n return Promise.resolve(JSON.parse(jsonValue) as T);\n }\n\n return Promise.resolve(null);\n }\n\n async has(key: string, options?: StorageOptions): Promise {\n return (await this.get(key, options)) != null;\n }\n\n save(key: string, obj: T, options?: StorageOptions): Promise {\n if (obj == null) {\n return this.remove(key, options);\n }\n\n if (obj instanceof Set) {\n obj = Array.from(obj) as T;\n }\n\n this.storage.setItem(key, JSON.stringify(obj));\n this.updatesSubject.next({ key, updateType: \"save\" });\n }\n\n remove(key: string, options?: StorageOptions): Promise {\n this.storage.removeItem(key);\n this.updatesSubject.next({ key, updateType: \"remove\" });\n return Promise.resolve();\n }\n\n getKeys(): string[] {\n return Object.keys(this.storage);\n }\n}\n","import { Injectable } from \"@angular/core\";\n\nimport { BroadcasterService } from \"@bitwarden/common/platform/abstractions/broadcaster.service\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\n\n@Injectable()\nexport class BroadcasterMessagingService implements MessagingService {\n constructor(private broadcasterService: BroadcasterService) {}\n\n send(subscriber: string, arg: any = {}) {\n const message = Object.assign({}, { command: subscriber }, arg);\n this.broadcasterService.send(message);\n }\n}\n","import { Injectable } from \"@angular/core\";\n\nimport { PolicyService } from \"@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction\";\nimport { PolicyType } from \"@bitwarden/common/admin-console/enums\";\nimport { Policy } from \"@bitwarden/common/admin-console/models/domain/policy\";\nimport { DeviceType, EventType } from \"@bitwarden/common/enums\";\nimport { EventResponse } from \"@bitwarden/common/models/response/event.response\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\n\n@Injectable()\nexport class EventService {\n private policies: Policy[];\n\n constructor(\n private i18nService: I18nService,\n policyService: PolicyService,\n ) {\n policyService.policies$.subscribe((policies) => {\n this.policies = policies;\n });\n }\n\n getDefaultDateFilters() {\n const d = new Date();\n const end = new Date(d.getFullYear(), d.getMonth(), d.getDate(), 23, 59);\n d.setDate(d.getDate() - 30);\n const start = new Date(d.getFullYear(), d.getMonth(), d.getDate(), 0, 0);\n return [this.toDateTimeLocalString(start), this.toDateTimeLocalString(end)];\n }\n\n formatDateFilters(filterStart: string, filterEnd: string) {\n const start: Date = new Date(filterStart);\n const end: Date = new Date(filterEnd + \":59.999\");\n if (isNaN(start.getTime()) || isNaN(end.getTime()) || end < start) {\n throw new Error(\"Invalid date range.\");\n }\n return [start.toISOString(), end.toISOString()];\n }\n\n async getEventInfo(ev: EventResponse, options = new EventOptions()): Promise {\n const appInfo = this.getAppInfo(ev);\n const { message, humanReadableMessage } = await this.getEventMessage(ev, options);\n return {\n message: message,\n humanReadableMessage: humanReadableMessage,\n appIcon: appInfo[0],\n appName: appInfo[1],\n };\n }\n\n private async getEventMessage(ev: EventResponse, options: EventOptions) {\n let msg = \"\";\n let humanReadableMsg = \"\";\n switch (ev.type) {\n // User\n case EventType.User_LoggedIn:\n msg = humanReadableMsg = this.i18nService.t(\"loggedIn\");\n break;\n case EventType.User_ChangedPassword:\n msg = humanReadableMsg = this.i18nService.t(\"changedPassword\");\n break;\n case EventType.User_Updated2fa:\n msg = humanReadableMsg = this.i18nService.t(\"enabledUpdated2fa\");\n break;\n case EventType.User_Disabled2fa:\n msg = humanReadableMsg = this.i18nService.t(\"disabled2fa\");\n break;\n case EventType.User_Recovered2fa:\n msg = humanReadableMsg = this.i18nService.t(\"recovered2fa\");\n break;\n case EventType.User_FailedLogIn:\n msg = humanReadableMsg = this.i18nService.t(\"failedLogin\");\n break;\n case EventType.User_FailedLogIn2fa:\n msg = humanReadableMsg = this.i18nService.t(\"failedLogin2fa\");\n break;\n case EventType.User_ClientExportedVault:\n msg = humanReadableMsg = this.i18nService.t(\"exportedVault\");\n break;\n case EventType.User_UpdatedTempPassword:\n msg = humanReadableMsg = this.i18nService.t(\"updatedTempPassword\");\n break;\n case EventType.User_MigratedKeyToKeyConnector:\n msg = humanReadableMsg = this.i18nService.t(\"migratedKeyConnector\");\n break;\n case EventType.User_RequestedDeviceApproval:\n msg = humanReadableMsg = this.i18nService.t(\"requestedDeviceApproval\");\n break;\n // Cipher\n case EventType.Cipher_Created:\n msg = this.i18nService.t(\"createdItemId\", this.formatCipherId(ev, options));\n humanReadableMsg = this.i18nService.t(\"createdItemId\", this.getShortId(ev.cipherId));\n break;\n case EventType.Cipher_Updated:\n msg = this.i18nService.t(\"editedItemId\", this.formatCipherId(ev, options));\n humanReadableMsg = this.i18nService.t(\"editedItemId\", this.getShortId(ev.cipherId));\n break;\n case EventType.Cipher_Deleted:\n msg = this.i18nService.t(\"permanentlyDeletedItemId\", this.formatCipherId(ev, options));\n humanReadableMsg = this.i18nService.t(\n \"permanentlyDeletedItemId\",\n this.getShortId(ev.cipherId),\n );\n break;\n case EventType.Cipher_SoftDeleted:\n msg = this.i18nService.t(\"deletedItemId\", this.formatCipherId(ev, options));\n humanReadableMsg = this.i18nService.t(\"deletedItemId\", this.getShortId(ev.cipherId));\n break;\n case EventType.Cipher_Restored:\n msg = this.i18nService.t(\"restoredItemId\", this.formatCipherId(ev, options));\n humanReadableMsg = this.i18nService.t(\"restoredItemId\", this.formatCipherId(ev, options));\n break;\n case EventType.Cipher_AttachmentCreated:\n msg = this.i18nService.t(\"createdAttachmentForItem\", this.formatCipherId(ev, options));\n humanReadableMsg = this.i18nService.t(\n \"createdAttachmentForItem\",\n this.getShortId(ev.cipherId),\n );\n break;\n case EventType.Cipher_AttachmentDeleted:\n msg = this.i18nService.t(\"deletedAttachmentForItem\", this.formatCipherId(ev, options));\n humanReadableMsg = this.i18nService.t(\n \"deletedAttachmentForItem\",\n this.getShortId(ev.cipherId),\n );\n break;\n case EventType.Cipher_Shared:\n msg = this.i18nService.t(\"movedItemIdToOrg\", this.formatCipherId(ev, options));\n humanReadableMsg = this.i18nService.t(\"movedItemIdToOrg\", this.getShortId(ev.cipherId));\n break;\n case EventType.Cipher_ClientViewed:\n msg = this.i18nService.t(\"viewedItemId\", this.formatCipherId(ev, options));\n humanReadableMsg = this.i18nService.t(\"viewedItemId\", this.getShortId(ev.cipherId));\n break;\n case EventType.Cipher_ClientToggledPasswordVisible:\n msg = this.i18nService.t(\"viewedPasswordItemId\", this.formatCipherId(ev, options));\n humanReadableMsg = this.i18nService.t(\"viewedPasswordItemId\", this.getShortId(ev.cipherId));\n break;\n case EventType.Cipher_ClientToggledHiddenFieldVisible:\n msg = this.i18nService.t(\"viewedHiddenFieldItemId\", this.formatCipherId(ev, options));\n humanReadableMsg = this.i18nService.t(\n \"viewedHiddenFieldItemId\",\n this.getShortId(ev.cipherId),\n );\n break;\n case EventType.Cipher_ClientToggledCardNumberVisible:\n msg = this.i18nService.t(\"viewedCardNumberItemId\", this.formatCipherId(ev, options));\n humanReadableMsg = this.i18nService.t(\n \"viewedCardNumberItemId\",\n this.getShortId(ev.cipherId),\n );\n break;\n case EventType.Cipher_ClientToggledCardCodeVisible:\n msg = this.i18nService.t(\"viewedSecurityCodeItemId\", this.formatCipherId(ev, options));\n humanReadableMsg = this.i18nService.t(\n \"viewedSecurityCodeItemId\",\n this.getShortId(ev.cipherId),\n );\n break;\n case EventType.Cipher_ClientCopiedHiddenField:\n msg = this.i18nService.t(\"copiedHiddenFieldItemId\", this.formatCipherId(ev, options));\n humanReadableMsg = this.i18nService.t(\n \"copiedHiddenFieldItemId\",\n this.getShortId(ev.cipherId),\n );\n break;\n case EventType.Cipher_ClientCopiedPassword:\n msg = this.i18nService.t(\"copiedPasswordItemId\", this.formatCipherId(ev, options));\n humanReadableMsg = this.i18nService.t(\"copiedPasswordItemId\", this.getShortId(ev.cipherId));\n break;\n case EventType.Cipher_ClientCopiedCardCode:\n msg = this.i18nService.t(\"copiedSecurityCodeItemId\", this.formatCipherId(ev, options));\n humanReadableMsg = this.i18nService.t(\n \"copiedSecurityCodeItemId\",\n this.getShortId(ev.cipherId),\n );\n break;\n case EventType.Cipher_ClientAutofilled:\n msg = this.i18nService.t(\"autofilledItemId\", this.formatCipherId(ev, options));\n humanReadableMsg = this.i18nService.t(\"autofilledItemId\", this.getShortId(ev.cipherId));\n break;\n case EventType.Cipher_UpdatedCollections:\n msg = this.i18nService.t(\"editedCollectionsForItem\", this.formatCipherId(ev, options));\n humanReadableMsg = this.i18nService.t(\n \"editedCollectionsForItem\",\n this.getShortId(ev.cipherId),\n );\n break;\n // Collection\n case EventType.Collection_Created:\n msg = this.i18nService.t(\"createdCollectionId\", this.formatCollectionId(ev));\n humanReadableMsg = this.i18nService.t(\n \"createdCollectionId\",\n this.getShortId(ev.collectionId),\n );\n break;\n case EventType.Collection_Updated:\n msg = this.i18nService.t(\"editedCollectionId\", this.formatCollectionId(ev));\n humanReadableMsg = this.i18nService.t(\n \"editedCollectionId\",\n this.getShortId(ev.collectionId),\n );\n break;\n case EventType.Collection_Deleted:\n msg = this.i18nService.t(\"deletedCollectionId\", this.formatCollectionId(ev));\n humanReadableMsg = this.i18nService.t(\n \"deletedCollectionId\",\n this.getShortId(ev.collectionId),\n );\n break;\n // Group\n case EventType.Group_Created:\n msg = this.i18nService.t(\"createdGroupId\", this.formatGroupId(ev));\n humanReadableMsg = this.i18nService.t(\"createdGroupId\", this.getShortId(ev.groupId));\n break;\n case EventType.Group_Updated:\n msg = this.i18nService.t(\"editedGroupId\", this.formatGroupId(ev));\n humanReadableMsg = this.i18nService.t(\"editedGroupId\", this.getShortId(ev.groupId));\n break;\n case EventType.Group_Deleted:\n msg = this.i18nService.t(\"deletedGroupId\", this.formatGroupId(ev));\n humanReadableMsg = this.i18nService.t(\"deletedGroupId\", this.getShortId(ev.groupId));\n break;\n // Org user\n case EventType.OrganizationUser_Invited:\n msg = this.i18nService.t(\"invitedUserId\", this.formatOrgUserId(ev));\n humanReadableMsg = this.i18nService.t(\n \"invitedUserId\",\n this.getShortId(ev.organizationUserId),\n );\n break;\n case EventType.OrganizationUser_Confirmed:\n msg = this.i18nService.t(\"confirmedUserId\", this.formatOrgUserId(ev));\n humanReadableMsg = this.i18nService.t(\n \"confirmedUserId\",\n this.getShortId(ev.organizationUserId),\n );\n break;\n case EventType.OrganizationUser_Updated:\n msg = this.i18nService.t(\"editedUserId\", this.formatOrgUserId(ev));\n humanReadableMsg = this.i18nService.t(\n \"editedUserId\",\n this.getShortId(ev.organizationUserId),\n );\n break;\n case EventType.OrganizationUser_Removed:\n msg = this.i18nService.t(\"removedUserId\", this.formatOrgUserId(ev));\n humanReadableMsg = this.i18nService.t(\n \"removedUserId\",\n this.getShortId(ev.organizationUserId),\n );\n break;\n case EventType.OrganizationUser_UpdatedGroups:\n msg = this.i18nService.t(\"editedGroupsForUser\", this.formatOrgUserId(ev));\n humanReadableMsg = this.i18nService.t(\n \"editedGroupsForUser\",\n this.getShortId(ev.organizationUserId),\n );\n break;\n case EventType.OrganizationUser_UnlinkedSso:\n msg = this.i18nService.t(\"unlinkedSsoUser\", this.formatOrgUserId(ev));\n humanReadableMsg = this.i18nService.t(\n \"unlinkedSsoUser\",\n this.getShortId(ev.organizationUserId),\n );\n break;\n case EventType.OrganizationUser_ResetPassword_Enroll:\n msg = this.i18nService.t(\"eventEnrollAccountRecovery\", this.formatOrgUserId(ev));\n humanReadableMsg = this.i18nService.t(\n \"eventEnrollAccountRecovery\",\n this.getShortId(ev.organizationUserId),\n );\n break;\n case EventType.OrganizationUser_ResetPassword_Withdraw:\n msg = this.i18nService.t(\"eventWithdrawAccountRecovery\", this.formatOrgUserId(ev));\n humanReadableMsg = this.i18nService.t(\n \"eventWithdrawAccountRecovery\",\n this.getShortId(ev.organizationUserId),\n );\n break;\n case EventType.OrganizationUser_AdminResetPassword:\n msg = this.i18nService.t(\"eventAdminPasswordReset\", this.formatOrgUserId(ev));\n humanReadableMsg = this.i18nService.t(\n \"eventAdminPasswordReset\",\n this.getShortId(ev.organizationUserId),\n );\n break;\n case EventType.OrganizationUser_ResetSsoLink:\n msg = this.i18nService.t(\"eventResetSsoLink\", this.formatOrgUserId(ev));\n humanReadableMsg = this.i18nService.t(\n \"eventResetSsoLink\",\n this.getShortId(ev.organizationUserId),\n );\n break;\n case EventType.OrganizationUser_FirstSsoLogin:\n msg = this.i18nService.t(\"firstSsoLogin\", this.formatOrgUserId(ev));\n humanReadableMsg = this.i18nService.t(\n \"firstSsoLogin\",\n this.getShortId(ev.organizationUserId),\n );\n break;\n case EventType.OrganizationUser_Revoked:\n msg = this.i18nService.t(\"revokedUserId\", this.formatOrgUserId(ev));\n humanReadableMsg = this.i18nService.t(\n \"revokedUserId\",\n this.getShortId(ev.organizationUserId),\n );\n break;\n case EventType.OrganizationUser_Restored:\n msg = this.i18nService.t(\"restoredUserId\", this.formatOrgUserId(ev));\n humanReadableMsg = this.i18nService.t(\n \"restoredUserId\",\n this.getShortId(ev.organizationUserId),\n );\n break;\n case EventType.OrganizationUser_ApprovedAuthRequest:\n msg = this.i18nService.t(\"approvedAuthRequest\", this.formatOrgUserId(ev));\n humanReadableMsg = this.i18nService.t(\n \"approvedAuthRequest\",\n this.getShortId(ev.organizationUserId),\n );\n break;\n case EventType.OrganizationUser_RejectedAuthRequest:\n msg = this.i18nService.t(\"rejectedAuthRequest\", this.formatOrgUserId(ev));\n humanReadableMsg = this.i18nService.t(\n \"rejectedAuthRequest\",\n this.getShortId(ev.organizationUserId),\n );\n break;\n // Org\n case EventType.Organization_Updated:\n msg = humanReadableMsg = this.i18nService.t(\"editedOrgSettings\");\n break;\n case EventType.Organization_PurgedVault:\n msg = humanReadableMsg = this.i18nService.t(\"purgedOrganizationVault\");\n break;\n case EventType.Organization_ClientExportedVault:\n msg = humanReadableMsg = this.i18nService.t(\"exportedOrganizationVault\");\n break;\n case EventType.Organization_VaultAccessed:\n msg = humanReadableMsg = this.i18nService.t(\"vaultAccessedByProvider\");\n break;\n case EventType.Organization_EnabledSso:\n msg = humanReadableMsg = this.i18nService.t(\"enabledSso\");\n break;\n case EventType.Organization_DisabledSso:\n msg = humanReadableMsg = this.i18nService.t(\"disabledSso\");\n break;\n case EventType.Organization_EnabledKeyConnector:\n msg = humanReadableMsg = this.i18nService.t(\"enabledKeyConnector\");\n break;\n case EventType.Organization_DisabledKeyConnector:\n msg = humanReadableMsg = this.i18nService.t(\"disabledKeyConnector\");\n break;\n case EventType.Organization_SponsorshipsSynced:\n msg = humanReadableMsg = this.i18nService.t(\"sponsorshipsSynced\");\n break;\n case EventType.Organization_CollectionManagementUpdated:\n msg = this.i18nService.t(\"modifiedCollectionManagement\", this.formatOrganizationId(ev));\n humanReadableMsg = this.i18nService.t(\n \"modifiedCollectionManagement\",\n this.getShortId(ev.organizationId),\n );\n break;\n\n // Policies\n case EventType.Policy_Updated: {\n msg = this.i18nService.t(\"modifiedPolicyId\", this.formatPolicyId(ev));\n\n const policy = this.policies.filter((p) => p.id === ev.policyId)[0];\n let p1 = this.getShortId(ev.policyId);\n if (policy != null) {\n p1 = PolicyType[policy.type];\n }\n\n humanReadableMsg = this.i18nService.t(\"modifiedPolicyId\", p1);\n break;\n }\n // Provider users:\n case EventType.ProviderUser_Invited:\n msg = this.i18nService.t(\"invitedUserId\", this.formatProviderUserId(ev));\n humanReadableMsg = this.i18nService.t(\"invitedUserId\", this.getShortId(ev.providerUserId));\n break;\n case EventType.ProviderUser_Confirmed:\n msg = this.i18nService.t(\"confirmedUserId\", this.formatProviderUserId(ev));\n humanReadableMsg = this.i18nService.t(\n \"confirmedUserId\",\n this.getShortId(ev.providerUserId),\n );\n break;\n case EventType.ProviderUser_Updated:\n msg = this.i18nService.t(\"editedUserId\", this.formatProviderUserId(ev));\n humanReadableMsg = this.i18nService.t(\"editedUserId\", this.getShortId(ev.providerUserId));\n break;\n case EventType.ProviderUser_Removed:\n msg = this.i18nService.t(\"removedUserId\", this.formatProviderUserId(ev));\n humanReadableMsg = this.i18nService.t(\"removedUserId\", this.getShortId(ev.providerUserId));\n break;\n case EventType.ProviderOrganization_Created:\n msg = this.i18nService.t(\"createdOrganizationId\", this.formatProviderOrganizationId(ev));\n humanReadableMsg = this.i18nService.t(\n \"createdOrganizationId\",\n this.getShortId(ev.providerOrganizationId),\n );\n break;\n case EventType.ProviderOrganization_Added:\n msg = this.i18nService.t(\"addedOrganizationId\", this.formatProviderOrganizationId(ev));\n humanReadableMsg = this.i18nService.t(\n \"addedOrganizationId\",\n this.getShortId(ev.providerOrganizationId),\n );\n break;\n case EventType.ProviderOrganization_Removed:\n msg = this.i18nService.t(\"removedOrganizationId\", this.formatProviderOrganizationId(ev));\n humanReadableMsg = this.i18nService.t(\n \"removedOrganizationId\",\n this.getShortId(ev.providerOrganizationId),\n );\n break;\n case EventType.ProviderOrganization_VaultAccessed:\n msg = this.i18nService.t(\"accessedClientVault\", this.formatProviderOrganizationId(ev));\n humanReadableMsg = this.i18nService.t(\n \"accessedClientVault\",\n this.getShortId(ev.providerOrganizationId),\n );\n break;\n // Org Domain claiming events\n case EventType.OrganizationDomain_Added:\n msg = humanReadableMsg = this.i18nService.t(\"addedDomain\", ev.domainName);\n break;\n case EventType.OrganizationDomain_Removed:\n msg = humanReadableMsg = this.i18nService.t(\"removedDomain\", ev.domainName);\n break;\n case EventType.OrganizationDomain_Verified:\n msg = humanReadableMsg = this.i18nService.t(\"domainVerifiedEvent\", ev.domainName);\n break;\n case EventType.OrganizationDomain_NotVerified:\n msg = humanReadableMsg = this.i18nService.t(\"domainNotVerifiedEvent\", ev.domainName);\n break;\n // Secrets Manager\n case EventType.Secret_Retrieved:\n msg = this.i18nService.t(\"accessedSecret\", this.formatSecretId(ev));\n humanReadableMsg = this.i18nService.t(\"accessedSecret\", this.getShortId(ev.secretId));\n break;\n default:\n break;\n }\n return {\n message: msg === \"\" ? null : msg,\n humanReadableMessage: humanReadableMsg === \"\" ? null : humanReadableMsg,\n };\n }\n\n private getAppInfo(ev: EventResponse): [string, string] {\n if (ev.serviceAccountId) {\n return [\"bwi-globe\", this.i18nService.t(\"sdk\")];\n }\n\n switch (ev.deviceType) {\n case DeviceType.Android:\n return [\"bwi-android\", this.i18nService.t(\"mobile\") + \" - Android\"];\n case DeviceType.iOS:\n return [\"bwi-apple\", this.i18nService.t(\"mobile\") + \" - iOS\"];\n case DeviceType.UWP:\n return [\"bwi-windows\", this.i18nService.t(\"mobile\") + \" - Windows\"];\n case DeviceType.ChromeExtension:\n return [\"bwi-chrome\", this.i18nService.t(\"extension\") + \" - Chrome\"];\n case DeviceType.FirefoxExtension:\n return [\"bwi-firefox\", this.i18nService.t(\"extension\") + \" - Firefox\"];\n case DeviceType.OperaExtension:\n return [\"bwi-opera\", this.i18nService.t(\"extension\") + \" - Opera\"];\n case DeviceType.EdgeExtension:\n return [\"bwi-edge\", this.i18nService.t(\"extension\") + \" - Edge\"];\n case DeviceType.VivaldiExtension:\n return [\"bwi-puzzle\", this.i18nService.t(\"extension\") + \" - Vivaldi\"];\n case DeviceType.SafariExtension:\n return [\"bwi-safari\", this.i18nService.t(\"extension\") + \" - Safari\"];\n case DeviceType.WindowsDesktop:\n return [\"bwi-windows\", this.i18nService.t(\"desktop\") + \" - Windows\"];\n case DeviceType.MacOsDesktop:\n return [\"bwi-apple\", this.i18nService.t(\"desktop\") + \" - macOS\"];\n case DeviceType.LinuxDesktop:\n return [\"bwi-linux\", this.i18nService.t(\"desktop\") + \" - Linux\"];\n case DeviceType.ChromeBrowser:\n return [\"bwi-globe\", this.i18nService.t(\"webVault\") + \" - Chrome\"];\n case DeviceType.FirefoxBrowser:\n return [\"bwi-globe\", this.i18nService.t(\"webVault\") + \" - Firefox\"];\n case DeviceType.OperaBrowser:\n return [\"bwi-globe\", this.i18nService.t(\"webVault\") + \" - Opera\"];\n case DeviceType.SafariBrowser:\n return [\"bwi-globe\", this.i18nService.t(\"webVault\") + \" - Safari\"];\n case DeviceType.VivaldiBrowser:\n return [\"bwi-globe\", this.i18nService.t(\"webVault\") + \" - Vivaldi\"];\n case DeviceType.EdgeBrowser:\n return [\"bwi-globe\", this.i18nService.t(\"webVault\") + \" - Edge\"];\n case DeviceType.IEBrowser:\n return [\"bwi-globe\", this.i18nService.t(\"webVault\") + \" - IE\"];\n case DeviceType.Server:\n return [\"bwi-server\", this.i18nService.t(\"server\")];\n case DeviceType.WindowsCLI:\n return [\"bwi-cli\", this.i18nService.t(\"cli\") + \" - Windows\"];\n case DeviceType.MacOsCLI:\n return [\"bwi-cli\", this.i18nService.t(\"cli\") + \" - macOS\"];\n case DeviceType.LinuxCLI:\n return [\"bwi-cli\", this.i18nService.t(\"cli\") + \" - Linux\"];\n case DeviceType.UnknownBrowser:\n return [\n \"bwi-globe\",\n this.i18nService.t(\"webVault\") + \" - \" + this.i18nService.t(\"unknown\"),\n ];\n default:\n return [\"bwi-globe\", this.i18nService.t(\"unknown\")];\n }\n }\n\n private formatCipherId(ev: EventResponse, options: EventOptions) {\n const shortId = this.getShortId(ev.cipherId);\n if (ev.organizationId == null || !options.cipherInfo) {\n return \"\" + shortId + \"\";\n }\n const a = this.makeAnchor(shortId);\n a.setAttribute(\n \"href\",\n `#/organizations/${ev.organizationId}/vault?search=${shortId}&viewEvents=${ev.cipherId}&type=all`,\n );\n return a.outerHTML;\n }\n\n private formatGroupId(ev: EventResponse) {\n const shortId = this.getShortId(ev.groupId);\n const a = this.makeAnchor(shortId);\n a.setAttribute(\"href\", \"#/organizations/\" + ev.organizationId + \"/groups?search=\" + shortId);\n return a.outerHTML;\n }\n\n private formatCollectionId(ev: EventResponse) {\n const shortId = this.getShortId(ev.collectionId);\n const a = this.makeAnchor(shortId);\n a.setAttribute(\n \"href\",\n `#/organizations/${ev.organizationId}/vault?collectionId=${ev.collectionId}`,\n );\n return a.outerHTML;\n }\n\n private formatOrgUserId(ev: EventResponse) {\n const shortId = this.getShortId(ev.organizationUserId);\n const a = this.makeAnchor(shortId);\n a.setAttribute(\n \"href\",\n \"#/organizations/\" +\n ev.organizationId +\n \"/members?search=\" +\n shortId +\n \"&viewEvents=\" +\n ev.organizationUserId,\n );\n return a.outerHTML;\n }\n\n private formatProviderUserId(ev: EventResponse) {\n const shortId = this.getShortId(ev.providerUserId);\n const a = this.makeAnchor(shortId);\n a.setAttribute(\n \"href\",\n \"#/providers/\" +\n ev.providerId +\n \"/manage/people?search=\" +\n shortId +\n \"&viewEvents=\" +\n ev.providerUserId,\n );\n return a.outerHTML;\n }\n\n private formatProviderOrganizationId(ev: EventResponse) {\n const shortId = this.getShortId(ev.providerOrganizationId);\n const a = this.makeAnchor(shortId);\n a.setAttribute(\"href\", \"#/providers/\" + ev.providerId + \"/clients?search=\" + shortId);\n return a.outerHTML;\n }\n\n private formatOrganizationId(ev: EventResponse) {\n const shortId = this.getShortId(ev.organizationId);\n const a = this.makeAnchor(shortId);\n a.setAttribute(\"href\", \"#/organizations/\" + ev.organizationId + \"/settings/account\");\n return a.outerHTML;\n }\n\n private formatPolicyId(ev: EventResponse) {\n const shortId = this.getShortId(ev.policyId);\n const a = this.makeAnchor(shortId);\n a.setAttribute(\n \"href\",\n \"#/organizations/\" + ev.organizationId + \"/settings/policies?policyId=\" + ev.policyId,\n );\n return a.outerHTML;\n }\n\n formatSecretId(ev: EventResponse): string {\n const shortId = this.getShortId(ev.secretId);\n const a = this.makeAnchor(shortId);\n a.setAttribute(\"href\", \"#/sm/\" + ev.organizationId + \"/secrets?search=\" + shortId);\n return a.outerHTML;\n }\n\n private makeAnchor(shortId: string) {\n const a = document.createElement(\"a\");\n a.title = this.i18nService.t(\"view\");\n a.innerHTML = \"\" + shortId + \"\";\n return a;\n }\n\n private getShortId(id: string) {\n return id?.substring(0, 8);\n }\n\n private toDateTimeLocalString(date: Date) {\n return (\n date.getFullYear() +\n \"-\" +\n this.pad(date.getMonth() + 1) +\n \"-\" +\n this.pad(date.getDate()) +\n \"T\" +\n this.pad(date.getHours()) +\n \":\" +\n this.pad(date.getMinutes())\n );\n }\n\n private pad(num: number) {\n const norm = Math.floor(Math.abs(num));\n return (norm < 10 ? \"0\" : \"\") + norm;\n }\n}\n\nexport class EventInfo {\n message: string;\n humanReadableMessage: string;\n appIcon: string;\n appName: string;\n}\n\nexport class EventOptions {\n cipherInfo = true;\n}\n","import { CryptoService } from \"../abstractions/crypto.service\";\nimport { EncryptService } from \"../abstractions/encrypt.service\";\n\nexport class ContainerService {\n constructor(\n private cryptoService: CryptoService,\n private encryptService: EncryptService,\n ) {}\n\n attachToGlobal(global: any) {\n if (!global.bitwardenContainerService) {\n global.bitwardenContainerService = this;\n }\n }\n\n /**\n * @throws Will throw if CryptoService was not instantiated and provided to the ContainerService constructor\n */\n getCryptoService(): CryptoService {\n if (this.cryptoService == null) {\n throw new Error(\"ContainerService.cryptoService not initialized.\");\n }\n return this.cryptoService;\n }\n\n /**\n * @throws Will throw if EncryptService was not instantiated and provided to the ContainerService constructor\n */\n getEncryptService(): EncryptService {\n if (this.encryptService == null) {\n throw new Error(\"ContainerService.encryptService not initialized.\");\n }\n return this.encryptService;\n }\n}\n","import { DOCUMENT } from \"@angular/common\";\nimport { Inject, Injectable } from \"@angular/core\";\n\nimport { AbstractThemingService } from \"@bitwarden/angular/platform/services/theming/theming.service.abstraction\";\nimport { WINDOW } from \"@bitwarden/angular/services/injection-tokens\";\nimport { EventUploadService as EventUploadServiceAbstraction } from \"@bitwarden/common/abstractions/event/event-upload.service\";\nimport { NotificationsService as NotificationsServiceAbstraction } from \"@bitwarden/common/abstractions/notifications.service\";\nimport { TwoFactorService as TwoFactorServiceAbstraction } from \"@bitwarden/common/auth/abstractions/two-factor.service\";\nimport { CryptoService as CryptoServiceAbstraction } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { EncryptService } from \"@bitwarden/common/platform/abstractions/encrypt.service\";\nimport { I18nService as I18nServiceAbstraction } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { StateService as StateServiceAbstraction } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { ConfigService } from \"@bitwarden/common/platform/services/config/config.service\";\nimport { ContainerService } from \"@bitwarden/common/platform/services/container.service\";\nimport { EventUploadService } from \"@bitwarden/common/services/event/event-upload.service\";\nimport { VaultTimeoutService } from \"@bitwarden/common/services/vault-timeout/vault-timeout.service\";\n\n@Injectable()\nexport class InitService {\n constructor(\n @Inject(WINDOW) private win: Window,\n private notificationsService: NotificationsServiceAbstraction,\n private vaultTimeoutService: VaultTimeoutService,\n private i18nService: I18nServiceAbstraction,\n private eventUploadService: EventUploadServiceAbstraction,\n private twoFactorService: TwoFactorServiceAbstraction,\n private stateService: StateServiceAbstraction,\n private cryptoService: CryptoServiceAbstraction,\n private themingService: AbstractThemingService,\n private encryptService: EncryptService,\n private configService: ConfigService,\n @Inject(DOCUMENT) private document: Document,\n ) {}\n\n init() {\n return async () => {\n await this.stateService.init();\n\n setTimeout(() => this.notificationsService.init(), 3000);\n await this.vaultTimeoutService.init(true);\n await this.i18nService.init();\n (this.eventUploadService as EventUploadService).init(true);\n this.twoFactorService.init();\n const htmlEl = this.win.document.documentElement;\n htmlEl.classList.add(\"locale_\" + this.i18nService.translationLocale);\n this.themingService.applyThemeChangesTo(this.document);\n const containerService = new ContainerService(this.cryptoService, this.encryptService);\n containerService.attachToGlobal(this.win);\n\n this.configService.init();\n };\n }\n}\n","import { Injectable, Injector } from \"@angular/core\";\nimport * as jq from \"jquery\";\nimport { first } from \"rxjs/operators\";\n\nimport { ModalRef } from \"@bitwarden/angular/components/modal/modal.ref\";\nimport { ModalService as BaseModalService } from \"@bitwarden/angular/services/modal.service\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\n\n@Injectable()\nexport class ModalService extends BaseModalService {\n el: any = null;\n modalOpen = false;\n\n constructor(\n injector: Injector,\n private messagingService: MessagingService,\n ) {\n super(injector);\n }\n\n protected setupHandlers(modalRef: ModalRef) {\n modalRef.onCreated.pipe(first()).subscribe(() => {\n const modals = Array.from(document.querySelectorAll(\".modal\"));\n if (modals.length > 0) {\n this.el = jq(modals[0]);\n this.el.modal(\"show\");\n\n this.el.on(\"show.bs.modal\", () => {\n modalRef.show();\n this.messagingService.send(\"modalShow\");\n });\n this.el.on(\"shown.bs.modal\", () => {\n modalRef.shown();\n this.messagingService.send(\"modalShown\");\n if (!Utils.isMobileBrowser) {\n this.el.find(\"*[appAutoFocus]\").focus();\n }\n });\n this.el.on(\"hide.bs.modal\", () => {\n this.messagingService.send(\"modalClose\");\n });\n this.el.on(\"hidden.bs.modal\", () => {\n modalRef.closed();\n this.messagingService.send(\"modalClosed\");\n });\n }\n });\n\n modalRef.onClose.pipe(first()).subscribe(() => {\n if (this.el != null) {\n this.el.modal(\"hide\");\n }\n });\n }\n}\n","import {\n Account as BaseAccount,\n AccountSettings as BaseAccountSettings,\n} from \"@bitwarden/common/platform/models/domain/account\";\n\nexport class AccountSettings extends BaseAccountSettings {\n vaultTimeout: number = process.env.NODE_ENV === \"development\" ? null : 15;\n}\n\nexport class Account extends BaseAccount {\n settings?: AccountSettings = new AccountSettings();\n\n constructor(init: Partial) {\n super(init);\n Object.assign(this.settings, {\n ...new AccountSettings(),\n ...this.settings,\n });\n }\n}\n","import { Inject, Injectable } from \"@angular/core\";\n\nimport {\n MEMORY_STORAGE,\n SECURE_STORAGE,\n STATE_FACTORY,\n STATE_SERVICE_USE_CACHE,\n} from \"@bitwarden/angular/services/injection-tokens\";\nimport { AccountService } from \"@bitwarden/common/auth/abstractions/account.service\";\nimport { TokenService } from \"@bitwarden/common/auth/abstractions/token.service\";\nimport { EnvironmentService } from \"@bitwarden/common/platform/abstractions/environment.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport {\n AbstractMemoryStorageService,\n AbstractStorageService,\n} from \"@bitwarden/common/platform/abstractions/storage.service\";\nimport { StateFactory } from \"@bitwarden/common/platform/factories/state-factory\";\nimport { StorageOptions } from \"@bitwarden/common/platform/models/domain/storage-options\";\nimport { MigrationRunner } from \"@bitwarden/common/platform/services/migration-runner\";\nimport { StateService as BaseStateService } from \"@bitwarden/common/platform/services/state.service\";\nimport { SendData } from \"@bitwarden/common/tools/send/models/data/send.data\";\nimport { CipherData } from \"@bitwarden/common/vault/models/data/cipher.data\";\n\nimport { Account } from \"./account\";\nimport { GlobalState } from \"./global-state\";\n\n@Injectable()\nexport class StateService extends BaseStateService {\n constructor(\n storageService: AbstractStorageService,\n @Inject(SECURE_STORAGE) secureStorageService: AbstractStorageService,\n @Inject(MEMORY_STORAGE) memoryStorageService: AbstractMemoryStorageService,\n logService: LogService,\n @Inject(STATE_FACTORY) stateFactory: StateFactory,\n accountService: AccountService,\n environmentService: EnvironmentService,\n tokenService: TokenService,\n migrationRunner: MigrationRunner,\n @Inject(STATE_SERVICE_USE_CACHE) useAccountCache = true,\n ) {\n super(\n storageService,\n secureStorageService,\n memoryStorageService,\n logService,\n stateFactory,\n accountService,\n environmentService,\n tokenService,\n migrationRunner,\n useAccountCache,\n );\n }\n\n async addAccount(account: Account) {\n // Apply web overrides to default account values\n account = new Account(account);\n await super.addAccount(account);\n }\n\n async getEncryptedCiphers(options?: StorageOptions): Promise<{ [id: string]: CipherData }> {\n options = this.reconcileOptions(options, await this.defaultInMemoryOptions());\n return await super.getEncryptedCiphers(options);\n }\n\n async setEncryptedCiphers(\n value: { [id: string]: CipherData },\n options?: StorageOptions,\n ): Promise {\n options = this.reconcileOptions(options, await this.defaultInMemoryOptions());\n return await super.setEncryptedCiphers(value, options);\n }\n\n async getEncryptedSends(options?: StorageOptions): Promise<{ [id: string]: SendData }> {\n options = this.reconcileOptions(options, await this.defaultInMemoryOptions());\n return await super.getEncryptedSends(options);\n }\n\n async setEncryptedSends(\n value: { [id: string]: SendData },\n options?: StorageOptions,\n ): Promise {\n options = this.reconcileOptions(options, await this.defaultInMemoryOptions());\n return await super.setEncryptedSends(value, options);\n }\n\n override async getLastSync(options?: StorageOptions): Promise {\n options = this.reconcileOptions(options, await this.defaultInMemoryOptions());\n return await super.getLastSync(options);\n }\n\n override async setLastSync(value: string, options?: StorageOptions): Promise {\n options = this.reconcileOptions(options, await this.defaultInMemoryOptions());\n return await super.setLastSync(value, options);\n }\n}\n","import { FileDownloadRequest } from \"./file-download.request\";\n\nexport class FileDownloadBuilder {\n get blobOptions(): any {\n const options = this._request.blobOptions ?? {};\n if (options.type == null) {\n options.type = this.fileType;\n }\n return options;\n }\n\n get blob(): Blob {\n if (this.blobOptions != null) {\n return new Blob([this._request.blobData], this.blobOptions);\n } else {\n return new Blob([this._request.blobData]);\n }\n }\n\n get downloadMethod(): \"save\" | \"open\" {\n if (this._request.downloadMethod != null) {\n return this._request.downloadMethod;\n }\n return this.fileType != \"application/pdf\" ? \"save\" : \"open\";\n }\n\n private get fileType() {\n const fileNameLower = this._request.fileName.toLowerCase();\n if (fileNameLower.endsWith(\".pdf\")) {\n return \"application/pdf\";\n } else if (fileNameLower.endsWith(\".xlsx\")) {\n return \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\";\n } else if (fileNameLower.endsWith(\".docx\")) {\n return \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\";\n } else if (fileNameLower.endsWith(\".pptx\")) {\n return \"application/vnd.openxmlformats-officedocument.presentationml.presentation\";\n } else if (fileNameLower.endsWith(\".csv\")) {\n return \"text/csv\";\n } else if (fileNameLower.endsWith(\".png\")) {\n return \"image/png\";\n } else if (fileNameLower.endsWith(\".jpg\") || fileNameLower.endsWith(\".jpeg\")) {\n return \"image/jpeg\";\n } else if (fileNameLower.endsWith(\".gif\")) {\n return \"image/gif\";\n }\n return null;\n }\n\n constructor(private readonly _request: FileDownloadRequest) {}\n}\n","import { Injectable } from \"@angular/core\";\n\nimport { FileDownloadBuilder } from \"@bitwarden/common/platform/abstractions/file-download/file-download.builder\";\nimport { FileDownloadRequest } from \"@bitwarden/common/platform/abstractions/file-download/file-download.request\";\nimport { FileDownloadService } from \"@bitwarden/common/platform/abstractions/file-download/file-download.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\n\n@Injectable()\nexport class WebFileDownloadService implements FileDownloadService {\n constructor(private platformUtilsService: PlatformUtilsService) {}\n\n download(request: FileDownloadRequest): void {\n const builder = new FileDownloadBuilder(request);\n const a = window.document.createElement(\"a\");\n if (builder.downloadMethod === \"save\") {\n a.download = request.fileName;\n } else if (!this.platformUtilsService.isSafari()) {\n a.rel = \"noreferrer\";\n a.target = \"_blank\";\n }\n a.href = URL.createObjectURL(builder.blob);\n a.style.position = \"fixed\";\n window.document.body.appendChild(a);\n a.click();\n window.document.body.removeChild(a);\n }\n}\n","import { CommonModule } from \"@angular/common\";\nimport { APP_INITIALIZER, NgModule, Optional, SkipSelf } from \"@angular/core\";\n\nimport {\n SECURE_STORAGE,\n STATE_FACTORY,\n STATE_SERVICE_USE_CACHE,\n LOCALES_DIRECTORY,\n SYSTEM_LANGUAGE,\n MEMORY_STORAGE,\n OBSERVABLE_MEMORY_STORAGE,\n OBSERVABLE_DISK_STORAGE,\n OBSERVABLE_DISK_LOCAL_STORAGE,\n WINDOW,\n} from \"@bitwarden/angular/services/injection-tokens\";\nimport { JslibServicesModule } from \"@bitwarden/angular/services/jslib-services.module\";\nimport { ModalService as ModalServiceAbstraction } from \"@bitwarden/angular/services/modal.service\";\nimport { AccountService } from \"@bitwarden/common/auth/abstractions/account.service\";\nimport { LoginService as LoginServiceAbstraction } from \"@bitwarden/common/auth/abstractions/login.service\";\nimport { LoginService } from \"@bitwarden/common/auth/services/login.service\";\nimport { EnvironmentService } from \"@bitwarden/common/platform/abstractions/environment.service\";\nimport { FileDownloadService } from \"@bitwarden/common/platform/abstractions/file-download/file-download.service\";\nimport { I18nService as I18nServiceAbstraction } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { MessagingService as MessagingServiceAbstraction } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { PlatformUtilsService as PlatformUtilsServiceAbstraction } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService as BaseStateServiceAbstraction } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { AbstractStorageService } from \"@bitwarden/common/platform/abstractions/storage.service\";\nimport { ThemeType } from \"@bitwarden/common/platform/enums\";\nimport { StateFactory } from \"@bitwarden/common/platform/factories/state-factory\";\nimport { MemoryStorageService } from \"@bitwarden/common/platform/services/memory-storage.service\";\nimport { MigrationBuilderService } from \"@bitwarden/common/platform/services/migration-builder.service\";\nimport { MigrationRunner } from \"@bitwarden/common/platform/services/migration-runner\";\nimport { StorageServiceProvider } from \"@bitwarden/common/platform/services/storage-service.provider\";\n/* eslint-disable import/no-restricted-paths -- Implementation for memory storage */\nimport { GlobalStateProvider, StateProvider } from \"@bitwarden/common/platform/state\";\nimport { MemoryStorageService as MemoryStorageServiceForStateProviders } from \"@bitwarden/common/platform/state/storage/memory-storage.service\";\n/* eslint-enable import/no-restricted-paths -- Implementation for memory storage */\nimport {\n DefaultThemeStateService,\n ThemeStateService,\n} from \"@bitwarden/common/platform/theming/theme-state.service\";\n\nimport { PolicyListService } from \"../admin-console/core/policy-list.service\";\nimport { HtmlStorageService } from \"../core/html-storage.service\";\nimport { I18nService } from \"../core/i18n.service\";\nimport { WebEnvironmentService } from \"../platform/web-environment.service\";\nimport { WebMigrationRunner } from \"../platform/web-migration-runner\";\nimport { WebStorageServiceProvider } from \"../platform/web-storage-service.provider\";\nimport { WindowStorageService } from \"../platform/window-storage.service\";\nimport { CollectionAdminService } from \"../vault/core/collection-admin.service\";\n\nimport { BroadcasterMessagingService } from \"./broadcaster-messaging.service\";\nimport { EventService } from \"./event.service\";\nimport { InitService } from \"./init.service\";\nimport { ModalService } from \"./modal.service\";\nimport { RouterService } from \"./router.service\";\nimport { Account, GlobalState, StateService } from \"./state\";\nimport { WebFileDownloadService } from \"./web-file-download.service\";\nimport { WebPlatformUtilsService } from \"./web-platform-utils.service\";\n\n@NgModule({\n declarations: [],\n imports: [CommonModule, JslibServicesModule],\n providers: [\n InitService,\n RouterService,\n EventService,\n PolicyListService,\n {\n provide: APP_INITIALIZER,\n useFactory: (initService: InitService) => initService.init(),\n deps: [InitService],\n multi: true,\n },\n {\n provide: STATE_FACTORY,\n useValue: new StateFactory(GlobalState, Account),\n },\n {\n provide: STATE_SERVICE_USE_CACHE,\n useValue: false,\n },\n {\n provide: I18nServiceAbstraction,\n useClass: I18nService,\n deps: [SYSTEM_LANGUAGE, LOCALES_DIRECTORY, GlobalStateProvider],\n },\n { provide: AbstractStorageService, useClass: HtmlStorageService },\n {\n provide: SECURE_STORAGE,\n // TODO: platformUtilsService.isDev has a helper for this, but using that service here results in a circular dependency.\n // We have a tech debt item in the backlog to break up platformUtilsService, but in the meantime simply checking the environment here is less cumbersome.\n useClass: process.env.NODE_ENV === \"development\" ? HtmlStorageService : MemoryStorageService,\n },\n {\n provide: MEMORY_STORAGE,\n useClass: MemoryStorageService,\n },\n { provide: OBSERVABLE_MEMORY_STORAGE, useClass: MemoryStorageServiceForStateProviders },\n {\n provide: OBSERVABLE_DISK_STORAGE,\n useFactory: () => new WindowStorageService(window.sessionStorage),\n },\n {\n provide: PlatformUtilsServiceAbstraction,\n useClass: WebPlatformUtilsService,\n },\n { provide: MessagingServiceAbstraction, useClass: BroadcasterMessagingService },\n { provide: ModalServiceAbstraction, useClass: ModalService },\n StateService,\n {\n provide: BaseStateServiceAbstraction,\n useExisting: StateService,\n },\n {\n provide: FileDownloadService,\n useClass: WebFileDownloadService,\n },\n {\n provide: LoginServiceAbstraction,\n useClass: LoginService,\n deps: [StateService],\n },\n CollectionAdminService,\n {\n provide: OBSERVABLE_DISK_LOCAL_STORAGE,\n useFactory: () => new WindowStorageService(window.localStorage),\n },\n {\n provide: StorageServiceProvider,\n useClass: WebStorageServiceProvider,\n deps: [OBSERVABLE_DISK_STORAGE, OBSERVABLE_MEMORY_STORAGE, OBSERVABLE_DISK_LOCAL_STORAGE],\n },\n {\n provide: MigrationRunner,\n useClass: WebMigrationRunner,\n deps: [\n AbstractStorageService,\n LogService,\n MigrationBuilderService,\n OBSERVABLE_DISK_LOCAL_STORAGE,\n ],\n },\n {\n provide: EnvironmentService,\n useClass: WebEnvironmentService,\n deps: [WINDOW, StateProvider, AccountService],\n },\n {\n provide: ThemeStateService,\n useFactory: (globalStateProvider: GlobalStateProvider) =>\n // Web chooses to have Light as the default theme\n new DefaultThemeStateService(globalStateProvider, ThemeType.Light),\n deps: [GlobalStateProvider],\n },\n ],\n})\nexport class CoreModule {\n constructor(@Optional() @SkipSelf() parentModule?: CoreModule) {\n if (parentModule) {\n throw new Error(\"CoreModule is already loaded. Import it in the AppModule only\");\n }\n }\n}\n","import { GlobalState as BaseGlobalState } from \"@bitwarden/common/platform/models/domain/global-state\";\n\nexport class GlobalState extends BaseGlobalState {\n rememberEmail = true;\n}\n","import { I18nService as BaseI18nService } from \"@bitwarden/common/platform/services/i18n.service\";\nimport { GlobalStateProvider } from \"@bitwarden/common/platform/state\";\n\nimport { SupportedTranslationLocales } from \"../../translation-constants\";\n\nexport class I18nService extends BaseI18nService {\n constructor(\n systemLanguage: string,\n localesDirectory: string,\n globalStateProvider: GlobalStateProvider,\n ) {\n super(\n systemLanguage || \"en-US\",\n localesDirectory,\n async (formattedLocale: string) => {\n const filePath =\n this.localesDirectory +\n \"/\" +\n formattedLocale +\n \"/messages.json?cache=\" +\n process.env.CACHE_TAG;\n const localesResult = await fetch(filePath);\n const locales = await localesResult.json();\n return locales;\n },\n globalStateProvider,\n );\n\n this.supportedTranslationLocales = SupportedTranslationLocales;\n }\n}\n","import { Subject } from \"rxjs\";\n\nimport {\n AbstractMemoryStorageService,\n ObservableStorageService,\n StorageUpdate,\n} from \"../../abstractions/storage.service\";\n\nexport class MemoryStorageService\n extends AbstractMemoryStorageService\n implements ObservableStorageService\n{\n protected store: Record = {};\n private updatesSubject = new Subject();\n\n get valuesRequireDeserialization(): boolean {\n return true;\n }\n get updates$() {\n return this.updatesSubject.asObservable();\n }\n\n get(key: string): Promise {\n const json = this.store[key];\n if (json) {\n const obj = JSON.parse(json as string);\n return Promise.resolve(obj as T);\n }\n return Promise.resolve(null);\n }\n\n async has(key: string): Promise {\n return (await this.get(key)) != null;\n }\n\n save(key: string, obj: T): Promise {\n if (obj == null) {\n return this.remove(key);\n }\n // TODO: Remove once foreground/background contexts are separated in browser\n // Needed to ensure ownership of all memory by the context running the storage service\n this.store[key] = JSON.stringify(obj);\n this.updatesSubject.next({ key, updateType: \"save\" });\n return Promise.resolve();\n }\n\n remove(key: string): Promise {\n delete this.store[key];\n this.updatesSubject.next({ key, updateType: \"remove\" });\n return Promise.resolve();\n }\n\n getBypassCache(key: string): Promise {\n return this.get(key);\n }\n}\n","import {\n AbstractStorageService,\n ObservableStorageService,\n} from \"@bitwarden/common/platform/abstractions/storage.service\";\nimport {\n PossibleLocation,\n StorageServiceProvider,\n} from \"@bitwarden/common/platform/services/storage-service.provider\";\nimport {\n ClientLocations,\n // eslint-disable-next-line import/no-restricted-paths\n} from \"@bitwarden/common/platform/state/state-definition\";\n\nexport class WebStorageServiceProvider extends StorageServiceProvider {\n constructor(\n diskStorageService: AbstractStorageService & ObservableStorageService,\n memoryStorageService: AbstractStorageService & ObservableStorageService,\n private readonly diskLocalStorageService: AbstractStorageService & ObservableStorageService,\n ) {\n super(diskStorageService, memoryStorageService);\n }\n\n override get(\n defaultLocation: PossibleLocation,\n overrides: Partial,\n ): [location: PossibleLocation, service: AbstractStorageService & ObservableStorageService] {\n const location = overrides[\"web\"] ?? defaultLocation;\n switch (location) {\n case \"disk-local\":\n return [\"disk-local\", this.diskLocalStorageService];\n default:\n // Pass in computed location to super because they could have\n // overriden default \"disk\" with web \"memory\".\n return super.get(location, overrides);\n }\n }\n}\n","import { Injectable } from \"@angular/core\";\nimport { Title } from \"@angular/platform-browser\";\nimport { ActivatedRoute, NavigationEnd, Router } from \"@angular/router\";\nimport { filter } from \"rxjs\";\n\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\n\n@Injectable()\nexport class RouterService {\n private previousUrl: string = undefined;\n private currentUrl: string = undefined;\n\n constructor(\n private router: Router,\n private activatedRoute: ActivatedRoute,\n private titleService: Title,\n private stateService: StateService,\n i18nService: I18nService,\n ) {\n this.currentUrl = this.router.url;\n\n router.events\n .pipe(filter((e) => e instanceof NavigationEnd))\n .subscribe((event: NavigationEnd) => {\n this.currentUrl = event.url;\n\n let title = i18nService.t(\"bitWebVault\");\n\n if (this.currentUrl.includes(\"/sm/\")) {\n title = i18nService.t(\"bitSecretsManager\");\n }\n\n let child = this.activatedRoute.firstChild;\n while (child.firstChild) {\n child = child.firstChild;\n }\n\n const titleId: string = child?.snapshot?.data?.titleId;\n const rawTitle: string = child?.snapshot?.data?.title;\n const updateUrl = !child?.snapshot?.data?.doNotSaveUrl ?? true;\n\n if (titleId != null || rawTitle != null) {\n const newTitle = rawTitle != null ? rawTitle : i18nService.t(titleId);\n if (newTitle != null && newTitle !== \"\") {\n title = newTitle + \" | \" + title;\n }\n }\n this.titleService.setTitle(title);\n if (updateUrl) {\n this.setPreviousUrl(this.currentUrl);\n }\n });\n }\n\n getPreviousUrl(): string | undefined {\n return this.previousUrl;\n }\n\n setPreviousUrl(url: string): void {\n this.previousUrl = url;\n }\n\n /**\n * Save URL to Global State. This service is used during the login process\n * @param url URL being saved to the Global State\n */\n async persistLoginRedirectUrl(url: string): Promise {\n await this.stateService.setDeepLinkRedirectUrl(url);\n }\n\n /**\n * Fetch and clear persisted LoginRedirectUrl if present in state\n */\n async getAndClearLoginRedirectUrl(): Promise | undefined {\n const persistedPreLoginUrl = await this.stateService.getDeepLinkRedirectUrl();\n\n if (!Utils.isNullOrEmpty(persistedPreLoginUrl)) {\n await this.persistLoginRedirectUrl(null);\n return persistedPreLoginUrl;\n }\n\n return;\n }\n}\n","import { Injectable } from \"@angular/core\";\n\nimport { ClientType, DeviceType } from \"@bitwarden/common/enums\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\n\n@Injectable()\nexport class WebPlatformUtilsService implements PlatformUtilsService {\n private browserCache: DeviceType = null;\n\n constructor(\n private i18nService: I18nService,\n private messagingService: MessagingService,\n private logService: LogService,\n ) {}\n\n getDevice(): DeviceType {\n if (this.browserCache != null) {\n return this.browserCache;\n }\n\n if (\n navigator.userAgent.indexOf(\" Firefox/\") !== -1 ||\n navigator.userAgent.indexOf(\" Gecko/\") !== -1\n ) {\n this.browserCache = DeviceType.FirefoxBrowser;\n } else if (navigator.userAgent.indexOf(\" OPR/\") >= 0) {\n this.browserCache = DeviceType.OperaBrowser;\n } else if (navigator.userAgent.indexOf(\" Edg/\") !== -1) {\n this.browserCache = DeviceType.EdgeBrowser;\n } else if (navigator.userAgent.indexOf(\" Vivaldi/\") !== -1) {\n this.browserCache = DeviceType.VivaldiBrowser;\n } else if (\n navigator.userAgent.indexOf(\" Safari/\") !== -1 &&\n navigator.userAgent.indexOf(\"Chrome\") === -1\n ) {\n this.browserCache = DeviceType.SafariBrowser;\n } else if ((window as any).chrome && navigator.userAgent.indexOf(\" Chrome/\") !== -1) {\n this.browserCache = DeviceType.ChromeBrowser;\n } else if (navigator.userAgent.indexOf(\" Trident/\") !== -1) {\n this.browserCache = DeviceType.IEBrowser;\n } else {\n this.browserCache = DeviceType.UnknownBrowser;\n }\n\n return this.browserCache;\n }\n\n getDeviceString(): string {\n const device = DeviceType[this.getDevice()].toLowerCase();\n return device.replace(\"browser\", \"\");\n }\n\n getClientType() {\n return ClientType.Web;\n }\n\n isFirefox(): boolean {\n return this.getDevice() === DeviceType.FirefoxBrowser;\n }\n\n isChrome(): boolean {\n return this.getDevice() === DeviceType.ChromeBrowser;\n }\n\n isEdge(): boolean {\n return this.getDevice() === DeviceType.EdgeBrowser;\n }\n\n isOpera(): boolean {\n return this.getDevice() === DeviceType.OperaBrowser;\n }\n\n isVivaldi(): boolean {\n return this.getDevice() === DeviceType.VivaldiBrowser;\n }\n\n isSafari(): boolean {\n return this.getDevice() === DeviceType.SafariBrowser;\n }\n\n isMacAppStore(): boolean {\n return false;\n }\n\n isViewOpen(): Promise {\n return Promise.resolve(false);\n }\n\n launchUri(uri: string, options?: any): void {\n const a = document.createElement(\"a\");\n a.href = uri;\n if (options == null || !options.sameWindow) {\n a.target = \"_blank\";\n a.rel = \"noreferrer noopener\";\n }\n a.classList.add(\"d-none\");\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n }\n\n getApplicationVersion(): Promise {\n return Promise.resolve(process.env.APPLICATION_VERSION || \"-\");\n }\n\n async getApplicationVersionNumber(): Promise {\n return (await this.getApplicationVersion()).split(RegExp(\"[+|-]\"))[0].trim();\n }\n\n supportsWebAuthn(win: Window): boolean {\n return typeof PublicKeyCredential !== \"undefined\";\n }\n\n supportsDuo(): boolean {\n return true;\n }\n\n showToast(\n type: \"error\" | \"success\" | \"warning\" | \"info\",\n title: string,\n text: string | string[],\n options?: any,\n ): void {\n this.messagingService.send(\"showToast\", {\n text: text,\n title: title,\n type: type,\n options: options,\n });\n }\n\n isDev(): boolean {\n return process.env.NODE_ENV === \"development\";\n }\n\n isSelfHost(): boolean {\n return WebPlatformUtilsService.isSelfHost();\n }\n\n static isSelfHost(): boolean {\n return process.env.ENV.toString() === \"selfhosted\";\n }\n\n copyToClipboard(text: string, options?: any): void | boolean {\n let win = window;\n let doc = window.document;\n if (options && (options.window || options.win)) {\n win = options.window || options.win;\n doc = win.document;\n } else if (options && options.doc) {\n doc = options.doc;\n }\n if (doc.queryCommandSupported && doc.queryCommandSupported(\"copy\")) {\n const textarea = doc.createElement(\"textarea\");\n textarea.textContent = text;\n // Prevent scrolling to bottom of page in MS Edge.\n textarea.style.position = \"fixed\";\n let copyEl = doc.body;\n // For some reason copy command won't work when modal is open if appending to body\n if (doc.body.classList.contains(\"modal-open\")) {\n copyEl = doc.body.querySelector(\".modal\");\n }\n copyEl.appendChild(textarea);\n textarea.select();\n let success = false;\n try {\n // Security exception may be thrown by some browsers.\n success = doc.execCommand(\"copy\");\n if (!success) {\n this.logService.debug(\"Copy command unsupported or disabled.\");\n }\n } catch (e) {\n // eslint-disable-next-line\n console.warn(\"Copy to clipboard failed.\", e);\n } finally {\n copyEl.removeChild(textarea);\n }\n return success;\n }\n }\n\n readFromClipboard(options?: any): Promise {\n throw new Error(\"Cannot read from clipboard on web.\");\n }\n\n supportsBiometric() {\n return Promise.resolve(false);\n }\n\n authenticateBiometric() {\n return Promise.resolve(false);\n }\n\n supportsSecureStorage() {\n return false;\n }\n\n getAutofillKeyboardShortcut(): Promise {\n return null;\n }\n}\n","import { Component, OnDestroy, OnInit } from \"@angular/core\";\n\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\n\n@Component({\n selector: \"app-frontend-layout\",\n templateUrl: \"frontend-layout.component.html\",\n})\nexport class FrontendLayoutComponent implements OnInit, OnDestroy {\n version: string;\n year = \"2015\";\n\n constructor(private platformUtilsService: PlatformUtilsService) {}\n\n async ngOnInit() {\n this.year = new Date().getFullYear().toString();\n this.version = await this.platformUtilsService.getApplicationVersion();\n\n document.body.classList.add(\"layout_frontend\");\n }\n\n ngOnDestroy() {\n document.body.classList.remove(\"layout_frontend\");\n }\n}\n","\n
\n \n © {{ year }} Bitwarden Inc.
\n {{ \"versionNumber\" | i18n: version }}\n
\n","\n
\n \n \n \n \n \n {{\n product.name\n }}\n \n \n\n \n 0\"\n class=\"tw-mt-4 tw-flex tw-w-full tw-flex-col tw-gap-2 tw-border-0 tw-border-t tw-border-solid tw-border-t-text-muted tw-p-2 tw-pb-0\"\n >\n {{ \"moreFromBitwarden\" | i18n }}\n \n \n {{ product.name }}\n \n \n \n
\n
\n","import { Component, ViewChild } from \"@angular/core\";\nimport { ActivatedRoute, Router } from \"@angular/router\";\nimport { combineLatest, concatMap } from \"rxjs\";\n\nimport {\n canAccessOrgAdmin,\n OrganizationService,\n} from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport { ProviderService } from \"@bitwarden/common/admin-console/abstractions/provider.service\";\nimport { MenuComponent } from \"@bitwarden/components\";\n\ntype ProductSwitcherItem = {\n /**\n * Displayed name\n */\n name: string;\n\n /**\n * Displayed icon\n */\n icon: string;\n\n /**\n * Route for items in the `bentoProducts$` section\n */\n appRoute?: string | any[];\n\n /**\n * Route for items in the `otherProducts$` section\n */\n marketingRoute?: string | any[];\n\n /**\n * Used to apply css styles to show when a button is selected\n */\n isActive?: boolean;\n};\n\n@Component({\n selector: \"product-switcher-content\",\n templateUrl: \"./product-switcher-content.component.html\",\n})\nexport class ProductSwitcherContentComponent {\n @ViewChild(\"menu\")\n menu: MenuComponent;\n\n protected products$ = combineLatest([\n this.organizationService.organizations$,\n this.route.paramMap,\n ]).pipe(\n concatMap(async ([orgs, paramMap]) => {\n const routeOrg = orgs.find((o) => o.id === paramMap.get(\"organizationId\"));\n // If the active route org doesn't have access to SM, find the first org that does.\n const smOrg =\n routeOrg?.canAccessSecretsManager && routeOrg?.enabled == true\n ? routeOrg\n : orgs.find((o) => o.canAccessSecretsManager && o.enabled == true);\n\n // If the active route org doesn't have access to AC, find the first org that does.\n const acOrg =\n routeOrg != null && canAccessOrgAdmin(routeOrg)\n ? routeOrg\n : orgs.find((o) => canAccessOrgAdmin(o));\n\n // TODO: This should be migrated to an Observable provided by the provider service and moved to the combineLatest above. See AC-2092.\n const providers = await this.providerService.getAll();\n\n /**\n * We can update this to the \"satisfies\" type upon upgrading to TypeScript 4.9\n * https://devblogs.microsoft.com/typescript/announcing-typescript-4-9/#satisfies\n */\n const products: Record<\"pm\" | \"sm\" | \"ac\" | \"provider\" | \"orgs\", ProductSwitcherItem> = {\n pm: {\n name: \"Password Manager\",\n icon: \"bwi-lock\",\n appRoute: \"/vault\",\n marketingRoute: \"https://bitwarden.com/products/personal/\",\n isActive:\n !this.router.url.includes(\"/sm/\") &&\n !this.router.url.includes(\"/organizations/\") &&\n !this.router.url.includes(\"/providers/\"),\n },\n sm: {\n name: \"Secrets Manager\",\n icon: \"bwi-cli\",\n appRoute: [\"/sm\", smOrg?.id],\n marketingRoute: \"https://bitwarden.com/products/secrets-manager/\",\n isActive: this.router.url.includes(\"/sm/\"),\n },\n ac: {\n name: \"Admin Console\",\n icon: \"bwi-business\",\n appRoute: [\"/organizations\", acOrg?.id],\n marketingRoute: \"https://bitwarden.com/products/business/\",\n isActive: this.router.url.includes(\"/organizations/\"),\n },\n provider: {\n name: \"Provider Portal\",\n icon: \"bwi-provider\",\n appRoute: [\"/providers\", providers[0]?.id],\n isActive: this.router.url.includes(\"/providers/\"),\n },\n orgs: {\n name: \"Organizations\",\n icon: \"bwi-business\",\n marketingRoute: \"https://bitwarden.com/products/business/\",\n },\n };\n\n const bento: ProductSwitcherItem[] = [products.pm];\n const other: ProductSwitcherItem[] = [];\n\n if (smOrg) {\n bento.push(products.sm);\n } else {\n other.push(products.sm);\n }\n\n if (acOrg) {\n bento.push(products.ac);\n } else {\n other.push(products.orgs);\n }\n\n if (providers.length > 0) {\n bento.push(products.provider);\n }\n\n return {\n bento,\n other,\n };\n }),\n );\n\n constructor(\n private organizationService: OrganizationService,\n private providerService: ProviderService,\n private route: ActivatedRoute,\n private router: Router,\n ) {}\n}\n","\n \n \n\n","import { AfterViewInit, ChangeDetectorRef, Component, Input } from \"@angular/core\";\n\nimport { IconButtonType } from \"@bitwarden/components/src/icon-button/icon-button.component\";\n\nimport { flagEnabled } from \"../../../utils/flags\";\n\n@Component({\n selector: \"product-switcher\",\n templateUrl: \"./product-switcher.component.html\",\n})\nexport class ProductSwitcherComponent implements AfterViewInit {\n protected isEnabled = flagEnabled(\"secretsManager\");\n\n /**\n * Passed to the product switcher's `bitIconButton`\n */\n @Input()\n buttonType: IconButtonType = \"main\";\n\n ngAfterViewInit() {\n /**\n * Resolves https://angular.io/errors/NG0100 [SM-403]\n *\n * Caused by `[bitMenuTriggerFor]=\"content?.menu\"` in template\n */\n this.changeDetector.detectChanges();\n }\n\n constructor(private changeDetector: ChangeDetectorRef) {}\n}\n","import { NgModule } from \"@angular/core\";\n\nimport { BannerModule } from \"@bitwarden/components\";\n\nimport { DynamicAvatarComponent } from \"../../components/dynamic-avatar.component\";\nimport { SharedModule } from \"../../shared\";\nimport { ProductSwitcherModule } from \"../product-switcher/product-switcher.module\";\n\nimport { WebHeaderComponent } from \"./web-header.component\";\n\n@NgModule({\n imports: [SharedModule, DynamicAvatarComponent, ProductSwitcherModule, BannerModule],\n declarations: [WebHeaderComponent],\n exports: [WebHeaderComponent],\n})\nexport class HeaderModule {}\n","import { Injectable } from \"@angular/core\";\n\nimport {\n GlobalStateProvider,\n KeyDefinition,\n NEW_WEB_LAYOUT_BANNER_DISK,\n} from \"@bitwarden/common/platform/state\";\n\nconst SHOW_BANNER_KEY = new KeyDefinition(NEW_WEB_LAYOUT_BANNER_DISK, \"showBanner\", {\n deserializer: (b) => {\n if (b === null) {\n return true;\n }\n return b;\n },\n});\n\n/** Displays a banner that introduces users to the new web vault layout. */\n@Injectable({ providedIn: \"root\" })\nexport class WebLayoutMigrationBannerService {\n private _showBannerState = this.globalStateProvider.get(SHOW_BANNER_KEY);\n showBanner$ = this._showBannerState.state$;\n\n constructor(private globalStateProvider: GlobalStateProvider) {}\n\n async hideBanner() {\n await this._showBannerState.update(() => false);\n }\n}\n","\n {{ \"newWebApp\" | i18n }}\n {{ \"releaseBlog\" | i18n }}\n\n\n
\n
\n \n \n \n {{ title || (routeData.titleId | i18n) }}\n \n \n
\n
\n
\n \n \n \n \n \n \n\n \n
\n \n \n
\n {{ \"loggedInAs\" | i18n }}\n \n {{ account | userName }}\n \n
\n
\n\n \n \n \n {{ hostname }}\n \n \n\n \n\n \n \n {{ \"accountSettings\" | i18n }}\n \n \n \n {{ \"getHelp\" | i18n }}\n \n \n \n {{ \"getApps\" | i18n }}\n \n\n \n\n \n \n
\n \n \n
\n \n \n
\n \n \n \n \n \n\n","import { Component, Input } from \"@angular/core\";\nimport { ActivatedRoute } from \"@angular/router\";\nimport { combineLatest, map, Observable } from \"rxjs\";\n\nimport { VaultTimeoutSettingsService } from \"@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service\";\nimport { VaultTimeoutAction } from \"@bitwarden/common/enums/vault-timeout-action.enum\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { AccountProfile } from \"@bitwarden/common/platform/models/domain/account\";\n\nimport { WebLayoutMigrationBannerService } from \"./web-layout-migration-banner.service\";\n\n@Component({\n selector: \"app-header\",\n templateUrl: \"./web-header.component.html\",\n})\nexport class WebHeaderComponent {\n /**\n * Custom title that overrides the route data `titleId`\n */\n @Input() title: string;\n\n /**\n * Icon to show before the title\n */\n @Input() icon: string;\n\n protected routeData$: Observable<{ titleId: string }>;\n protected account$: Observable;\n protected canLock$: Observable;\n protected selfHosted: boolean;\n protected hostname = location.hostname;\n\n constructor(\n private route: ActivatedRoute,\n private stateService: StateService,\n private platformUtilsService: PlatformUtilsService,\n private vaultTimeoutSettingsService: VaultTimeoutSettingsService,\n private messagingService: MessagingService,\n protected webLayoutMigrationBannerService: WebLayoutMigrationBannerService,\n ) {\n this.routeData$ = this.route.data.pipe(\n map((params) => {\n return {\n titleId: params.titleId,\n };\n }),\n );\n\n this.selfHosted = this.platformUtilsService.isSelfHost();\n\n this.account$ = combineLatest([\n this.stateService.activeAccount$,\n this.stateService.accounts$,\n ]).pipe(\n map(([activeAccount, accounts]) => {\n return accounts[activeAccount]?.profile;\n }),\n );\n this.canLock$ = this.vaultTimeoutSettingsService\n .availableVaultTimeoutActions$()\n .pipe(map((actions) => actions.includes(VaultTimeoutAction.Lock)));\n }\n\n protected lock() {\n this.messagingService.send(\"lockVault\");\n }\n\n protected logout() {\n this.messagingService.send(\"logout\");\n }\n}\n","import { Component } from \"@angular/core\";\n\n@Component({\n selector: \"bit-nav-divider\",\n templateUrl: \"./nav-divider.component.html\",\n})\nexport class NavDividerComponent {}\n","
\n","\n \n \n \n \n \n \n \n \n\n","import { CommonModule } from \"@angular/common\";\nimport { Component, EventEmitter, Input, Output } from \"@angular/core\";\nimport { ActivatedRoute } from \"@angular/router\";\nimport { combineLatest, map, Observable } from \"rxjs\";\n\nimport { JslibModule } from \"@bitwarden/angular/jslib.module\";\nimport { OrganizationService } from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport type { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\nimport { NavigationModule } from \"@bitwarden/components\";\n\n@Component({\n selector: \"org-switcher\",\n templateUrl: \"org-switcher.component.html\",\n standalone: true,\n imports: [CommonModule, JslibModule, NavigationModule],\n})\nexport class OrgSwitcherComponent {\n protected organizations$: Observable =\n this.organizationService.organizations$.pipe(\n map((orgs) =>\n orgs.filter((org) => this.filter(org)).sort((a, b) => a.name.localeCompare(b.name)),\n ),\n );\n\n protected activeOrganization$: Observable = combineLatest([\n this.route.paramMap,\n this.organizations$,\n ]).pipe(map(([params, orgs]) => orgs.find((org) => org.id === params.get(\"organizationId\"))));\n\n /**\n * Filter function for displayed organizations in the `org-switcher`\n * @example\n * const smFilter = (org: Organization) => org.canAccessSecretsManager\n * // \n */\n @Input()\n filter: (org: Organization) => boolean = () => true;\n\n /**\n * Is `true` if the expanded content is visible\n */\n @Input()\n open = false;\n @Output()\n openChange = new EventEmitter();\n\n /**\n * Visibility of the New Organization button\n * (Temporary; will be removed when ability to create organizations is added to SM.)\n */\n @Input()\n hideNewButton = false;\n\n constructor(\n private route: ActivatedRoute,\n private organizationService: OrganizationService,\n ) {}\n\n protected toggle(event?: MouseEvent) {\n event?.stopPropagation();\n this.open = !this.open;\n this.openChange.emit(this.open);\n }\n}\n","import { A11yModule } from \"@angular/cdk/a11y\";\nimport { NgModule } from \"@angular/core\";\nimport { RouterModule } from \"@angular/router\";\n\nimport { I18nPipe } from \"@bitwarden/angular/platform/pipes/i18n.pipe\";\n\nimport { SharedModule } from \"../../shared\";\n\nimport { ProductSwitcherContentComponent } from \"./product-switcher-content.component\";\nimport { ProductSwitcherComponent } from \"./product-switcher.component\";\n\n@NgModule({\n imports: [SharedModule, A11yModule, RouterModule],\n declarations: [ProductSwitcherComponent, ProductSwitcherContentComponent],\n exports: [ProductSwitcherComponent],\n providers: [I18nPipe],\n})\nexport class ProductSwitcherModule {}\n","import { svgIcon } from \"@bitwarden/components\";\n\nexport const SecretsManagerLogo = svgIcon`\n \n`;\n","import { svgIcon } from \"@bitwarden/components\";\n\nexport const PasswordManagerLogo = svgIcon`\n\n`;\n","\n \n \n \n\n","import { CommonModule } from \"@angular/common\";\nimport { Component, NgZone, OnDestroy, OnInit } from \"@angular/core\";\nimport { RouterModule } from \"@angular/router\";\nimport { firstValueFrom } from \"rxjs\";\n\nimport { JslibModule } from \"@bitwarden/angular/jslib.module\";\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { OrganizationService } from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport { BillingAccountProfileStateService } from \"@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service\";\nimport { FeatureFlag } from \"@bitwarden/common/enums/feature-flag.enum\";\nimport { BroadcasterService } from \"@bitwarden/common/platform/abstractions/broadcaster.service\";\nimport { ConfigServiceAbstraction as ConfigService } from \"@bitwarden/common/platform/abstractions/config/config.service.abstraction\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { SyncService } from \"@bitwarden/common/vault/abstractions/sync/sync.service.abstraction\";\nimport { IconModule, LayoutComponent, NavigationModule } from \"@bitwarden/components\";\n\nimport { PaymentMethodWarningsModule } from \"../billing/shared\";\n\nimport { PasswordManagerLogo } from \"./password-manager-logo\";\n\nconst BroadcasterSubscriptionId = \"UserLayoutComponent\";\n\n@Component({\n selector: \"app-user-layout\",\n templateUrl: \"user-layout.component.html\",\n standalone: true,\n imports: [\n CommonModule,\n RouterModule,\n JslibModule,\n LayoutComponent,\n IconModule,\n NavigationModule,\n PaymentMethodWarningsModule,\n ],\n})\nexport class UserLayoutComponent implements OnInit, OnDestroy {\n protected readonly logo = PasswordManagerLogo;\n hasFamilySponsorshipAvailable: boolean;\n hideSubscription: boolean;\n\n protected showPaymentMethodWarningBanners$ = this.configService.getFeatureFlag$(\n FeatureFlag.ShowPaymentMethodWarningBanners,\n false,\n );\n\n constructor(\n private broadcasterService: BroadcasterService,\n private ngZone: NgZone,\n private platformUtilsService: PlatformUtilsService,\n private organizationService: OrganizationService,\n private apiService: ApiService,\n private syncService: SyncService,\n private configService: ConfigService,\n private billingAccountProfileStateService: BillingAccountProfileStateService,\n ) {}\n\n async ngOnInit() {\n document.body.classList.remove(\"layout_frontend\");\n\n this.broadcasterService.subscribe(BroadcasterSubscriptionId, async (message: any) => {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.ngZone.run(async () => {\n switch (message.command) {\n case \"purchasedPremium\":\n await this.load();\n break;\n default:\n }\n });\n });\n\n await this.syncService.fullSync(false);\n await this.load();\n }\n\n ngOnDestroy() {\n this.broadcasterService.unsubscribe(BroadcasterSubscriptionId);\n }\n\n async load() {\n const hasPremiumPersonally = await firstValueFrom(\n this.billingAccountProfileStateService.hasPremiumPersonally$,\n );\n const hasPremiumFromOrg = await firstValueFrom(\n this.billingAccountProfileStateService.hasPremiumFromAnyOrganization$,\n );\n const selfHosted = this.platformUtilsService.isSelfHost();\n\n this.hasFamilySponsorshipAvailable = await this.organizationService.canManageSponsorships();\n let billing = null;\n if (!selfHosted) {\n // TODO: We should remove the need to call this!\n billing = await this.apiService.getUserBillingHistory();\n }\n this.hideSubscription =\n !hasPremiumPersonally && hasPremiumFromOrg && (selfHosted || billing?.hasNoHistory);\n }\n}\n","
\n
\n \"Bitwarden\"\n

\n \n {{ \"loading\" | i18n }}\n

\n
\n
\n","import { Component } from \"@angular/core\";\nimport { Params } from \"@angular/router\";\n\nimport { BaseAcceptComponent } from \"../../../common/base.accept.component\";\n\n@Component({\n selector: \"app-accept-family-sponsorship\",\n templateUrl: \"accept-family-sponsorship.component.html\",\n})\nexport class AcceptFamilySponsorshipComponent extends BaseAcceptComponent {\n failedShortMessage = \"inviteAcceptFailedShort\";\n failedMessage = \"inviteAcceptFailed\";\n\n requiredParameters = [\"email\", \"token\"];\n\n async authedHandler(qParams: Params) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/setup/families-for-enterprise\"], { queryParams: qParams });\n }\n\n async unauthedHandler(qParams: Params) {\n if (!qParams.register) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/login\"], { queryParams: { email: qParams.email } });\n } else {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/register\"], { queryParams: { email: qParams.email } });\n }\n }\n}\n","import { PlanSponsorshipType } from \"../../../../billing/enums\";\n\nexport class OrganizationSponsorshipRedeemRequest {\n planSponsorshipType: PlanSponsorshipType;\n sponsoredOrganizationId: string;\n}\n","
\n
\n

{{ \"sponsoredFamiliesOffer\" | i18n }}

\n
\n
\n \n {{ \"loading\" | i18n }}\n
\n
\n {{ \"badToken\" | i18n }}\n
\n \n

\n {{ \"acceptBitwardenFamiliesHelp\" | i18n }}\n

\n
\n \n \n \n \n \n \n
\n
\n \n
\n
\n \n
\n \n
\n","import { Component, OnDestroy, OnInit, ViewChild } from \"@angular/core\";\nimport { ActivatedRoute, Router } from \"@angular/router\";\nimport { lastValueFrom, Observable, Subject } from \"rxjs\";\nimport { first, map, takeUntil } from \"rxjs/operators\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { OrganizationService } from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\nimport { OrganizationSponsorshipRedeemRequest } from \"@bitwarden/common/admin-console/models/request/organization/organization-sponsorship-redeem.request\";\nimport { PlanSponsorshipType, PlanType } from \"@bitwarden/common/billing/enums\";\nimport { ProductType } from \"@bitwarden/common/enums\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { ValidationService } from \"@bitwarden/common/platform/abstractions/validation.service\";\nimport { SyncService } from \"@bitwarden/common/vault/abstractions/sync/sync.service.abstraction\";\nimport { DialogService } from \"@bitwarden/components\";\n\nimport { OrganizationPlansComponent } from \"../../../billing\";\nimport { SharedModule } from \"../../../shared\";\nimport {\n DeleteOrganizationDialogResult,\n openDeleteOrganizationDialog,\n} from \"../settings/components\";\n\n@Component({\n templateUrl: \"families-for-enterprise-setup.component.html\",\n standalone: true,\n imports: [SharedModule, OrganizationPlansComponent],\n})\nexport class FamiliesForEnterpriseSetupComponent implements OnInit, OnDestroy {\n @ViewChild(OrganizationPlansComponent, { static: false })\n set organizationPlansComponent(value: OrganizationPlansComponent) {\n if (!value) {\n return;\n }\n\n value.plan = PlanType.FamiliesAnnually;\n value.product = ProductType.Families;\n value.acceptingSponsorship = true;\n // eslint-disable-next-line rxjs-angular/prefer-takeuntil\n value.onSuccess.subscribe(this.onOrganizationCreateSuccess.bind(this));\n }\n\n loading = true;\n badToken = false;\n formPromise: Promise;\n\n token: string;\n existingFamilyOrganizations: Organization[];\n existingFamilyOrganizations$: Observable;\n\n showNewOrganization = false;\n _organizationPlansComponent: OrganizationPlansComponent;\n _selectedFamilyOrganizationId = \"\";\n\n private _destroy = new Subject();\n\n constructor(\n private router: Router,\n private platformUtilsService: PlatformUtilsService,\n private i18nService: I18nService,\n private route: ActivatedRoute,\n private apiService: ApiService,\n private syncService: SyncService,\n private validationService: ValidationService,\n private organizationService: OrganizationService,\n private dialogService: DialogService,\n ) {}\n\n async ngOnInit() {\n document.body.classList.remove(\"layout_frontend\");\n // eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe\n this.route.queryParams.pipe(first()).subscribe(async (qParams) => {\n const error = qParams.token == null;\n if (error) {\n this.platformUtilsService.showToast(\n \"error\",\n null,\n this.i18nService.t(\"sponsoredFamiliesAcceptFailed\"),\n { timeout: 10000 },\n );\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/\"]);\n return;\n }\n\n this.token = qParams.token;\n\n await this.syncService.fullSync(true);\n this.badToken = !(await this.apiService.postPreValidateSponsorshipToken(this.token));\n this.loading = false;\n });\n\n this.existingFamilyOrganizations$ = this.organizationService.organizations$.pipe(\n map((orgs) => orgs.filter((o) => o.planProductType === ProductType.Families)),\n );\n\n this.existingFamilyOrganizations$.pipe(takeUntil(this._destroy)).subscribe((orgs) => {\n if (orgs.length === 0) {\n this.selectedFamilyOrganizationId = \"createNew\";\n }\n });\n }\n\n ngOnDestroy(): void {\n this._destroy.next();\n this._destroy.complete();\n }\n\n async submit() {\n this.formPromise = this.doSubmit(this._selectedFamilyOrganizationId);\n await this.formPromise;\n this.formPromise = null;\n }\n\n get selectedFamilyOrganizationId() {\n return this._selectedFamilyOrganizationId;\n }\n\n set selectedFamilyOrganizationId(value: string) {\n this._selectedFamilyOrganizationId = value;\n this.showNewOrganization = value === \"createNew\";\n }\n\n private async doSubmit(organizationId: string) {\n try {\n const request = new OrganizationSponsorshipRedeemRequest();\n request.planSponsorshipType = PlanSponsorshipType.FamiliesForEnterprise;\n request.sponsoredOrganizationId = organizationId;\n\n await this.apiService.postRedeemSponsorship(this.token, request);\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"sponsoredFamiliesOfferRedeemed\"),\n );\n await this.syncService.fullSync(true);\n\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/\"]);\n } catch (e) {\n if (this.showNewOrganization) {\n const dialog = openDeleteOrganizationDialog(this.dialogService, {\n data: {\n organizationId: organizationId,\n requestType: \"InvalidFamiliesForEnterprise\",\n },\n });\n\n const result = await lastValueFrom(dialog.closed);\n\n if (result === DeleteOrganizationDialogResult.Deleted) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/\"]);\n }\n }\n this.validationService.showError(this.i18nService.t(\"sponsorshipTokenHasExpired\"));\n }\n }\n\n private async onOrganizationCreateSuccess(value: any) {\n // Use newly created organization id\n await this.doSubmit(value.organizationId);\n }\n}\n","import { Component, OnInit, ViewChild } from \"@angular/core\";\nimport { ActivatedRoute } from \"@angular/router\";\nimport { first } from \"rxjs/operators\";\n\nimport { PlanType } from \"@bitwarden/common/billing/enums\";\nimport { ProductType } from \"@bitwarden/common/enums\";\n\nimport { OrganizationPlansComponent } from \"../../billing\";\nimport { HeaderModule } from \"../../layouts/header/header.module\";\nimport { SharedModule } from \"../../shared\";\n\n@Component({\n templateUrl: \"create-organization.component.html\",\n standalone: true,\n imports: [SharedModule, OrganizationPlansComponent, HeaderModule],\n})\n// eslint-disable-next-line rxjs-angular/prefer-takeuntil\nexport class CreateOrganizationComponent implements OnInit {\n @ViewChild(OrganizationPlansComponent, { static: true })\n orgPlansComponent: OrganizationPlansComponent;\n\n constructor(private route: ActivatedRoute) {}\n\n ngOnInit() {\n // eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe\n this.route.queryParams.pipe(first()).subscribe(async (qParams) => {\n if (qParams.plan === \"families\") {\n this.orgPlansComponent.plan = PlanType.FamiliesAnnually;\n this.orgPlansComponent.product = ProductType.Families;\n } else if (qParams.plan === \"teams\") {\n this.orgPlansComponent.plan = PlanType.TeamsAnnually;\n this.orgPlansComponent.product = ProductType.Teams;\n } else if (qParams.plan === \"teamsStarter\") {\n this.orgPlansComponent.plan = PlanType.TeamsStarter;\n this.orgPlansComponent.product = ProductType.TeamsStarter;\n } else if (qParams.plan === \"enterprise\") {\n this.orgPlansComponent.plan = PlanType.EnterpriseAnnually;\n this.orgPlansComponent.product = ProductType.Enterprise;\n }\n });\n }\n}\n","\n\n\n

{{ \"newOrganizationDesc\" | i18n }}

\n \n
\n","import { AbstractControl, AsyncValidatorFn, ValidationErrors } from \"@angular/forms\";\n\nexport function notAllowedValueAsync(\n valueGetter: () => Promise,\n caseInsensitive = false,\n): AsyncValidatorFn {\n return async (control: AbstractControl): Promise => {\n let notAllowedValue = await valueGetter();\n let controlValue = control.value;\n if (caseInsensitive) {\n notAllowedValue = notAllowedValue.toLowerCase();\n controlValue = controlValue.toLowerCase();\n }\n\n if (controlValue === notAllowedValue) {\n return {\n notAllowedValue: true,\n };\n }\n };\n}\n","\n {{ sponsoringOrg.familySponsorshipFriendlyName }}\n\n{{ sponsoringOrg.name }}\n\n {{ statusMessage }}\n\n\n
\n \n \n \n
\n \n \n {{ \"resendEmail\" | i18n }}\n \n \n \n {{ \"remove\" | i18n }}\n \n
\n
\n\n","import { formatDate } from \"@angular/common\";\nimport { Component, EventEmitter, Input, Output, OnInit } from \"@angular/core\";\nimport { firstValueFrom } from \"rxjs\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { DialogService } from \"@bitwarden/components\";\n\n@Component({\n selector: \"[sponsoring-org-row]\",\n templateUrl: \"sponsoring-org-row.component.html\",\n})\nexport class SponsoringOrgRowComponent implements OnInit {\n @Input() sponsoringOrg: Organization = null;\n @Input() isSelfHosted = false;\n\n @Output() sponsorshipRemoved = new EventEmitter();\n\n statusMessage = \"loading\";\n statusClass: \"text-success\" | \"text-danger\" = \"text-success\";\n\n revokeSponsorshipPromise: Promise;\n resendEmailPromise: Promise;\n\n private locale = \"\";\n\n constructor(\n private apiService: ApiService,\n private i18nService: I18nService,\n private logService: LogService,\n private platformUtilsService: PlatformUtilsService,\n private dialogService: DialogService,\n ) {}\n\n async ngOnInit() {\n this.locale = await firstValueFrom(this.i18nService.locale$);\n\n this.setStatus(\n this.isSelfHosted,\n this.sponsoringOrg.familySponsorshipToDelete,\n this.sponsoringOrg.familySponsorshipValidUntil,\n this.sponsoringOrg.familySponsorshipLastSyncDate,\n );\n }\n\n async revokeSponsorship() {\n try {\n this.revokeSponsorshipPromise = this.doRevokeSponsorship();\n await this.revokeSponsorshipPromise;\n } catch (e) {\n this.logService.error(e);\n }\n\n this.revokeSponsorshipPromise = null;\n }\n\n async resendEmail() {\n this.resendEmailPromise = this.apiService.postResendSponsorshipOffer(this.sponsoringOrg.id);\n await this.resendEmailPromise;\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"emailSent\"));\n this.resendEmailPromise = null;\n }\n\n get isSentAwaitingSync() {\n return this.isSelfHosted && !this.sponsoringOrg.familySponsorshipLastSyncDate;\n }\n\n private async doRevokeSponsorship() {\n const confirmed = await this.dialogService.openSimpleDialog({\n title: `${this.i18nService.t(\"remove\")} ${this.sponsoringOrg.familySponsorshipFriendlyName}?`,\n content: { key: \"revokeSponsorshipConfirmation\" },\n acceptButtonText: { key: \"remove\" },\n type: \"warning\",\n });\n\n if (!confirmed) {\n return;\n }\n\n await this.apiService.deleteRevokeSponsorship(this.sponsoringOrg.id);\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"reclaimedFreePlan\"));\n this.sponsorshipRemoved.emit();\n }\n\n private setStatus(\n selfHosted: boolean,\n toDelete?: boolean,\n validUntil?: Date,\n lastSyncDate?: Date,\n ) {\n /*\n * Possible Statuses:\n * Requested (self-hosted only)\n * Sent\n * Active\n * RequestRevoke\n * RevokeWhenExpired\n */\n\n if (toDelete && validUntil) {\n // They want to delete but there is a valid until date which means there is an active sponsorship\n this.statusMessage = this.i18nService.t(\n \"revokeWhenExpired\",\n formatDate(validUntil, \"MM/dd/yyyy\", this.locale),\n );\n this.statusClass = \"text-danger\";\n } else if (toDelete) {\n // They want to delete and we don't have a valid until date so we can\n // this should only happen on a self-hosted install\n this.statusMessage = this.i18nService.t(\"requestRemoved\");\n this.statusClass = \"text-danger\";\n } else if (validUntil) {\n // They don't want to delete and they have a valid until date\n // that means they are actively sponsoring someone\n this.statusMessage = this.i18nService.t(\"active\");\n this.statusClass = \"text-success\";\n } else if (selfHosted && lastSyncDate) {\n // We are on a self-hosted install and it has been synced but we have not gotten\n // a valid until date so we can't know if they are actively sponsoring someone\n this.statusMessage = this.i18nService.t(\"sent\");\n this.statusClass = \"text-success\";\n } else if (!selfHosted) {\n // We are in cloud and all other status checks have been false therefore we have\n // sent the request but it hasn't been accepted yet\n this.statusMessage = this.i18nService.t(\"sent\");\n this.statusClass = \"text-success\";\n } else {\n // We are on a self-hosted install and we have not synced yet\n this.statusMessage = this.i18nService.t(\"requested\");\n this.statusClass = \"text-success\";\n }\n }\n}\n","\n\n\n \n \n {{ \"loading\" | i18n }}\n \n \n

\n {{ \"sponsoredFamiliesEligible\" | i18n }}\n

\n
\n {{ \"sponsoredFamiliesInclude\" | i18n }}:\n
    \n
  • {{ \"sponsoredFamiliesPremiumAccess\" | i18n }}
  • \n
  • {{ \"sponsoredFamiliesSharedCollections\" | i18n }}
  • \n
\n
\n \n
\n \n \n \n \n \n
\n
\n \n \n \n \n {{ \"cannotSponsorSelf\" | i18n }}\n \n \n \n {{ \"invalidEmail\" | i18n }}\n \n
\n
\n \n
\n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
{{ \"recipient\" | i18n }}{{ \"sponsoringOrg\" | i18n }}{{ \"status\" | i18n }}
\n
\n {{ \"sponsoredFamiliesLeaveCopy\" | i18n }}\n
\n
\n
\n","import { Component, OnDestroy, OnInit } from \"@angular/core\";\nimport { FormBuilder, FormControl, FormGroup, Validators } from \"@angular/forms\";\nimport { map, Observable, Subject, takeUntil } from \"rxjs\";\n\nimport { notAllowedValueAsync } from \"@bitwarden/angular/admin-console/validators/not-allowed-value-async.validator\";\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { OrganizationService } from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\nimport { PlanSponsorshipType } from \"@bitwarden/common/billing/enums/\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { SyncService } from \"@bitwarden/common/vault/abstractions/sync/sync.service.abstraction\";\n\ninterface RequestSponsorshipForm {\n selectedSponsorshipOrgId: FormControl;\n sponsorshipEmail: FormControl;\n}\n\n@Component({\n selector: \"app-sponsored-families\",\n templateUrl: \"sponsored-families.component.html\",\n})\nexport class SponsoredFamiliesComponent implements OnInit, OnDestroy {\n loading = false;\n\n availableSponsorshipOrgs$: Observable;\n activeSponsorshipOrgs$: Observable;\n anyOrgsAvailable$: Observable;\n anyActiveSponsorships$: Observable;\n\n // Conditional display properties\n formPromise: Promise;\n\n sponsorshipForm: FormGroup;\n\n private _destroy = new Subject();\n\n constructor(\n private apiService: ApiService,\n private i18nService: I18nService,\n private platformUtilsService: PlatformUtilsService,\n private syncService: SyncService,\n private organizationService: OrganizationService,\n private formBuilder: FormBuilder,\n private stateService: StateService,\n ) {\n this.sponsorshipForm = this.formBuilder.group({\n selectedSponsorshipOrgId: new FormControl(\"\", {\n validators: [Validators.required],\n }),\n sponsorshipEmail: new FormControl(\"\", {\n validators: [Validators.email],\n asyncValidators: [\n notAllowedValueAsync(async () => await this.stateService.getEmail(), true),\n ],\n updateOn: \"blur\",\n }),\n });\n }\n\n async ngOnInit() {\n this.availableSponsorshipOrgs$ = this.organizationService.organizations$.pipe(\n map((orgs) => orgs.filter((o) => o.familySponsorshipAvailable)),\n );\n\n this.availableSponsorshipOrgs$.pipe(takeUntil(this._destroy)).subscribe((orgs) => {\n if (orgs.length === 1) {\n this.sponsorshipForm.patchValue({\n selectedSponsorshipOrgId: orgs[0].id,\n });\n }\n });\n\n this.anyOrgsAvailable$ = this.availableSponsorshipOrgs$.pipe(map((orgs) => orgs.length > 0));\n\n this.activeSponsorshipOrgs$ = this.organizationService.organizations$.pipe(\n map((orgs) => orgs.filter((o) => o.familySponsorshipFriendlyName !== null)),\n );\n\n this.anyActiveSponsorships$ = this.activeSponsorshipOrgs$.pipe(map((orgs) => orgs.length > 0));\n\n this.loading = false;\n }\n\n ngOnDestroy(): void {\n this._destroy.next();\n this._destroy.complete();\n }\n\n async submit() {\n this.formPromise = this.apiService.postCreateSponsorship(\n this.sponsorshipForm.value.selectedSponsorshipOrgId,\n {\n sponsoredEmail: this.sponsorshipForm.value.sponsorshipEmail,\n planSponsorshipType: PlanSponsorshipType.FamiliesForEnterprise,\n friendlyName: this.sponsorshipForm.value.sponsorshipEmail,\n },\n );\n\n await this.formPromise;\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"sponsorshipCreated\"));\n this.formPromise = null;\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.resetForm();\n await this.forceReload();\n }\n\n async forceReload() {\n this.loading = true;\n await this.syncService.fullSync(true);\n this.loading = false;\n }\n\n get sponsorshipEmailControl() {\n return this.sponsorshipForm.controls.sponsorshipEmail;\n }\n\n private async resetForm() {\n this.sponsorshipForm.reset();\n }\n\n get isSelfHosted(): boolean {\n return this.platformUtilsService.isSelfHost();\n }\n}\n","import { OrganizationKeysRequest } from \"../../../models/request/organization-keys.request\";\n\nexport class OrganizationUserAcceptInitRequest {\n token: string;\n key: string;\n keys: OrganizationKeysRequest;\n collectionName: string;\n}\n","export class OrganizationUserAcceptRequest {\n token: string;\n // Used to auto-enroll in master password reset\n resetPasswordKey: string;\n}\n","
\n
\n \"Bitwarden\"\n

\n \n {{ \"loading\" | i18n }}\n

\n
\n
\n
\n
\n
\n

{{ \"joinOrganization\" | i18n }}

\n
\n
\n

\n {{ orgName }}\n {{ email }}\n

\n

{{ \"joinOrganizationDesc\" | i18n }}

\n
\n
\n \n {{ \"logIn\" | i18n }}\n \n \n {{ \"createAccount\" | i18n }}\n \n
\n
\n
\n
\n
\n
\n","import { Component } from \"@angular/core\";\nimport { ActivatedRoute, Params, Router } from \"@angular/router\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { OrganizationApiServiceAbstraction } from \"@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction\";\nimport { OrganizationUserService } from \"@bitwarden/common/admin-console/abstractions/organization-user/organization-user.service\";\nimport {\n OrganizationUserAcceptInitRequest,\n OrganizationUserAcceptRequest,\n} from \"@bitwarden/common/admin-console/abstractions/organization-user/requests\";\nimport { PolicyApiServiceAbstraction } from \"@bitwarden/common/admin-console/abstractions/policy/policy-api.service.abstraction\";\nimport { PolicyService } from \"@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction\";\nimport { Policy } from \"@bitwarden/common/admin-console/models/domain/policy\";\nimport { OrganizationKeysRequest } from \"@bitwarden/common/admin-console/models/request/organization-keys.request\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\nimport { OrgKey } from \"@bitwarden/common/types/key\";\n\nimport { BaseAcceptComponent } from \"../common/base.accept.component\";\n\n@Component({\n selector: \"app-accept-organization\",\n templateUrl: \"accept-organization.component.html\",\n})\nexport class AcceptOrganizationComponent extends BaseAcceptComponent {\n orgName: string;\n\n protected requiredParameters: string[] = [\"organizationId\", \"organizationUserId\", \"token\"];\n\n constructor(\n router: Router,\n platformUtilsService: PlatformUtilsService,\n i18nService: I18nService,\n route: ActivatedRoute,\n stateService: StateService,\n private cryptoService: CryptoService,\n private policyApiService: PolicyApiServiceAbstraction,\n private policyService: PolicyService,\n private logService: LogService,\n private organizationApiService: OrganizationApiServiceAbstraction,\n private organizationUserService: OrganizationUserService,\n private messagingService: MessagingService,\n private apiService: ApiService,\n ) {\n super(router, platformUtilsService, i18nService, route, stateService);\n }\n\n async authedHandler(qParams: Params): Promise {\n const initOrganization =\n qParams.initOrganization != null && qParams.initOrganization.toLocaleLowerCase() === \"true\";\n if (initOrganization) {\n this.actionPromise = this.acceptInitOrganizationFlow(qParams);\n } else {\n const needsReAuth = (await this.stateService.getOrganizationInvitation()) == null;\n if (needsReAuth) {\n // Accepting an org invite requires authentication from a logged out state\n this.messagingService.send(\"logout\", { redirect: false });\n await this.prepareOrganizationInvitation(qParams);\n return;\n }\n\n // User has already logged in and passed the Master Password policy check\n this.actionPromise = this.acceptFlow(qParams);\n }\n\n await this.actionPromise;\n await this.apiService.refreshIdentityToken();\n await this.stateService.setOrganizationInvitation(null);\n this.platformUtilService.showToast(\n \"success\",\n this.i18nService.t(\"inviteAccepted\"),\n initOrganization\n ? this.i18nService.t(\"inviteInitAcceptedDesc\")\n : this.i18nService.t(\"inviteAcceptedDesc\"),\n { timeout: 10000 },\n );\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/vault\"]);\n }\n\n async unauthedHandler(qParams: Params): Promise {\n await this.prepareOrganizationInvitation(qParams);\n\n // In certain scenarios, we want to accelerate the user through the accept org invite process\n // For example, if the user has a BW account already, we want them to be taken to login instead of creation.\n await this.accelerateInviteAcceptIfPossible(qParams);\n }\n\n private async acceptInitOrganizationFlow(qParams: Params): Promise {\n return this.prepareAcceptInitRequest(qParams).then((request) =>\n this.organizationUserService.postOrganizationUserAcceptInit(\n qParams.organizationId,\n qParams.organizationUserId,\n request,\n ),\n );\n }\n\n private async acceptFlow(qParams: Params): Promise {\n return this.prepareAcceptRequest(qParams).then((request) =>\n this.organizationUserService.postOrganizationUserAccept(\n qParams.organizationId,\n qParams.organizationUserId,\n request,\n ),\n );\n }\n\n private async prepareAcceptInitRequest(\n qParams: Params,\n ): Promise {\n const request = new OrganizationUserAcceptInitRequest();\n request.token = qParams.token;\n\n const [encryptedOrgKey, orgKey] = await this.cryptoService.makeOrgKey();\n const [orgPublicKey, encryptedOrgPrivateKey] = await this.cryptoService.makeKeyPair(orgKey);\n const collection = await this.cryptoService.encrypt(\n this.i18nService.t(\"defaultCollection\"),\n orgKey,\n );\n\n request.key = encryptedOrgKey.encryptedString;\n request.keys = new OrganizationKeysRequest(\n orgPublicKey,\n encryptedOrgPrivateKey.encryptedString,\n );\n request.collectionName = collection.encryptedString;\n\n return request;\n }\n\n private async prepareAcceptRequest(qParams: Params): Promise {\n const request = new OrganizationUserAcceptRequest();\n request.token = qParams.token;\n\n if (await this.performResetPasswordAutoEnroll(qParams)) {\n const response = await this.organizationApiService.getKeys(qParams.organizationId);\n\n if (response == null) {\n throw new Error(this.i18nService.t(\"resetPasswordOrgKeysError\"));\n }\n\n const publicKey = Utils.fromB64ToArray(response.publicKey);\n\n // RSA Encrypt user's encKey.key with organization public key\n const userKey = await this.cryptoService.getUserKey();\n const encryptedKey = await this.cryptoService.rsaEncrypt(userKey.key, publicKey);\n\n // Add reset password key to accept request\n request.resetPasswordKey = encryptedKey.encryptedString;\n }\n return request;\n }\n\n private async performResetPasswordAutoEnroll(qParams: Params): Promise {\n let policyList: Policy[] = null;\n try {\n const policies = await this.policyApiService.getPoliciesByToken(\n qParams.organizationId,\n qParams.token,\n qParams.email,\n qParams.organizationUserId,\n );\n policyList = Policy.fromListResponse(policies);\n } catch (e) {\n this.logService.error(e);\n }\n\n if (policyList != null) {\n const result = this.policyService.getResetPasswordPolicyOptions(\n policyList,\n qParams.organizationId,\n );\n // Return true if policy enabled and auto-enroll enabled\n return result[1] && result[0].autoEnrollEnabled;\n }\n\n return false;\n }\n\n private async prepareOrganizationInvitation(qParams: Params): Promise {\n this.orgName = qParams.organizationName;\n if (this.orgName != null) {\n // Fix URL encoding of space issue with Angular\n this.orgName = this.orgName.replace(/\\+/g, \" \");\n }\n await this.stateService.setOrganizationInvitation(qParams);\n }\n\n private async accelerateInviteAcceptIfPossible(qParams: Params): Promise {\n // Extract the query params we need to make routing acceleration decisions\n const orgSsoIdentifier = qParams.orgSsoIdentifier;\n const orgUserHasExistingUser = this.stringToNullOrBool(qParams.orgUserHasExistingUser);\n\n // if orgUserHasExistingUser is null, short circuit for backwards compatibility w/ older servers\n if (orgUserHasExistingUser == null) {\n return;\n }\n\n // if user exists, send user to login\n if (orgUserHasExistingUser) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/login\"], {\n queryParams: { email: qParams.email },\n });\n return;\n }\n\n // no user exists; so either sign in via SSO and JIT provision one or simply register.\n\n if (orgSsoIdentifier) {\n // We only send sso org identifier if the org has SSO enabled and the SSO policy required.\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/sso\"], {\n queryParams: { email: qParams.email, identifier: orgSsoIdentifier },\n });\n return;\n }\n\n // if SSO is disabled OR if sso is enabled but the SSO login required policy is not enabled\n // then send user to create account\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/register\"], {\n queryParams: { email: qParams.email, fromOrgInvite: true },\n });\n return;\n }\n\n private stringToNullOrBool(s: string | undefined): boolean | null {\n if (s === undefined) {\n return null;\n }\n return s.toLowerCase() === \"true\";\n }\n}\n","export class PasswordHintRequest {\n email: string;\n\n constructor(email: string) {\n this.email = email;\n }\n}\n","import { Directive, OnInit } from \"@angular/core\";\nimport { Router } from \"@angular/router\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { LoginService } from \"@bitwarden/common/auth/abstractions/login.service\";\nimport { PasswordHintRequest } from \"@bitwarden/common/auth/models/request/password-hint.request\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\n\n@Directive()\nexport class HintComponent implements OnInit {\n email = \"\";\n formPromise: Promise;\n\n protected successRoute = \"login\";\n protected onSuccessfulSubmit: () => void;\n\n constructor(\n protected router: Router,\n protected i18nService: I18nService,\n protected apiService: ApiService,\n protected platformUtilsService: PlatformUtilsService,\n private logService: LogService,\n private loginService: LoginService,\n ) {}\n\n ngOnInit(): void {\n this.email = this.loginService.getEmail() ?? \"\";\n }\n\n async submit() {\n if (this.email == null || this.email === \"\") {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"emailRequired\"),\n );\n return;\n }\n if (this.email.indexOf(\"@\") === -1) {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"invalidEmail\"),\n );\n return;\n }\n\n try {\n this.formPromise = this.apiService.postPasswordHint(new PasswordHintRequest(this.email));\n await this.formPromise;\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"masterPassSent\"));\n if (this.onSuccessfulSubmit != null) {\n this.onSuccessfulSubmit();\n } else if (this.router != null) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([this.successRoute]);\n }\n } catch (e) {\n this.logService.error(e);\n }\n }\n}\n","import { Component } from \"@angular/core\";\nimport { Router } from \"@angular/router\";\n\nimport { HintComponent as BaseHintComponent } from \"@bitwarden/angular/auth/components/hint.component\";\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { LoginService } from \"@bitwarden/common/auth/abstractions/login.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\n\n@Component({\n selector: \"app-hint\",\n templateUrl: \"hint.component.html\",\n})\nexport class HintComponent extends BaseHintComponent {\n constructor(\n router: Router,\n i18nService: I18nService,\n apiService: ApiService,\n platformUtilsService: PlatformUtilsService,\n logService: LogService,\n loginService: LoginService,\n ) {\n super(router, i18nService, apiService, platformUtilsService, logService, loginService);\n }\n}\n","
\n
\n
\n

{{ \"passwordHint\" | i18n }}

\n
\n
\n
\n \n \n {{ \"enterEmailToGetHint\" | i18n }}\n
\n
\n
\n \n {{ \"submit\" | i18n }}\n \n \n \n {{ \"cancel\" | i18n }}\n \n
\n
\n
\n
\n
\n
\n","import { Directive, NgZone, OnDestroy, OnInit } from \"@angular/core\";\nimport { Router } from \"@angular/router\";\nimport { firstValueFrom, Subject } from \"rxjs\";\nimport { concatMap, take, takeUntil } from \"rxjs/operators\";\n\nimport { PinCryptoServiceAbstraction } from \"@bitwarden/auth/common\";\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { VaultTimeoutSettingsService } from \"@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service\";\nimport { VaultTimeoutService } from \"@bitwarden/common/abstractions/vault-timeout/vault-timeout.service\";\nimport { PolicyApiServiceAbstraction } from \"@bitwarden/common/admin-console/abstractions/policy/policy-api.service.abstraction\";\nimport { InternalPolicyService } from \"@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction\";\nimport { MasterPasswordPolicyOptions } from \"@bitwarden/common/admin-console/models/domain/master-password-policy-options\";\nimport { DeviceTrustCryptoServiceAbstraction } from \"@bitwarden/common/auth/abstractions/device-trust-crypto.service.abstraction\";\nimport { UserVerificationService } from \"@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction\";\nimport { ForceSetPasswordReason } from \"@bitwarden/common/auth/models/domain/force-set-password-reason\";\nimport { SecretVerificationRequest } from \"@bitwarden/common/auth/models/request/secret-verification.request\";\nimport { MasterPasswordPolicyResponse } from \"@bitwarden/common/auth/models/response/master-password-policy.response\";\nimport { VaultTimeoutAction } from \"@bitwarden/common/enums/vault-timeout-action.enum\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { EnvironmentService } from \"@bitwarden/common/platform/abstractions/environment.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { BiometricStateService } from \"@bitwarden/common/platform/biometrics/biometric-state.service\";\nimport { HashPurpose, KeySuffixOptions } from \"@bitwarden/common/platform/enums\";\nimport { PinLockType } from \"@bitwarden/common/services/vault-timeout/vault-timeout-settings.service\";\nimport { PasswordStrengthServiceAbstraction } from \"@bitwarden/common/tools/password-strength\";\nimport { UserKey } from \"@bitwarden/common/types/key\";\nimport { DialogService } from \"@bitwarden/components\";\n\n@Directive()\nexport class LockComponent implements OnInit, OnDestroy {\n masterPassword = \"\";\n pin = \"\";\n showPassword = false;\n email: string;\n pinEnabled = false;\n masterPasswordEnabled = false;\n webVaultHostname = \"\";\n formPromise: Promise;\n supportsBiometric: boolean;\n biometricLock: boolean;\n\n protected successRoute = \"vault\";\n protected forcePasswordResetRoute = \"update-temp-password\";\n protected onSuccessfulSubmit: () => Promise;\n\n private invalidPinAttempts = 0;\n private pinStatus: PinLockType;\n\n private enforcedMasterPasswordOptions: MasterPasswordPolicyOptions = undefined;\n\n private destroy$ = new Subject();\n\n constructor(\n protected router: Router,\n protected i18nService: I18nService,\n protected platformUtilsService: PlatformUtilsService,\n protected messagingService: MessagingService,\n protected cryptoService: CryptoService,\n protected vaultTimeoutService: VaultTimeoutService,\n protected vaultTimeoutSettingsService: VaultTimeoutSettingsService,\n protected environmentService: EnvironmentService,\n protected stateService: StateService,\n protected apiService: ApiService,\n protected logService: LogService,\n protected ngZone: NgZone,\n protected policyApiService: PolicyApiServiceAbstraction,\n protected policyService: InternalPolicyService,\n protected passwordStrengthService: PasswordStrengthServiceAbstraction,\n protected dialogService: DialogService,\n protected deviceTrustCryptoService: DeviceTrustCryptoServiceAbstraction,\n protected userVerificationService: UserVerificationService,\n protected pinCryptoService: PinCryptoServiceAbstraction,\n protected biometricStateService: BiometricStateService,\n ) {}\n\n async ngOnInit() {\n this.stateService.activeAccount$\n .pipe(\n concatMap(async () => {\n await this.load();\n }),\n takeUntil(this.destroy$),\n )\n .subscribe();\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n async submit() {\n if (this.pinEnabled) {\n return await this.handlePinRequiredUnlock();\n }\n\n await this.handleMasterPasswordRequiredUnlock();\n }\n\n async logOut() {\n const confirmed = await this.dialogService.openSimpleDialog({\n title: { key: \"logOut\" },\n content: { key: \"logOutConfirmation\" },\n acceptButtonText: { key: \"logOut\" },\n type: \"warning\",\n });\n\n if (confirmed) {\n this.messagingService.send(\"logout\");\n }\n }\n\n async unlockBiometric(): Promise {\n if (!this.biometricLock) {\n return;\n }\n\n await this.biometricStateService.setUserPromptCancelled();\n const userKey = await this.cryptoService.getUserKeyFromStorage(KeySuffixOptions.Biometric);\n\n if (userKey) {\n await this.setUserKeyAndContinue(userKey, false);\n }\n\n return !!userKey;\n }\n\n togglePassword() {\n this.showPassword = !this.showPassword;\n const input = document.getElementById(this.pinEnabled ? \"pin\" : \"masterPassword\");\n if (this.ngZone.isStable) {\n input.focus();\n } else {\n this.ngZone.onStable.pipe(take(1)).subscribe(() => input.focus());\n }\n }\n\n private async handlePinRequiredUnlock() {\n if (this.pin == null || this.pin === \"\") {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"pinRequired\"),\n );\n return;\n }\n\n return await this.doUnlockWithPin();\n }\n\n private async doUnlockWithPin() {\n const MAX_INVALID_PIN_ENTRY_ATTEMPTS = 5;\n\n try {\n const userKey = await this.pinCryptoService.decryptUserKeyWithPin(this.pin);\n\n if (userKey) {\n await this.setUserKeyAndContinue(userKey);\n return; // successfully unlocked\n }\n\n // Failure state: invalid PIN or failed decryption\n this.invalidPinAttempts++;\n\n // Log user out if they have entered an invalid PIN too many times\n if (this.invalidPinAttempts >= MAX_INVALID_PIN_ENTRY_ATTEMPTS) {\n this.platformUtilsService.showToast(\n \"error\",\n null,\n this.i18nService.t(\"tooManyInvalidPinEntryAttemptsLoggingOut\"),\n );\n this.messagingService.send(\"logout\");\n return;\n }\n\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"invalidPin\"),\n );\n } catch {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"unexpectedError\"),\n );\n }\n }\n\n private async handleMasterPasswordRequiredUnlock() {\n if (this.masterPassword == null || this.masterPassword === \"\") {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"masterPasswordRequired\"),\n );\n return;\n }\n await this.doUnlockWithMasterPassword();\n }\n\n private async doUnlockWithMasterPassword() {\n const kdf = await this.stateService.getKdfType();\n const kdfConfig = await this.stateService.getKdfConfig();\n\n const masterKey = await this.cryptoService.makeMasterKey(\n this.masterPassword,\n this.email,\n kdf,\n kdfConfig,\n );\n const storedPasswordHash = await this.cryptoService.getMasterKeyHash();\n\n let passwordValid = false;\n\n if (storedPasswordHash != null) {\n // Offline unlock possible\n passwordValid = await this.cryptoService.compareAndUpdateKeyHash(\n this.masterPassword,\n masterKey,\n );\n } else {\n // Online only\n const request = new SecretVerificationRequest();\n const serverKeyHash = await this.cryptoService.hashMasterKey(\n this.masterPassword,\n masterKey,\n HashPurpose.ServerAuthorization,\n );\n request.masterPasswordHash = serverKeyHash;\n try {\n this.formPromise = this.apiService.postAccountVerifyPassword(request);\n const response = await this.formPromise;\n this.enforcedMasterPasswordOptions = MasterPasswordPolicyOptions.fromResponse(response);\n passwordValid = true;\n const localKeyHash = await this.cryptoService.hashMasterKey(\n this.masterPassword,\n masterKey,\n HashPurpose.LocalAuthorization,\n );\n await this.cryptoService.setMasterKeyHash(localKeyHash);\n } catch (e) {\n this.logService.error(e);\n } finally {\n this.formPromise = null;\n }\n }\n\n if (!passwordValid) {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"invalidMasterPassword\"),\n );\n return;\n }\n\n const userKey = await this.cryptoService.decryptUserKeyWithMasterKey(masterKey);\n await this.cryptoService.setMasterKey(masterKey);\n await this.setUserKeyAndContinue(userKey, true);\n }\n\n private async setUserKeyAndContinue(key: UserKey, evaluatePasswordAfterUnlock = false) {\n await this.cryptoService.setUserKey(key);\n\n // Now that we have a decrypted user key in memory, we can check if we\n // need to establish trust on the current device\n await this.deviceTrustCryptoService.trustDeviceIfRequired();\n\n await this.doContinue(evaluatePasswordAfterUnlock);\n }\n\n private async doContinue(evaluatePasswordAfterUnlock: boolean) {\n await this.stateService.setEverBeenUnlocked(true);\n await this.biometricStateService.resetUserPromptCancelled();\n this.messagingService.send(\"unlocked\");\n\n if (evaluatePasswordAfterUnlock) {\n try {\n // If we do not have any saved policies, attempt to load them from the service\n if (this.enforcedMasterPasswordOptions == undefined) {\n this.enforcedMasterPasswordOptions = await firstValueFrom(\n this.policyService.masterPasswordPolicyOptions$(),\n );\n }\n\n if (this.requirePasswordChange()) {\n await this.stateService.setForceSetPasswordReason(\n ForceSetPasswordReason.WeakMasterPassword,\n );\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([this.forcePasswordResetRoute]);\n return;\n }\n } catch (e) {\n // Do not prevent unlock if there is an error evaluating policies\n this.logService.error(e);\n }\n }\n\n if (this.onSuccessfulSubmit != null) {\n await this.onSuccessfulSubmit();\n } else if (this.router != null) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([this.successRoute]);\n }\n }\n\n private async load() {\n // TODO: Investigate PM-3515\n\n // The loading of the lock component works as follows:\n // 1. First, is locking a valid timeout action? If not, we will log the user out.\n // 2. If locking IS a valid timeout action, we proceed to show the user the lock screen.\n // The user will be able to unlock as follows:\n // - If they have a PIN set, they will be presented with the PIN input\n // - If they have a master password and no PIN, they will be presented with the master password input\n // - If they have biometrics enabled, they will be presented with the biometric prompt\n\n const availableVaultTimeoutActions = await firstValueFrom(\n this.vaultTimeoutSettingsService.availableVaultTimeoutActions$(),\n );\n const supportsLock = availableVaultTimeoutActions.includes(VaultTimeoutAction.Lock);\n if (!supportsLock) {\n return await this.vaultTimeoutService.logOut();\n }\n\n this.pinStatus = await this.vaultTimeoutSettingsService.isPinLockSet();\n\n let ephemeralPinSet = await this.stateService.getPinKeyEncryptedUserKeyEphemeral();\n ephemeralPinSet ||= await this.stateService.getDecryptedPinProtected();\n this.pinEnabled =\n (this.pinStatus === \"TRANSIENT\" && !!ephemeralPinSet) || this.pinStatus === \"PERSISTANT\";\n this.masterPasswordEnabled = await this.userVerificationService.hasMasterPassword();\n\n this.supportsBiometric = await this.platformUtilsService.supportsBiometric();\n this.biometricLock =\n (await this.vaultTimeoutSettingsService.isBiometricLockSet()) &&\n ((await this.cryptoService.hasUserKeyStored(KeySuffixOptions.Biometric)) ||\n !this.platformUtilsService.supportsSecureStorage());\n this.email = await this.stateService.getEmail();\n\n this.webVaultHostname = (await this.environmentService.getEnvironment()).getHostname();\n }\n\n /**\n * Checks if the master password meets the enforced policy requirements\n * If not, returns false\n */\n private requirePasswordChange(): boolean {\n if (\n this.enforcedMasterPasswordOptions == undefined ||\n !this.enforcedMasterPasswordOptions.enforceOnLogin\n ) {\n return false;\n }\n\n const passwordStrength = this.passwordStrengthService.getPasswordStrength(\n this.masterPassword,\n this.email,\n )?.score;\n\n return !this.policyService.evaluateMasterPassword(\n passwordStrength,\n this.masterPassword,\n this.enforcedMasterPasswordOptions,\n );\n }\n}\n","import { Component, NgZone } from \"@angular/core\";\nimport { Router } from \"@angular/router\";\n\nimport { LockComponent as BaseLockComponent } from \"@bitwarden/angular/auth/components/lock.component\";\nimport { PinCryptoServiceAbstraction } from \"@bitwarden/auth/common\";\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { VaultTimeoutSettingsService } from \"@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service\";\nimport { VaultTimeoutService } from \"@bitwarden/common/abstractions/vault-timeout/vault-timeout.service\";\nimport { PolicyApiServiceAbstraction } from \"@bitwarden/common/admin-console/abstractions/policy/policy-api.service.abstraction\";\nimport { InternalPolicyService } from \"@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction\";\nimport { DeviceTrustCryptoServiceAbstraction } from \"@bitwarden/common/auth/abstractions/device-trust-crypto.service.abstraction\";\nimport { UserVerificationService } from \"@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { EnvironmentService } from \"@bitwarden/common/platform/abstractions/environment.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { BiometricStateService } from \"@bitwarden/common/platform/biometrics/biometric-state.service\";\nimport { PasswordStrengthServiceAbstraction } from \"@bitwarden/common/tools/password-strength\";\nimport { DialogService } from \"@bitwarden/components\";\n\n@Component({\n selector: \"app-lock\",\n templateUrl: \"lock.component.html\",\n})\nexport class LockComponent extends BaseLockComponent {\n constructor(\n router: Router,\n i18nService: I18nService,\n platformUtilsService: PlatformUtilsService,\n messagingService: MessagingService,\n cryptoService: CryptoService,\n vaultTimeoutService: VaultTimeoutService,\n vaultTimeoutSettingsService: VaultTimeoutSettingsService,\n environmentService: EnvironmentService,\n stateService: StateService,\n apiService: ApiService,\n logService: LogService,\n ngZone: NgZone,\n policyApiService: PolicyApiServiceAbstraction,\n policyService: InternalPolicyService,\n passwordStrengthService: PasswordStrengthServiceAbstraction,\n dialogService: DialogService,\n deviceTrustCryptoService: DeviceTrustCryptoServiceAbstraction,\n userVerificationService: UserVerificationService,\n pinCryptoService: PinCryptoServiceAbstraction,\n biometricStateService: BiometricStateService,\n ) {\n super(\n router,\n i18nService,\n platformUtilsService,\n messagingService,\n cryptoService,\n vaultTimeoutService,\n vaultTimeoutSettingsService,\n environmentService,\n stateService,\n apiService,\n logService,\n ngZone,\n policyApiService,\n policyService,\n passwordStrengthService,\n dialogService,\n deviceTrustCryptoService,\n userVerificationService,\n pinCryptoService,\n biometricStateService,\n );\n }\n\n async ngOnInit() {\n await super.ngOnInit();\n this.onSuccessfulSubmit = async () => {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigateByUrl(this.successRoute);\n };\n }\n}\n","
\n
\n
\n

\n \n

\n

{{ \"yourVaultIsLocked\" | i18n }}

\n
\n
\n
\n \n
\n \n \n \n \n
\n \n {{ \"loggedInAsEmailOn\" | i18n: email : webVaultHostname }}\n \n
\n
\n
\n \n {{ \"unlock\" | i18n }} \n \n \n \n {{ \"logOut\" | i18n }}\n \n
\n
\n
\n
\n
\n
\n","import { Directive, OnDestroy, OnInit } from \"@angular/core\";\nimport { FormBuilder, FormControl } from \"@angular/forms\";\nimport { ActivatedRoute, Router } from \"@angular/router\";\nimport {\n firstValueFrom,\n switchMap,\n Subject,\n catchError,\n from,\n of,\n finalize,\n takeUntil,\n defer,\n throwError,\n} from \"rxjs\";\n\nimport {\n UserDecryptionOptions,\n UserDecryptionOptionsServiceAbstraction,\n} from \"@bitwarden/auth/common\";\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { OrganizationApiServiceAbstraction } from \"@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction\";\nimport { OrganizationUserService } from \"@bitwarden/common/admin-console/abstractions/organization-user/organization-user.service\";\nimport { DeviceTrustCryptoServiceAbstraction } from \"@bitwarden/common/auth/abstractions/device-trust-crypto.service.abstraction\";\nimport { DevicesServiceAbstraction } from \"@bitwarden/common/auth/abstractions/devices/devices.service.abstraction\";\nimport { LoginService } from \"@bitwarden/common/auth/abstractions/login.service\";\nimport { PasswordResetEnrollmentServiceAbstraction } from \"@bitwarden/common/auth/abstractions/password-reset-enrollment.service.abstraction\";\nimport { SsoLoginServiceAbstraction } from \"@bitwarden/common/auth/abstractions/sso-login.service.abstraction\";\nimport { TokenService } from \"@bitwarden/common/auth/abstractions/token.service\";\nimport { KeysRequest } from \"@bitwarden/common/models/request/keys.request\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { ValidationService } from \"@bitwarden/common/platform/abstractions/validation.service\";\n\nenum State {\n NewUser,\n ExistingUserUntrustedDevice,\n}\n\ntype NewUserData = {\n readonly state: State.NewUser;\n readonly organizationId: string;\n readonly userEmail: string;\n};\n\ntype ExistingUserUntrustedDeviceData = {\n readonly state: State.ExistingUserUntrustedDevice;\n readonly showApproveFromOtherDeviceBtn: boolean;\n readonly showReqAdminApprovalBtn: boolean;\n readonly showApproveWithMasterPasswordBtn: boolean;\n readonly userEmail: string;\n};\n\ntype Data = NewUserData | ExistingUserUntrustedDeviceData;\n\n@Directive()\nexport class BaseLoginDecryptionOptionsComponent implements OnInit, OnDestroy {\n private destroy$ = new Subject();\n\n protected State = State;\n\n protected data?: Data;\n protected loading = true;\n\n // Remember device means for the user to trust the device\n rememberDeviceForm = this.formBuilder.group({\n rememberDevice: [true],\n });\n\n get rememberDevice(): FormControl {\n return this.rememberDeviceForm?.controls.rememberDevice;\n }\n\n constructor(\n protected formBuilder: FormBuilder,\n protected devicesService: DevicesServiceAbstraction,\n protected stateService: StateService,\n protected router: Router,\n protected activatedRoute: ActivatedRoute,\n protected messagingService: MessagingService,\n protected tokenService: TokenService,\n protected loginService: LoginService,\n protected organizationApiService: OrganizationApiServiceAbstraction,\n protected cryptoService: CryptoService,\n protected organizationUserService: OrganizationUserService,\n protected apiService: ApiService,\n protected i18nService: I18nService,\n protected validationService: ValidationService,\n protected deviceTrustCryptoService: DeviceTrustCryptoServiceAbstraction,\n protected platformUtilsService: PlatformUtilsService,\n protected userDecryptionOptionsService: UserDecryptionOptionsServiceAbstraction,\n protected passwordResetEnrollmentService: PasswordResetEnrollmentServiceAbstraction,\n protected ssoLoginService: SsoLoginServiceAbstraction,\n ) {}\n\n async ngOnInit() {\n this.loading = true;\n\n this.setupRememberDeviceValueChanges();\n\n // Persist user choice from state if it exists\n await this.setRememberDeviceDefaultValue();\n\n try {\n const userDecryptionOptions = await firstValueFrom(\n this.userDecryptionOptionsService.userDecryptionOptions$,\n );\n\n // see sso-login.strategy - to determine if a user is new or not it just checks if there is a key on the token response..\n // can we check if they have a user key or master key in crypto service? Would that be sufficient?\n if (\n !userDecryptionOptions?.trustedDeviceOption?.hasAdminApproval &&\n !userDecryptionOptions?.hasMasterPassword\n ) {\n // We are dealing with a new account if:\n // - User does not have admin approval (i.e. has not enrolled into admin reset)\n // - AND does not have a master password\n\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.loadNewUserData();\n } else {\n this.loadUntrustedDeviceData(userDecryptionOptions);\n }\n\n // Note: this is probably not a comprehensive write up of all scenarios:\n\n // If the TDE feature flag is enabled and TDE is configured for the org that the user is a member of,\n // then new and existing users can be redirected here after completing the SSO flow (and 2FA if enabled).\n\n // First we must determine user type (new or existing):\n\n // New User\n // - present user with option to remember the device or not (trust the device)\n // - present a continue button to proceed to the vault\n // - loadNewUserData() --> will need to load enrollment status and user email address.\n\n // Existing User\n // - Determine if user is an admin with access to account recovery in admin console\n // - Determine if user has a MP or not, if not, they must be redirected to set one (see PM-1035)\n // - Determine if device is trusted or not via device crypto service (method not yet written)\n // - If not trusted, present user with login decryption options (approve from other device, approve with master password, request admin approval)\n // - loadUntrustedDeviceData()\n } catch (err) {\n this.validationService.showError(err);\n }\n }\n\n private async setRememberDeviceDefaultValue() {\n const rememberDeviceFromState = await this.deviceTrustCryptoService.getShouldTrustDevice();\n\n const rememberDevice = rememberDeviceFromState ?? true;\n\n this.rememberDevice.setValue(rememberDevice);\n }\n\n private setupRememberDeviceValueChanges() {\n this.rememberDevice.valueChanges\n .pipe(\n switchMap((value) =>\n defer(() => this.deviceTrustCryptoService.setShouldTrustDevice(value)),\n ),\n takeUntil(this.destroy$),\n )\n .subscribe();\n }\n\n async loadNewUserData() {\n const autoEnrollStatus$ = defer(() =>\n this.ssoLoginService.getActiveUserOrganizationSsoIdentifier(),\n ).pipe(\n switchMap((organizationIdentifier) => {\n if (organizationIdentifier == undefined) {\n return throwError(() => new Error(this.i18nService.t(\"ssoIdentifierRequired\")));\n }\n\n return from(this.organizationApiService.getAutoEnrollStatus(organizationIdentifier));\n }),\n catchError((err: unknown) => {\n this.validationService.showError(err);\n return of(undefined);\n }),\n );\n\n const email$ = from(this.stateService.getEmail()).pipe(\n catchError((err: unknown) => {\n this.validationService.showError(err);\n return of(undefined);\n }),\n takeUntil(this.destroy$),\n );\n\n const autoEnrollStatus = await firstValueFrom(autoEnrollStatus$);\n const email = await firstValueFrom(email$);\n\n this.data = { state: State.NewUser, organizationId: autoEnrollStatus.id, userEmail: email };\n this.loading = false;\n }\n\n loadUntrustedDeviceData(userDecryptionOptions: UserDecryptionOptions) {\n this.loading = true;\n\n const email$ = from(this.stateService.getEmail()).pipe(\n catchError((err: unknown) => {\n this.validationService.showError(err);\n return of(undefined);\n }),\n takeUntil(this.destroy$),\n );\n\n email$\n .pipe(\n takeUntil(this.destroy$),\n finalize(() => {\n this.loading = false;\n }),\n )\n .subscribe((email) => {\n const showApproveFromOtherDeviceBtn =\n userDecryptionOptions?.trustedDeviceOption?.hasLoginApprovingDevice || false;\n\n const showReqAdminApprovalBtn =\n !!userDecryptionOptions?.trustedDeviceOption?.hasAdminApproval || false;\n\n const showApproveWithMasterPasswordBtn = userDecryptionOptions?.hasMasterPassword || false;\n\n const userEmail = email;\n\n this.data = {\n state: State.ExistingUserUntrustedDevice,\n showApproveFromOtherDeviceBtn,\n showReqAdminApprovalBtn,\n showApproveWithMasterPasswordBtn,\n userEmail,\n };\n });\n }\n\n async approveFromOtherDevice() {\n if (this.data.state !== State.ExistingUserUntrustedDevice) {\n return;\n }\n\n this.loginService.setEmail(this.data.userEmail);\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/login-with-device\"]);\n }\n\n async requestAdminApproval() {\n this.loginService.setEmail(this.data.userEmail);\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/admin-approval-requested\"]);\n }\n\n async approveWithMasterPassword() {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/lock\"], { queryParams: { from: \"login-initiated\" } });\n }\n\n async createUser() {\n if (this.data.state !== State.NewUser) {\n return;\n }\n\n // this.loading to support clients without async-actions-support\n this.loading = true;\n try {\n const { publicKey, privateKey } = await this.cryptoService.initAccount();\n const keysRequest = new KeysRequest(publicKey, privateKey.encryptedString);\n await this.apiService.postAccountKeys(keysRequest);\n\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"accountSuccessfullyCreated\"),\n );\n\n await this.passwordResetEnrollmentService.enroll(this.data.organizationId);\n\n if (this.rememberDeviceForm.value.rememberDevice) {\n await this.deviceTrustCryptoService.trustDevice();\n }\n } catch (error) {\n this.validationService.showError(error);\n } finally {\n this.loading = false;\n }\n }\n\n logOut() {\n this.loading = true; // to avoid an awkward delay in browser extension\n this.messagingService.send(\"logout\");\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n}\n","
\n \n
\n \n
\n\n \n

\n \n {{ \"loading\" | i18n }}\n

\n
\n\n \n \n

{{ \"loginInitiated\" | i18n }}

\n\n

\n {{ \"deviceApprovalRequired\" | i18n }}\n

\n\n
\n \n \n {{ \"rememberThisDevice\" | i18n }} \n {{ \"uncheckIfPublicDevice\" | i18n }}\n \n
\n\n
\n \n {{ \"approveFromYourOtherDevice\" | i18n }}\n \n\n \n {{ \"requestAdminApproval\" | i18n }}\n \n\n \n {{ \"approveWithMasterPassword\" | i18n }}\n \n
\n
\n\n \n

{{ \"loggedInExclamation\" | i18n }}

\n\n
\n \n \n {{ \"rememberThisDevice\" | i18n }} \n {{ \"uncheckIfPublicDevice\" | i18n }}\n \n
\n\n \n {{ \"continue\" | i18n }}\n \n
\n\n
\n\n
\n

{{ \"loggingInAs\" | i18n }} {{ data.userEmail }}

\n {{ \"notYou\" | i18n }}\n
\n
\n \n\n","import { Component } from \"@angular/core\";\n\nimport { BaseLoginDecryptionOptionsComponent } from \"@bitwarden/angular/auth/components/base-login-decryption-options.component\";\n@Component({\n selector: \"web-login-decryption-options\",\n templateUrl: \"login-decryption-options.component.html\",\n})\nexport class LoginDecryptionOptionsComponent extends BaseLoginDecryptionOptionsComponent {\n override async createUser(): Promise {\n try {\n await super.createUser();\n await this.router.navigate([\"/vault\"]);\n } catch (error) {\n this.validationService.showError(error);\n }\n }\n\n createUserAction = async (): Promise => {\n return this.createUser();\n };\n}\n","export enum AuthRequestType {\n AuthenticateAndUnlock = 0,\n Unlock = 1,\n AdminApproval = 2,\n}\n","import { AuthRequestType } from \"../../enums/auth-request-type\";\n\nexport class CreateAuthRequest {\n constructor(\n readonly email: string,\n readonly deviceIdentifier: string,\n readonly publicKey: string,\n readonly type: AuthRequestType,\n readonly accessCode: string,\n ) {}\n}\n","export abstract class IFrameComponent {\n iframe: HTMLIFrameElement;\n private connectorLink: HTMLAnchorElement;\n private parseFunction = this.parseMessage.bind(this);\n\n constructor(\n private win: Window,\n protected webVaultUrl: string,\n private path: string,\n private iframeId: string,\n public successCallback?: (message: string) => any,\n public errorCallback?: (message: string) => any,\n public infoCallback?: (message: string) => any,\n ) {\n this.connectorLink = win.document.createElement(\"a\");\n }\n\n stop() {\n this.sendMessage(\"stop\");\n }\n\n start() {\n this.sendMessage(\"start\");\n }\n\n sendMessage(message: any) {\n if (!this.iframe || !this.iframe.src || !this.iframe.contentWindow) {\n return;\n }\n\n this.iframe.contentWindow.postMessage(message, this.iframe.src);\n }\n\n base64Encode(str: string): string {\n return btoa(\n encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, (match, p1) => {\n return String.fromCharCode((\"0x\" + p1) as any);\n }),\n );\n }\n\n cleanup() {\n this.win.removeEventListener(\"message\", this.parseFunction, false);\n }\n\n protected createParams(data: any, version: number) {\n return new URLSearchParams({\n data: this.base64Encode(JSON.stringify(data)),\n parent: encodeURIComponent(this.win.document.location.href),\n v: version.toString(),\n });\n }\n\n protected initComponent(params: URLSearchParams): void {\n this.connectorLink.href = `${this.webVaultUrl}/${this.path}?${params}`;\n this.iframe = this.win.document.getElementById(this.iframeId) as HTMLIFrameElement;\n this.iframe.src = this.connectorLink.href;\n\n this.win.addEventListener(\"message\", this.parseFunction, false);\n }\n\n private parseMessage(event: MessageEvent) {\n if (!this.validMessage(event)) {\n return;\n }\n\n const parts: string[] = event.data.split(\"|\");\n if (parts[0] === \"success\" && this.successCallback) {\n this.successCallback(parts[1]);\n } else if (parts[0] === \"error\" && this.errorCallback) {\n this.errorCallback(parts[1]);\n } else if (parts[0] === \"info\" && this.infoCallback) {\n this.infoCallback(parts[1]);\n }\n }\n\n private validMessage(event: MessageEvent) {\n if (\n event.origin == null ||\n event.origin === \"\" ||\n event.origin !== (this.connectorLink as any).origin ||\n event.data == null ||\n typeof event.data !== \"string\"\n ) {\n return false;\n }\n\n return (\n event.data.indexOf(\"success|\") === 0 ||\n event.data.indexOf(\"error|\") === 0 ||\n event.data.indexOf(\"info|\") === 0\n );\n }\n}\n","import { I18nService } from \"../platform/abstractions/i18n.service\";\n\nimport { IFrameComponent } from \"./iframe-component\";\n\nexport class CaptchaIFrame extends IFrameComponent {\n constructor(\n win: Window,\n webVaultUrl: string,\n private i18nService: I18nService,\n successCallback: (message: string) => any,\n errorCallback: (message: string) => any,\n infoCallback: (message: string) => any,\n ) {\n super(\n win,\n webVaultUrl,\n \"captcha-connector.html\",\n \"hcaptcha_iframe\",\n successCallback,\n errorCallback,\n (message: string) => {\n const parsedMessage = JSON.parse(message);\n if (typeof parsedMessage !== \"string\") {\n this.iframe.height = parsedMessage.height.toString();\n this.iframe.width = parsedMessage.width.toString();\n } else {\n infoCallback(parsedMessage);\n }\n },\n );\n }\n\n init(siteKey: string): void {\n super.initComponent(\n this.createParams({ siteKey: siteKey, locale: this.i18nService.translationLocale }, 1),\n );\n }\n}\n","import { Directive, Input } from \"@angular/core\";\nimport { firstValueFrom } from \"rxjs\";\n\nimport { CaptchaIFrame } from \"@bitwarden/common/auth/captcha-iframe\";\nimport { EnvironmentService } from \"@bitwarden/common/platform/abstractions/environment.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\n\n@Directive()\nexport abstract class CaptchaProtectedComponent {\n @Input() captchaSiteKey: string = null;\n captchaToken: string = null;\n captcha: CaptchaIFrame;\n\n constructor(\n protected environmentService: EnvironmentService,\n protected i18nService: I18nService,\n protected platformUtilsService: PlatformUtilsService,\n ) {}\n\n async setupCaptcha() {\n const env = await firstValueFrom(this.environmentService.environment$);\n const webVaultUrl = env.getWebVaultUrl();\n\n this.captcha = new CaptchaIFrame(\n window,\n webVaultUrl,\n this.i18nService,\n (token: string) => {\n this.captchaToken = token;\n },\n (error: string) => {\n this.platformUtilsService.showToast(\"error\", this.i18nService.t(\"errorOccurred\"), error);\n },\n (info: string) => {\n this.platformUtilsService.showToast(\"info\", this.i18nService.t(\"info\"), info);\n },\n );\n }\n\n showCaptcha() {\n return !Utils.isNullOrWhitespace(this.captchaSiteKey);\n }\n\n protected handleCaptchaRequired(response: { captchaSiteKey: string }): boolean {\n if (Utils.isNullOrWhitespace(response.captchaSiteKey)) {\n return false;\n }\n\n this.captchaSiteKey = response.captchaSiteKey;\n this.captcha.init(response.captchaSiteKey);\n return true;\n }\n}\n","import { Directive, OnDestroy, OnInit } from \"@angular/core\";\nimport { IsActiveMatchOptions, Router } from \"@angular/router\";\nimport { Subject, takeUntil } from \"rxjs\";\n\nimport {\n AuthRequestLoginCredentials,\n AuthRequestServiceAbstraction,\n LoginStrategyServiceAbstraction,\n} from \"@bitwarden/auth/common\";\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { AnonymousHubService } from \"@bitwarden/common/auth/abstractions/anonymous-hub.service\";\nimport { AuthService } from \"@bitwarden/common/auth/abstractions/auth.service\";\nimport { DeviceTrustCryptoServiceAbstraction } from \"@bitwarden/common/auth/abstractions/device-trust-crypto.service.abstraction\";\nimport { LoginService } from \"@bitwarden/common/auth/abstractions/login.service\";\nimport { AuthRequestType } from \"@bitwarden/common/auth/enums/auth-request-type\";\nimport { AuthenticationStatus } from \"@bitwarden/common/auth/enums/authentication-status\";\nimport { AdminAuthRequestStorable } from \"@bitwarden/common/auth/models/domain/admin-auth-req-storable\";\nimport { AuthResult } from \"@bitwarden/common/auth/models/domain/auth-result\";\nimport { ForceSetPasswordReason } from \"@bitwarden/common/auth/models/domain/force-set-password-reason\";\nimport { CreateAuthRequest } from \"@bitwarden/common/auth/models/request/create-auth.request\";\nimport { AuthRequestResponse } from \"@bitwarden/common/auth/models/response/auth-request.response\";\nimport { HttpStatusCode } from \"@bitwarden/common/enums/http-status-code.enum\";\nimport { ErrorResponse } from \"@bitwarden/common/models/response/error.response\";\nimport { AppIdService } from \"@bitwarden/common/platform/abstractions/app-id.service\";\nimport { CryptoFunctionService } from \"@bitwarden/common/platform/abstractions/crypto-function.service\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { EnvironmentService } from \"@bitwarden/common/platform/abstractions/environment.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { ValidationService } from \"@bitwarden/common/platform/abstractions/validation.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\nimport { PasswordGenerationServiceAbstraction } from \"@bitwarden/common/tools/generator/password\";\n\nimport { CaptchaProtectedComponent } from \"./captcha-protected.component\";\n\nenum State {\n StandardAuthRequest,\n AdminAuthRequest,\n}\n\n@Directive()\nexport class LoginViaAuthRequestComponent\n extends CaptchaProtectedComponent\n implements OnInit, OnDestroy\n{\n private destroy$ = new Subject();\n userAuthNStatus: AuthenticationStatus;\n email: string;\n showResendNotification = false;\n authRequest: CreateAuthRequest;\n fingerprintPhrase: string;\n onSuccessfulLoginTwoFactorNavigate: () => Promise;\n onSuccessfulLogin: () => Promise;\n onSuccessfulLoginNavigate: () => Promise;\n onSuccessfulLoginForceResetNavigate: () => Promise;\n\n protected adminApprovalRoute = \"admin-approval-requested\";\n\n protected StateEnum = State;\n protected state = State.StandardAuthRequest;\n\n protected twoFactorRoute = \"2fa\";\n protected successRoute = \"vault\";\n protected forcePasswordResetRoute = \"update-temp-password\";\n private resendTimeout = 12000;\n\n private authRequestKeyPair: { publicKey: Uint8Array; privateKey: Uint8Array };\n\n // TODO: in future, go to child components and remove child constructors and let deps fall through to the super class\n constructor(\n protected router: Router,\n private cryptoService: CryptoService,\n private cryptoFunctionService: CryptoFunctionService,\n private appIdService: AppIdService,\n private passwordGenerationService: PasswordGenerationServiceAbstraction,\n private apiService: ApiService,\n private authService: AuthService,\n private logService: LogService,\n environmentService: EnvironmentService,\n i18nService: I18nService,\n platformUtilsService: PlatformUtilsService,\n private anonymousHubService: AnonymousHubService,\n private validationService: ValidationService,\n private stateService: StateService,\n private loginService: LoginService,\n private deviceTrustCryptoService: DeviceTrustCryptoServiceAbstraction,\n private authRequestService: AuthRequestServiceAbstraction,\n private loginStrategyService: LoginStrategyServiceAbstraction,\n ) {\n super(environmentService, i18nService, platformUtilsService);\n\n // TODO: I don't know why this is necessary.\n // Why would the existence of the email depend on the navigation?\n const navigation = this.router.getCurrentNavigation();\n if (navigation) {\n this.email = this.loginService.getEmail();\n }\n\n //gets signalR push notification\n this.loginStrategyService.authRequestPushNotification$\n .pipe(takeUntil(this.destroy$))\n .subscribe((id) => {\n // Only fires on approval currently\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.verifyAndHandleApprovedAuthReq(id);\n });\n }\n\n async ngOnInit() {\n this.userAuthNStatus = await this.authService.getAuthStatus();\n\n const matchOptions: IsActiveMatchOptions = {\n paths: \"exact\",\n queryParams: \"ignored\",\n fragment: \"ignored\",\n matrixParams: \"ignored\",\n };\n\n if (this.router.isActive(this.adminApprovalRoute, matchOptions)) {\n this.state = State.AdminAuthRequest;\n }\n\n if (this.state === State.AdminAuthRequest) {\n // Pull email from state for admin auth reqs b/c it is available\n // This also prevents it from being lost on refresh as the\n // login service email does not persist.\n this.email = await this.stateService.getEmail();\n\n if (!this.email) {\n this.platformUtilsService.showToast(\"error\", null, this.i18nService.t(\"userEmailMissing\"));\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/login-initiated\"]);\n return;\n }\n\n // We only allow a single admin approval request to be active at a time\n // so must check state to see if we have an existing one or not\n const adminAuthReqStorable = await this.stateService.getAdminAuthRequest();\n\n if (adminAuthReqStorable) {\n await this.handleExistingAdminAuthRequest(adminAuthReqStorable);\n } else {\n // No existing admin auth request; so we need to create one\n await this.startAuthRequestLogin();\n }\n } else {\n // Standard auth request\n // TODO: evaluate if we can remove the setting of this.email in the constructor\n this.email = this.loginService.getEmail();\n\n if (!this.email) {\n this.platformUtilsService.showToast(\"error\", null, this.i18nService.t(\"userEmailMissing\"));\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/login\"]);\n return;\n }\n\n await this.startAuthRequestLogin();\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n this.anonymousHubService.stopHubConnection();\n }\n\n private async handleExistingAdminAuthRequest(adminAuthReqStorable: AdminAuthRequestStorable) {\n // Note: on login, the SSOLoginStrategy will also call to see an existing admin auth req\n // has been approved and handle it if so.\n\n // Regardless, we always retrieve the auth request from the server verify and handle status changes here as well\n let adminAuthReqResponse: AuthRequestResponse;\n try {\n adminAuthReqResponse = await this.apiService.getAuthRequest(adminAuthReqStorable.id);\n } catch (error) {\n if (error instanceof ErrorResponse && error.statusCode === HttpStatusCode.NotFound) {\n return await this.handleExistingAdminAuthReqDeletedOrDenied();\n }\n }\n\n // Request doesn't exist anymore\n if (!adminAuthReqResponse) {\n return await this.handleExistingAdminAuthReqDeletedOrDenied();\n }\n\n // Re-derive the user's fingerprint phrase\n // It is important to not use the server's public key here as it could have been compromised via MITM\n const derivedPublicKeyArrayBuffer = await this.cryptoFunctionService.rsaExtractPublicKey(\n adminAuthReqStorable.privateKey,\n );\n this.fingerprintPhrase = (\n await this.cryptoService.getFingerprint(this.email, derivedPublicKeyArrayBuffer)\n ).join(\"-\");\n\n // Request denied\n if (adminAuthReqResponse.isAnswered && !adminAuthReqResponse.requestApproved) {\n return await this.handleExistingAdminAuthReqDeletedOrDenied();\n }\n\n // Request approved\n if (adminAuthReqResponse.requestApproved) {\n return await this.handleApprovedAdminAuthRequest(\n adminAuthReqResponse,\n adminAuthReqStorable.privateKey,\n );\n }\n\n // Request still pending response from admin\n // So, create hub connection so that any approvals will be received via push notification\n this.anonymousHubService.createHubConnection(adminAuthReqStorable.id);\n }\n\n private async handleExistingAdminAuthReqDeletedOrDenied() {\n // clear the admin auth request from state\n await this.stateService.setAdminAuthRequest(null);\n\n // start new auth request\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.startAuthRequestLogin();\n }\n\n private async buildAuthRequest(authRequestType: AuthRequestType) {\n const authRequestKeyPairArray = await this.cryptoFunctionService.rsaGenerateKeyPair(2048);\n\n this.authRequestKeyPair = {\n publicKey: authRequestKeyPairArray[0],\n privateKey: authRequestKeyPairArray[1],\n };\n\n const deviceIdentifier = await this.appIdService.getAppId();\n const publicKey = Utils.fromBufferToB64(this.authRequestKeyPair.publicKey);\n const accessCode = await this.passwordGenerationService.generatePassword({ length: 25 });\n\n this.fingerprintPhrase = (\n await this.cryptoService.getFingerprint(this.email, this.authRequestKeyPair.publicKey)\n ).join(\"-\");\n\n this.authRequest = new CreateAuthRequest(\n this.email,\n deviceIdentifier,\n publicKey,\n authRequestType,\n accessCode,\n );\n }\n\n async startAuthRequestLogin() {\n this.showResendNotification = false;\n\n try {\n let reqResponse: AuthRequestResponse;\n\n if (this.state === State.AdminAuthRequest) {\n await this.buildAuthRequest(AuthRequestType.AdminApproval);\n reqResponse = await this.apiService.postAdminAuthRequest(this.authRequest);\n\n const adminAuthReqStorable = new AdminAuthRequestStorable({\n id: reqResponse.id,\n privateKey: this.authRequestKeyPair.privateKey,\n });\n\n await this.stateService.setAdminAuthRequest(adminAuthReqStorable);\n } else {\n await this.buildAuthRequest(AuthRequestType.AuthenticateAndUnlock);\n reqResponse = await this.apiService.postAuthRequest(this.authRequest);\n }\n\n if (reqResponse.id) {\n this.anonymousHubService.createHubConnection(reqResponse.id);\n }\n } catch (e) {\n this.logService.error(e);\n }\n\n setTimeout(() => {\n this.showResendNotification = true;\n }, this.resendTimeout);\n }\n\n private async verifyAndHandleApprovedAuthReq(requestId: string) {\n try {\n // Retrieve the auth request from server and verify it's approved\n let authReqResponse: AuthRequestResponse;\n\n switch (this.state) {\n case State.StandardAuthRequest:\n // Unauthed - access code required for user verification\n authReqResponse = await this.apiService.getAuthResponse(\n requestId,\n this.authRequest.accessCode,\n );\n break;\n\n case State.AdminAuthRequest:\n // Authed - no access code required\n authReqResponse = await this.apiService.getAuthRequest(requestId);\n break;\n\n default:\n break;\n }\n\n if (!authReqResponse.requestApproved) {\n return;\n }\n\n // Approved so proceed:\n\n // 4 Scenarios to handle for approved auth requests:\n // Existing flow 1:\n // - Anon Login with Device > User is not AuthN > receives approval from device with pubKey(masterKey)\n // > decrypt masterKey > must authenticate > gets masterKey(userKey) > decrypt userKey and proceed to vault\n\n // 3 new flows from TDE:\n // Flow 2:\n // - Post SSO > User is AuthN > SSO login strategy success sets masterKey(userKey) > receives approval from device with pubKey(masterKey)\n // > decrypt masterKey > decrypt userKey > establish trust if required > proceed to vault\n // Flow 3:\n // - Post SSO > User is AuthN > Receives approval from device with pubKey(userKey) > decrypt userKey > establish trust if required > proceed to vault\n // Flow 4:\n // - Anon Login with Device > User is not AuthN > receives approval from device with pubKey(userKey)\n // > decrypt userKey > must authenticate > set userKey > proceed to vault\n\n // if user has authenticated via SSO\n if (this.userAuthNStatus === AuthenticationStatus.Locked) {\n return await this.handleApprovedAdminAuthRequest(\n authReqResponse,\n this.authRequestKeyPair.privateKey,\n );\n }\n\n // Flow 1 and 4:\n const loginAuthResult = await this.loginViaAuthRequestStrategy(requestId, authReqResponse);\n await this.handlePostLoginNavigation(loginAuthResult);\n } catch (error) {\n if (error instanceof ErrorResponse) {\n let errorRoute = \"/login\";\n if (this.state === State.AdminAuthRequest) {\n errorRoute = \"/login-initiated\";\n }\n\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([errorRoute]);\n this.validationService.showError(error);\n return;\n }\n\n this.logService.error(error);\n }\n }\n\n async handleApprovedAdminAuthRequest(\n adminAuthReqResponse: AuthRequestResponse,\n privateKey: ArrayBuffer,\n ) {\n // See verifyAndHandleApprovedAuthReq(...) for flow details\n // it's flow 2 or 3 based on presence of masterPasswordHash\n if (adminAuthReqResponse.masterPasswordHash) {\n // Flow 2: masterPasswordHash is not null\n // key is authRequestPublicKey(masterKey) + we have authRequestPublicKey(masterPasswordHash)\n await this.authRequestService.setKeysAfterDecryptingSharedMasterKeyAndHash(\n adminAuthReqResponse,\n privateKey,\n );\n } else {\n // Flow 3: masterPasswordHash is null\n // we can assume key is authRequestPublicKey(userKey) and we can just decrypt with userKey and proceed to vault\n await this.authRequestService.setUserKeyAfterDecryptingSharedUserKey(\n adminAuthReqResponse,\n privateKey,\n );\n }\n\n // clear the admin auth request from state so it cannot be used again (it's a one time use)\n // TODO: this should eventually be enforced via deleting this on the server once it is used\n await this.stateService.setAdminAuthRequest(null);\n\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"loginApproved\"));\n\n // Now that we have a decrypted user key in memory, we can check if we\n // need to establish trust on the current device\n await this.deviceTrustCryptoService.trustDeviceIfRequired();\n\n // TODO: don't forget to use auto enrollment service everywhere we trust device\n\n await this.handleSuccessfulLoginNavigation();\n }\n\n // Authentication helper\n private async buildAuthRequestLoginCredentials(\n requestId: string,\n response: AuthRequestResponse,\n ): Promise {\n // if masterPasswordHash has a value, we will always receive key as authRequestPublicKey(masterKey) + authRequestPublicKey(masterPasswordHash)\n // if masterPasswordHash is null, we will always receive key as authRequestPublicKey(userKey)\n if (response.masterPasswordHash) {\n const { masterKey, masterKeyHash } =\n await this.authRequestService.decryptPubKeyEncryptedMasterKeyAndHash(\n response.key,\n response.masterPasswordHash,\n this.authRequestKeyPair.privateKey,\n );\n\n return new AuthRequestLoginCredentials(\n this.email,\n this.authRequest.accessCode,\n requestId,\n null, // no userKey\n masterKey,\n masterKeyHash,\n );\n } else {\n const userKey = await this.authRequestService.decryptPubKeyEncryptedUserKey(\n response.key,\n this.authRequestKeyPair.privateKey,\n );\n return new AuthRequestLoginCredentials(\n this.email,\n this.authRequest.accessCode,\n requestId,\n userKey,\n null, // no masterKey\n null, // no masterKeyHash\n );\n }\n }\n\n private async loginViaAuthRequestStrategy(\n requestId: string,\n authReqResponse: AuthRequestResponse,\n ): Promise {\n // Note: credentials change based on if the authReqResponse.key is a encryptedMasterKey or UserKey\n const credentials = await this.buildAuthRequestLoginCredentials(requestId, authReqResponse);\n\n // Note: keys are set by AuthRequestLoginStrategy success handling\n return await this.loginStrategyService.logIn(credentials);\n }\n\n // Routing logic\n private async handlePostLoginNavigation(loginResponse: AuthResult) {\n if (loginResponse.requiresTwoFactor) {\n if (this.onSuccessfulLoginTwoFactorNavigate != null) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.onSuccessfulLoginTwoFactorNavigate();\n } else {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([this.twoFactorRoute]);\n }\n } else if (loginResponse.forcePasswordReset != ForceSetPasswordReason.None) {\n if (this.onSuccessfulLoginForceResetNavigate != null) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.onSuccessfulLoginForceResetNavigate();\n } else {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([this.forcePasswordResetRoute]);\n }\n } else {\n await this.handleSuccessfulLoginNavigation();\n }\n }\n\n async setRememberEmailValues() {\n const rememberEmail = this.loginService.getRememberEmail();\n const rememberedEmail = this.loginService.getEmail();\n await this.stateService.setRememberedEmail(rememberEmail ? rememberedEmail : null);\n this.loginService.clearValues();\n }\n\n private async handleSuccessfulLoginNavigation() {\n if (this.state === State.StandardAuthRequest) {\n // Only need to set remembered email on standard login with auth req flow\n await this.setRememberEmailValues();\n }\n\n if (this.onSuccessfulLogin != null) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.onSuccessfulLogin();\n }\n\n if (this.onSuccessfulLoginNavigate != null) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.onSuccessfulLoginNavigate();\n } else {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([this.successRoute]);\n }\n }\n}\n","\n\n\n
\n \n\n \n

\n {{ \"loginOrCreateNewAccount\" | i18n }}\n

\n\n \n

{{ \"loginInitiated\" | i18n }}

\n\n
\n

{{ \"notificationSentDevice\" | i18n }}

\n\n

\n {{ \"fingerprintMatchInfo\" | i18n }}\n

\n
\n\n
\n

{{ \"fingerprintPhraseHeader\" | i18n }}

\n

\n {{ fingerprintPhrase }}\n

\n
\n\n \n\n
\n\n
\n {{ \"loginWithDeviceEnabledNote\" | i18n }}\n {{ \"viewAllLoginOptions\" | i18n }}\n
\n
\n \n \n \n

{{ \"adminApprovalRequested\" | i18n }}

\n\n
\n

{{ \"adminApprovalRequestSentToAdmins\" | i18n }}

\n

{{ \"youWillBeNotifiedOnceApproved\" | i18n }}

\n
\n\n
\n

{{ \"fingerprintPhraseHeader\" | i18n }}

\n

\n {{ fingerprintPhrase }}\n

\n
\n\n
\n\n
\n {{ \"troubleLoggingIn\" | i18n }}\n {{ \"viewAllLoginOptions\" | i18n }}\n
\n \n
\n \n\n","import { Component, OnDestroy, OnInit } from \"@angular/core\";\nimport { Router } from \"@angular/router\";\n\nimport { LoginViaAuthRequestComponent as BaseLoginWithDeviceComponent } from \"@bitwarden/angular/auth/components/login-via-auth-request.component\";\nimport {\n AuthRequestServiceAbstraction,\n LoginStrategyServiceAbstraction,\n} from \"@bitwarden/auth/common\";\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { AnonymousHubService } from \"@bitwarden/common/auth/abstractions/anonymous-hub.service\";\nimport { AuthService } from \"@bitwarden/common/auth/abstractions/auth.service\";\nimport { DeviceTrustCryptoServiceAbstraction } from \"@bitwarden/common/auth/abstractions/device-trust-crypto.service.abstraction\";\nimport { LoginService } from \"@bitwarden/common/auth/abstractions/login.service\";\nimport { AppIdService } from \"@bitwarden/common/platform/abstractions/app-id.service\";\nimport { CryptoFunctionService } from \"@bitwarden/common/platform/abstractions/crypto-function.service\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { EnvironmentService } from \"@bitwarden/common/platform/abstractions/environment.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { ValidationService } from \"@bitwarden/common/platform/abstractions/validation.service\";\nimport { PasswordGenerationServiceAbstraction } from \"@bitwarden/common/tools/generator/password\";\n\nimport { StateService } from \"../../core\";\n\n@Component({\n selector: \"app-login-via-auth-request\",\n templateUrl: \"login-via-auth-request.component.html\",\n})\nexport class LoginViaAuthRequestComponent\n extends BaseLoginWithDeviceComponent\n implements OnInit, OnDestroy\n{\n constructor(\n router: Router,\n cryptoService: CryptoService,\n cryptoFunctionService: CryptoFunctionService,\n appIdService: AppIdService,\n passwordGenerationService: PasswordGenerationServiceAbstraction,\n apiService: ApiService,\n authService: AuthService,\n logService: LogService,\n environmentService: EnvironmentService,\n i18nService: I18nService,\n platformUtilsService: PlatformUtilsService,\n anonymousHubService: AnonymousHubService,\n validationService: ValidationService,\n stateService: StateService,\n loginService: LoginService,\n deviceTrustCryptoService: DeviceTrustCryptoServiceAbstraction,\n authRequestService: AuthRequestServiceAbstraction,\n loginStrategyService: LoginStrategyServiceAbstraction,\n ) {\n super(\n router,\n cryptoService,\n cryptoFunctionService,\n appIdService,\n passwordGenerationService,\n apiService,\n authService,\n logService,\n environmentService,\n i18nService,\n platformUtilsService,\n anonymousHubService,\n validationService,\n stateService,\n loginService,\n deviceTrustCryptoService,\n authRequestService,\n loginStrategyService,\n );\n }\n}\n","import { Directive, OnInit } from \"@angular/core\";\nimport { Router } from \"@angular/router\";\n\nimport { WebAuthnLoginServiceAbstraction } from \"@bitwarden/common/auth/abstractions/webauthn/webauthn-login.service.abstraction\";\nimport { ForceSetPasswordReason } from \"@bitwarden/common/auth/models/domain/force-set-password-reason\";\nimport { WebAuthnLoginCredentialAssertionView } from \"@bitwarden/common/auth/models/view/webauthn-login/webauthn-login-credential-assertion.view\";\nimport { ErrorResponse } from \"@bitwarden/common/models/response/error.response\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { ValidationService } from \"@bitwarden/common/platform/abstractions/validation.service\";\n\nexport type State = \"assert\" | \"assertFailed\";\n\n@Directive()\nexport class BaseLoginViaWebAuthnComponent implements OnInit {\n protected currentState: State = \"assert\";\n\n protected successRoute = \"/vault\";\n protected forcePasswordResetRoute = \"/update-temp-password\";\n\n constructor(\n private webAuthnLoginService: WebAuthnLoginServiceAbstraction,\n private router: Router,\n private logService: LogService,\n private validationService: ValidationService,\n private i18nService: I18nService,\n ) {}\n\n ngOnInit(): void {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.authenticate();\n }\n\n protected retry() {\n this.currentState = \"assert\";\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.authenticate();\n }\n\n private async authenticate() {\n let assertion: WebAuthnLoginCredentialAssertionView;\n try {\n const options = await this.webAuthnLoginService.getCredentialAssertionOptions();\n assertion = await this.webAuthnLoginService.assertCredential(options);\n } catch (error) {\n this.validationService.showError(error);\n this.currentState = \"assertFailed\";\n return;\n }\n try {\n const authResult = await this.webAuthnLoginService.logIn(assertion);\n\n if (authResult.requiresTwoFactor) {\n this.validationService.showError(\n this.i18nService.t(\"twoFactorForPasskeysNotSupportedOnClientUpdateToLogIn\"),\n );\n this.currentState = \"assertFailed\";\n } else if (authResult.forcePasswordReset == ForceSetPasswordReason.AdminForcePasswordReset) {\n await this.router.navigate([this.forcePasswordResetRoute]);\n } else {\n await this.router.navigate([this.successRoute]);\n }\n } catch (error) {\n if (error instanceof ErrorResponse) {\n this.validationService.showError(this.i18nService.t(\"invalidPasskeyPleaseTryAgain\"));\n }\n this.logService.error(error);\n this.currentState = \"assertFailed\";\n }\n }\n}\n","import { svgIcon } from \"@bitwarden/components\";\n\nexport const CreatePasskeyFailedIcon = svgIcon`\n\n \n \n \n \n \n \n \n \n \n\n`;\n","import { svgIcon } from \"@bitwarden/components\";\n\nexport const CreatePasskeyIcon = svgIcon`\n\n \n \n \n \n \n \n \n \n\n`;\n","\n
\n \n

\n {{ \"readingPasskeyLoading\" | i18n }}\n

\n\n \n
\n \n \n

{{ \"readingPasskeyLoadingInfo\" | i18n }}

\n \n {{ \"loading\" | i18n }}\n \n
\n\n \n \n

{{ \"readingPasskeyLoadingInfo\" | i18n }}

\n \n {{ \"tryAgain\" | i18n }}\n \n
\n
\n

\n {{ \"troubleLoggingIn\" | i18n }}
\n {{ \"useADifferentLogInMethod\" | i18n }}\n

\n
\n \n\n","import { Component } from \"@angular/core\";\n\nimport { BaseLoginViaWebAuthnComponent } from \"@bitwarden/angular/auth/components/base-login-via-webauthn.component\";\nimport { CreatePasskeyFailedIcon } from \"@bitwarden/angular/auth/icons/create-passkey-failed.icon\";\nimport { CreatePasskeyIcon } from \"@bitwarden/angular/auth/icons/create-passkey.icon\";\n\n@Component({\n selector: \"app-login-via-webauthn\",\n templateUrl: \"login-via-webauthn.component.html\",\n})\nexport class LoginViaWebAuthnComponent extends BaseLoginViaWebAuthnComponent {\n protected readonly Icons = { CreatePasskeyIcon, CreatePasskeyFailedIcon };\n}\n","import { Directive, ElementRef, NgZone, OnDestroy, OnInit, ViewChild } from \"@angular/core\";\nimport { FormBuilder, Validators } from \"@angular/forms\";\nimport { ActivatedRoute, Router } from \"@angular/router\";\nimport { Subject, firstValueFrom } from \"rxjs\";\nimport { take, takeUntil } from \"rxjs/operators\";\n\nimport { LoginStrategyServiceAbstraction, PasswordLoginCredentials } from \"@bitwarden/auth/common\";\nimport { DevicesApiServiceAbstraction } from \"@bitwarden/common/auth/abstractions/devices-api.service.abstraction\";\nimport { LoginService } from \"@bitwarden/common/auth/abstractions/login.service\";\nimport { SsoLoginServiceAbstraction } from \"@bitwarden/common/auth/abstractions/sso-login.service.abstraction\";\nimport { WebAuthnLoginServiceAbstraction } from \"@bitwarden/common/auth/abstractions/webauthn/webauthn-login.service.abstraction\";\nimport { AuthResult } from \"@bitwarden/common/auth/models/domain/auth-result\";\nimport { ForceSetPasswordReason } from \"@bitwarden/common/auth/models/domain/force-set-password-reason\";\nimport { AppIdService } from \"@bitwarden/common/platform/abstractions/app-id.service\";\nimport { CryptoFunctionService } from \"@bitwarden/common/platform/abstractions/crypto-function.service\";\nimport { EnvironmentService } from \"@bitwarden/common/platform/abstractions/environment.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\nimport { PasswordGenerationServiceAbstraction } from \"@bitwarden/common/tools/generator/password\";\n\nimport {\n AllValidationErrors,\n FormValidationErrorsService,\n} from \"../../platform/abstractions/form-validation-errors.service\";\n\nimport { CaptchaProtectedComponent } from \"./captcha-protected.component\";\n\n@Directive()\nexport class LoginComponent extends CaptchaProtectedComponent implements OnInit, OnDestroy {\n @ViewChild(\"masterPasswordInput\", { static: true }) masterPasswordInput: ElementRef;\n\n showPassword = false;\n formPromise: Promise;\n onSuccessfulLogin: () => Promise;\n onSuccessfulLoginNavigate: () => Promise;\n onSuccessfulLoginTwoFactorNavigate: () => Promise;\n onSuccessfulLoginForceResetNavigate: () => Promise;\n showLoginWithDevice: boolean;\n validatedEmail = false;\n paramEmailSet = false;\n\n formGroup = this.formBuilder.group({\n email: [\"\", [Validators.required, Validators.email]],\n masterPassword: [\n \"\",\n [Validators.required, Validators.minLength(Utils.originalMinimumPasswordLength)],\n ],\n rememberEmail: [false],\n });\n\n protected twoFactorRoute = \"2fa\";\n protected successRoute = \"vault\";\n protected forcePasswordResetRoute = \"update-temp-password\";\n\n protected destroy$ = new Subject();\n\n get loggedEmail() {\n return this.formGroup.value.email;\n }\n\n constructor(\n protected devicesApiService: DevicesApiServiceAbstraction,\n protected appIdService: AppIdService,\n protected loginStrategyService: LoginStrategyServiceAbstraction,\n protected router: Router,\n platformUtilsService: PlatformUtilsService,\n i18nService: I18nService,\n protected stateService: StateService,\n environmentService: EnvironmentService,\n protected passwordGenerationService: PasswordGenerationServiceAbstraction,\n protected cryptoFunctionService: CryptoFunctionService,\n protected logService: LogService,\n protected ngZone: NgZone,\n protected formBuilder: FormBuilder,\n protected formValidationErrorService: FormValidationErrorsService,\n protected route: ActivatedRoute,\n protected loginService: LoginService,\n protected ssoLoginService: SsoLoginServiceAbstraction,\n protected webAuthnLoginService: WebAuthnLoginServiceAbstraction,\n ) {\n super(environmentService, i18nService, platformUtilsService);\n }\n\n async ngOnInit() {\n this.route?.queryParams.pipe(takeUntil(this.destroy$)).subscribe((params) => {\n if (!params) {\n return;\n }\n\n const queryParamsEmail = params.email;\n\n if (queryParamsEmail != null && queryParamsEmail.indexOf(\"@\") > -1) {\n this.formGroup.get(\"email\").setValue(queryParamsEmail);\n this.loginService.setEmail(queryParamsEmail);\n this.paramEmailSet = true;\n }\n });\n let email = this.loginService.getEmail();\n\n if (email == null || email === \"\") {\n email = await this.stateService.getRememberedEmail();\n }\n\n if (!this.paramEmailSet) {\n this.formGroup.get(\"email\")?.setValue(email ?? \"\");\n }\n let rememberEmail = this.loginService.getRememberEmail();\n if (rememberEmail == null) {\n rememberEmail = (await this.stateService.getRememberedEmail()) != null;\n }\n this.formGroup.get(\"rememberEmail\")?.setValue(rememberEmail);\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n async submit(showToast = true) {\n const data = this.formGroup.value;\n\n await this.setupCaptcha();\n\n this.formGroup.markAllAsTouched();\n\n //web\n if (this.formGroup.invalid && !showToast) {\n return;\n }\n\n //desktop, browser; This should be removed once all clients use reactive forms\n if (this.formGroup.invalid && showToast) {\n const errorText = this.getErrorToastMessage();\n this.platformUtilsService.showToast(\"error\", this.i18nService.t(\"errorOccurred\"), errorText);\n return;\n }\n\n try {\n const credentials = new PasswordLoginCredentials(\n data.email,\n data.masterPassword,\n this.captchaToken,\n null,\n );\n\n this.formPromise = this.loginStrategyService.logIn(credentials);\n const response = await this.formPromise;\n this.setFormValues();\n await this.loginService.saveEmailSettings();\n if (this.handleCaptchaRequired(response)) {\n return;\n } else if (this.handleMigrateEncryptionKey(response)) {\n return;\n } else if (response.requiresTwoFactor) {\n if (this.onSuccessfulLoginTwoFactorNavigate != null) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.onSuccessfulLoginTwoFactorNavigate();\n } else {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([this.twoFactorRoute]);\n }\n } else if (response.forcePasswordReset != ForceSetPasswordReason.None) {\n if (this.onSuccessfulLoginForceResetNavigate != null) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.onSuccessfulLoginForceResetNavigate();\n } else {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([this.forcePasswordResetRoute]);\n }\n } else {\n if (this.onSuccessfulLogin != null) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.onSuccessfulLogin();\n }\n if (this.onSuccessfulLoginNavigate != null) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.onSuccessfulLoginNavigate();\n } else {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([this.successRoute]);\n }\n }\n } catch (e) {\n this.logService.error(e);\n }\n }\n\n togglePassword() {\n this.showPassword = !this.showPassword;\n if (this.ngZone.isStable) {\n document.getElementById(\"masterPassword\").focus();\n } else {\n this.ngZone.onStable\n .pipe(take(1))\n .subscribe(() => document.getElementById(\"masterPassword\").focus());\n }\n }\n\n async startAuthRequestLogin() {\n this.formGroup.get(\"masterPassword\")?.clearValidators();\n this.formGroup.get(\"masterPassword\")?.updateValueAndValidity();\n\n if (!this.formGroup.valid) {\n return;\n }\n\n this.setFormValues();\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/login-with-device\"]);\n }\n\n async launchSsoBrowser(clientId: string, ssoRedirectUri: string) {\n await this.saveEmailSettings();\n // Generate necessary sso params\n const passwordOptions: any = {\n type: \"password\",\n length: 64,\n uppercase: true,\n lowercase: true,\n numbers: true,\n special: false,\n };\n const state = await this.passwordGenerationService.generatePassword(passwordOptions);\n const ssoCodeVerifier = await this.passwordGenerationService.generatePassword(passwordOptions);\n const codeVerifierHash = await this.cryptoFunctionService.hash(ssoCodeVerifier, \"sha256\");\n const codeChallenge = Utils.fromBufferToUrlB64(codeVerifierHash);\n\n // Save sso params\n await this.ssoLoginService.setSsoState(state);\n await this.ssoLoginService.setCodeVerifier(ssoCodeVerifier);\n\n // Build URI\n const env = await firstValueFrom(this.environmentService.environment$);\n const webUrl = env.getWebVaultUrl();\n\n // Launch browser\n this.platformUtilsService.launchUri(\n webUrl +\n \"/#/sso?clientId=\" +\n clientId +\n \"&redirectUri=\" +\n encodeURIComponent(ssoRedirectUri) +\n \"&state=\" +\n state +\n \"&codeChallenge=\" +\n codeChallenge +\n \"&email=\" +\n encodeURIComponent(this.formGroup.controls.email.value),\n );\n }\n\n async validateEmail() {\n this.formGroup.controls.email.markAsTouched();\n const emailInvalid = this.formGroup.get(\"email\").invalid;\n if (!emailInvalid) {\n this.toggleValidateEmail(true);\n await this.getLoginWithDevice(this.loggedEmail);\n }\n }\n\n toggleValidateEmail(value: boolean) {\n this.validatedEmail = value;\n if (!this.validatedEmail) {\n // Reset master password only when going from validated to not validated\n // so that autofill can work properly\n this.formGroup.controls.masterPassword.reset();\n } else {\n // Mark MP as untouched so that, when users enter email and hit enter,\n // the MP field doesn't load with validation errors\n this.formGroup.controls.masterPassword.markAsUntouched();\n\n // When email is validated, focus on master password after\n // waiting for input to be rendered\n if (this.ngZone.isStable) {\n this.masterPasswordInput?.nativeElement?.focus();\n } else {\n this.ngZone.onStable.pipe(take(1)).subscribe(() => {\n this.masterPasswordInput?.nativeElement?.focus();\n });\n }\n }\n }\n\n setFormValues() {\n this.loginService.setEmail(this.formGroup.value.email);\n this.loginService.setRememberEmail(this.formGroup.value.rememberEmail);\n }\n\n async saveEmailSettings() {\n this.setFormValues();\n await this.loginService.saveEmailSettings();\n\n // Save off email for SSO\n await this.ssoLoginService.setSsoEmail(this.formGroup.value.email);\n }\n\n // Legacy accounts used the master key to encrypt data. Migration is required\n // but only performed on web\n protected handleMigrateEncryptionKey(result: AuthResult): boolean {\n if (!result.requiresEncryptionKeyMigration) {\n return false;\n }\n\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccured\"),\n this.i18nService.t(\"encryptionKeyMigrationRequired\"),\n );\n return true;\n }\n\n private getErrorToastMessage() {\n const error: AllValidationErrors = this.formValidationErrorService\n .getFormValidationErrors(this.formGroup.controls)\n .shift();\n\n if (error) {\n switch (error.errorName) {\n case \"email\":\n return this.i18nService.t(\"invalidEmail\");\n case \"minlength\":\n return this.i18nService.t(\"masterPasswordMinlength\", Utils.originalMinimumPasswordLength);\n default:\n return this.i18nService.t(this.errorTag(error));\n }\n }\n\n return;\n }\n\n private errorTag(error: AllValidationErrors): string {\n const name = error.errorName.charAt(0).toUpperCase() + error.errorName.slice(1);\n return `${error.controlName}${name}`;\n }\n\n async getLoginWithDevice(email: string) {\n try {\n const deviceIdentifier = await this.appIdService.getAppId();\n this.showLoginWithDevice = await this.devicesApiService.getKnownDevice(\n email,\n deviceIdentifier,\n );\n } catch (e) {\n this.showLoginWithDevice = false;\n }\n }\n}\n","\n \n
\n \n

\n {{ \"loginOrCreateNewAccount\" | i18n }}\n

\n \n \n
\n \n {{ \"emailAddress\" | i18n }}\n \n \n
\n\n
\n \n \n {{ \"rememberEmail\" | i18n }}\n \n
\n\n
\n \n {{ \"continue\" | i18n }} \n \n
\n\n
\n

{{ \"or\" | i18n }}

\n\n \n {{ \"loginWithPasskey\" | i18n }}\n \n
\n\n
\n\n

\n {{ \"newAroundHere\" | i18n }}\n \n {{ \"createAccount\" | i18n }}\n

\n
\n\n
\n
\n \n {{ \"masterPass\" | i18n }}\n \n \n \n {{ \"getMasterPasswordHint\" | i18n }}\n
\n\n
\n \n
\n\n
\n \n {{ \"loginWithMasterPassword\" | i18n }} \n \n
\n\n
\n \n {{ \"loginWithDevice\" | i18n }} \n \n
\n\n
\n \n \n {{ \"enterpriseSingleSignOn\" | i18n }}\n \n
\n\n
\n\n
\n

{{ \"loggingInAs\" | i18n }} {{ loggedEmail }}

\n {{ \"notYou\" | i18n }}\n
\n
\n
\n \n \n\n","import { Component, NgZone, OnInit } from \"@angular/core\";\nimport { FormBuilder } from \"@angular/forms\";\nimport { ActivatedRoute, Router } from \"@angular/router\";\nimport { takeUntil } from \"rxjs\";\nimport { first } from \"rxjs/operators\";\n\nimport { LoginComponent as BaseLoginComponent } from \"@bitwarden/angular/auth/components/login.component\";\nimport { FormValidationErrorsService } from \"@bitwarden/angular/platform/abstractions/form-validation-errors.service\";\nimport { LoginStrategyServiceAbstraction } from \"@bitwarden/auth/common\";\nimport { PolicyApiServiceAbstraction } from \"@bitwarden/common/admin-console/abstractions/policy/policy-api.service.abstraction\";\nimport { InternalPolicyService } from \"@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction\";\nimport { PolicyData } from \"@bitwarden/common/admin-console/models/data/policy.data\";\nimport { MasterPasswordPolicyOptions } from \"@bitwarden/common/admin-console/models/domain/master-password-policy-options\";\nimport { Policy } from \"@bitwarden/common/admin-console/models/domain/policy\";\nimport { PolicyResponse } from \"@bitwarden/common/admin-console/models/response/policy.response\";\nimport { DevicesApiServiceAbstraction } from \"@bitwarden/common/auth/abstractions/devices-api.service.abstraction\";\nimport { LoginService } from \"@bitwarden/common/auth/abstractions/login.service\";\nimport { SsoLoginServiceAbstraction } from \"@bitwarden/common/auth/abstractions/sso-login.service.abstraction\";\nimport { WebAuthnLoginServiceAbstraction } from \"@bitwarden/common/auth/abstractions/webauthn/webauthn-login.service.abstraction\";\nimport { AuthResult } from \"@bitwarden/common/auth/models/domain/auth-result\";\nimport { ListResponse } from \"@bitwarden/common/models/response/list.response\";\nimport { AppIdService } from \"@bitwarden/common/platform/abstractions/app-id.service\";\nimport { CryptoFunctionService } from \"@bitwarden/common/platform/abstractions/crypto-function.service\";\nimport { EnvironmentService } from \"@bitwarden/common/platform/abstractions/environment.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { PasswordGenerationServiceAbstraction } from \"@bitwarden/common/tools/generator/password\";\nimport { PasswordStrengthServiceAbstraction } from \"@bitwarden/common/tools/password-strength\";\n\nimport { flagEnabled } from \"../../../utils/flags\";\nimport { RouterService, StateService } from \"../../core\";\n\n@Component({\n selector: \"app-login\",\n templateUrl: \"login.component.html\",\n})\n// eslint-disable-next-line rxjs-angular/prefer-takeuntil\nexport class LoginComponent extends BaseLoginComponent implements OnInit {\n showResetPasswordAutoEnrollWarning = false;\n enforcedPasswordPolicyOptions: MasterPasswordPolicyOptions;\n policies: ListResponse;\n showPasswordless = false;\n\n constructor(\n devicesApiService: DevicesApiServiceAbstraction,\n appIdService: AppIdService,\n loginStrategyService: LoginStrategyServiceAbstraction,\n router: Router,\n i18nService: I18nService,\n route: ActivatedRoute,\n platformUtilsService: PlatformUtilsService,\n environmentService: EnvironmentService,\n passwordGenerationService: PasswordGenerationServiceAbstraction,\n private passwordStrengthService: PasswordStrengthServiceAbstraction,\n cryptoFunctionService: CryptoFunctionService,\n private policyApiService: PolicyApiServiceAbstraction,\n private policyService: InternalPolicyService,\n logService: LogService,\n ngZone: NgZone,\n protected stateService: StateService,\n private routerService: RouterService,\n formBuilder: FormBuilder,\n formValidationErrorService: FormValidationErrorsService,\n loginService: LoginService,\n ssoLoginService: SsoLoginServiceAbstraction,\n webAuthnLoginService: WebAuthnLoginServiceAbstraction,\n ) {\n super(\n devicesApiService,\n appIdService,\n loginStrategyService,\n router,\n platformUtilsService,\n i18nService,\n stateService,\n environmentService,\n passwordGenerationService,\n cryptoFunctionService,\n logService,\n ngZone,\n formBuilder,\n formValidationErrorService,\n route,\n loginService,\n ssoLoginService,\n webAuthnLoginService,\n );\n this.onSuccessfulLoginNavigate = this.goAfterLogIn;\n this.showPasswordless = flagEnabled(\"showPasswordless\");\n }\n\n async ngOnInit() {\n // eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe\n this.route.queryParams.pipe(first()).subscribe(async (qParams) => {\n if (qParams.org != null) {\n const route = this.router.createUrlTree([\"create-organization\"], {\n queryParams: { plan: qParams.org },\n });\n this.routerService.setPreviousUrl(route.toString());\n }\n\n // Are they coming from an email for sponsoring a families organization\n if (qParams.sponsorshipToken != null) {\n const route = this.router.createUrlTree([\"setup/families-for-enterprise\"], {\n queryParams: { token: qParams.sponsorshipToken },\n });\n this.routerService.setPreviousUrl(route.toString());\n }\n await super.ngOnInit();\n });\n\n const invite = await this.stateService.getOrganizationInvitation();\n if (invite != null) {\n let policyList: Policy[] = null;\n try {\n this.policies = await this.policyApiService.getPoliciesByToken(\n invite.organizationId,\n invite.token,\n invite.email,\n invite.organizationUserId,\n );\n policyList = Policy.fromListResponse(this.policies);\n } catch (e) {\n this.logService.error(e);\n }\n\n if (policyList != null) {\n const resetPasswordPolicy = this.policyService.getResetPasswordPolicyOptions(\n policyList,\n invite.organizationId,\n );\n // Set to true if policy enabled and auto-enroll enabled\n this.showResetPasswordAutoEnrollWarning =\n resetPasswordPolicy[1] && resetPasswordPolicy[0].autoEnrollEnabled;\n\n this.policyService\n .masterPasswordPolicyOptions$(policyList)\n .pipe(takeUntil(this.destroy$))\n .subscribe((enforcedPasswordPolicyOptions) => {\n this.enforcedPasswordPolicyOptions = enforcedPasswordPolicyOptions;\n });\n }\n }\n }\n\n async goAfterLogIn() {\n const masterPassword = this.formGroup.value.masterPassword;\n\n // Check master password against policy\n if (this.enforcedPasswordPolicyOptions != null) {\n const strengthResult = this.passwordStrengthService.getPasswordStrength(\n masterPassword,\n this.formGroup.value.email,\n );\n const masterPasswordScore = strengthResult == null ? null : strengthResult.score;\n\n // If invalid, save policies and require update\n if (\n !this.policyService.evaluateMasterPassword(\n masterPasswordScore,\n masterPassword,\n this.enforcedPasswordPolicyOptions,\n )\n ) {\n const policiesData: { [id: string]: PolicyData } = {};\n this.policies.data.map((p) => (policiesData[p.id] = new PolicyData(p)));\n await this.policyService.replace(policiesData);\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"update-password\"]);\n return;\n }\n }\n\n this.loginService.clearValues();\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([this.successRoute]);\n }\n\n goToHint() {\n this.setFormValues();\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigateByUrl(\"/hint\");\n }\n\n goToRegister() {\n const email = this.formGroup.value.email;\n\n if (email) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/register\"], { queryParams: { email: email } });\n return;\n }\n\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/register\"]);\n }\n\n async submit() {\n const rememberEmail = this.formGroup.value.rememberEmail;\n\n if (!rememberEmail) {\n await this.stateService.setRememberedEmail(null);\n }\n await super.submit(false);\n }\n\n protected override handleMigrateEncryptionKey(result: AuthResult): boolean {\n if (!result.requiresEncryptionKeyMigration) {\n return false;\n }\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"migrate-legacy-encryption\"]);\n return true;\n }\n}\n","export class DeleteRecoverRequest {\n email: string;\n}\n","import { Component } from \"@angular/core\";\nimport { Router } from \"@angular/router\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { DeleteRecoverRequest } from \"@bitwarden/common/models/request/delete-recover.request\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\n\n@Component({\n selector: \"app-recover-delete\",\n templateUrl: \"recover-delete.component.html\",\n})\nexport class RecoverDeleteComponent {\n email: string;\n formPromise: Promise;\n\n constructor(\n private router: Router,\n private apiService: ApiService,\n private platformUtilsService: PlatformUtilsService,\n private i18nService: I18nService,\n private logService: LogService,\n ) {}\n\n async submit() {\n try {\n const request = new DeleteRecoverRequest();\n request.email = this.email.trim().toLowerCase();\n this.formPromise = this.apiService.postAccountRecoverDelete(request);\n await this.formPromise;\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"deleteRecoverEmailSent\"),\n );\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/\"]);\n } catch (e) {\n this.logService.error(e);\n }\n }\n}\n","
\n
\n
\n

{{ \"deleteAccount\" | i18n }}

\n
\n
\n

{{ \"deleteRecoverDesc\" | i18n }}

\n
\n \n \n
\n
\n
\n \n {{ \"submit\" | i18n }}\n \n \n \n {{ \"cancel\" | i18n }}\n \n
\n
\n
\n
\n
\n
\n","import { SecretVerificationRequest } from \"./secret-verification.request\";\n\nexport class TwoFactorRecoveryRequest extends SecretVerificationRequest {\n recoveryCode: string;\n email: string;\n}\n","import { Component } from \"@angular/core\";\nimport { Router } from \"@angular/router\";\n\nimport { LoginStrategyServiceAbstraction } from \"@bitwarden/auth/common\";\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { TwoFactorRecoveryRequest } from \"@bitwarden/common/auth/models/request/two-factor-recovery.request\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\n\n@Component({\n selector: \"app-recover-two-factor\",\n templateUrl: \"recover-two-factor.component.html\",\n})\nexport class RecoverTwoFactorComponent {\n email: string;\n masterPassword: string;\n recoveryCode: string;\n formPromise: Promise;\n\n constructor(\n private router: Router,\n private apiService: ApiService,\n private platformUtilsService: PlatformUtilsService,\n private i18nService: I18nService,\n private cryptoService: CryptoService,\n private loginStrategyService: LoginStrategyServiceAbstraction,\n private logService: LogService,\n ) {}\n\n async submit() {\n try {\n const request = new TwoFactorRecoveryRequest();\n request.recoveryCode = this.recoveryCode.replace(/\\s/g, \"\").toLowerCase();\n request.email = this.email.trim().toLowerCase();\n const key = await this.loginStrategyService.makePreloginKey(\n this.masterPassword,\n request.email,\n );\n request.masterPasswordHash = await this.cryptoService.hashMasterKey(this.masterPassword, key);\n this.formPromise = this.apiService.postTwoFactorRecover(request);\n await this.formPromise;\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"twoStepRecoverDisabled\"),\n );\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/\"]);\n } catch (e) {\n this.logService.error(e);\n }\n }\n}\n","
\n
\n
\n

{{ \"recoverAccountTwoStep\" | i18n }}

\n
\n
\n

\n {{ \"recoverAccountTwoStepDesc\" | i18n }}\n {{ \"learnMore\" | i18n }}\n

\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n \n {{ \"submit\" | i18n }}\n \n \n \n {{ \"cancel\" | i18n }}\n \n
\n
\n
\n
\n
\n
\n","import { Directive, OnInit } from \"@angular/core\";\nimport { Router } from \"@angular/router\";\n\nimport { OrganizationApiServiceAbstraction } from \"@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction\";\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\nimport { KeyConnectorService } from \"@bitwarden/common/auth/abstractions/key-connector.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { SyncService } from \"@bitwarden/common/vault/abstractions/sync/sync.service.abstraction\";\nimport { DialogService } from \"@bitwarden/components\";\n\n@Directive()\nexport class RemovePasswordComponent implements OnInit {\n actionPromise: Promise;\n continuing = false;\n leaving = false;\n\n loading = true;\n organization: Organization;\n email: string;\n\n constructor(\n private router: Router,\n private stateService: StateService,\n private syncService: SyncService,\n private platformUtilsService: PlatformUtilsService,\n private i18nService: I18nService,\n private keyConnectorService: KeyConnectorService,\n private organizationApiService: OrganizationApiServiceAbstraction,\n private dialogService: DialogService,\n ) {}\n\n async ngOnInit() {\n this.organization = await this.keyConnectorService.getManagingOrganization();\n this.email = await this.stateService.getEmail();\n await this.syncService.fullSync(false);\n this.loading = false;\n }\n\n async convert() {\n this.continuing = true;\n this.actionPromise = this.keyConnectorService.migrateUser();\n\n try {\n await this.actionPromise;\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"removedMasterPassword\"),\n );\n await this.keyConnectorService.removeConvertAccountRequired();\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"\"]);\n } catch (e) {\n this.platformUtilsService.showToast(\"error\", this.i18nService.t(\"errorOccurred\"), e.message);\n }\n }\n\n async leave() {\n const confirmed = await this.dialogService.openSimpleDialog({\n title: this.organization.name,\n content: { key: \"leaveOrganizationConfirmation\" },\n type: \"warning\",\n });\n\n if (!confirmed) {\n return false;\n }\n\n try {\n this.leaving = true;\n this.actionPromise = this.organizationApiService.leave(this.organization.id);\n await this.actionPromise;\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"leftOrganization\"));\n await this.keyConnectorService.removeConvertAccountRequired();\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"\"]);\n } catch (e) {\n this.platformUtilsService.showToast(\"error\", this.i18nService.t(\"errorOccurred\"), e);\n }\n }\n}\n","
\n
\n \"Bitwarden\"\n

\n \n {{ \"loading\" | i18n }}\n

\n
\n
\n
\n
\n
\n

{{ \"removeMasterPassword\" | i18n }}

\n
\n
\n
\n

{{ \"convertOrganizationEncryptionDesc\" | i18n: organization.name }}

\n\n \n \n {{ \"removeMasterPassword\" | i18n }}\n \n \n \n {{ \"leaveOrganization\" | i18n }}\n \n
\n
\n
\n
\n
\n","import { Component } from \"@angular/core\";\n\nimport { RemovePasswordComponent as BaseRemovePasswordComponent } from \"@bitwarden/angular/auth/components/remove-password.component\";\n\n@Component({\n selector: \"app-remove-password\",\n templateUrl: \"remove-password.component.html\",\n})\nexport class RemovePasswordComponent extends BaseRemovePasswordComponent {}\n","import { KeysRequest } from \"../../../models/request/keys.request\";\nimport { KdfType } from \"../../../platform/enums\";\n\nexport class SetPasswordRequest {\n masterPasswordHash: string;\n key: string;\n masterPasswordHint: string;\n keys: KeysRequest | null;\n kdf: KdfType;\n kdfIterations: number;\n kdfMemory?: number;\n kdfParallelism?: number;\n orgIdentifier: string;\n\n constructor(\n masterPasswordHash: string,\n key: string,\n masterPasswordHint: string,\n orgIdentifier: string,\n keys: KeysRequest | null,\n kdf: KdfType,\n kdfIterations: number,\n kdfMemory?: number,\n kdfParallelism?: number,\n ) {\n this.masterPasswordHash = masterPasswordHash;\n this.key = key;\n this.masterPasswordHint = masterPasswordHint;\n this.kdf = kdf;\n this.kdfIterations = kdfIterations;\n this.kdfMemory = kdfMemory;\n this.kdfParallelism = kdfParallelism;\n this.orgIdentifier = orgIdentifier;\n this.keys = keys;\n }\n}\n","import { Directive, OnDestroy, OnInit } from \"@angular/core\";\nimport { Subject, takeUntil } from \"rxjs\";\n\nimport { PolicyService } from \"@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction\";\nimport { MasterPasswordPolicyOptions } from \"@bitwarden/common/admin-console/models/domain/master-password-policy-options\";\nimport { KdfConfig } from \"@bitwarden/common/auth/models/domain/kdf-config\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { KdfType } from \"@bitwarden/common/platform/enums\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\nimport { EncString } from \"@bitwarden/common/platform/models/domain/enc-string\";\nimport { PasswordGenerationServiceAbstraction } from \"@bitwarden/common/tools/generator/password\";\nimport { UserKey, MasterKey } from \"@bitwarden/common/types/key\";\nimport { DialogService } from \"@bitwarden/components\";\n\nimport { PasswordColorText } from \"../../tools/password-strength/password-strength.component\";\n\n@Directive()\nexport class ChangePasswordComponent implements OnInit, OnDestroy {\n masterPassword: string;\n masterPasswordRetype: string;\n formPromise: Promise;\n enforcedPolicyOptions: MasterPasswordPolicyOptions;\n passwordStrengthResult: any;\n color: string;\n text: string;\n leakedPassword: boolean;\n minimumLength = Utils.minimumPasswordLength;\n\n protected email: string;\n protected kdf: KdfType;\n protected kdfConfig: KdfConfig;\n\n protected destroy$ = new Subject();\n\n constructor(\n protected i18nService: I18nService,\n protected cryptoService: CryptoService,\n protected messagingService: MessagingService,\n protected passwordGenerationService: PasswordGenerationServiceAbstraction,\n protected platformUtilsService: PlatformUtilsService,\n protected policyService: PolicyService,\n protected stateService: StateService,\n protected dialogService: DialogService,\n ) {}\n\n async ngOnInit() {\n this.email = await this.stateService.getEmail();\n this.policyService\n .masterPasswordPolicyOptions$()\n .pipe(takeUntil(this.destroy$))\n .subscribe(\n (enforcedPasswordPolicyOptions) =>\n (this.enforcedPolicyOptions ??= enforcedPasswordPolicyOptions),\n );\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n async submit() {\n if (!(await this.strongPassword())) {\n return;\n }\n\n if (!(await this.setupSubmitActions())) {\n return;\n }\n\n const email = await this.stateService.getEmail();\n if (this.kdf == null) {\n this.kdf = await this.stateService.getKdfType();\n }\n if (this.kdfConfig == null) {\n this.kdfConfig = await this.stateService.getKdfConfig();\n }\n\n // Create new master key\n const newMasterKey = await this.cryptoService.makeMasterKey(\n this.masterPassword,\n email.trim().toLowerCase(),\n this.kdf,\n this.kdfConfig,\n );\n const newMasterKeyHash = await this.cryptoService.hashMasterKey(\n this.masterPassword,\n newMasterKey,\n );\n\n let newProtectedUserKey: [UserKey, EncString] = null;\n const userKey = await this.cryptoService.getUserKey();\n if (userKey == null) {\n newProtectedUserKey = await this.cryptoService.makeUserKey(newMasterKey);\n } else {\n newProtectedUserKey = await this.cryptoService.encryptUserKeyWithMasterKey(newMasterKey);\n }\n\n await this.performSubmitActions(newMasterKeyHash, newMasterKey, newProtectedUserKey);\n }\n\n async setupSubmitActions(): Promise {\n // Override in sub-class\n // Can be used for additional validation and/or other processes the should occur before changing passwords\n return true;\n }\n\n async performSubmitActions(\n newMasterKeyHash: string,\n newMasterKey: MasterKey,\n newUserKey: [UserKey, EncString],\n ) {\n // Override in sub-class\n }\n\n async strongPassword(): Promise {\n if (this.masterPassword == null || this.masterPassword === \"\") {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"masterPasswordRequired\"),\n );\n return false;\n }\n if (this.masterPassword.length < this.minimumLength) {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"masterPasswordMinimumlength\", this.minimumLength),\n );\n return false;\n }\n if (this.masterPassword !== this.masterPasswordRetype) {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"masterPassDoesntMatch\"),\n );\n return false;\n }\n\n const strengthResult = this.passwordStrengthResult;\n\n if (\n this.enforcedPolicyOptions != null &&\n !this.policyService.evaluateMasterPassword(\n strengthResult.score,\n this.masterPassword,\n this.enforcedPolicyOptions,\n )\n ) {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"masterPasswordPolicyRequirementsNotMet\"),\n );\n return false;\n }\n\n const weakPassword = strengthResult != null && strengthResult.score < 3;\n\n if (weakPassword && this.leakedPassword) {\n const result = await this.dialogService.openSimpleDialog({\n title: { key: \"weakAndExposedMasterPassword\" },\n content: { key: \"weakAndBreachedMasterPasswordDesc\" },\n type: \"warning\",\n });\n\n if (!result) {\n return false;\n }\n } else {\n if (weakPassword) {\n const result = await this.dialogService.openSimpleDialog({\n title: { key: \"weakMasterPassword\" },\n content: { key: \"weakMasterPasswordDesc\" },\n type: \"warning\",\n });\n\n if (!result) {\n return false;\n }\n }\n if (this.leakedPassword) {\n const result = await this.dialogService.openSimpleDialog({\n title: { key: \"exposedMasterPassword\" },\n content: { key: \"exposedMasterPasswordDesc\" },\n type: \"warning\",\n });\n\n if (!result) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n async logOut() {\n const confirmed = await this.dialogService.openSimpleDialog({\n title: { key: \"logOut\" },\n content: { key: \"logOutConfirmation\" },\n acceptButtonText: { key: \"logOut\" },\n type: \"warning\",\n });\n\n if (confirmed) {\n this.messagingService.send(\"logout\");\n }\n }\n\n getStrengthResult(result: any) {\n this.passwordStrengthResult = result;\n }\n\n getPasswordScoreText(event: PasswordColorText) {\n this.color = event.color;\n this.text = event.text;\n }\n}\n","import { Directive } from \"@angular/core\";\nimport { ActivatedRoute, Router } from \"@angular/router\";\nimport { firstValueFrom, of } from \"rxjs\";\nimport { filter, first, switchMap, tap } from \"rxjs/operators\";\n\nimport { InternalUserDecryptionOptionsServiceAbstraction } from \"@bitwarden/auth/common\";\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { OrganizationApiServiceAbstraction } from \"@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction\";\nimport { OrganizationUserService } from \"@bitwarden/common/admin-console/abstractions/organization-user/organization-user.service\";\nimport { OrganizationUserResetPasswordEnrollmentRequest } from \"@bitwarden/common/admin-console/abstractions/organization-user/requests\";\nimport { PolicyApiServiceAbstraction } from \"@bitwarden/common/admin-console/abstractions/policy/policy-api.service.abstraction\";\nimport { PolicyService } from \"@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction\";\nimport { MasterPasswordPolicyOptions } from \"@bitwarden/common/admin-console/models/domain/master-password-policy-options\";\nimport { OrganizationAutoEnrollStatusResponse } from \"@bitwarden/common/admin-console/models/response/organization-auto-enroll-status.response\";\nimport { SsoLoginServiceAbstraction } from \"@bitwarden/common/auth/abstractions/sso-login.service.abstraction\";\nimport { ForceSetPasswordReason } from \"@bitwarden/common/auth/models/domain/force-set-password-reason\";\nimport { SetPasswordRequest } from \"@bitwarden/common/auth/models/request/set-password.request\";\nimport { KeysRequest } from \"@bitwarden/common/models/request/keys.request\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport {\n HashPurpose,\n DEFAULT_KDF_TYPE,\n DEFAULT_KDF_CONFIG,\n} from \"@bitwarden/common/platform/enums\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\nimport { EncString } from \"@bitwarden/common/platform/models/domain/enc-string\";\nimport { PasswordGenerationServiceAbstraction } from \"@bitwarden/common/tools/generator/password\";\nimport { MasterKey, UserKey } from \"@bitwarden/common/types/key\";\nimport { SyncService } from \"@bitwarden/common/vault/abstractions/sync/sync.service.abstraction\";\nimport { DialogService } from \"@bitwarden/components\";\n\nimport { ChangePasswordComponent as BaseChangePasswordComponent } from \"./change-password.component\";\n\n@Directive()\nexport class SetPasswordComponent extends BaseChangePasswordComponent {\n syncLoading = true;\n showPassword = false;\n hint = \"\";\n orgSsoIdentifier: string = null;\n orgId: string;\n resetPasswordAutoEnroll = false;\n onSuccessfulChangePassword: () => Promise;\n successRoute = \"vault\";\n\n forceSetPasswordReason: ForceSetPasswordReason = ForceSetPasswordReason.None;\n ForceSetPasswordReason = ForceSetPasswordReason;\n\n constructor(\n i18nService: I18nService,\n cryptoService: CryptoService,\n messagingService: MessagingService,\n passwordGenerationService: PasswordGenerationServiceAbstraction,\n platformUtilsService: PlatformUtilsService,\n private policyApiService: PolicyApiServiceAbstraction,\n policyService: PolicyService,\n protected router: Router,\n private apiService: ApiService,\n private syncService: SyncService,\n private route: ActivatedRoute,\n stateService: StateService,\n private organizationApiService: OrganizationApiServiceAbstraction,\n private organizationUserService: OrganizationUserService,\n private userDecryptionOptionsService: InternalUserDecryptionOptionsServiceAbstraction,\n private ssoLoginService: SsoLoginServiceAbstraction,\n dialogService: DialogService,\n ) {\n super(\n i18nService,\n cryptoService,\n messagingService,\n passwordGenerationService,\n platformUtilsService,\n policyService,\n stateService,\n dialogService,\n );\n }\n\n async ngOnInit() {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n super.ngOnInit();\n\n await this.syncService.fullSync(true);\n this.syncLoading = false;\n\n this.forceSetPasswordReason = await this.stateService.getForceSetPasswordReason();\n\n this.route.queryParams\n .pipe(\n first(),\n switchMap((qParams) => {\n if (qParams.identifier != null) {\n return of(qParams.identifier);\n } else {\n // Try to get orgSsoId from state as fallback\n // Note: this is primarily for the TDE user w/out MP obtains admin MP reset permission scenario.\n return this.ssoLoginService.getActiveUserOrganizationSsoIdentifier();\n }\n }),\n filter((orgSsoId) => orgSsoId != null),\n tap((orgSsoId: string) => {\n this.orgSsoIdentifier = orgSsoId;\n }),\n switchMap((orgSsoId: string) => this.organizationApiService.getAutoEnrollStatus(orgSsoId)),\n tap((orgAutoEnrollStatusResponse: OrganizationAutoEnrollStatusResponse) => {\n this.orgId = orgAutoEnrollStatusResponse.id;\n this.resetPasswordAutoEnroll = orgAutoEnrollStatusResponse.resetPasswordEnabled;\n }),\n switchMap((orgAutoEnrollStatusResponse: OrganizationAutoEnrollStatusResponse) =>\n // Must get org id from response to get master password policy options\n this.policyApiService.getMasterPasswordPolicyOptsForOrgUser(\n orgAutoEnrollStatusResponse.id,\n ),\n ),\n tap((masterPasswordPolicyOptions: MasterPasswordPolicyOptions) => {\n this.enforcedPolicyOptions = masterPasswordPolicyOptions;\n }),\n )\n .subscribe({\n error: () => {\n this.platformUtilsService.showToast(\"error\", null, this.i18nService.t(\"errorOccurred\"));\n },\n });\n }\n\n async setupSubmitActions() {\n this.kdf = DEFAULT_KDF_TYPE;\n this.kdfConfig = DEFAULT_KDF_CONFIG;\n return true;\n }\n\n async performSubmitActions(\n masterPasswordHash: string,\n masterKey: MasterKey,\n userKey: [UserKey, EncString],\n ) {\n let keysRequest: KeysRequest | null = null;\n let newKeyPair: [string, EncString] | null = null;\n\n if (\n this.forceSetPasswordReason !=\n ForceSetPasswordReason.TdeUserWithoutPasswordHasPasswordResetPermission\n ) {\n // Existing JIT provisioned user in a MP encryption org setting first password\n // Users in this state will not already have a user asymmetric key pair so must create it for them\n // We don't want to re-create the user key pair if the user already has one (TDE user case)\n newKeyPair = await this.cryptoService.makeKeyPair(userKey[0]);\n keysRequest = new KeysRequest(newKeyPair[0], newKeyPair[1].encryptedString);\n }\n\n const request = new SetPasswordRequest(\n masterPasswordHash,\n userKey[1].encryptedString,\n this.hint,\n this.orgSsoIdentifier,\n keysRequest,\n this.kdf,\n this.kdfConfig.iterations,\n this.kdfConfig.memory,\n this.kdfConfig.parallelism,\n );\n try {\n if (this.resetPasswordAutoEnroll) {\n this.formPromise = this.apiService\n .setPassword(request)\n .then(async () => {\n await this.onSetPasswordSuccess(masterKey, userKey, newKeyPair);\n return this.organizationApiService.getKeys(this.orgId);\n })\n .then(async (response) => {\n if (response == null) {\n throw new Error(this.i18nService.t(\"resetPasswordOrgKeysError\"));\n }\n const userId = await this.stateService.getUserId();\n const publicKey = Utils.fromB64ToArray(response.publicKey);\n\n // RSA Encrypt user key with organization public key\n const userKey = await this.cryptoService.getUserKey();\n const encryptedUserKey = await this.cryptoService.rsaEncrypt(userKey.key, publicKey);\n\n const resetRequest = new OrganizationUserResetPasswordEnrollmentRequest();\n resetRequest.masterPasswordHash = masterPasswordHash;\n resetRequest.resetPasswordKey = encryptedUserKey.encryptedString;\n\n return this.organizationUserService.putOrganizationUserResetPasswordEnrollment(\n this.orgId,\n userId,\n resetRequest,\n );\n });\n } else {\n this.formPromise = this.apiService.setPassword(request).then(async () => {\n await this.onSetPasswordSuccess(masterKey, userKey, newKeyPair);\n });\n }\n\n await this.formPromise;\n\n if (this.onSuccessfulChangePassword != null) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.onSuccessfulChangePassword();\n } else {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([this.successRoute]);\n }\n } catch {\n this.platformUtilsService.showToast(\"error\", null, this.i18nService.t(\"errorOccurred\"));\n }\n }\n\n togglePassword(confirmField: boolean) {\n this.showPassword = !this.showPassword;\n document.getElementById(confirmField ? \"masterPasswordRetype\" : \"masterPassword\").focus();\n }\n\n protected async onSetPasswordSuccess(\n masterKey: MasterKey,\n userKey: [UserKey, EncString],\n keyPair: [string, EncString] | null,\n ) {\n // Clear force set password reason to allow navigation back to vault.\n await this.stateService.setForceSetPasswordReason(ForceSetPasswordReason.None);\n\n // User now has a password so update account decryption options in state\n const userDecryptionOpts = await firstValueFrom(\n this.userDecryptionOptionsService.userDecryptionOptions$,\n );\n userDecryptionOpts.hasMasterPassword = true;\n await this.userDecryptionOptionsService.setUserDecryptionOptions(userDecryptionOpts);\n\n await this.stateService.setKdfType(this.kdf);\n await this.stateService.setKdfConfig(this.kdfConfig);\n await this.cryptoService.setMasterKey(masterKey);\n await this.cryptoService.setUserKey(userKey[0]);\n\n // Set private key only for new JIT provisioned users in MP encryption orgs\n // Existing TDE users will have private key set on sync or on login\n if (\n keyPair !== null &&\n this.forceSetPasswordReason !=\n ForceSetPasswordReason.TdeUserWithoutPasswordHasPasswordResetPermission\n ) {\n await this.cryptoService.setPrivateKey(keyPair[1].encryptedString);\n }\n\n const localMasterKeyHash = await this.cryptoService.hashMasterKey(\n this.masterPassword,\n masterKey,\n HashPurpose.LocalAuthorization,\n );\n await this.cryptoService.setMasterKeyHash(localMasterKeyHash);\n }\n}\n","
\n
\n
\n

{{ \"setMasterPassword\" | i18n }}

\n
\n
\n \n {{ \"loading\" | i18n }}\n
\n
\n \n {{ \"orgPermissionsUpdatedMustSetPassword\" | i18n }}\n

\n\n \n

{{ \"orgRequiresYouToSetPassword\" | i18n }}

\n
\n\n \n {{ \"resetPasswordAutoEnrollInviteWarning\" | i18n }}\n \n
\n \n \n \n
\n
\n \n \n \n
\n
\n \n \n \n
\n
\n
\n {{ \"masterPassDesc\" | i18n }}\n
\n
\n \n
\n \n \n \n \n
\n
\n
\n \n \n {{ \"masterPassHintDesc\" | i18n }}\n
\n
\n
\n \n \n {{ \"submit\" | i18n }}\n \n \n {{ \"logOut\" | i18n }}\n \n
\n
\n
\n
\n
\n
\n","import { Component } from \"@angular/core\";\n\nimport { SetPasswordComponent as BaseSetPasswordComponent } from \"@bitwarden/angular/auth/components/set-password.component\";\n\n@Component({\n selector: \"app-set-password\",\n templateUrl: \"set-password.component.html\",\n})\nexport class SetPasswordComponent extends BaseSetPasswordComponent {}\n","import { Component } from \"@angular/core\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { UserVerificationService } from \"@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction\";\nimport { Verification } from \"@bitwarden/common/auth/types/verification\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\n\n@Component({\n selector: \"app-deauthorize-sessions\",\n templateUrl: \"deauthorize-sessions.component.html\",\n})\nexport class DeauthorizeSessionsComponent {\n masterPassword: Verification;\n formPromise: Promise;\n\n constructor(\n private apiService: ApiService,\n private i18nService: I18nService,\n private platformUtilsService: PlatformUtilsService,\n private userVerificationService: UserVerificationService,\n private messagingService: MessagingService,\n private logService: LogService,\n ) {}\n\n async submit() {\n try {\n this.formPromise = this.userVerificationService\n .buildRequest(this.masterPassword)\n .then((request) => this.apiService.postSecurityStamp(request));\n await this.formPromise;\n this.platformUtilsService.showToast(\n \"success\",\n this.i18nService.t(\"sessionsDeauthorized\"),\n this.i18nService.t(\"logBackIn\"),\n );\n this.messagingService.send(\"logout\");\n } catch (e) {\n this.logService.error(e);\n }\n }\n}\n","
\n
\n \n
\n

{{ \"deauthorizeSessions\" | i18n }}

\n \n ×\n \n
\n
\n

{{ \"deauthorizeSessionsDesc\" | i18n }}

\n {{ \"deauthorizeSessionsWarning\" | i18n }}\n \n \n
\n
\n \n \n
\n \n
\n
\n","import { Component } from \"@angular/core\";\nimport { FormBuilder } from \"@angular/forms\";\n\nimport { AccountApiService } from \"@bitwarden/common/auth/abstractions/account-api.service\";\nimport { Verification } from \"@bitwarden/common/auth/types/verification\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\n\n@Component({\n selector: \"app-delete-account\",\n templateUrl: \"delete-account.component.html\",\n})\nexport class DeleteAccountComponent {\n formPromise: Promise;\n\n deleteForm = this.formBuilder.group({\n verification: undefined as Verification | undefined,\n });\n\n constructor(\n private i18nService: I18nService,\n private platformUtilsService: PlatformUtilsService,\n private formBuilder: FormBuilder,\n private accountApiService: AccountApiService,\n private logService: LogService,\n ) {}\n\n async submit() {\n try {\n const verification = this.deleteForm.get(\"verification\").value;\n this.formPromise = this.accountApiService.deleteAccount(verification);\n await this.formPromise;\n this.platformUtilsService.showToast(\n \"success\",\n this.i18nService.t(\"accountDeleted\"),\n this.i18nService.t(\"accountDeletedDesc\"),\n );\n } catch (e) {\n this.logService.error(e);\n }\n }\n}\n","
\n
\n \n
\n

{{ \"deleteAccount\" | i18n }}

\n \n ×\n \n
\n
\n

{{ \"deleteAccountDesc\" | i18n }}

\n {{ \"deleteAccountWarning\" | i18n }}\n \n \n
\n
\n \n \n
\n \n
\n
\n","import { SecretVerificationRequest } from \"./secret-verification.request\";\n\nexport class EmailTokenRequest extends SecretVerificationRequest {\n newEmail: string;\n masterPasswordHash: string;\n}\n","import { EmailTokenRequest } from \"./email-token.request\";\n\nexport class EmailRequest extends EmailTokenRequest {\n newMasterPasswordHash: string;\n token: string;\n key: string;\n}\n","
\n \n {{ \"changeEmailTwoFactorWarning\" | i18n }}\n \n\n
\n \n {{ \"masterPass\" | i18n }}\n \n \n \n \n {{ \"newEmail\" | i18n }}\n \n \n
\n\n \n
\n

{{ \"changeEmailDesc\" | i18n: formGroup.controls.step1.value.newEmail }}

\n {{ \"loggedOutWarning\" | i18n }}\n\n
\n \n {{ \"code\" | i18n }}\n \n \n
\n
\n\n \n \n
\n","import { Component, OnInit } from \"@angular/core\";\nimport { FormBuilder, Validators } from \"@angular/forms\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { TwoFactorProviderType } from \"@bitwarden/common/auth/enums/two-factor-provider-type\";\nimport { EmailTokenRequest } from \"@bitwarden/common/auth/models/request/email-token.request\";\nimport { EmailRequest } from \"@bitwarden/common/auth/models/request/email.request\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\n\n@Component({\n selector: \"app-change-email\",\n templateUrl: \"change-email.component.html\",\n})\nexport class ChangeEmailComponent implements OnInit {\n tokenSent = false;\n showTwoFactorEmailWarning = false;\n\n protected formGroup = this.formBuilder.group({\n step1: this.formBuilder.group({\n masterPassword: [\"\", [Validators.required]],\n newEmail: [\"\", [Validators.required, Validators.email]],\n }),\n token: [{ value: \"\", disabled: true }, [Validators.required]],\n });\n\n constructor(\n private apiService: ApiService,\n private i18nService: I18nService,\n private platformUtilsService: PlatformUtilsService,\n private cryptoService: CryptoService,\n private messagingService: MessagingService,\n private logService: LogService,\n private stateService: StateService,\n private formBuilder: FormBuilder,\n ) {}\n\n async ngOnInit() {\n const twoFactorProviders = await this.apiService.getTwoFactorProviders();\n this.showTwoFactorEmailWarning = twoFactorProviders.data.some(\n (p) => p.type === TwoFactorProviderType.Email && p.enabled,\n );\n }\n\n protected submit = async () => {\n // This form has multiple steps, so we need to mark all the groups as touched.\n this.formGroup.controls.step1.markAllAsTouched();\n\n if (this.tokenSent) {\n this.formGroup.controls.token.markAllAsTouched();\n }\n\n // Exit if the form is invalid.\n if (this.formGroup.invalid) {\n return;\n }\n\n const step1Value = this.formGroup.controls.step1.value;\n const newEmail = step1Value.newEmail.trim().toLowerCase();\n\n if (!this.tokenSent) {\n const request = new EmailTokenRequest();\n request.newEmail = newEmail;\n request.masterPasswordHash = await this.cryptoService.hashMasterKey(\n step1Value.masterPassword,\n await this.cryptoService.getOrDeriveMasterKey(step1Value.masterPassword),\n );\n try {\n await this.apiService.postEmailToken(request);\n this.activateStep2();\n } catch (e) {\n this.logService.error(e);\n }\n } else {\n const request = new EmailRequest();\n request.token = this.formGroup.value.token;\n request.newEmail = newEmail;\n request.masterPasswordHash = await this.cryptoService.hashMasterKey(\n step1Value.masterPassword,\n await this.cryptoService.getOrDeriveMasterKey(step1Value.masterPassword),\n );\n const kdf = await this.stateService.getKdfType();\n const kdfConfig = await this.stateService.getKdfConfig();\n const newMasterKey = await this.cryptoService.makeMasterKey(\n step1Value.masterPassword,\n newEmail,\n kdf,\n kdfConfig,\n );\n request.newMasterPasswordHash = await this.cryptoService.hashMasterKey(\n step1Value.masterPassword,\n newMasterKey,\n );\n const newUserKey = await this.cryptoService.encryptUserKeyWithMasterKey(newMasterKey);\n request.key = newUserKey[1].encryptedString;\n try {\n await this.apiService.postEmail(request);\n this.reset();\n this.platformUtilsService.showToast(\n \"success\",\n this.i18nService.t(\"emailChanged\"),\n this.i18nService.t(\"logBackIn\"),\n );\n this.messagingService.send(\"logout\");\n } catch (e) {\n this.logService.error(e);\n }\n }\n };\n\n // Disable step1 and enable token\n activateStep2() {\n this.formGroup.controls.step1.disable();\n this.formGroup.controls.token.enable();\n\n this.tokenSent = true;\n }\n\n // Reset form and re-enable step1\n reset() {\n this.formGroup.reset();\n this.formGroup.controls.step1.enable();\n this.formGroup.controls.token.disable();\n\n this.tokenSent = false;\n }\n}\n","\n\n\n \n\n
\n

{{ \"changeEmail\" | i18n }}

\n \n
\n\n \n \n \n \n \n\n \n \n \n \n \n
\n","import { Component, ViewChild, ViewContainerRef } from \"@angular/core\";\n\nimport { ModalService } from \"@bitwarden/angular/services/modal.service\";\nimport { UserVerificationService } from \"@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction\";\n\nimport { PurgeVaultComponent } from \"../../../vault/settings/purge-vault.component\";\n\nimport { DeauthorizeSessionsComponent } from \"./deauthorize-sessions.component\";\nimport { DeleteAccountComponent } from \"./delete-account.component\";\n\n@Component({\n selector: \"app-account\",\n templateUrl: \"account.component.html\",\n})\nexport class AccountComponent {\n @ViewChild(\"deauthorizeSessionsTemplate\", { read: ViewContainerRef, static: true })\n deauthModalRef: ViewContainerRef;\n @ViewChild(\"purgeVaultTemplate\", { read: ViewContainerRef, static: true })\n purgeModalRef: ViewContainerRef;\n @ViewChild(\"deleteAccountTemplate\", { read: ViewContainerRef, static: true })\n deleteModalRef: ViewContainerRef;\n\n showChangeEmail = true;\n\n constructor(\n private modalService: ModalService,\n private userVerificationService: UserVerificationService,\n ) {}\n\n async ngOnInit() {\n this.showChangeEmail = await this.userVerificationService.hasMasterPassword();\n }\n\n async deauthorizeSessions() {\n await this.modalService.openViewRef(DeauthorizeSessionsComponent, this.deauthModalRef);\n }\n\n async purgeVault() {\n await this.modalService.openViewRef(PurgeVaultComponent, this.purgeModalRef);\n }\n\n async deleteAccount() {\n await this.modalService.openViewRef(DeleteAccountComponent, this.deleteModalRef);\n }\n}\n","export enum EmergencyAccessType {\n View = 0,\n Takeover = 1,\n}\n","import { KdfType } from \"@bitwarden/common/platform/enums\";\nimport { CipherResponse } from \"@bitwarden/common/vault/models/response/cipher.response\";\n\nimport { EmergencyAccessStatusType } from \"../enums/emergency-access-status-type\";\nimport { EmergencyAccessType } from \"../enums/emergency-access-type\";\n\nexport class GranteeEmergencyAccess {\n id: string;\n granteeId: string;\n name: string;\n email: string;\n type: EmergencyAccessType;\n status: EmergencyAccessStatusType;\n waitTimeDays: number;\n creationDate: string;\n avatarColor: string;\n}\n\nexport class GrantorEmergencyAccess {\n id: string;\n grantorId: string;\n name: string;\n email: string;\n type: EmergencyAccessType;\n status: EmergencyAccessStatusType;\n waitTimeDays: number;\n creationDate: string;\n avatarColor: string;\n}\n\nexport class TakeoverTypeEmergencyAccess {\n keyEncrypted: string;\n kdf: KdfType;\n kdfIterations: number;\n kdfMemory?: number;\n kdfParallelism?: number;\n}\n\nexport class ViewTypeEmergencyAccess {\n keyEncrypted: string;\n ciphers: CipherResponse[] = [];\n}\n","import { DialogConfig, DialogRef, DIALOG_DATA } from \"@angular/cdk/dialog\";\nimport { Component, OnInit, Inject } from \"@angular/core\";\nimport { FormBuilder } from \"@angular/forms\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { OrganizationManagementPreferencesService } from \"@bitwarden/common/admin-console/abstractions/organization-management-preferences/organization-management-preferences.service\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\nimport { DialogService } from \"@bitwarden/components\";\n\nexport enum EmergencyAccessConfirmDialogResult {\n Confirmed = \"confirmed\",\n}\ntype EmergencyAccessConfirmDialogData = {\n /** display name of the account requesting emergency access */\n name: string;\n /** identifies the account requesting emergency access */\n userId: string;\n /** traces a unique emergency request */\n emergencyAccessId: string;\n};\n@Component({\n selector: \"emergency-access-confirm\",\n templateUrl: \"emergency-access-confirm.component.html\",\n})\nexport class EmergencyAccessConfirmComponent implements OnInit {\n loading = true;\n fingerprint: string;\n confirmForm = this.formBuilder.group({\n dontAskAgain: [false],\n });\n\n constructor(\n @Inject(DIALOG_DATA) protected params: EmergencyAccessConfirmDialogData,\n private formBuilder: FormBuilder,\n private apiService: ApiService,\n private cryptoService: CryptoService,\n protected organizationManagementPreferencesService: OrganizationManagementPreferencesService,\n private logService: LogService,\n private dialogRef: DialogRef,\n ) {}\n\n async ngOnInit() {\n try {\n const publicKeyResponse = await this.apiService.getUserPublicKey(this.params.userId);\n if (publicKeyResponse != null) {\n const publicKey = Utils.fromB64ToArray(publicKeyResponse.publicKey);\n const fingerprint = await this.cryptoService.getFingerprint(this.params.userId, publicKey);\n if (fingerprint != null) {\n this.fingerprint = fingerprint.join(\"-\");\n }\n }\n } catch (e) {\n this.logService.error(e);\n }\n this.loading = false;\n }\n\n submit = async () => {\n if (this.loading) {\n return;\n }\n\n if (this.confirmForm.get(\"dontAskAgain\").value) {\n await this.organizationManagementPreferencesService.autoConfirmFingerPrints.set(true);\n }\n\n try {\n this.dialogRef.close(EmergencyAccessConfirmDialogResult.Confirmed);\n } catch (e) {\n this.logService.error(e);\n }\n };\n /**\n * Strongly typed helper to open a EmergencyAccessConfirmComponent\n * @param dialogService Instance of the dialog service that will be used to open the dialog\n * @param config Configuration for the dialog\n */\n static open(\n dialogService: DialogService,\n config: DialogConfig,\n ) {\n return dialogService.open(\n EmergencyAccessConfirmComponent,\n config,\n );\n }\n}\n","
\n \n \n {{ \"confirmUser\" | i18n }}\n {{ params.name }}\n \n
\n

\n {{ \"fingerprintEnsureIntegrityVerify\" | i18n }}\n \n {{ \"learnMore\" | i18n }}\n

\n

\n {{ fingerprint }}\n

\n\n \n \n {{ \"dontAskFingerprintAgain\" | i18n }}\n \n
\n
\n \n \n
\n
\n
\n","import { DialogConfig, DialogRef, DIALOG_DATA } from \"@angular/cdk/dialog\";\nimport { Component, Inject, OnInit } from \"@angular/core\";\nimport { FormBuilder, Validators } from \"@angular/forms\";\n\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { DialogService } from \"@bitwarden/components\";\n\nimport { EmergencyAccessService } from \"../../emergency-access\";\nimport { EmergencyAccessType } from \"../../emergency-access/enums/emergency-access-type\";\n\nexport type EmergencyAccessAddEditDialogData = {\n /** display name of the account requesting emergency access */\n name: string;\n /** traces a unique emergency request */\n emergencyAccessId: string;\n /** A boolean indicating whether the emergency access request is in read-only mode (true for view-only, false for editing). */\n readOnly: boolean;\n};\n\nexport enum EmergencyAccessAddEditDialogResult {\n Saved = \"saved\",\n Canceled = \"canceled\",\n Deleted = \"deleted\",\n}\n@Component({\n selector: \"emergency-access-add-edit\",\n templateUrl: \"emergency-access-add-edit.component.html\",\n})\nexport class EmergencyAccessAddEditComponent implements OnInit {\n loading = true;\n readOnly = false;\n editMode = false;\n title: string;\n type: EmergencyAccessType = EmergencyAccessType.View;\n\n emergencyAccessType = EmergencyAccessType;\n waitTimes: { name: string; value: number }[];\n\n addEditForm = this.formBuilder.group({\n email: [\"\", [Validators.email, Validators.required]],\n emergencyAccessType: [this.emergencyAccessType.View],\n waitTime: [{ value: null, disabled: this.readOnly }, [Validators.required]],\n });\n constructor(\n @Inject(DIALOG_DATA) protected params: EmergencyAccessAddEditDialogData,\n private formBuilder: FormBuilder,\n private emergencyAccessService: EmergencyAccessService,\n private i18nService: I18nService,\n private platformUtilsService: PlatformUtilsService,\n private logService: LogService,\n private dialogRef: DialogRef,\n ) {}\n async ngOnInit() {\n this.editMode = this.loading = this.params.emergencyAccessId != null;\n this.waitTimes = [\n { name: this.i18nService.t(\"oneDay\"), value: 1 },\n { name: this.i18nService.t(\"days\", \"2\"), value: 2 },\n { name: this.i18nService.t(\"days\", \"7\"), value: 7 },\n { name: this.i18nService.t(\"days\", \"14\"), value: 14 },\n { name: this.i18nService.t(\"days\", \"30\"), value: 30 },\n { name: this.i18nService.t(\"days\", \"90\"), value: 90 },\n ];\n\n if (this.editMode) {\n this.title = this.i18nService.t(\"editEmergencyContact\");\n try {\n const emergencyAccess = await this.emergencyAccessService.getEmergencyAccess(\n this.params.emergencyAccessId,\n );\n this.addEditForm.patchValue({\n email: emergencyAccess.email,\n waitTime: emergencyAccess.waitTimeDays,\n emergencyAccessType: emergencyAccess.type,\n });\n } catch (e) {\n this.logService.error(e);\n }\n } else {\n this.title = this.i18nService.t(\"inviteEmergencyContact\");\n this.addEditForm.patchValue({ waitTime: this.waitTimes[2].value });\n }\n\n this.loading = false;\n }\n\n submit = async () => {\n if (this.addEditForm.invalid) {\n this.addEditForm.markAllAsTouched();\n return;\n }\n try {\n if (this.editMode) {\n await this.emergencyAccessService.update(\n this.params.emergencyAccessId,\n this.addEditForm.value.emergencyAccessType,\n this.addEditForm.value.waitTime,\n );\n } else {\n await this.emergencyAccessService.invite(\n this.addEditForm.value.email,\n this.addEditForm.value.emergencyAccessType,\n this.addEditForm.value.waitTime,\n );\n }\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(this.editMode ? \"editedUserId\" : \"invitedUsers\", this.params.name),\n );\n this.dialogRef.close(EmergencyAccessAddEditDialogResult.Saved);\n } catch (e) {\n this.logService.error(e);\n }\n };\n\n delete = async () => {\n this.dialogRef.close(EmergencyAccessAddEditDialogResult.Deleted);\n };\n /**\n * Strongly typed helper to open a EmergencyAccessAddEditComponent\n * @param dialogService Instance of the dialog service that will be used to open the dialog\n * @param config Configuration for the dialog\n */\n static open = (\n dialogService: DialogService,\n config: DialogConfig,\n ) => {\n return dialogService.open(\n EmergencyAccessAddEditComponent,\n config,\n );\n };\n}\n","
\n \n \n \n {{ title }}\n {{ params.name }}\n \n \n \n

{{ \"inviteEmergencyContactDesc\" | i18n }}

\n \n {{ \"email\" | i18n }}\n \n \n
\n \n \n {{ \"userAccess\" | i18n }}\n \n \n \n \n \n {{ \"view\" | i18n }}\n {{ \"viewDesc\" | i18n }}\n \n\n \n {{ \"takeover\" | i18n }}\n {{ \"takeoverDesc\" | i18n }}\n \n \n\n \n {{ \"waitTime\" | i18n }}\n \n \n \n {{ \"waitTimeDesc\" | i18n }}\n \n
\n \n \n \n \n \n
\n
\n","import { DialogConfig, DialogRef, DIALOG_DATA } from \"@angular/cdk/dialog\";\nimport { Component, OnDestroy, OnInit, Inject, Input } from \"@angular/core\";\nimport { FormBuilder, Validators } from \"@angular/forms\";\nimport { takeUntil } from \"rxjs\";\n\nimport { ChangePasswordComponent } from \"@bitwarden/angular/auth/components/change-password.component\";\nimport { PolicyService } from \"@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { KdfType } from \"@bitwarden/common/platform/enums\";\nimport { PasswordGenerationServiceAbstraction } from \"@bitwarden/common/tools/generator/password\";\nimport { DialogService } from \"@bitwarden/components\";\n\nimport { EmergencyAccessService } from \"../../../emergency-access\";\n\nexport enum EmergencyAccessTakeoverResultType {\n Done = \"done\",\n}\ntype EmergencyAccessTakeoverDialogData = {\n /** display name of the account requesting emergency access takeover */\n name: string;\n /** email of the account requesting emergency access takeover */\n email: string;\n /** traces a unique emergency request */\n emergencyAccessId: string;\n};\n@Component({\n selector: \"emergency-access-takeover\",\n templateUrl: \"emergency-access-takeover.component.html\",\n})\n// eslint-disable-next-line rxjs-angular/prefer-takeuntil\nexport class EmergencyAccessTakeoverComponent\n extends ChangePasswordComponent\n implements OnInit, OnDestroy\n{\n @Input() kdf: KdfType;\n @Input() kdfIterations: number;\n takeoverForm = this.formBuilder.group({\n masterPassword: [\"\", [Validators.required]],\n masterPasswordRetype: [\"\", [Validators.required]],\n });\n\n constructor(\n @Inject(DIALOG_DATA) protected params: EmergencyAccessTakeoverDialogData,\n private formBuilder: FormBuilder,\n i18nService: I18nService,\n cryptoService: CryptoService,\n messagingService: MessagingService,\n stateService: StateService,\n passwordGenerationService: PasswordGenerationServiceAbstraction,\n platformUtilsService: PlatformUtilsService,\n policyService: PolicyService,\n private emergencyAccessService: EmergencyAccessService,\n private logService: LogService,\n dialogService: DialogService,\n private dialogRef: DialogRef,\n ) {\n super(\n i18nService,\n cryptoService,\n messagingService,\n passwordGenerationService,\n platformUtilsService,\n policyService,\n stateService,\n dialogService,\n );\n }\n\n async ngOnInit() {\n const policies = await this.emergencyAccessService.getGrantorPolicies(\n this.params.emergencyAccessId,\n );\n this.policyService\n .masterPasswordPolicyOptions$(policies)\n .pipe(takeUntil(this.destroy$))\n .subscribe((enforcedPolicyOptions) => (this.enforcedPolicyOptions = enforcedPolicyOptions));\n }\n\n // eslint-disable-next-line rxjs-angular/prefer-takeuntil\n ngOnDestroy(): void {\n super.ngOnDestroy();\n }\n\n submit = async () => {\n if (this.takeoverForm.invalid) {\n this.takeoverForm.markAllAsTouched();\n return;\n }\n this.masterPassword = this.takeoverForm.get(\"masterPassword\").value;\n this.masterPasswordRetype = this.takeoverForm.get(\"masterPasswordRetype\").value;\n if (!(await this.strongPassword())) {\n return;\n }\n\n try {\n await this.emergencyAccessService.takeover(\n this.params.emergencyAccessId,\n this.masterPassword,\n this.params.email,\n );\n } catch (e) {\n this.logService.error(e);\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"unexpectedError\"),\n );\n }\n this.dialogRef.close(EmergencyAccessTakeoverResultType.Done);\n };\n /**\n * Strongly typed helper to open a EmergencyAccessTakeoverComponent\n * @param dialogService Instance of the dialog service that will be used to open the dialog\n * @param config Configuration for the dialog\n */\n static open = (\n dialogService: DialogService,\n config: DialogConfig,\n ) => {\n return dialogService.open(\n EmergencyAccessTakeoverComponent,\n config,\n );\n };\n}\n","
\n \n \n {{ \"takeover\" | i18n }}\n {{ params.name }}\n \n
\n {{ \"loggedOutWarning\" | i18n }}\n \n \n
\n
\n \n {{ \"newMasterPass\" | i18n }}\n \n \n \n \n \n
\n
\n \n {{ \"confirmNewMasterPass\" | i18n }}\n \n \n \n
\n
\n
\n
\n \n \n
\n
\n
\n","\n\n \n

\n {{ \"emergencyAccessDesc\" | i18n }}\n \n {{ \"learnMore\" | i18n }}.\n \n

\n {{\n \"emergencyAccessOwnerWarning\" | i18n\n }}\n
\n \n
\n

\n {{ \"trustedEmergencyContacts\" | i18n }}\n

\n \n
\n \n \n {{ \"addEmergencyContact\" | i18n }}\n \n
\n
\n \n \n \n {{ \"name\" | i18n }}\n {{ \"accessLevel\" | i18n }}\n {{ \"options\" | i18n }}\n \n \n \n \n \n \n \n {{ c.email }}\n {{ \"invited\" | i18n }}\n {{ \"accepted\" | i18n }}\n {{ \"emergencyAccessRecoveryInitiated\" | i18n }}\n {{\n \"emergencyAccessRecoveryApproved\" | i18n\n }}\n\n {{ c.name }}\n \n \n \n {{ \"view\" | i18n }}\n {{\n \"takeover\" | i18n\n }}\n \n \n \n \n \n \n {{ \"resendInvitation\" | i18n }}\n \n \n \n {{ \"confirm\" | i18n }}\n \n \n \n {{ \"approve\" | i18n }}\n \n \n \n {{ \"reject\" | i18n }}\n \n \n \n \n \n \n \n \n

{{ \"noTrustedContacts\" | i18n }}

\n \n \n {{ \"loading\" | i18n }}\n \n
\n
\n\n \n

{{ \"designatedEmergencyContacts\" | i18n }}

\n\n \n \n \n {{ \"name\" | i18n }}\n {{ \"accessLevel\" | i18n }}\n {{ \"options\" | i18n }}\n \n \n \n \n \n \n \n {{ c.email }}\n {{\n \"invited\" | i18n\n }}\n {{ \"accepted\" | i18n }}\n {{ \"emergencyAccessRecoveryInitiated\" | i18n }}\n {{ \"emergencyAccessRecoveryApproved\" | i18n }}\n\n {{ c.name }}\n \n \n \n {{ \"view\" | i18n }}\n {{\n \"takeover\" | i18n\n }}\n \n \n \n \n \n \n {{ \"requestAccess\" | i18n }}\n \n \n \n {{ \"takeover\" | i18n }}\n \n \n \n {{ \"view\" | i18n }}\n \n \n \n \n \n \n \n \n

{{ \"noGrantedAccess\" | i18n }}

\n \n \n {{ \"loading\" | i18n }}\n \n
\n
\n
\n\n\n\n\n","import { Component, OnInit, ViewChild, ViewContainerRef } from \"@angular/core\";\nimport { lastValueFrom, Observable, firstValueFrom } from \"rxjs\";\n\nimport { UserNamePipe } from \"@bitwarden/angular/pipes/user-name.pipe\";\nimport { OrganizationService } from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport { OrganizationManagementPreferencesService } from \"@bitwarden/common/admin-console/abstractions/organization-management-preferences/organization-management-preferences.service\";\nimport { BillingAccountProfileStateService } from \"@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { DialogService } from \"@bitwarden/components\";\n\nimport { EmergencyAccessService } from \"../../emergency-access\";\nimport { EmergencyAccessStatusType } from \"../../emergency-access/enums/emergency-access-status-type\";\nimport { EmergencyAccessType } from \"../../emergency-access/enums/emergency-access-type\";\nimport {\n GranteeEmergencyAccess,\n GrantorEmergencyAccess,\n} from \"../../emergency-access/models/emergency-access\";\n\nimport {\n EmergencyAccessConfirmComponent,\n EmergencyAccessConfirmDialogResult,\n} from \"./confirm/emergency-access-confirm.component\";\nimport {\n EmergencyAccessAddEditComponent,\n EmergencyAccessAddEditDialogResult,\n} from \"./emergency-access-add-edit.component\";\nimport {\n EmergencyAccessTakeoverComponent,\n EmergencyAccessTakeoverResultType,\n} from \"./takeover/emergency-access-takeover.component\";\n\n@Component({\n selector: \"emergency-access\",\n templateUrl: \"emergency-access.component.html\",\n})\n// eslint-disable-next-line rxjs-angular/prefer-takeuntil\nexport class EmergencyAccessComponent implements OnInit {\n @ViewChild(\"addEdit\", { read: ViewContainerRef, static: true }) addEditModalRef: ViewContainerRef;\n @ViewChild(\"takeoverTemplate\", { read: ViewContainerRef, static: true })\n takeoverModalRef: ViewContainerRef;\n @ViewChild(\"confirmTemplate\", { read: ViewContainerRef, static: true })\n confirmModalRef: ViewContainerRef;\n\n loaded = false;\n canAccessPremium$: Observable;\n trustedContacts: GranteeEmergencyAccess[];\n grantedContacts: GrantorEmergencyAccess[];\n emergencyAccessType = EmergencyAccessType;\n emergencyAccessStatusType = EmergencyAccessStatusType;\n actionPromise: Promise;\n isOrganizationOwner: boolean;\n\n constructor(\n private emergencyAccessService: EmergencyAccessService,\n private i18nService: I18nService,\n private platformUtilsService: PlatformUtilsService,\n private messagingService: MessagingService,\n private userNamePipe: UserNamePipe,\n private logService: LogService,\n private stateService: StateService,\n private organizationService: OrganizationService,\n protected dialogService: DialogService,\n billingAccountProfileStateService: BillingAccountProfileStateService,\n protected organizationManagementPreferencesService: OrganizationManagementPreferencesService,\n ) {\n this.canAccessPremium$ = billingAccountProfileStateService.hasPremiumFromAnySource$;\n }\n\n async ngOnInit() {\n const orgs = await this.organizationService.getAll();\n this.isOrganizationOwner = orgs.some((o) => o.isOwner);\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.load();\n }\n\n async load() {\n this.trustedContacts = await this.emergencyAccessService.getEmergencyAccessTrusted();\n this.grantedContacts = await this.emergencyAccessService.getEmergencyAccessGranted();\n this.loaded = true;\n }\n\n async premiumRequired() {\n const canAccessPremium = await firstValueFrom(this.canAccessPremium$);\n\n if (!canAccessPremium) {\n this.messagingService.send(\"premiumRequired\");\n return;\n }\n }\n\n edit = async (details: GranteeEmergencyAccess) => {\n const canAccessPremium = await firstValueFrom(this.canAccessPremium$);\n const dialogRef = EmergencyAccessAddEditComponent.open(this.dialogService, {\n data: {\n name: this.userNamePipe.transform(details),\n emergencyAccessId: details?.id,\n readOnly: !canAccessPremium,\n },\n });\n\n const result = await lastValueFrom(dialogRef.closed);\n if (result === EmergencyAccessAddEditDialogResult.Saved) {\n await this.load();\n } else if (result === EmergencyAccessAddEditDialogResult.Deleted) {\n await this.remove(details);\n }\n };\n\n invite = async () => {\n await this.edit(null);\n };\n\n async reinvite(contact: GranteeEmergencyAccess) {\n if (this.actionPromise != null) {\n return;\n }\n this.actionPromise = this.emergencyAccessService.reinvite(contact.id);\n await this.actionPromise;\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"hasBeenReinvited\", contact.email),\n );\n this.actionPromise = null;\n }\n\n async confirm(contact: GranteeEmergencyAccess) {\n function updateUser() {\n contact.status = EmergencyAccessStatusType.Confirmed;\n }\n\n if (this.actionPromise != null) {\n return;\n }\n\n const autoConfirm = await firstValueFrom(\n this.organizationManagementPreferencesService.autoConfirmFingerPrints.state$,\n );\n if (autoConfirm == null || !autoConfirm) {\n const dialogRef = EmergencyAccessConfirmComponent.open(this.dialogService, {\n data: {\n name: this.userNamePipe.transform(contact),\n emergencyAccessId: contact.id,\n userId: contact?.granteeId,\n },\n });\n const result = await lastValueFrom(dialogRef.closed);\n if (result === EmergencyAccessConfirmDialogResult.Confirmed) {\n await this.emergencyAccessService.confirm(contact.id, contact.granteeId);\n updateUser();\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"hasBeenConfirmed\", this.userNamePipe.transform(contact)),\n );\n }\n return;\n }\n\n this.actionPromise = this.emergencyAccessService.confirm(contact.id, contact.granteeId);\n await this.actionPromise;\n updateUser();\n\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"hasBeenConfirmed\", this.userNamePipe.transform(contact)),\n );\n this.actionPromise = null;\n }\n\n async remove(details: GranteeEmergencyAccess | GrantorEmergencyAccess) {\n const confirmed = await this.dialogService.openSimpleDialog({\n title: this.userNamePipe.transform(details),\n content: { key: \"removeUserConfirmation\" },\n type: \"warning\",\n });\n\n if (!confirmed) {\n return false;\n }\n\n try {\n await this.emergencyAccessService.delete(details.id);\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"removedUserId\", this.userNamePipe.transform(details)),\n );\n\n if (details instanceof GranteeEmergencyAccess) {\n this.removeGrantee(details);\n } else {\n this.removeGrantor(details);\n }\n } catch (e) {\n this.logService.error(e);\n }\n }\n\n async requestAccess(details: GrantorEmergencyAccess) {\n const confirmed = await this.dialogService.openSimpleDialog({\n title: this.userNamePipe.transform(details),\n content: {\n key: \"requestAccessConfirmation\",\n placeholders: [details.waitTimeDays.toString()],\n },\n acceptButtonText: { key: \"requestAccess\" },\n type: \"warning\",\n });\n\n if (!confirmed) {\n return false;\n }\n\n await this.emergencyAccessService.requestAccess(details.id);\n\n details.status = EmergencyAccessStatusType.RecoveryInitiated;\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"requestSent\", this.userNamePipe.transform(details)),\n );\n }\n\n async approve(details: GranteeEmergencyAccess) {\n const type = this.i18nService.t(\n details.type === EmergencyAccessType.View ? \"view\" : \"takeover\",\n );\n\n const confirmed = await this.dialogService.openSimpleDialog({\n title: this.userNamePipe.transform(details),\n content: {\n key: \"approveAccessConfirmation\",\n placeholders: [this.userNamePipe.transform(details), type],\n },\n acceptButtonText: { key: \"approve\" },\n type: \"warning\",\n });\n\n if (!confirmed) {\n return false;\n }\n\n await this.emergencyAccessService.approve(details.id);\n details.status = EmergencyAccessStatusType.RecoveryApproved;\n\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"emergencyApproved\", this.userNamePipe.transform(details)),\n );\n }\n\n async reject(details: GranteeEmergencyAccess) {\n await this.emergencyAccessService.reject(details.id);\n details.status = EmergencyAccessStatusType.Confirmed;\n\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"emergencyRejected\", this.userNamePipe.transform(details)),\n );\n }\n\n takeover = async (details: GrantorEmergencyAccess) => {\n const dialogRef = EmergencyAccessTakeoverComponent.open(this.dialogService, {\n data: {\n name: this.userNamePipe.transform(details),\n email: details.email,\n emergencyAccessId: details.id ?? null,\n },\n });\n const result = await lastValueFrom(dialogRef.closed);\n if (result === EmergencyAccessTakeoverResultType.Done) {\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"passwordResetFor\", this.userNamePipe.transform(details)),\n );\n }\n };\n\n private removeGrantee(details: GranteeEmergencyAccess) {\n const index = this.trustedContacts.indexOf(details);\n if (index > -1) {\n this.trustedContacts.splice(index, 1);\n }\n }\n\n private removeGrantor(details: GrantorEmergencyAccess) {\n const index = this.grantedContacts.indexOf(details);\n if (index > -1) {\n this.grantedContacts.splice(index, 1);\n }\n }\n}\n","
\n
\n \n
\n

\n {{ \"attachments\" | i18n }}\n {{ cipher.name }}\n

\n \n ×\n \n
\n
\n \n \n \n \n \n \n \n \n
\n \n \n \n
\n {{ a.fileName }}\n
\n \n \n {{ \"attachmentFixDescription\" | i18n }}\n \n {{ \"fix\" | i18n }}\n \n
\n
\n {{ a.sizeName }}\n
\n \n \n \n \n
\n
\n

{{ \"newAttachment\" | i18n }}

\n \n \n {{ \"maxFileSize\" | i18n }}\n
\n
\n
\n \n \n {{ \"save\" | i18n }}\n \n \n
\n \n
\n
\n","import { Component } from \"@angular/core\";\n\nimport { AttachmentsComponent as BaseAttachmentsComponent } from \"@bitwarden/angular/vault/components/attachments.component\";\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { BillingAccountProfileStateService } from \"@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { FileDownloadService } from \"@bitwarden/common/platform/abstractions/file-download/file-download.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { CipherService } from \"@bitwarden/common/vault/abstractions/cipher.service\";\nimport { AttachmentView } from \"@bitwarden/common/vault/models/view/attachment.view\";\nimport { DialogService } from \"@bitwarden/components\";\n\n@Component({\n selector: \"emergency-access-attachments\",\n templateUrl: \"../../../../vault/individual-vault/attachments.component.html\",\n})\nexport class EmergencyAccessAttachmentsComponent extends BaseAttachmentsComponent {\n viewOnly = true;\n canAccessAttachments = true;\n\n constructor(\n cipherService: CipherService,\n i18nService: I18nService,\n cryptoService: CryptoService,\n stateService: StateService,\n platformUtilsService: PlatformUtilsService,\n apiService: ApiService,\n logService: LogService,\n fileDownloadService: FileDownloadService,\n dialogService: DialogService,\n billingAccountProfileStateService: BillingAccountProfileStateService,\n ) {\n super(\n cipherService,\n i18nService,\n cryptoService,\n platformUtilsService,\n apiService,\n window,\n logService,\n stateService,\n fileDownloadService,\n dialogService,\n billingAccountProfileStateService,\n );\n }\n\n protected async init() {\n // Do nothing since cipher is already decoded\n }\n\n protected showFixOldAttachments(attachment: AttachmentView) {\n return false;\n }\n}\n","
\n
\n \n
\n

{{ title }}

\n \n ×\n \n
\n
\n \n {{ \"personalOwnershipPolicyInEffect\" | i18n }}\n \n
\n
\n \n \n \n \n
\n
\n
\n
\n \n \n
\n
\n \n \n \n \n
\n
\n \n \n
\n
\n \n
\n \n
\n \n \n \n
\n
\n
\n
\n
\n \n
\n \n \n \n \n \n \n \n \n \n \n
\n
\n
\n \n
\n \n \n \n \n \n \n
\n
\n
\n
\n
\n \n
\n \n \n
\n
\n \n
\n
\n \n \n \n
\n
\n
\n \n
\n
\n \n \n
\n
\n \n \n 15\n \n \n \n \n \n \n \n --- ---\n \n
\n
\n \n \n {{ \"upgrade\" | i18n }}\n \n
\n \n \n {{ totpSec }}\n \n \n \n \n \n \n \n {{ totpCodeFormatted }}\n \n \n \n
\n
\n
\n \n \n
\n \n
\n \n
\n \n \n \n \n \n \n
\n
\n
\n
\n
\n \n \n \n \n
\n
\n \n \n \n \n \n \n
\n
\n \n
\n \n {{ \"newUri\" | i18n }}\n \n \n \n \n
\n
\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n
\n
\n
\n
\n \n
\n \n
\n \n \n \n \n \n \n
\n
\n
\n
\n \n \n \n \n \n \n \n \n \n
\n
\n \n \n
\n
\n
\n
\n \n
\n \n
\n \n \n \n \n \n \n
\n
\n
\n
\n
\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n
\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n
\n \n \n
\n
\n
\n
\n \n \n
\n \n \n

{{ \"ownership\" | i18n }}

\n
\n
\n \n \n \n \n
\n
\n
\n \n

{{ \"collections\" | i18n }}

\n
\n {{ \"noCollectionsInList\" | i18n }}\n
\n \n
\n \n \n
\n
\n
\n \n
\n
\n {{ \"dateUpdated\" | i18n }}:\n {{ cipher.revisionDate | date: \"medium\" }}\n
\n
\n {{ \"dateCreated\" | i18n }}:\n {{ cipher.creationDate | date: \"medium\" }}\n
\n
\n {{ \"datePasswordUpdated\" | i18n }}:\n {{ cipher.passwordRevisionDisplayDate | date: \"medium\" }}\n
\n
\n {{ \"passwordHistory\" | i18n }}:\n \n {{ cipher.passwordHistory.length }}\n \n
\n
\n
\n {{ ph.lastUsedDate | date: \"short\" }} -\n \n
\n
\n
\n
\n \n

{{ \"options\" | i18n }}

\n
\n \n \n \n \n \n
\n
\n \n
\n \n \n {{ (cipher?.isDeleted ? \"restore\" : \"save\") | i18n }}\n \n \n
\n \n \n \n \n \n \n \n
\n
\n \n \n\n","import { DatePipe } from \"@angular/common\";\nimport { Component } from \"@angular/core\";\n\nimport { AuditService } from \"@bitwarden/common/abstractions/audit.service\";\nimport { EventCollectionService } from \"@bitwarden/common/abstractions/event/event-collection.service\";\nimport { OrganizationService } from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport { PolicyService } from \"@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction\";\nimport { BillingAccountProfileStateService } from \"@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service\";\nimport { ConfigServiceAbstraction } from \"@bitwarden/common/platform/abstractions/config/config.service.abstraction\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { PasswordGenerationServiceAbstraction } from \"@bitwarden/common/tools/generator/password/\";\nimport { SendApiService } from \"@bitwarden/common/tools/send/services/send-api.service.abstraction\";\nimport { CipherService } from \"@bitwarden/common/vault/abstractions/cipher.service\";\nimport { CollectionService } from \"@bitwarden/common/vault/abstractions/collection.service\";\nimport { FolderService } from \"@bitwarden/common/vault/abstractions/folder/folder.service.abstraction\";\nimport { TotpService } from \"@bitwarden/common/vault/abstractions/totp.service\";\nimport { Cipher } from \"@bitwarden/common/vault/models/domain/cipher\";\nimport { DialogService } from \"@bitwarden/components\";\nimport { PasswordRepromptService } from \"@bitwarden/vault\";\n\nimport { AddEditComponent as BaseAddEditComponent } from \"../../../../vault/individual-vault/add-edit.component\";\n\n@Component({\n selector: \"app-org-vault-add-edit\",\n templateUrl: \"../../../../vault/individual-vault/add-edit.component.html\",\n})\nexport class EmergencyAddEditCipherComponent extends BaseAddEditComponent {\n originalCipher: Cipher = null;\n viewOnly = true;\n protected override componentName = \"app-org-vault-add-edit\";\n\n constructor(\n cipherService: CipherService,\n folderService: FolderService,\n i18nService: I18nService,\n platformUtilsService: PlatformUtilsService,\n auditService: AuditService,\n stateService: StateService,\n collectionService: CollectionService,\n totpService: TotpService,\n passwordGenerationService: PasswordGenerationServiceAbstraction,\n messagingService: MessagingService,\n eventCollectionService: EventCollectionService,\n policyService: PolicyService,\n passwordRepromptService: PasswordRepromptService,\n organizationService: OrganizationService,\n logService: LogService,\n sendApiService: SendApiService,\n dialogService: DialogService,\n datePipe: DatePipe,\n configService: ConfigServiceAbstraction,\n billingAccountProfileStateService: BillingAccountProfileStateService,\n ) {\n super(\n cipherService,\n folderService,\n i18nService,\n platformUtilsService,\n auditService,\n stateService,\n collectionService,\n totpService,\n passwordGenerationService,\n messagingService,\n eventCollectionService,\n policyService,\n organizationService,\n logService,\n passwordRepromptService,\n sendApiService,\n dialogService,\n datePipe,\n configService,\n billingAccountProfileStateService,\n );\n }\n\n async load() {\n this.title = this.i18nService.t(\"viewItem\");\n }\n\n protected async loadCipher() {\n return Promise.resolve(this.originalCipher);\n }\n}\n","

{{ \"vault\" | i18n }}

\n\n
\n \n \n \n \n \n \n \n \n {{ currentCipher.name }}\n \n \n {{ \"shared\" | i18n }}\n \n \n \n {{ \"attachments\" | i18n }}\n \n
\n {{ currentCipher.subTitle }}\n \n \n
\n \n \n \n \n {{ \"attachments\" | i18n }}\n \n \n
\n \n \n
\n
\n
\n \n \n {{ \"loading\" | i18n }}\n \n
\n\n\n","import { Component, OnInit, ViewChild, ViewContainerRef } from \"@angular/core\";\nimport { ActivatedRoute, Router } from \"@angular/router\";\n\nimport { ModalService } from \"@bitwarden/angular/services/modal.service\";\nimport { CipherView } from \"@bitwarden/common/vault/models/view/cipher.view\";\n\nimport { EmergencyAccessService } from \"../../../emergency-access\";\nimport { EmergencyAccessAttachmentsComponent } from \"../attachments/emergency-access-attachments.component\";\n\nimport { EmergencyAddEditCipherComponent } from \"./emergency-add-edit-cipher.component\";\n\n@Component({\n selector: \"emergency-access-view\",\n templateUrl: \"emergency-access-view.component.html\",\n})\n// eslint-disable-next-line rxjs-angular/prefer-takeuntil\nexport class EmergencyAccessViewComponent implements OnInit {\n @ViewChild(\"cipherAddEdit\", { read: ViewContainerRef, static: true })\n cipherAddEditModalRef: ViewContainerRef;\n @ViewChild(\"attachments\", { read: ViewContainerRef, static: true })\n attachmentsModalRef: ViewContainerRef;\n\n id: string;\n ciphers: CipherView[] = [];\n loaded = false;\n\n constructor(\n private modalService: ModalService,\n private router: Router,\n private route: ActivatedRoute,\n private emergencyAccessService: EmergencyAccessService,\n ) {}\n\n ngOnInit() {\n // eslint-disable-next-line rxjs-angular/prefer-takeuntil\n this.route.params.subscribe((qParams) => {\n if (qParams.id == null) {\n return this.router.navigate([\"settings/emergency-access\"]);\n }\n\n this.id = qParams.id;\n\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.load();\n });\n }\n\n async selectCipher(cipher: CipherView) {\n // eslint-disable-next-line\n const [_, childComponent] = await this.modalService.openViewRef(\n EmergencyAddEditCipherComponent,\n this.cipherAddEditModalRef,\n (comp) => {\n comp.cipherId = cipher == null ? null : cipher.id;\n comp.cipher = cipher;\n },\n );\n\n return childComponent;\n }\n\n async load() {\n this.ciphers = await this.emergencyAccessService.getViewOnlyCiphers(this.id);\n this.loaded = true;\n }\n\n async viewAttachments(cipher: CipherView) {\n await this.modalService.openViewRef(\n EmergencyAccessAttachmentsComponent,\n this.attachmentsModalRef,\n (comp) => {\n comp.cipher = cipher;\n comp.emergencyAccessId = this.id;\n },\n );\n }\n}\n","import { SecretVerificationRequest } from \"./secret-verification.request\";\n\nexport class PasswordRequest extends SecretVerificationRequest {\n newMasterPasswordHash: string;\n masterPasswordHint: string;\n key: string;\n}\n","export enum WebauthnLoginCredentialPrfStatus {\n Enabled = 0,\n Supported = 1,\n Unsupported = 2,\n}\n","import { svgIcon } from \"@bitwarden/components\";\n\nexport const CreatePasskeyFailedIcon = svgIcon`\n\n \n \n \n \n \n \n \n \n \n\n`;\n","import { svgIcon } from \"@bitwarden/components\";\n\nexport const CreatePasskeyIcon = svgIcon`\n\n \n \n \n \n \n \n \n \n\n`;\n","import { DialogConfig, DialogRef } from \"@angular/cdk/dialog\";\nimport { Component, OnInit } from \"@angular/core\";\nimport { FormBuilder, Validators } from \"@angular/forms\";\nimport { firstValueFrom, map, Observable } from \"rxjs\";\n\nimport { PrfKeySet } from \"@bitwarden/auth/common\";\nimport { Verification } from \"@bitwarden/common/auth/types/verification\";\nimport { ErrorResponse } from \"@bitwarden/common/models/response/error.response\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { DialogService } from \"@bitwarden/components\";\n\nimport { WebauthnLoginAdminService } from \"../../../core\";\nimport { CredentialCreateOptionsView } from \"../../../core/views/credential-create-options.view\";\nimport { PendingWebauthnLoginCredentialView } from \"../../../core/views/pending-webauthn-login-credential.view\";\n\nimport { CreatePasskeyFailedIcon } from \"./create-passkey-failed.icon\";\nimport { CreatePasskeyIcon } from \"./create-passkey.icon\";\n\nexport enum CreateCredentialDialogResult {\n Success,\n}\n\ntype Step =\n | \"userVerification\"\n | \"credentialCreation\"\n | \"credentialCreationFailed\"\n | \"credentialNaming\";\n\n@Component({\n templateUrl: \"create-credential-dialog.component.html\",\n})\nexport class CreateCredentialDialogComponent implements OnInit {\n protected readonly NameMaxCharacters = 50;\n protected readonly CreateCredentialDialogResult = CreateCredentialDialogResult;\n protected readonly Icons = { CreatePasskeyIcon, CreatePasskeyFailedIcon };\n\n protected currentStep: Step = \"userVerification\";\n protected invalidSecret = false;\n protected formGroup = this.formBuilder.group({\n userVerification: this.formBuilder.group({\n secret: [null as Verification | null, Validators.required],\n }),\n credentialNaming: this.formBuilder.group({\n name: [\"\", Validators.maxLength(50)],\n useForEncryption: [true],\n }),\n });\n\n protected credentialOptions?: CredentialCreateOptionsView;\n protected pendingCredential?: PendingWebauthnLoginCredentialView;\n protected hasPasskeys$?: Observable;\n protected loading$ = this.webauthnService.loading$;\n\n constructor(\n private formBuilder: FormBuilder,\n private dialogRef: DialogRef,\n private webauthnService: WebauthnLoginAdminService,\n private platformUtilsService: PlatformUtilsService,\n private i18nService: I18nService,\n private logService: LogService,\n ) {}\n\n ngOnInit(): void {\n this.hasPasskeys$ = this.webauthnService\n .getCredentials$()\n .pipe(map((credentials) => credentials.length > 0));\n }\n\n protected submit = async () => {\n this.dialogRef.disableClose = true;\n\n try {\n switch (this.currentStep) {\n case \"userVerification\":\n return await this.submitUserVerification();\n case \"credentialCreationFailed\":\n return await this.submitCredentialCreationFailed();\n case \"credentialCreation\":\n return await this.submitCredentialCreation();\n case \"credentialNaming\":\n return await this.submitCredentialNaming();\n }\n } finally {\n this.dialogRef.disableClose = false;\n }\n };\n\n protected async submitUserVerification() {\n this.formGroup.controls.userVerification.markAllAsTouched();\n if (this.formGroup.controls.userVerification.invalid) {\n return;\n }\n\n try {\n this.credentialOptions = await this.webauthnService.getCredentialAttestationOptions(\n this.formGroup.value.userVerification.secret,\n );\n } catch (error) {\n if (error instanceof ErrorResponse && error.statusCode === 400) {\n this.invalidSecret = true;\n } else {\n this.logService?.error(error);\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"unexpectedError\"),\n error.message,\n );\n }\n return;\n }\n\n this.currentStep = \"credentialCreation\";\n await this.submitCredentialCreation();\n }\n\n protected async submitCredentialCreation() {\n this.pendingCredential = await this.webauthnService.createCredential(this.credentialOptions);\n if (this.pendingCredential === undefined) {\n this.currentStep = \"credentialCreationFailed\";\n return;\n }\n\n this.currentStep = \"credentialNaming\";\n }\n\n protected async submitCredentialCreationFailed() {\n this.currentStep = \"credentialCreation\";\n await this.submitCredentialCreation();\n }\n\n protected async submitCredentialNaming() {\n this.formGroup.controls.credentialNaming.markAllAsTouched();\n if (this.formGroup.controls.credentialNaming.controls.name.invalid) {\n return;\n }\n\n let keySet: PrfKeySet | undefined;\n if (\n this.pendingCredential.supportsPrf &&\n this.formGroup.value.credentialNaming.useForEncryption\n ) {\n keySet = await this.webauthnService.createKeySet(this.pendingCredential);\n\n if (keySet === undefined) {\n this.formGroup.controls.credentialNaming.controls.useForEncryption?.setErrors({\n error: {\n message: this.i18nService.t(\"useForVaultEncryptionErrorReadingPasskey\"),\n },\n });\n return;\n }\n }\n\n const name = this.formGroup.value.credentialNaming.name;\n\n await this.webauthnService.saveCredential(\n this.formGroup.value.credentialNaming.name,\n this.pendingCredential,\n keySet,\n );\n\n if (await firstValueFrom(this.hasPasskeys$)) {\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"passkeySaved\", name),\n );\n } else {\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"loginWithPasskeyEnabled\"),\n );\n }\n\n this.dialogRef.close(CreateCredentialDialogResult.Success);\n }\n}\n\n/**\n * Strongly typed helper to open a CreateCredentialDialog\n * @param dialogService Instance of the dialog service that will be used to open the dialog\n * @param config Configuration for the dialog\n */\nexport const openCreateCredentialDialog = (\n dialogService: DialogService,\n config: DialogConfig,\n) => {\n return dialogService.open(\n CreateCredentialDialogComponent,\n config,\n );\n};\n","
\n \n {{ \"loginWithPasskey\" | i18n }}\n {{ \"newPasskey\" | i18n }}\n \n \n \n \n \n \n \n\n
\n \n

{{ \"creatingPasskeyLoading\" | i18n }}

\n

{{ \"creatingPasskeyLoadingInfo\" | i18n }}

\n
\n\n \n \n

{{ \"errorCreatingPasskey\" | i18n }}

\n

{{ \"errorCreatingPasskeyInfo\" | i18n }}

\n \n\n
\n

{{ \"passkeySuccessfullyCreated\" | i18n }}

\n

\n {{ \"customPasskeyNameInfo\" | i18n }}\n

\n \n {{ \"name\" | i18n }}\n \n {{\n \"charactersCurrentAndMaximum\"\n | i18n: formGroup.value.credentialNaming.name.length : NameMaxCharacters\n }}\n \n \n \n {{ \"useForVaultEncryption\" | i18n }}\n {{ \"useForVaultEncryptionInfo\" | i18n }}\n \n
\n
\n \n \n \n \n
\n
\n","
\n \n {{ \"removePasskey\" | i18n }}\n {{\n credential.name\n }}\n \n \n \n \n \n\n \n

{{ \"removePasskeyInfo\" | i18n }}

\n\n \n
\n
\n \n \n \n \n
\n
\n","import { DialogConfig, DialogRef, DIALOG_DATA } from \"@angular/cdk/dialog\";\nimport { Component, Inject, OnDestroy, OnInit } from \"@angular/core\";\nimport { FormBuilder } from \"@angular/forms\";\nimport { Subject, takeUntil } from \"rxjs\";\n\nimport { Verification } from \"@bitwarden/common/auth/types/verification\";\nimport { ErrorResponse } from \"@bitwarden/common/models/response/error.response\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { DialogService } from \"@bitwarden/components\";\n\nimport { WebauthnLoginAdminService } from \"../../../core\";\nimport { WebauthnLoginCredentialView } from \"../../../core/views/webauthn-login-credential.view\";\n\nexport interface DeleteCredentialDialogParams {\n credentialId: string;\n}\n\n@Component({\n templateUrl: \"delete-credential-dialog.component.html\",\n})\nexport class DeleteCredentialDialogComponent implements OnInit, OnDestroy {\n private destroy$ = new Subject();\n\n protected invalidSecret = false;\n protected formGroup = this.formBuilder.group({\n secret: null as Verification | null,\n });\n protected credential?: WebauthnLoginCredentialView;\n protected loading$ = this.webauthnService.loading$;\n\n constructor(\n @Inject(DIALOG_DATA) private params: DeleteCredentialDialogParams,\n private formBuilder: FormBuilder,\n private dialogRef: DialogRef,\n private webauthnService: WebauthnLoginAdminService,\n private platformUtilsService: PlatformUtilsService,\n private i18nService: I18nService,\n private logService: LogService,\n ) {}\n\n ngOnInit(): void {\n this.webauthnService\n .getCredential$(this.params.credentialId)\n .pipe(takeUntil(this.destroy$))\n .subscribe((credential) => (this.credential = credential));\n }\n\n submit = async () => {\n if (this.credential === undefined) {\n return;\n }\n\n this.dialogRef.disableClose = true;\n try {\n await this.webauthnService.deleteCredential(this.credential.id, this.formGroup.value.secret);\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"passkeyRemoved\"));\n } catch (error) {\n if (error instanceof ErrorResponse && error.statusCode === 400) {\n this.invalidSecret = true;\n } else {\n this.logService?.error(error);\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"unexpectedError\"),\n error.message,\n );\n }\n return false;\n } finally {\n this.dialogRef.disableClose = false;\n }\n\n this.dialogRef.close();\n };\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n}\n\n/**\n * Strongly typed helper to open a DeleteCredentialDialogComponent\n * @param dialogService Instance of the dialog service that will be used to open the dialog\n * @param config Configuration for the dialog\n */\nexport const openDeleteCredentialDialogComponent = (\n dialogService: DialogService,\n config: DialogConfig,\n) => {\n return dialogService.open(DeleteCredentialDialogComponent, config);\n};\n","
\n \n {{ \"enablePasskeyEncryption\" | i18n }}\n {{\n credential.name\n }}\n \n \n \n \n \n\n \n

{{ \"useForVaultEncryptionInfo\" | i18n }}

\n\n \n \n \n
\n
\n \n \n \n \n
\n
\n","import { DIALOG_DATA, DialogConfig, DialogRef } from \"@angular/cdk/dialog\";\nimport { Component, Inject, OnDestroy, OnInit } from \"@angular/core\";\nimport { FormBuilder, Validators } from \"@angular/forms\";\nimport { Subject } from \"rxjs\";\nimport { takeUntil } from \"rxjs/operators\";\n\nimport { WebAuthnLoginServiceAbstraction } from \"@bitwarden/common/auth/abstractions/webauthn/webauthn-login.service.abstraction\";\nimport { WebAuthnLoginCredentialAssertionOptionsView } from \"@bitwarden/common/auth/models/view/webauthn-login/webauthn-login-credential-assertion-options.view\";\nimport { Verification } from \"@bitwarden/common/auth/types/verification\";\nimport { ErrorResponse } from \"@bitwarden/common/models/response/error.response\";\nimport { DialogService } from \"@bitwarden/components/src/dialog/dialog.service\";\n\nimport { WebauthnLoginAdminService } from \"../../../core/services/webauthn-login/webauthn-login-admin.service\";\nimport { WebauthnLoginCredentialView } from \"../../../core/views/webauthn-login-credential.view\";\n\nexport interface EnableEncryptionDialogParams {\n credentialId: string;\n}\n\n@Component({\n templateUrl: \"enable-encryption-dialog.component.html\",\n})\nexport class EnableEncryptionDialogComponent implements OnInit, OnDestroy {\n private destroy$ = new Subject();\n\n protected invalidSecret = false;\n protected formGroup = this.formBuilder.group({\n userVerification: this.formBuilder.group({\n secret: [null as Verification | null, Validators.required],\n }),\n });\n\n protected credential?: WebauthnLoginCredentialView;\n protected credentialOptions?: WebAuthnLoginCredentialAssertionOptionsView;\n protected loading$ = this.webauthnService.loading$;\n\n constructor(\n @Inject(DIALOG_DATA) private params: EnableEncryptionDialogParams,\n private formBuilder: FormBuilder,\n private dialogRef: DialogRef,\n private webauthnService: WebauthnLoginAdminService,\n private webauthnLoginService: WebAuthnLoginServiceAbstraction,\n ) {}\n\n ngOnInit(): void {\n this.webauthnService\n .getCredential$(this.params.credentialId)\n .pipe(takeUntil(this.destroy$))\n .subscribe((credential: any) => (this.credential = credential));\n }\n\n submit = async () => {\n if (this.credential === undefined) {\n return;\n }\n\n this.dialogRef.disableClose = true;\n try {\n this.credentialOptions = await this.webauthnService.getCredentialAssertOptions(\n this.formGroup.value.userVerification.secret,\n );\n await this.webauthnService.enableCredentialEncryption(\n await this.webauthnLoginService.assertCredential(this.credentialOptions),\n );\n } catch (error) {\n if (error instanceof ErrorResponse && error.statusCode === 400) {\n this.invalidSecret = true;\n }\n throw error;\n }\n\n this.dialogRef.close();\n };\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n}\n\n/**\n * Strongly typed helper to open a EnableEncryptionDialogComponent\n * @param dialogService Instance of the dialog service that will be used to open the dialog\n * @param config Configuration for the dialog\n */\nexport const openEnableCredentialDialogComponent = (\n dialogService: DialogService,\n config: DialogConfig,\n) => {\n return dialogService.open(EnableEncryptionDialogComponent, config);\n};\n","

\n {{ \"loginWithPasskey\" | i18n }}\n \n \n {{ \"off\" | i18n }} - {{ \"ssoLoginIsRequired\" | i18n }}\n \n \n {{\n \"on\" | i18n\n }}\n {{\n \"off\" | i18n\n }}\n \n \n {{ \"beta\" | i18n }}\n \n \n \n

\n

\n {{ \"loginWithPasskeyInfo\" | i18n }}\n {{\n \"learnMoreAboutPasswordless\" | i18n\n }}\n

\n\n\n \n \n \n \n \n
{{ credential.name }}\n \n \n {{ \"usedForEncryption\" | i18n }}\n \n \n \n \n {{ \"enablePasskeyEncryption\" | i18n }}\n \n \n \n {{ \"encryptionNotSupported\" | i18n }}\n \n \n \n {{ \"remove\" | i18n }}\n \n
\n\n

{{ \"passkeyLimitReachedInfo\" | i18n }}

\n\n\n \n {{ \"newPasskey\" | i18n }}\n \n\n \n {{ \"enable\" | i18n }}\n \n\n","import { Component, HostBinding, OnDestroy, OnInit } from \"@angular/core\";\nimport { Subject, takeUntil } from \"rxjs\";\n\nimport { PolicyService } from \"@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction\";\nimport { PolicyType } from \"@bitwarden/common/admin-console/enums\";\nimport { DialogService } from \"@bitwarden/components\";\n\nimport { WebauthnLoginAdminService } from \"../../core\";\nimport { WebauthnLoginCredentialPrfStatus } from \"../../core/enums/webauthn-login-credential-prf-status.enum\";\nimport { WebauthnLoginCredentialView } from \"../../core/views/webauthn-login-credential.view\";\n\nimport { openCreateCredentialDialog } from \"./create-credential-dialog/create-credential-dialog.component\";\nimport { openDeleteCredentialDialogComponent } from \"./delete-credential-dialog/delete-credential-dialog.component\";\nimport { openEnableCredentialDialogComponent } from \"./enable-encryption-dialog/enable-encryption-dialog.component\";\n\n@Component({\n selector: \"app-webauthn-login-settings\",\n templateUrl: \"webauthn-login-settings.component.html\",\n host: {\n \"aria-live\": \"polite\",\n },\n})\nexport class WebauthnLoginSettingsComponent implements OnInit, OnDestroy {\n private destroy$ = new Subject();\n\n protected readonly MaxCredentialCount = WebauthnLoginAdminService.MaxCredentialCount;\n protected readonly WebauthnLoginCredentialPrfStatus = WebauthnLoginCredentialPrfStatus;\n\n protected credentials?: WebauthnLoginCredentialView[];\n protected loading = true;\n\n constructor(\n private webauthnService: WebauthnLoginAdminService,\n private dialogService: DialogService,\n private policyService: PolicyService,\n ) {}\n\n @HostBinding(\"attr.aria-busy\")\n get ariaBusy() {\n return this.loading ? \"true\" : \"false\";\n }\n\n get hasCredentials() {\n return this.credentials && this.credentials.length > 0;\n }\n\n get hasData() {\n return this.credentials !== undefined;\n }\n\n get limitReached() {\n return this.credentials?.length >= this.MaxCredentialCount;\n }\n\n requireSsoPolicyEnabled = false;\n\n ngOnInit(): void {\n this.policyService\n .policyAppliesToActiveUser$(PolicyType.RequireSso)\n .pipe(takeUntil(this.destroy$))\n .subscribe((enabled) => {\n this.requireSsoPolicyEnabled = enabled;\n });\n\n this.webauthnService\n .getCredentials$()\n .pipe(takeUntil(this.destroy$))\n .subscribe((credentials) => (this.credentials = credentials));\n\n this.webauthnService.loading$\n .pipe(takeUntil(this.destroy$))\n .subscribe((loading) => (this.loading = loading));\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n protected createCredential() {\n openCreateCredentialDialog(this.dialogService, {});\n }\n\n protected deleteCredential(credentialId: string) {\n openDeleteCredentialDialogComponent(this.dialogService, { data: { credentialId } });\n }\n\n protected enableEncryption(credentialId: string) {\n openEnableCredentialDialogComponent(this.dialogService, { data: { credentialId } });\n }\n}\n","
\n

{{ \"changeMasterPassword\" | i18n }}

\n
\n\n{{ \"loggedOutWarning\" | i18n }}\n\n\n\n\n
\n
\n
\n \n \n
\n
\n
\n
\n
\n
\n \n \n \n {{ \"important\" | i18n }}\n {{ \"masterPassImportant\" | i18n }} {{ characterMinimumMessage }}\n \n \n \n
\n
\n
\n
\n \n \n
\n
\n
\n
\n
\n \n \n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n \n \n
\n \n\n\n\n","import { Component } from \"@angular/core\";\nimport { Router } from \"@angular/router\";\n\nimport { ChangePasswordComponent as BaseChangePasswordComponent } from \"@bitwarden/angular/auth/components/change-password.component\";\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { AuditService } from \"@bitwarden/common/abstractions/audit.service\";\nimport { PolicyService } from \"@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction\";\nimport { UserVerificationService } from \"@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction\";\nimport { PasswordRequest } from \"@bitwarden/common/auth/models/request/password.request\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { EncString } from \"@bitwarden/common/platform/models/domain/enc-string\";\nimport { PasswordGenerationServiceAbstraction } from \"@bitwarden/common/tools/generator/password\";\nimport { MasterKey, UserKey } from \"@bitwarden/common/types/key\";\nimport { CipherService } from \"@bitwarden/common/vault/abstractions/cipher.service\";\nimport { SyncService } from \"@bitwarden/common/vault/abstractions/sync/sync.service.abstraction\";\nimport { DialogService } from \"@bitwarden/components\";\n\nimport { UserKeyRotationService } from \"../key-rotation/user-key-rotation.service\";\n\n@Component({\n selector: \"app-change-password\",\n templateUrl: \"change-password.component.html\",\n})\nexport class ChangePasswordComponent extends BaseChangePasswordComponent {\n rotateUserKey = false;\n currentMasterPassword: string;\n masterPasswordHint: string;\n checkForBreaches = true;\n characterMinimumMessage = \"\";\n\n constructor(\n i18nService: I18nService,\n cryptoService: CryptoService,\n messagingService: MessagingService,\n stateService: StateService,\n passwordGenerationService: PasswordGenerationServiceAbstraction,\n platformUtilsService: PlatformUtilsService,\n policyService: PolicyService,\n private auditService: AuditService,\n private cipherService: CipherService,\n private syncService: SyncService,\n private apiService: ApiService,\n private router: Router,\n dialogService: DialogService,\n private userVerificationService: UserVerificationService,\n private keyRotationService: UserKeyRotationService,\n ) {\n super(\n i18nService,\n cryptoService,\n messagingService,\n passwordGenerationService,\n platformUtilsService,\n policyService,\n stateService,\n dialogService,\n );\n }\n\n async ngOnInit() {\n if (!(await this.userVerificationService.hasMasterPassword())) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/settings/security/two-factor\"]);\n }\n\n this.masterPasswordHint = (await this.apiService.getProfile()).masterPasswordHint;\n await super.ngOnInit();\n\n this.characterMinimumMessage = this.i18nService.t(\"characterMinimum\", this.minimumLength);\n }\n\n async rotateUserKeyClicked() {\n if (this.rotateUserKey) {\n const ciphers = await this.cipherService.getAllDecrypted();\n let hasOldAttachments = false;\n if (ciphers != null) {\n for (let i = 0; i < ciphers.length; i++) {\n if (ciphers[i].organizationId == null && ciphers[i].hasOldAttachments) {\n hasOldAttachments = true;\n break;\n }\n }\n }\n\n if (hasOldAttachments) {\n const learnMore = await this.dialogService.openSimpleDialog({\n title: { key: \"warning\" },\n content: { key: \"oldAttachmentsNeedFixDesc\" },\n acceptButtonText: { key: \"learnMore\" },\n cancelButtonText: { key: \"close\" },\n type: \"warning\",\n });\n\n if (learnMore) {\n this.platformUtilsService.launchUri(\n \"https://bitwarden.com/help/attachments/#add-storage-space\",\n );\n }\n this.rotateUserKey = false;\n return;\n }\n\n const result = await this.dialogService.openSimpleDialog({\n title: { key: \"rotateEncKeyTitle\" },\n content:\n this.i18nService.t(\"updateEncryptionKeyWarning\") +\n \" \" +\n this.i18nService.t(\"updateEncryptionKeyExportWarning\") +\n \" \" +\n this.i18nService.t(\"rotateEncKeyConfirmation\"),\n type: \"warning\",\n });\n\n if (!result) {\n this.rotateUserKey = false;\n }\n }\n }\n\n async submit() {\n if (this.masterPasswordHint != null && this.masterPasswordHint == this.masterPassword) {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"hintEqualsPassword\"),\n );\n return;\n }\n\n this.leakedPassword = false;\n if (this.checkForBreaches) {\n this.leakedPassword = (await this.auditService.passwordLeaked(this.masterPassword)) > 0;\n }\n\n await super.submit();\n }\n\n async setupSubmitActions() {\n if (this.currentMasterPassword == null || this.currentMasterPassword === \"\") {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"masterPasswordRequired\"),\n );\n return false;\n }\n\n if (this.rotateUserKey) {\n await this.syncService.fullSync(true);\n }\n\n return super.setupSubmitActions();\n }\n\n async performSubmitActions(\n newMasterPasswordHash: string,\n newMasterKey: MasterKey,\n newUserKey: [UserKey, EncString],\n ) {\n const masterKey = await this.cryptoService.getOrDeriveMasterKey(this.currentMasterPassword);\n const request = new PasswordRequest();\n request.masterPasswordHash = await this.cryptoService.hashMasterKey(\n this.currentMasterPassword,\n masterKey,\n );\n request.masterPasswordHint = this.masterPasswordHint;\n request.newMasterPasswordHash = newMasterPasswordHash;\n request.key = newUserKey[1].encryptedString;\n\n try {\n if (this.rotateUserKey) {\n this.formPromise = this.apiService.postPassword(request).then(() => {\n return this.updateKey();\n });\n } else {\n this.formPromise = this.apiService.postPassword(request);\n }\n\n await this.formPromise;\n\n this.platformUtilsService.showToast(\n \"success\",\n this.i18nService.t(\"masterPasswordChanged\"),\n this.i18nService.t(\"logBackIn\"),\n );\n this.messagingService.send(\"logout\");\n } catch {\n this.platformUtilsService.showToast(\"error\", null, this.i18nService.t(\"errorOccurred\"));\n }\n }\n\n private async updateKey() {\n await this.keyRotationService.rotateUserKeyAndEncryptedData(this.masterPassword);\n }\n}\n","import { PasswordRequest } from \"../../auth/models/request/password.request\";\nimport { KdfType } from \"../../platform/enums\";\n\nexport class KdfRequest extends PasswordRequest {\n kdf: KdfType;\n kdfIterations: number;\n kdfMemory?: number;\n kdfParallelism?: number;\n}\n","import { DIALOG_DATA } from \"@angular/cdk/dialog\";\nimport { Component, Inject } from \"@angular/core\";\nimport { FormGroup, FormControl, Validators } from \"@angular/forms\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { KdfConfig } from \"@bitwarden/common/auth/models/domain/kdf-config\";\nimport { KdfRequest } from \"@bitwarden/common/models/request/kdf.request\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { KdfType } from \"@bitwarden/common/platform/enums\";\n\n@Component({\n selector: \"app-change-kdf-confirmation\",\n templateUrl: \"change-kdf-confirmation.component.html\",\n})\nexport class ChangeKdfConfirmationComponent {\n kdf: KdfType;\n kdfConfig: KdfConfig;\n\n form = new FormGroup({\n masterPassword: new FormControl(null, Validators.required),\n });\n showPassword = false;\n masterPassword: string;\n formPromise: Promise;\n loading = false;\n\n constructor(\n private apiService: ApiService,\n private i18nService: I18nService,\n private platformUtilsService: PlatformUtilsService,\n private cryptoService: CryptoService,\n private messagingService: MessagingService,\n private stateService: StateService,\n private logService: LogService,\n @Inject(DIALOG_DATA) params: { kdf: KdfType; kdfConfig: KdfConfig },\n ) {\n this.kdf = params.kdf;\n this.kdfConfig = params.kdfConfig;\n this.masterPassword = null;\n }\n\n async submit() {\n this.loading = true;\n\n try {\n this.formPromise = this.makeKeyAndSaveAsync();\n await this.formPromise;\n this.platformUtilsService.showToast(\n \"success\",\n this.i18nService.t(\"encKeySettingsChanged\"),\n this.i18nService.t(\"logBackIn\"),\n );\n this.messagingService.send(\"logout\");\n } catch (e) {\n this.logService.error(e);\n } finally {\n this.loading = false;\n }\n }\n\n private async makeKeyAndSaveAsync() {\n const masterPassword = this.form.value.masterPassword;\n const request = new KdfRequest();\n request.kdf = this.kdf;\n request.kdfIterations = this.kdfConfig.iterations;\n request.kdfMemory = this.kdfConfig.memory;\n request.kdfParallelism = this.kdfConfig.parallelism;\n const masterKey = await this.cryptoService.getOrDeriveMasterKey(masterPassword);\n request.masterPasswordHash = await this.cryptoService.hashMasterKey(masterPassword, masterKey);\n const email = await this.stateService.getEmail();\n\n // Ensure the KDF config is valid.\n this.cryptoService.validateKdfConfig(this.kdf, this.kdfConfig);\n\n const newMasterKey = await this.cryptoService.makeMasterKey(\n masterPassword,\n email,\n this.kdf,\n this.kdfConfig,\n );\n request.newMasterPasswordHash = await this.cryptoService.hashMasterKey(\n masterPassword,\n newMasterKey,\n );\n const newUserKey = await this.cryptoService.encryptUserKeyWithMasterKey(newMasterKey);\n request.key = newUserKey[1].encryptedString;\n\n await this.apiService.postAccountKdf(request);\n }\n}\n","\n \n {{ \"changeKdf\" | i18n }}\n \n\n \n {{ \"changeKdfLoggedOutWarning\" | i18n }}\n \n
\n
\n {{ \"masterPass\" | i18n }}\n \n \n {{ \"confirmIdentity\" | i18n }}\n \n
\n
\n \n
\n \n \n \n \n
\n","
\n

{{ \"encKeySettings\" | i18n }}

\n
\n{{ \"changeKdfLoggedOutWarning\" | i18n }}\n
\n
\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
\n \n

\n {{ \"kdfIterationsDesc\" | i18n: (PBKDF2_ITERATIONS.defaultValue | number) }}\n

\n \n {{ \"kdfIterationsWarning\" | i18n: (100000 | number) }}\n \n
\n \n

{{ \"argon2Desc\" | i18n }}

\n {{ \"argon2Warning\" | i18n }}\n
\n
\n
\n \n {{ \"changeKdf\" | i18n }}\n \n\n","import { Component, OnInit } from \"@angular/core\";\n\nimport { KdfConfig } from \"@bitwarden/common/auth/models/domain/kdf-config\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport {\n DEFAULT_KDF_CONFIG,\n PBKDF2_ITERATIONS,\n ARGON2_ITERATIONS,\n ARGON2_MEMORY,\n ARGON2_PARALLELISM,\n KdfType,\n} from \"@bitwarden/common/platform/enums\";\nimport { DialogService } from \"@bitwarden/components\";\n\nimport { ChangeKdfConfirmationComponent } from \"./change-kdf-confirmation.component\";\n\n@Component({\n selector: \"app-change-kdf\",\n templateUrl: \"change-kdf.component.html\",\n})\nexport class ChangeKdfComponent implements OnInit {\n kdf = KdfType.PBKDF2_SHA256;\n kdfConfig: KdfConfig = DEFAULT_KDF_CONFIG;\n kdfType = KdfType;\n kdfOptions: any[] = [];\n\n // Default values for template\n protected PBKDF2_ITERATIONS = PBKDF2_ITERATIONS;\n protected ARGON2_ITERATIONS = ARGON2_ITERATIONS;\n protected ARGON2_MEMORY = ARGON2_MEMORY;\n protected ARGON2_PARALLELISM = ARGON2_PARALLELISM;\n\n constructor(\n private stateService: StateService,\n private dialogService: DialogService,\n ) {\n this.kdfOptions = [\n { name: \"PBKDF2 SHA-256\", value: KdfType.PBKDF2_SHA256 },\n { name: \"Argon2id\", value: KdfType.Argon2id },\n ];\n }\n\n async ngOnInit() {\n this.kdf = await this.stateService.getKdfType();\n this.kdfConfig = await this.stateService.getKdfConfig();\n }\n\n async onChangeKdf(newValue: KdfType) {\n if (newValue === KdfType.PBKDF2_SHA256) {\n this.kdfConfig = new KdfConfig(PBKDF2_ITERATIONS.defaultValue);\n } else if (newValue === KdfType.Argon2id) {\n this.kdfConfig = new KdfConfig(\n ARGON2_ITERATIONS.defaultValue,\n ARGON2_MEMORY.defaultValue,\n ARGON2_PARALLELISM.defaultValue,\n );\n } else {\n throw new Error(\"Unknown KDF type.\");\n }\n }\n\n async openConfirmationModal() {\n this.dialogService.open(ChangeKdfConfirmationComponent, {\n data: {\n kdf: this.kdf,\n kdfConfig: this.kdfConfig,\n },\n });\n }\n}\n","\n\n

{{ \"apiKey\" | i18n }}

\n\n

\n {{ \"userApiKeyDesc\" | i18n }}\n

\n\n\n\n\n","import { Component, OnInit, ViewChild, ViewContainerRef } from \"@angular/core\";\n\nimport { ModalService } from \"@bitwarden/angular/services/modal.service\";\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { UserVerificationService } from \"@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\n\nimport { ApiKeyComponent } from \"./api-key.component\";\n\n@Component({\n selector: \"app-security-keys\",\n templateUrl: \"security-keys.component.html\",\n})\nexport class SecurityKeysComponent implements OnInit {\n @ViewChild(\"viewUserApiKeyTemplate\", { read: ViewContainerRef, static: true })\n viewUserApiKeyModalRef: ViewContainerRef;\n @ViewChild(\"rotateUserApiKeyTemplate\", { read: ViewContainerRef, static: true })\n rotateUserApiKeyModalRef: ViewContainerRef;\n\n showChangeKdf = true;\n\n constructor(\n private userVerificationService: UserVerificationService,\n private stateService: StateService,\n private modalService: ModalService,\n private apiService: ApiService,\n ) {}\n\n async ngOnInit() {\n this.showChangeKdf = await this.userVerificationService.hasMasterPassword();\n }\n\n async viewUserApiKey() {\n const entityId = await this.stateService.getUserId();\n await this.modalService.openViewRef(ApiKeyComponent, this.viewUserApiKeyModalRef, (comp) => {\n comp.keyType = \"user\";\n comp.entityId = entityId;\n comp.postKey = this.apiService.postUserApiKey.bind(this.apiService);\n comp.scope = \"api\";\n comp.grantType = \"client_credentials\";\n comp.apiKeyTitle = \"apiKey\";\n comp.apiKeyWarning = \"userApiKeyWarning\";\n comp.apiKeyDescription = \"userApiKeyDesc\";\n });\n }\n\n async rotateUserApiKey() {\n const entityId = await this.stateService.getUserId();\n await this.modalService.openViewRef(ApiKeyComponent, this.rotateUserApiKeyModalRef, (comp) => {\n comp.keyType = \"user\";\n comp.isRotation = true;\n comp.entityId = entityId;\n comp.postKey = this.apiService.postUserRotateApiKey.bind(this.apiService);\n comp.scope = \"api\";\n comp.grantType = \"client_credentials\";\n comp.apiKeyTitle = \"apiKey\";\n comp.apiKeyWarning = \"userApiKeyWarning\";\n comp.apiKeyDescription = \"apiKeyRotateDesc\";\n });\n }\n}\n","import { Component } from \"@angular/core\";\n\nimport { UserVerificationService } from \"@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction\";\n\n@Component({\n selector: \"app-security\",\n templateUrl: \"security.component.html\",\n})\nexport class SecurityComponent {\n showChangePassword = true;\n\n constructor(private userVerificationService: UserVerificationService) {}\n\n async ngOnInit() {\n this.showChangePassword = await this.userVerificationService.hasMasterPassword();\n }\n}\n","\n \n {{ \"masterPassword\" | i18n }}\n {{ \"twoStepLogin\" | i18n }}\n {{ \"keys\" | i18n }}\n \n\n\n\n \n\n","import { NgModule } from \"@angular/core\";\nimport { RouterModule, Routes } from \"@angular/router\";\n\nimport { ChangePasswordComponent } from \"../change-password.component\";\nimport { TwoFactorSetupComponent } from \"../two-factor-setup.component\";\n\nimport { SecurityKeysComponent } from \"./security-keys.component\";\nimport { SecurityComponent } from \"./security.component\";\n\nconst routes: Routes = [\n {\n path: \"\",\n component: SecurityComponent,\n data: { titleId: \"security\" },\n children: [\n { path: \"\", pathMatch: \"full\", redirectTo: \"change-password\" },\n {\n path: \"change-password\",\n component: ChangePasswordComponent,\n data: { titleId: \"masterPassword\" },\n },\n {\n path: \"two-factor\",\n component: TwoFactorSetupComponent,\n data: { titleId: \"twoStepLogin\" },\n },\n {\n path: \"security-keys\",\n component: SecurityKeysComponent,\n data: { titleId: \"keys\" },\n },\n ],\n },\n];\n\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule],\n})\nexport class SecurityRoutingModule {}\n","\n
\n
\n \n
\n
\n \n {{ \"loading\" | i18n }}\n
\n
\n

{{ \"ssoLogInWithOrgIdentifier\" | i18n }}

\n
\n \n \n
\n
\n
\n \n {{ \"logIn\" | i18n }} \n \n \n \n {{ \"cancel\" | i18n }}\n \n
\n
\n
\n
\n
\n\n","import { Component } from \"@angular/core\";\nimport { ActivatedRoute, Router } from \"@angular/router\";\nimport { first } from \"rxjs/operators\";\n\nimport { SsoComponent as BaseSsoComponent } from \"@bitwarden/angular/auth/components/sso.component\";\nimport {\n LoginStrategyServiceAbstraction,\n UserDecryptionOptionsServiceAbstraction,\n} from \"@bitwarden/auth/common\";\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { OrgDomainApiServiceAbstraction } from \"@bitwarden/common/admin-console/abstractions/organization-domain/org-domain-api.service.abstraction\";\nimport { OrganizationDomainSsoDetailsResponse } from \"@bitwarden/common/admin-console/abstractions/organization-domain/responses/organization-domain-sso-details.response\";\nimport { SsoLoginServiceAbstraction } from \"@bitwarden/common/auth/abstractions/sso-login.service.abstraction\";\nimport { HttpStatusCode } from \"@bitwarden/common/enums\";\nimport { ErrorResponse } from \"@bitwarden/common/models/response/error.response\";\nimport { ConfigServiceAbstraction } from \"@bitwarden/common/platform/abstractions/config/config.service.abstraction\";\nimport { CryptoFunctionService } from \"@bitwarden/common/platform/abstractions/crypto-function.service\";\nimport { EnvironmentService } from \"@bitwarden/common/platform/abstractions/environment.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { ValidationService } from \"@bitwarden/common/platform/abstractions/validation.service\";\nimport { PasswordGenerationServiceAbstraction } from \"@bitwarden/common/tools/generator/password\";\n\n@Component({\n selector: \"app-sso\",\n templateUrl: \"sso.component.html\",\n})\n// eslint-disable-next-line rxjs-angular/prefer-takeuntil\nexport class SsoComponent extends BaseSsoComponent {\n constructor(\n ssoLoginService: SsoLoginServiceAbstraction,\n loginStrategyService: LoginStrategyServiceAbstraction,\n router: Router,\n i18nService: I18nService,\n route: ActivatedRoute,\n stateService: StateService,\n platformUtilsService: PlatformUtilsService,\n apiService: ApiService,\n cryptoFunctionService: CryptoFunctionService,\n environmentService: EnvironmentService,\n passwordGenerationService: PasswordGenerationServiceAbstraction,\n logService: LogService,\n private orgDomainApiService: OrgDomainApiServiceAbstraction,\n private validationService: ValidationService,\n userDecryptionOptionsService: UserDecryptionOptionsServiceAbstraction,\n configService: ConfigServiceAbstraction,\n ) {\n super(\n ssoLoginService,\n loginStrategyService,\n router,\n i18nService,\n route,\n stateService,\n platformUtilsService,\n apiService,\n cryptoFunctionService,\n environmentService,\n passwordGenerationService,\n logService,\n userDecryptionOptionsService,\n configService,\n );\n this.redirectUri = window.location.origin + \"/sso-connector.html\";\n this.clientId = \"web\";\n }\n\n async ngOnInit() {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n super.ngOnInit();\n\n // eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe\n this.route.queryParams.pipe(first()).subscribe(async (qParams) => {\n if (qParams.identifier != null) {\n // SSO Org Identifier in query params takes precedence over claimed domains\n this.identifier = qParams.identifier;\n } else {\n // Note: this flow is written for web but both browser and desktop\n // redirect here on SSO button click.\n\n // Check if email matches any claimed domains\n if (qParams.email) {\n // show loading spinner\n this.loggingIn = true;\n try {\n const response: OrganizationDomainSsoDetailsResponse =\n await this.orgDomainApiService.getClaimedOrgDomainByEmail(qParams.email);\n\n if (response?.ssoAvailable) {\n this.identifier = response.organizationIdentifier;\n await this.submit();\n return;\n }\n } catch (error) {\n this.handleGetClaimedDomainByEmailError(error);\n }\n\n this.loggingIn = false;\n }\n\n // Fallback to state svc if domain is unclaimed\n const storedIdentifier = await this.ssoLoginService.getOrganizationSsoIdentifier();\n if (storedIdentifier != null) {\n this.identifier = storedIdentifier;\n }\n }\n });\n }\n\n private handleGetClaimedDomainByEmailError(error: any): void {\n if (error instanceof ErrorResponse) {\n const errorResponse: ErrorResponse = error as ErrorResponse;\n switch (errorResponse.statusCode) {\n case HttpStatusCode.NotFound:\n //this is a valid case for a domain not found\n return;\n\n default:\n this.validationService.showError(errorResponse);\n break;\n }\n }\n }\n\n async submit() {\n await this.ssoLoginService.setOrganizationSsoIdentifier(this.identifier);\n if (this.clientId === \"browser\") {\n document.cookie = `ssoHandOffMessage=${this.i18nService.t(\"ssoHandOff\")};SameSite=strict`;\n }\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n super.submit();\n }\n}\n","export type InitiationPath =\n | \"Registration form\"\n | \"Password Manager trial from marketing website\"\n | \"Secrets Manager trial from marketing website\"\n | \"New organization creation in-product\"\n | \"Upgrade in-product\";\n\nexport class ReferenceEventRequest {\n id: string;\n session: string;\n layout: string;\n flow: string;\n initiationPath: InitiationPath;\n}\n","\n \n \n \n\n","import { CdkStep } from \"@angular/cdk/stepper\";\nimport { Component, Input } from \"@angular/core\";\n\n@Component({\n selector: \"app-vertical-step\",\n templateUrl: \"vertical-step.component.html\",\n providers: [{ provide: CdkStep, useExisting: VerticalStep }],\n})\nexport class VerticalStep extends CdkStep {\n @Input() subLabel = \"\";\n @Input() applyBorder = true;\n @Input() addSubLabelSpacing = false;\n}\n","\n
\n \n \n {{ stepNumber }}\n \n \n \n \n \n \n {{ step.label }}\n

\n

{{ step.subLabel }}

\n
\n \n\n","import { Component, EventEmitter, Input, Output } from \"@angular/core\";\n\nimport { VerticalStep } from \"./vertical-step.component\";\n\n@Component({\n selector: \"app-vertical-step-content\",\n templateUrl: \"vertical-step-content.component.html\",\n})\nexport class VerticalStepContentComponent {\n @Output() onSelectStep = new EventEmitter();\n\n @Input() disabled = false;\n @Input() selected = false;\n @Input() step: VerticalStep;\n @Input() stepNumber: number;\n\n selectStep() {\n this.onSelectStep.emit();\n }\n}\n","
\n
    \n
  • \n \n
\n \n \n \n\n","import { CdkStepper } from \"@angular/cdk/stepper\";\nimport { Component, Input, QueryList } from \"@angular/core\";\n\nimport { VerticalStep } from \"./vertical-step.component\";\n\n@Component({\n selector: \"app-vertical-stepper\",\n templateUrl: \"vertical-stepper.component.html\",\n providers: [{ provide: CdkStepper, useExisting: VerticalStepperComponent }],\n})\nexport class VerticalStepperComponent extends CdkStepper {\n readonly steps: QueryList;\n\n @Input()\n activeClass = \"active\";\n\n isNextButtonHidden() {\n return !(this.steps.length === this.selectedIndex + 1);\n }\n\n isStepDisabled(index: number) {\n if (this.selectedIndex !== index) {\n return this.selectedIndex === index - 1\n ? !this.steps.find((_, i) => i == index - 1)?.completed\n : true;\n }\n return false;\n }\n\n selectStepByIndex(index: number): void {\n this.selectedIndex = index;\n }\n}\n","import { CaptchaProtectedRequest } from \"../../auth/models/request/captcha-protected.request\";\nimport { KdfType } from \"../../platform/enums\";\n\nimport { KeysRequest } from \"./keys.request\";\nimport { ReferenceEventRequest } from \"./reference-event.request\";\n\nexport class RegisterRequest implements CaptchaProtectedRequest {\n masterPasswordHint: string;\n keys: KeysRequest;\n token: string;\n organizationUserId: string;\n\n constructor(\n public email: string,\n public name: string,\n public masterPasswordHash: string,\n masterPasswordHint: string,\n public key: string,\n public referenceData: ReferenceEventRequest,\n public captchaResponse: string,\n public kdf: KdfType,\n public kdfIterations: number,\n public kdfMemory?: number,\n public kdfParallelism?: number,\n ) {\n this.masterPasswordHint = masterPasswordHint ? masterPasswordHint : null;\n }\n}\n","import { AbstractControl, UntypedFormGroup, ValidatorFn } from \"@angular/forms\";\n\nimport { FormGroupControls } from \"../../platform/abstractions/form-validation-errors.service\";\n\nexport class InputsFieldMatch {\n //check to ensure two fields do not have the same value\n static validateInputsDoesntMatch(matchTo: string, errorMessage: string): ValidatorFn {\n return (control: AbstractControl) => {\n if (control.parent && control.parent.controls) {\n return control?.value === (control?.parent?.controls as FormGroupControls)[matchTo].value\n ? {\n inputsMatchError: {\n message: errorMessage,\n },\n }\n : null;\n }\n\n return null;\n };\n }\n\n //check to ensure two fields have the same value\n static validateInputsMatch(matchTo: string, errorMessage: string): ValidatorFn {\n return (control: AbstractControl) => {\n if (control.parent && control.parent.controls) {\n return control?.value === (control?.parent?.controls as FormGroupControls)[matchTo].value\n ? null\n : {\n inputsDoesntMatchError: {\n message: errorMessage,\n },\n };\n }\n\n return null;\n };\n }\n\n //checks the formGroup if two fields have the same value and validation is controlled from either field\n static validateFormInputsMatch(field: string, fieldMatchTo: string, errorMessage: string) {\n return (formGroup: UntypedFormGroup) => {\n const fieldCtrl = formGroup.controls[field];\n const fieldMatchToCtrl = formGroup.controls[fieldMatchTo];\n\n if (fieldCtrl.value !== fieldMatchToCtrl.value) {\n fieldMatchToCtrl.setErrors({\n inputsDoesntMatchError: {\n message: errorMessage,\n },\n });\n } else {\n fieldMatchToCtrl.setErrors(null);\n }\n };\n }\n}\n","import { Directive, EventEmitter, Input, OnInit, Output } from \"@angular/core\";\nimport { AbstractControl, UntypedFormBuilder, ValidatorFn, Validators } from \"@angular/forms\";\nimport { Router } from \"@angular/router\";\n\nimport { LoginStrategyServiceAbstraction, PasswordLoginCredentials } from \"@bitwarden/auth/common\";\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { AuditService } from \"@bitwarden/common/abstractions/audit.service\";\nimport { RegisterResponse } from \"@bitwarden/common/auth/models/response/register.response\";\nimport { KeysRequest } from \"@bitwarden/common/models/request/keys.request\";\nimport { ReferenceEventRequest } from \"@bitwarden/common/models/request/reference-event.request\";\nimport { RegisterRequest } from \"@bitwarden/common/models/request/register.request\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { EnvironmentService } from \"@bitwarden/common/platform/abstractions/environment.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { DEFAULT_KDF_CONFIG, DEFAULT_KDF_TYPE } from \"@bitwarden/common/platform/enums\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\nimport { PasswordGenerationServiceAbstraction } from \"@bitwarden/common/tools/generator/password\";\nimport { DialogService } from \"@bitwarden/components\";\n\nimport {\n AllValidationErrors,\n FormValidationErrorsService,\n} from \"../../platform/abstractions/form-validation-errors.service\";\nimport { PasswordColorText } from \"../../tools/password-strength/password-strength.component\";\nimport { InputsFieldMatch } from \"../validators/inputs-field-match.validator\";\n\nimport { CaptchaProtectedComponent } from \"./captcha-protected.component\";\n\n@Directive()\nexport class RegisterComponent extends CaptchaProtectedComponent implements OnInit {\n @Input() isInTrialFlow = false;\n @Output() createdAccount = new EventEmitter();\n\n showPassword = false;\n formPromise: Promise;\n referenceData: ReferenceEventRequest;\n showTerms = true;\n showErrorSummary = false;\n passwordStrengthResult: any;\n characterMinimumMessage: string;\n minimumLength = Utils.minimumPasswordLength;\n color: string;\n text: string;\n\n formGroup = this.formBuilder.group(\n {\n email: [\"\", [Validators.required, Validators.email]],\n name: [\"\"],\n masterPassword: [\"\", [Validators.required, Validators.minLength(this.minimumLength)]],\n confirmMasterPassword: [\"\", [Validators.required, Validators.minLength(this.minimumLength)]],\n hint: [\n null,\n [\n InputsFieldMatch.validateInputsDoesntMatch(\n \"masterPassword\",\n this.i18nService.t(\"hintEqualsPassword\"),\n ),\n ],\n ],\n checkForBreaches: [true],\n acceptPolicies: [false, [this.acceptPoliciesValidation()]],\n },\n {\n validator: InputsFieldMatch.validateFormInputsMatch(\n \"masterPassword\",\n \"confirmMasterPassword\",\n this.i18nService.t(\"masterPassDoesntMatch\"),\n ),\n },\n );\n\n protected successRoute = \"login\";\n\n protected accountCreated = false;\n\n protected captchaBypassToken: string = null;\n\n constructor(\n protected formValidationErrorService: FormValidationErrorsService,\n protected formBuilder: UntypedFormBuilder,\n protected loginStrategyService: LoginStrategyServiceAbstraction,\n protected router: Router,\n i18nService: I18nService,\n protected cryptoService: CryptoService,\n protected apiService: ApiService,\n protected stateService: StateService,\n platformUtilsService: PlatformUtilsService,\n protected passwordGenerationService: PasswordGenerationServiceAbstraction,\n environmentService: EnvironmentService,\n protected logService: LogService,\n protected auditService: AuditService,\n protected dialogService: DialogService,\n ) {\n super(environmentService, i18nService, platformUtilsService);\n this.showTerms = !platformUtilsService.isSelfHost();\n this.characterMinimumMessage = this.i18nService.t(\"characterMinimum\", this.minimumLength);\n }\n\n async ngOnInit() {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.setupCaptcha();\n }\n\n async submit(showToast = true) {\n let email = this.formGroup.value.email;\n email = email.trim().toLowerCase();\n let name = this.formGroup.value.name;\n name = name === \"\" ? null : name; // Why do we do this?\n const masterPassword = this.formGroup.value.masterPassword;\n try {\n if (!this.accountCreated) {\n const registerResponse = await this.registerAccount(\n await this.buildRegisterRequest(email, masterPassword, name),\n showToast,\n );\n if (!registerResponse.successful) {\n return;\n }\n this.captchaBypassToken = registerResponse.captchaBypassToken;\n this.accountCreated = true;\n }\n if (this.isInTrialFlow) {\n if (!this.accountCreated) {\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"trialAccountCreated\"),\n );\n }\n const loginResponse = await this.logIn(email, masterPassword, this.captchaBypassToken);\n if (loginResponse.captchaRequired) {\n return;\n }\n this.createdAccount.emit(this.formGroup.value.email);\n } else {\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"newAccountCreated\"),\n );\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([this.successRoute], { queryParams: { email: email } });\n }\n } catch (e) {\n this.logService.error(e);\n }\n }\n\n togglePassword() {\n this.showPassword = !this.showPassword;\n }\n\n getStrengthResult(result: any) {\n this.passwordStrengthResult = result;\n }\n\n getPasswordScoreText(event: PasswordColorText) {\n this.color = event.color;\n this.text = event.text;\n }\n\n private getErrorToastMessage() {\n const error: AllValidationErrors = this.formValidationErrorService\n .getFormValidationErrors(this.formGroup.controls)\n .shift();\n\n if (error) {\n switch (error.errorName) {\n case \"email\":\n return this.i18nService.t(\"invalidEmail\");\n case \"inputsDoesntMatchError\":\n return this.i18nService.t(\"masterPassDoesntMatch\");\n case \"inputsMatchError\":\n return this.i18nService.t(\"hintEqualsPassword\");\n case \"minlength\":\n return this.i18nService.t(\"masterPasswordMinlength\", Utils.minimumPasswordLength);\n default:\n return this.i18nService.t(this.errorTag(error));\n }\n }\n\n return;\n }\n\n private errorTag(error: AllValidationErrors): string {\n const name = error.errorName.charAt(0).toUpperCase() + error.errorName.slice(1);\n return `${error.controlName}${name}`;\n }\n\n //validation would be ignored on selfhosted\n private acceptPoliciesValidation(): ValidatorFn {\n return (control: AbstractControl) => {\n const ctrlValue = control.value;\n\n return !ctrlValue && this.showTerms ? { required: true } : null;\n };\n }\n\n private async validateRegistration(showToast: boolean): Promise<{ isValid: boolean }> {\n this.formGroup.markAllAsTouched();\n this.showErrorSummary = true;\n\n if (this.formGroup.get(\"acceptPolicies\").hasError(\"required\")) {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"acceptPoliciesRequired\"),\n );\n return { isValid: false };\n }\n\n //web\n if (this.formGroup.invalid && !showToast) {\n return { isValid: false };\n }\n\n //desktop, browser\n if (this.formGroup.invalid && showToast) {\n const errorText = this.getErrorToastMessage();\n this.platformUtilsService.showToast(\"error\", this.i18nService.t(\"errorOccurred\"), errorText);\n return { isValid: false };\n }\n\n const passwordWeak =\n this.passwordStrengthResult != null && this.passwordStrengthResult.score < 3;\n const passwordLeak =\n this.formGroup.controls.checkForBreaches.value &&\n (await this.auditService.passwordLeaked(this.formGroup.controls.masterPassword.value)) > 0;\n\n if (passwordWeak && passwordLeak) {\n const result = await this.dialogService.openSimpleDialog({\n title: { key: \"weakAndExposedMasterPassword\" },\n content: { key: \"weakAndBreachedMasterPasswordDesc\" },\n type: \"warning\",\n });\n\n if (!result) {\n return { isValid: false };\n }\n } else if (passwordWeak) {\n const result = await this.dialogService.openSimpleDialog({\n title: { key: \"weakMasterPassword\" },\n content: { key: \"weakMasterPasswordDesc\" },\n type: \"warning\",\n });\n\n if (!result) {\n return { isValid: false };\n }\n } else if (passwordLeak) {\n const result = await this.dialogService.openSimpleDialog({\n title: { key: \"exposedMasterPassword\" },\n content: { key: \"exposedMasterPasswordDesc\" },\n type: \"warning\",\n });\n\n if (!result) {\n return { isValid: false };\n }\n }\n\n return { isValid: true };\n }\n\n private async buildRegisterRequest(\n email: string,\n masterPassword: string,\n name: string,\n ): Promise {\n const hint = this.formGroup.value.hint;\n const kdf = DEFAULT_KDF_TYPE;\n const kdfConfig = DEFAULT_KDF_CONFIG;\n const key = await this.cryptoService.makeMasterKey(masterPassword, email, kdf, kdfConfig);\n const newUserKey = await this.cryptoService.makeUserKey(key);\n const masterKeyHash = await this.cryptoService.hashMasterKey(masterPassword, key);\n const keys = await this.cryptoService.makeKeyPair(newUserKey[0]);\n const request = new RegisterRequest(\n email,\n name,\n masterKeyHash,\n hint,\n newUserKey[1].encryptedString,\n this.referenceData,\n this.captchaToken,\n kdf,\n kdfConfig.iterations,\n kdfConfig.memory,\n kdfConfig.parallelism,\n );\n request.keys = new KeysRequest(keys[0], keys[1].encryptedString);\n const orgInvite = await this.stateService.getOrganizationInvitation();\n if (orgInvite != null && orgInvite.token != null && orgInvite.organizationUserId != null) {\n request.token = orgInvite.token;\n request.organizationUserId = orgInvite.organizationUserId;\n }\n return request;\n }\n\n private async registerAccount(\n request: RegisterRequest,\n showToast: boolean,\n ): Promise<{ successful: boolean; captchaBypassToken?: string }> {\n if (!(await this.validateRegistration(showToast)).isValid) {\n return { successful: false };\n }\n this.formPromise = this.apiService.postRegister(request);\n try {\n const response = await this.formPromise;\n return { successful: true, captchaBypassToken: response.captchaBypassToken };\n } catch (e) {\n if (this.handleCaptchaRequired(e)) {\n return { successful: false };\n } else {\n throw e;\n }\n }\n }\n\n private async logIn(\n email: string,\n masterPassword: string,\n captchaBypassToken: string,\n ): Promise<{ captchaRequired: boolean }> {\n const credentials = new PasswordLoginCredentials(\n email,\n masterPassword,\n captchaBypassToken,\n null,\n );\n const loginResponse = await this.loginStrategyService.logIn(credentials);\n if (this.handleCaptchaRequired(loginResponse)) {\n return { captchaRequired: true };\n }\n return { captchaRequired: false };\n }\n}\n","\n\n\n
\n
\n \n {{ \"emailAddress\" | i18n }}\n \n {{ \"emailAddressDesc\" | i18n }}\n \n
\n\n
\n \n {{ \"name\" | i18n }}\n \n {{ \"yourNameDesc\" | i18n }}\n \n
\n\n
\n \n \n \n {{ \"masterPass\" | i18n }}\n \n \n \n {{ \"important\" | i18n }}\n {{ \"masterPassImportant\" | i18n }} {{ characterMinimumMessage }}\n \n \n \n \n
\n\n
\n \n {{ \"reTypeMasterPass\" | i18n }}\n \n \n \n
\n\n
\n \n {{ \"masterPassHintLabel\" | i18n }}\n \n {{ \"masterPassHintDesc\" | i18n }}\n \n
\n\n
\n \n
\n
\n \n {{ \"checkForBreaches\" | i18n }}\n
\n
\n \n\n \n {{ \"acceptPolicies\" | i18n }}
\n {{\n \"termsOfService\" | i18n\n }},\n {{\n \"privacyPolicy\" | i18n\n }}\n
\n
\n\n
\n \n \n {{ \"createAccount\" | i18n }}\n \n \n \n \n {{ \"logIn\" | i18n }}\n \n \n
\n

\n {{ \"alreadyHaveAccount\" | i18n }}\n {{ \"logIn\" | i18n }}\n

\n \n
\n\n","import { Component, Input } from \"@angular/core\";\nimport { UntypedFormBuilder } from \"@angular/forms\";\nimport { Router } from \"@angular/router\";\n\nimport { RegisterComponent as BaseRegisterComponent } from \"@bitwarden/angular/auth/components/register.component\";\nimport { FormValidationErrorsService } from \"@bitwarden/angular/platform/abstractions/form-validation-errors.service\";\nimport { LoginStrategyServiceAbstraction } from \"@bitwarden/auth/common\";\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { AuditService } from \"@bitwarden/common/abstractions/audit.service\";\nimport { PolicyService } from \"@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction\";\nimport { MasterPasswordPolicyOptions } from \"@bitwarden/common/admin-console/models/domain/master-password-policy-options\";\nimport { ReferenceEventRequest } from \"@bitwarden/common/models/request/reference-event.request\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { EnvironmentService } from \"@bitwarden/common/platform/abstractions/environment.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { PasswordGenerationServiceAbstraction } from \"@bitwarden/common/tools/generator/password\";\nimport { DialogService } from \"@bitwarden/components\";\n\n@Component({\n selector: \"app-register-form\",\n templateUrl: \"./register-form.component.html\",\n})\nexport class RegisterFormComponent extends BaseRegisterComponent {\n @Input() queryParamEmail: string;\n @Input() queryParamFromOrgInvite: boolean;\n @Input() enforcedPolicyOptions: MasterPasswordPolicyOptions;\n @Input() referenceDataValue: ReferenceEventRequest;\n\n showErrorSummary = false;\n characterMinimumMessage: string;\n\n constructor(\n formValidationErrorService: FormValidationErrorsService,\n formBuilder: UntypedFormBuilder,\n loginStrategyService: LoginStrategyServiceAbstraction,\n router: Router,\n i18nService: I18nService,\n cryptoService: CryptoService,\n apiService: ApiService,\n stateService: StateService,\n platformUtilsService: PlatformUtilsService,\n passwordGenerationService: PasswordGenerationServiceAbstraction,\n private policyService: PolicyService,\n environmentService: EnvironmentService,\n logService: LogService,\n auditService: AuditService,\n dialogService: DialogService,\n ) {\n super(\n formValidationErrorService,\n formBuilder,\n loginStrategyService,\n router,\n i18nService,\n cryptoService,\n apiService,\n stateService,\n platformUtilsService,\n passwordGenerationService,\n environmentService,\n logService,\n auditService,\n dialogService,\n );\n }\n\n async ngOnInit() {\n await super.ngOnInit();\n this.referenceData = this.referenceDataValue;\n if (this.queryParamEmail) {\n this.formGroup.get(\"email\")?.setValue(this.queryParamEmail);\n }\n\n if (this.enforcedPolicyOptions != null && this.enforcedPolicyOptions.minLength > 0) {\n this.characterMinimumMessage = \"\";\n } else {\n this.characterMinimumMessage = this.i18nService.t(\"characterMinimum\", this.minimumLength);\n }\n }\n\n async submit() {\n if (\n this.enforcedPolicyOptions != null &&\n !this.policyService.evaluateMasterPassword(\n this.passwordStrengthResult.score,\n this.formGroup.value.masterPassword,\n this.enforcedPolicyOptions,\n )\n ) {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"masterPasswordPolicyRequirementsNotMet\"),\n );\n return;\n }\n\n await super.submit(false);\n }\n}\n","import { Component } from \"@angular/core\";\n\n@Component({\n selector: \"app-logo-cnet-5-stars\",\n templateUrl: \"logo-cnet-5-stars.component.html\",\n})\nexport class LogoCnet5StarsComponent {}\n","
\n
\n \n \n \n \n \n
\n
\n “Bitwarden scores points for being fully open-source, secure and audited annually by third-party\n cybersecurity firms, giving it a level of transparency that sets it apart from its peers.”\n
\n
\n \n \n \n

Best Password Manager in 2024

\n
\n
\n","import { Component, Input } from \"@angular/core\";\n\n@Component({\n selector: \"review-logo\",\n templateUrl: \"review-logo.component.html\",\n})\nexport class ReviewLogoComponent {\n @Input() logoClass: string;\n @Input() logoSrc: string;\n @Input() logoAlt: string;\n}\n","
\n \n
\n
\n \n \n \n \n
\n
\n \n
\n \n
\n
\n 4.7\n
\n
\n","import { Component } from \"@angular/core\";\n\n@Component({\n selector: \"app-enterprise-content\",\n templateUrl: \"enterprise-content.component.html\",\n})\nexport class EnterpriseContentComponent {}\n","

The Password Manager Trusted by Millions

\n
\n

Everything enterprises need out of a password manager:

\n
\n
    \n
  • Secure password sharing
  • \n
  • \n Easy, flexible SSO and SCIM integrations\n
  • \n
  • Free families plan for users
  • \n
  • Quick import and migration tools
  • \n
  • Simple, streamlined user experience
  • \n
  • Priority support and trainers
  • \n
\n
\n \n
\n \n \n \n
\n
\n","import { Component } from \"@angular/core\";\n\n@Component({\n selector: \"app-logo-forbes\",\n templateUrl: \"logo-forbes.component.html\",\n})\nexport class LogoForbesComponent {}\n","
\n
\n \n \n \n
\n
\n “Bitwarden boasts the backing of some of the world's best security experts and an attractive,\n easy-to-use interface”\n
\n
\n","import { Component } from \"@angular/core\";\n\n@Component({\n selector: \"app-logo-us-news\",\n templateUrl: \"logo-us-news.component.html\",\n})\nexport class LogoUSNewsComponent {}\n","\n","import { Component } from \"@angular/core\";\n\n@Component({\n selector: \"app-teams-content\",\n templateUrl: \"teams-content.component.html\",\n})\nexport class TeamsContentComponent {}\n","

The Bitwarden Password Manager

\n
\n

\n Trusted by millions of individuals, teams, and organizations worldwide for secure password\n storage and sharing.\n

\n
\n
    \n
  • Store logins, secure notes, and more
  • \n
  • Collaborate and share securely
  • \n
  • Access anywhere on any device
  • \n
  • Create your account to get started
  • \n
\n
\n \n \n
\n","import { Component, Input } from \"@angular/core\";\n\n@Component({\n selector: \"app-trial-confirmation-details\",\n templateUrl: \"confirmation-details.component.html\",\n})\nexport class ConfirmationDetailsComponent {\n @Input() email: string;\n @Input() orgLabel: string;\n}\n","
\n

{{ \"trialThankYou\" | i18n: orgLabel }}

\n
    \n
  • \n

    \n {{ \"trialConfirmationEmail\" | i18n }}\n {{ email }}.\n

    \n
  • \n
  • \n

    \n {{ \"trialPaidInfoMessage\" | i18n: orgLabel }}\n

    \n
  • \n
\n
\n","import { Component } from \"@angular/core\";\n\n@Component({\n selector: \"app-default-content\",\n templateUrl: \"default-content.component.html\",\n})\nexport class DefaultContentComponent {}\n","

The Bitwarden Password Manager

\n
\n

\n Trusted by millions of individuals, teams, and organizations worldwide for secure password\n storage and sharing.\n

\n
\n
    \n
  • Store logins, secure notes, and more
  • \n
  • Collaborate and share securely
  • \n
  • Access anywhere on any device
  • \n
  • Create your account to get started
  • \n
\n
\n \n \n
\n","import { Component } from \"@angular/core\";\n\n@Component({\n selector: \"app-enterprise1-content\",\n templateUrl: \"enterprise1-content.component.html\",\n})\nexport class Enterprise1ContentComponent {}\n","

The Password Manager Trusted by Millions

\n
\n

Everything enterprises need out of a password manager:

\n
\n
    \n
  • Secure password sharing
  • \n
  • \n Easy, flexible SSO and SCIM integrations\n
  • \n
  • Free families plan for users
  • \n
  • Quick import and migration tools
  • \n
  • Simple, streamlined user experience
  • \n
  • Priority support and trainers
  • \n
\n
\n \n
\n \n \n \n
\n
\n","import { Component } from \"@angular/core\";\n\n@Component({\n selector: \"app-enterprise2-content\",\n templateUrl: \"enterprise2-content.component.html\",\n})\nexport class Enterprise2ContentComponent {}\n","

The Password Manager Trusted by Millions

\n
\n

Everything enterprises need out of a password manager:

\n
\n
    \n
  • Secure password sharing
  • \n
  • \n Easy, flexible SSO and SCIM integrations\n
  • \n
  • Free families plan for users
  • \n
  • Quick import and migration tools
  • \n
  • Simple, streamlined user experience
  • \n
  • Priority support and trainers
  • \n
\n
\n \n
\n \n \n \n
\n
\n","import { Component } from \"@angular/core\";\n\n@Component({\n selector: \"app-teams1-content\",\n templateUrl: \"teams1-content.component.html\",\n})\nexport class Teams1ContentComponent {}\n","

Start Your Teams Free Trial Now

\n
\n
$4 per month / per user
\n
Annual subscription
\n
\n
\n

\n Millions of individuals, teams, and organizations worldwide trust Bitwarden for secure password\n storage and sharing.\n

\n
\n
    \n
  • Collaborate and share securely
  • \n
  • Deploy and manage quickly and easily
  • \n
  • Access anywhere on any device
  • \n
  • Create your account to get started
  • \n
\n
\n \n \n
\n","import { Component } from \"@angular/core\";\n\n@Component({\n selector: \"app-teams2-content\",\n templateUrl: \"teams2-content.component.html\",\n})\nexport class Teams2ContentComponent {}\n","

Start Your Free Trial Now

\n
\n

\n Millions of individuals, teams, and organizations worldwide trust Bitwarden for secure password\n storage and sharing.\n

\n
\n
    \n
  • Collaborate and share securely
  • \n
  • Deploy and manage quickly and easily
  • \n
  • Access anywhere on any device
  • \n
  • Create your account to get started
  • \n
\n
\n \n \n
\n","import { Component } from \"@angular/core\";\n\n@Component({\n selector: \"app-teams3-content\",\n templateUrl: \"teams3-content.component.html\",\n})\nexport class Teams3ContentComponent {}\n","

Begin Teams Starter Free Trial Now

\n
\n

\n Millions of individuals, teams, and organizations worldwide trust Bitwarden for secure password\n storage and sharing.\n

\n
\n\n
\n \n \n
\n","import { Component } from \"@angular/core\";\n\n@Component({\n selector: \"app-logo-cnet\",\n templateUrl: \"logo-cnet.component.html\",\n})\nexport class LogoCnetComponent {}\n","
\n
\n \n \n \n
\n
\n \"No more excuses; start using Bitwarden today. The identity you save could be your own. The\n money definitely will be.\"\n
\n
\n","import { Component } from \"@angular/core\";\n\n@Component({\n selector: \"app-cnet-enterprise-content\",\n templateUrl: \"cnet-enterprise-content.component.html\",\n})\nexport class CnetEnterpriseContentComponent {}\n","

Start Your Enterprise Free Trial Now

\n
\n

\n Millions of individuals, teams, and organizations worldwide trust Bitwarden for secure password\n storage and sharing.\n

\n
\n
    \n
  • Collaborate and share securely
  • \n
  • Deploy and manage quickly and easily
  • \n
  • Access anywhere on any device
  • \n
  • Create your account to get started
  • \n
\n
\n \n \n
\n","import { Component } from \"@angular/core\";\n\n@Component({\n selector: \"app-cnet-individual-content\",\n templateUrl: \"cnet-individual-content.component.html\",\n})\nexport class CnetIndividualContentComponent {}\n","

Start Your Premium Account Now

\n
\n

\n Millions of individuals, teams, and organizations worldwide trust Bitwarden for secure password\n storage and sharing.\n

\n
\n
    \n
  • Store logins, secure notes, and more
  • \n
  • Secure your account with advanced two-step login
  • \n
  • Access anywhere on any device
  • \n
  • Create your account to get started
  • \n
\n
\n \n \n
\n","import { Component } from \"@angular/core\";\n\n@Component({\n selector: \"app-cnet-teams-content\",\n templateUrl: \"cnet-teams-content.component.html\",\n})\nexport class CnetTeamsContentComponent {}\n","

Start Your Teams Free Trial Now

\n
\n

\n Millions of individuals, teams, and organizations worldwide trust Bitwarden for secure password\n storage and sharing.\n

\n
\n
    \n
  • Collaborate and share securely
  • \n
  • Deploy and manage quickly and easily
  • \n
  • Access anywhere on any device
  • \n
  • Create your account to get started
  • \n
\n
\n \n \n
\n","import { Component } from \"@angular/core\";\n\n@Component({\n selector: \"app-abm-enterprise-content\",\n templateUrl: \"abm-enterprise-content.component.html\",\n})\nexport class AbmEnterpriseContentComponent {}\n","

The Bitwarden Password Manager

\n
\n

\n Trusted by millions of individuals, teams, and organizations worldwide for secure password\n storage and sharing.\n

\n
\n
    \n
  • Store logins, secure notes, and more
  • \n
  • Collaborate and share securely
  • \n
  • Access anywhere on any device
  • \n
  • Create your account to get started
  • \n
\n
\n \n \n
\n","import { Component } from \"@angular/core\";\n\n@Component({\n selector: \"app-abm-teams-content\",\n templateUrl: \"abm-teams-content.component.html\",\n})\nexport class AbmTeamsContentComponent {}\n","

The Bitwarden Password Manager

\n
\n

\n Trusted by millions of individuals, teams, and organizations worldwide for secure password\n storage and sharing.\n

\n
\n
    \n
  • Store logins, secure notes, and more
  • \n
  • Collaborate and share securely
  • \n
  • Access anywhere on any device
  • \n
  • Create your account to get started
  • \n
\n
\n \n \n
\n","import { Component, Input } from \"@angular/core\";\n\n@Component({\n selector: \"app-review-blurb\",\n templateUrl: \"review-blurb.component.html\",\n})\nexport class ReviewBlurbComponent {\n @Input() header: string;\n @Input() quote: string;\n @Input() source: string;\n}\n","

{{ header }}

\n
\n

\n {{ headline }}\n

\n
\n
    \n
  • \n {{ primaryPoint }}\n
  • \n
\n
\n
\n
\n

{{ calloutHeadline }}

\n
    \n
  • \n {{ callout }}\n
  • \n
\n
\n
\n
\n
\n \n
\n","
\n

\n {{ header }}\n

\n
\n \"{{ quote }}\"\n
\n
\n \n

{{ source }}

\n
\n
\n
\n","import { Component, OnDestroy, OnInit } from \"@angular/core\";\nimport { ActivatedRoute } from \"@angular/router\";\nimport { Subject, takeUntil } from \"rxjs\";\n\n@Component({\n selector: \"app-secrets-manager-content\",\n templateUrl: \"secrets-manager-content.component.html\",\n})\nexport class SecretsManagerContentComponent implements OnInit, OnDestroy {\n header: string;\n headline =\n \"A simpler, faster way to secure and automate secrets across code and infrastructure deployments\";\n primaryPoints: string[];\n calloutHeadline: string;\n callouts: string[];\n\n private paidPrimaryPoints = [\n \"Unlimited secrets, users, and projects\",\n \"Simple and transparent pricing\",\n \"Zero-knowledge, end-to-end encryption\",\n ];\n\n private paidCalloutHeadline = \"Limited time offer\";\n\n private paidCallouts = [\n \"Sign up today and receive a complimentary 12-month subscription to Bitwarden Password Manager\",\n \"Experience complete security across your organization\",\n \"Secure all your sensitive credentials, from user applications to machine secrets\",\n ];\n\n private freePrimaryPoints = [\n \"Unlimited secrets\",\n \"Simple and transparent pricing\",\n \"Zero-knowledge, end-to-end encryption\",\n ];\n\n private freeCalloutHeadline = \"Go beyond developer security!\";\n\n private freeCallouts = [\n \"Your Bitwarden account will also grant complimentary access to Bitwarden Password Manager\",\n \"Extend end-to-end encryption to your personal passwords, addresses, credit cards and notes\",\n ];\n\n private destroy$ = new Subject();\n\n constructor(private activatedRoute: ActivatedRoute) {}\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n ngOnInit(): void {\n this.activatedRoute.queryParams.pipe(takeUntil(this.destroy$)).subscribe((queryParameters) => {\n switch (queryParameters.org) {\n case \"enterprise\":\n this.header = \"Secrets Manager for Enterprise\";\n this.primaryPoints = this.paidPrimaryPoints;\n this.calloutHeadline = this.paidCalloutHeadline;\n this.callouts = this.paidCallouts;\n break;\n case \"free\":\n this.header = \"Bitwarden Secrets Manager\";\n this.primaryPoints = this.freePrimaryPoints;\n this.calloutHeadline = this.freeCalloutHeadline;\n this.callouts = this.freeCallouts;\n break;\n case \"teams\":\n case \"teamsStarter\":\n this.header = \"Secrets Manager for Teams\";\n this.primaryPoints = this.paidPrimaryPoints;\n this.calloutHeadline = this.paidCalloutHeadline;\n this.callouts = this.paidCallouts;\n break;\n }\n });\n }\n}\n","import { Component, OnInit, ViewChild } from \"@angular/core\";\nimport { UntypedFormBuilder, Validators } from \"@angular/forms\";\nimport { Router } from \"@angular/router\";\n\nimport { OrganizationBillingServiceAbstraction as OrganizationBillingService } from \"@bitwarden/common/billing/abstractions/organization-billing.service\";\nimport { PlanType } from \"@bitwarden/common/billing/enums\";\nimport { ReferenceEventRequest } from \"@bitwarden/common/models/request/reference-event.request\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\n\nimport { VerticalStepperComponent } from \"../../trial-initiation/vertical-stepper/vertical-stepper.component\";\n\n@Component({\n selector: \"app-secrets-manager-trial-free-stepper\",\n templateUrl: \"secrets-manager-trial-free-stepper.component.html\",\n})\nexport class SecretsManagerTrialFreeStepperComponent implements OnInit {\n @ViewChild(\"stepper\", { static: false }) verticalStepper: VerticalStepperComponent;\n\n formGroup = this.formBuilder.group({\n name: [\n \"\",\n {\n validators: [Validators.required, Validators.maxLength(50)],\n updateOn: \"change\",\n },\n ],\n email: [\n \"\",\n {\n validators: [Validators.email],\n },\n ],\n });\n\n subLabels = {\n createAccount:\n \"Before creating your free organization, you first need to log in or create a personal account.\",\n organizationInfo: \"Enter your organization information\",\n };\n\n organizationId: string;\n\n referenceEventRequest: ReferenceEventRequest;\n\n constructor(\n protected formBuilder: UntypedFormBuilder,\n protected i18nService: I18nService,\n protected organizationBillingService: OrganizationBillingService,\n private router: Router,\n ) {}\n\n ngOnInit(): void {\n this.referenceEventRequest = new ReferenceEventRequest();\n this.referenceEventRequest.initiationPath = \"Secrets Manager trial from marketing website\";\n }\n\n accountCreated(email: string): void {\n this.formGroup.get(\"email\")?.setValue(email);\n this.subLabels.createAccount = email;\n this.verticalStepper.next();\n }\n\n async createOrganization(): Promise {\n const response = await this.organizationBillingService.startFree({\n organization: {\n name: this.formGroup.get(\"name\").value,\n billingEmail: this.formGroup.get(\"email\").value,\n },\n plan: {\n type: PlanType.Free,\n subscribeToSecretsManager: true,\n isFromSecretsManagerTrial: true,\n },\n });\n\n this.organizationId = response.id;\n this.subLabels.organizationInfo = response.name;\n this.verticalStepper.next();\n }\n\n async navigateToMembers(): Promise {\n await this.router.navigate([\"organizations\", this.organizationId, \"members\"]);\n }\n\n async navigateToSecretsManager(): Promise {\n await this.router.navigate([\"sm\", this.organizationId]);\n }\n}\n","\n \n \n \n \n \n \n \n {{ \"next\" | i18n }}\n \n \n \n
\n

{{ \"smFreeTrialThankYou\" | i18n }}

\n
    \n
  • \n

    \n {{ \"smFreeTrialConfirmationEmail\" | i18n }}\n {{ formGroup.get(\"email\").value }}.\n

    \n
  • \n
\n
\n
\n \n \n {{ \"inviteUsers\" | i18n }}\n \n
\n
\n
\n","\n \n \n \n \n \n \n \n {{ \"next\" | i18n }}\n \n \n \n \n \n \n \n
\n \n \n {{ \"inviteUsers\" | i18n }}\n \n
\n
\n
\n","import { Component, Input, ViewChild } from \"@angular/core\";\n\nimport { ProductType } from \"@bitwarden/common/enums\";\n\nimport {\n OrganizationCreatedEvent,\n SubscriptionProduct,\n TrialOrganizationType,\n} from \"../../../billing/accounts/trial-initiation/trial-billing-step.component\";\nimport { VerticalStepperComponent } from \"../../trial-initiation/vertical-stepper/vertical-stepper.component\";\nimport { SecretsManagerTrialFreeStepperComponent } from \"../secrets-manager/secrets-manager-trial-free-stepper.component\";\n\n@Component({\n selector: \"app-secrets-manager-trial-paid-stepper\",\n templateUrl: \"secrets-manager-trial-paid-stepper.component.html\",\n})\nexport class SecretsManagerTrialPaidStepperComponent extends SecretsManagerTrialFreeStepperComponent {\n @ViewChild(\"stepper\", { static: false }) verticalStepper: VerticalStepperComponent;\n @Input() organizationTypeQueryParameter: string;\n\n billingSubLabel = this.i18nService.t(\"billingTrialSubLabel\");\n organizationId: string;\n\n organizationCreated(event: OrganizationCreatedEvent) {\n this.organizationId = event.organizationId;\n this.billingSubLabel = event.planDescription;\n this.verticalStepper.next();\n }\n\n steppedBack() {\n this.verticalStepper.previous();\n }\n\n get createAccountLabel() {\n const organizationType =\n this.productType === ProductType.TeamsStarter\n ? \"Teams Starter\"\n : ProductType[this.productType];\n return `Before creating your ${organizationType} organization, you first need to log in or create a personal account.`;\n }\n\n get productType(): TrialOrganizationType {\n switch (this.organizationTypeQueryParameter) {\n case \"enterprise\":\n return ProductType.Enterprise;\n case \"families\":\n return ProductType.Families;\n case \"teams\":\n return ProductType.Teams;\n case \"teamsStarter\":\n return ProductType.TeamsStarter;\n }\n }\n\n protected readonly SubscriptionProduct = SubscriptionProduct;\n}\n","\n\n
\n
\n
\n \n
\n \n
\n
\n
\n
\n
\n \n

\n {{\n \"startYour7DayFreeTrialOfBitwardenSecretsManagerFor\"\n | i18n: organizationTypeQueryParameter\n }}\n

\n \n
\n \n \n
\n
\n
\n \n
\n","import { Component, OnDestroy, OnInit } from \"@angular/core\";\nimport { ActivatedRoute } from \"@angular/router\";\nimport { Subject, takeUntil } from \"rxjs\";\n\n@Component({\n selector: \"app-secrets-manager-trial\",\n templateUrl: \"secrets-manager-trial.component.html\",\n})\nexport class SecretsManagerTrialComponent implements OnInit, OnDestroy {\n organizationTypeQueryParameter: string;\n\n private destroy$ = new Subject();\n\n constructor(private route: ActivatedRoute) {}\n\n ngOnInit(): void {\n this.route.queryParams.pipe(takeUntil(this.destroy$)).subscribe((queryParameters) => {\n this.organizationTypeQueryParameter = queryParameters.org;\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n get freeOrganization() {\n return this.organizationTypeQueryParameter === \"free\";\n }\n}\n","\n\n\n
\n

{{ \"createAccount\" | i18n }}

\n \n \n
\n \n
\n
\n
\n
\n \n\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
\n
\n \n \n
\n
\n
\n \n
\n

\n {{ freeTrialText }}\n

\n \n
\n \n \n \n \n \n \n \n {{ \"next\" | i18n }}\n \n \n \n \n \n \n \n \n
\n \n {{ \"getStarted\" | i18n | titlecase }}\n \n \n {{ \"inviteUsers\" | i18n }}\n \n
\n
\n
\n
\n
\n
\n \n \n
\n","import { StepperSelectionEvent } from \"@angular/cdk/stepper\";\nimport { TitleCasePipe } from \"@angular/common\";\nimport { Component, OnDestroy, OnInit, ViewChild } from \"@angular/core\";\nimport { UntypedFormBuilder, Validators } from \"@angular/forms\";\nimport { ActivatedRoute, Router } from \"@angular/router\";\nimport { Subject, takeUntil } from \"rxjs\";\n\nimport { PolicyApiServiceAbstraction } from \"@bitwarden/common/admin-console/abstractions/policy/policy-api.service.abstraction\";\nimport { PolicyService } from \"@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction\";\nimport { MasterPasswordPolicyOptions } from \"@bitwarden/common/admin-console/models/domain/master-password-policy-options\";\nimport { Policy } from \"@bitwarden/common/admin-console/models/domain/policy\";\nimport { PlanType } from \"@bitwarden/common/billing/enums\";\nimport { ProductType } from \"@bitwarden/common/enums\";\nimport { ReferenceEventRequest } from \"@bitwarden/common/models/request/reference-event.request\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\n\nimport {\n OrganizationCreatedEvent,\n SubscriptionProduct,\n TrialOrganizationType,\n} from \"../../billing/accounts/trial-initiation/trial-billing-step.component\";\n\nimport { RouterService } from \"./../../core/router.service\";\nimport { VerticalStepperComponent } from \"./vertical-stepper/vertical-stepper.component\";\n\nenum ValidOrgParams {\n families = \"families\",\n enterprise = \"enterprise\",\n teams = \"teams\",\n teamsStarter = \"teamsStarter\",\n individual = \"individual\",\n premium = \"premium\",\n free = \"free\",\n}\n\nenum ValidLayoutParams {\n default = \"default\",\n teams = \"teams\",\n teams1 = \"teams1\",\n teams2 = \"teams2\",\n teams3 = \"teams3\",\n enterprise = \"enterprise\",\n enterprise1 = \"enterprise1\",\n enterprise2 = \"enterprise2\",\n cnetcmpgnent = \"cnetcmpgnent\",\n cnetcmpgnind = \"cnetcmpgnind\",\n cnetcmpgnteams = \"cnetcmpgnteams\",\n abmenterprise = \"abmenterprise\",\n abmteams = \"abmteams\",\n secretsManager = \"secretsManager\",\n}\n\n@Component({\n selector: \"app-trial\",\n templateUrl: \"trial-initiation.component.html\",\n})\nexport class TrialInitiationComponent implements OnInit, OnDestroy {\n email = \"\";\n fromOrgInvite = false;\n org = \"\";\n orgInfoSubLabel = \"\";\n orgId = \"\";\n orgLabel = \"\";\n billingSubLabel = \"\";\n layout = \"default\";\n plan: PlanType;\n product: ProductType;\n accountCreateOnly = true;\n useTrialStepper = false;\n policies: Policy[];\n enforcedPolicyOptions: MasterPasswordPolicyOptions;\n trialFlowOrgs: string[] = [\n ValidOrgParams.teams,\n ValidOrgParams.teamsStarter,\n ValidOrgParams.enterprise,\n ValidOrgParams.families,\n ];\n routeFlowOrgs: string[] = [\n ValidOrgParams.free,\n ValidOrgParams.premium,\n ValidOrgParams.individual,\n ];\n layouts = ValidLayoutParams;\n referenceData: ReferenceEventRequest;\n @ViewChild(\"stepper\", { static: false }) verticalStepper: VerticalStepperComponent;\n\n orgInfoFormGroup = this.formBuilder.group({\n name: [\"\", { validators: [Validators.required, Validators.maxLength(50)], updateOn: \"change\" }],\n email: [\"\"],\n });\n\n private set referenceDataId(referenceId: string) {\n if (referenceId != null) {\n this.referenceData.id = referenceId;\n } else {\n this.referenceData.id = (\"; \" + document.cookie)\n .split(\"; reference=\")\n .pop()\n .split(\";\")\n .shift();\n }\n\n if (this.referenceData.id === \"\") {\n this.referenceData.id = null;\n } else {\n // Matches \"_ga_QBRN562QQQ=value1.value2.session\" and captures values and session.\n const regex = /_ga_QBRN562QQQ=([^.]+)\\.([^.]+)\\.(\\d+)/;\n const match = document.cookie.match(regex);\n if (match) {\n this.referenceData.session = match[3];\n }\n }\n }\n\n private destroy$ = new Subject();\n\n constructor(\n private route: ActivatedRoute,\n protected router: Router,\n private formBuilder: UntypedFormBuilder,\n private titleCasePipe: TitleCasePipe,\n private stateService: StateService,\n private logService: LogService,\n private policyApiService: PolicyApiServiceAbstraction,\n private policyService: PolicyService,\n private i18nService: I18nService,\n private routerService: RouterService,\n ) {}\n\n async ngOnInit(): Promise {\n this.route.queryParams.pipe(takeUntil(this.destroy$)).subscribe((qParams) => {\n this.referenceData = new ReferenceEventRequest();\n if (qParams.email != null && qParams.email.indexOf(\"@\") > -1) {\n this.email = qParams.email;\n this.fromOrgInvite = qParams.fromOrgInvite === \"true\";\n }\n\n this.referenceDataId = qParams.reference;\n\n if (Object.values(ValidLayoutParams).includes(qParams.layout)) {\n this.layout = qParams.layout;\n this.accountCreateOnly = false;\n }\n\n if (this.trialFlowOrgs.includes(qParams.org)) {\n this.org = qParams.org;\n this.orgLabel = this.titleCasePipe.transform(this.orgDisplayName);\n this.useTrialStepper = true;\n this.referenceData.flow = qParams.org;\n\n if (this.org === ValidOrgParams.families) {\n this.plan = PlanType.FamiliesAnnually;\n this.product = ProductType.Families;\n } else if (this.org === ValidOrgParams.teamsStarter) {\n this.plan = PlanType.TeamsStarter;\n this.product = ProductType.TeamsStarter;\n } else if (this.org === ValidOrgParams.teams) {\n this.plan = PlanType.TeamsAnnually;\n this.product = ProductType.Teams;\n } else if (this.org === ValidOrgParams.enterprise) {\n this.plan = PlanType.EnterpriseAnnually;\n this.product = ProductType.Enterprise;\n }\n } else if (this.routeFlowOrgs.includes(qParams.org)) {\n this.referenceData.flow = qParams.org;\n const route = this.router.createUrlTree([\"create-organization\"], {\n queryParams: { plan: qParams.org },\n });\n this.routerService.setPreviousUrl(route.toString());\n }\n\n // Are they coming from an email for sponsoring a families organization\n // After logging in redirect them to setup the families sponsorship\n this.setupFamilySponsorship(qParams.sponsorshipToken);\n\n this.referenceData.initiationPath = this.accountCreateOnly\n ? \"Registration form\"\n : \"Password Manager trial from marketing website\";\n });\n\n const invite = await this.stateService.getOrganizationInvitation();\n if (invite != null) {\n try {\n const policies = await this.policyApiService.getPoliciesByToken(\n invite.organizationId,\n invite.token,\n invite.email,\n invite.organizationUserId,\n );\n if (policies.data != null) {\n this.policies = Policy.fromListResponse(policies);\n }\n } catch (e) {\n this.logService.error(e);\n }\n }\n\n if (this.policies != null) {\n this.policyService\n .masterPasswordPolicyOptions$(this.policies)\n .pipe(takeUntil(this.destroy$))\n .subscribe((enforcedPasswordPolicyOptions) => {\n this.enforcedPolicyOptions = enforcedPasswordPolicyOptions;\n });\n }\n\n this.orgInfoFormGroup.controls.name.valueChanges\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => {\n this.orgInfoFormGroup.controls.name.markAsTouched();\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n stepSelectionChange(event: StepperSelectionEvent) {\n // Set org info sub label\n if (event.selectedIndex === 1 && this.orgInfoFormGroup.controls.name.value === \"\") {\n this.orgInfoSubLabel =\n \"Enter your \" +\n this.titleCasePipe.transform(this.orgDisplayName) +\n \" organization information\";\n } else if (event.previouslySelectedIndex === 1) {\n this.orgInfoSubLabel = this.orgInfoFormGroup.controls.name.value;\n }\n\n //set billing sub label\n if (event.selectedIndex === 2) {\n this.billingSubLabel = this.i18nService.t(\"billingTrialSubLabel\");\n }\n }\n\n createdAccount(email: string) {\n this.email = email;\n this.orgInfoFormGroup.get(\"email\")?.setValue(email);\n this.verticalStepper.next();\n }\n\n billingSuccess(event: any) {\n this.orgId = event?.orgId;\n this.billingSubLabel = event?.subLabelText;\n this.verticalStepper.next();\n }\n\n createdOrganization(event: OrganizationCreatedEvent) {\n this.orgId = event.organizationId;\n this.billingSubLabel = event.planDescription;\n this.verticalStepper.next();\n }\n\n navigateToOrgVault() {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"organizations\", this.orgId, \"vault\"]);\n }\n\n navigateToOrgInvite() {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"organizations\", this.orgId, \"members\"]);\n }\n\n previousStep() {\n this.verticalStepper.previous();\n }\n\n get orgDisplayName() {\n if (this.org === \"teamsStarter\") {\n return \"Teams Starter\";\n }\n\n return this.org;\n }\n\n get freeTrialText() {\n const translationKey =\n this.layout === this.layouts.secretsManager\n ? \"startYour7DayFreeTrialOfBitwardenSecretsManagerFor\"\n : \"startYour7DayFreeTrialOfBitwardenFor\";\n\n return this.i18nService.t(translationKey, this.org);\n }\n\n get trialOrganizationType(): TrialOrganizationType {\n switch (this.product) {\n case ProductType.Free:\n return null;\n default:\n return this.product;\n }\n }\n\n private setupFamilySponsorship(sponsorshipToken: string) {\n if (sponsorshipToken != null) {\n const route = this.router.createUrlTree([\"setup/families-for-enterprise\"], {\n queryParams: { plan: sponsorshipToken },\n });\n this.routerService.setPreviousUrl(route.toString());\n }\n }\n\n protected readonly SubscriptionProduct = SubscriptionProduct;\n}\n","import { I18nService } from \"../platform/abstractions/i18n.service\";\nimport { PlatformUtilsService } from \"../platform/abstractions/platform-utils.service\";\n\nexport class WebAuthnIFrame {\n private iframe: HTMLIFrameElement = null;\n private connectorLink: HTMLAnchorElement;\n private parseFunction = this.parseMessage.bind(this);\n\n constructor(\n private win: Window,\n private webVaultUrl: string,\n private webAuthnNewTab: boolean,\n private platformUtilsService: PlatformUtilsService,\n private i18nService: I18nService,\n private successCallback: Function, // eslint-disable-line\n private errorCallback: Function, // eslint-disable-line\n private infoCallback: Function, // eslint-disable-line\n ) {\n this.connectorLink = win.document.createElement(\"a\");\n }\n\n init(data: any): void {\n const params = new URLSearchParams({\n data: this.base64Encode(JSON.stringify(data)),\n parent: encodeURIComponent(this.win.document.location.href),\n btnText: encodeURIComponent(this.i18nService.t(\"webAuthnAuthenticate\")),\n v: \"1\",\n });\n\n if (this.webAuthnNewTab) {\n // Firefox fallback which opens the webauthn page in a new tab\n params.append(\"locale\", this.i18nService.translationLocale);\n this.platformUtilsService.launchUri(\n `${this.webVaultUrl}/webauthn-fallback-connector.html?${params}`,\n );\n } else {\n this.connectorLink.href = `${this.webVaultUrl}/webauthn-connector.html?${params}`;\n this.iframe = this.win.document.getElementById(\"webauthn_iframe\") as HTMLIFrameElement;\n this.iframe.allow = \"publickey-credentials-get \" + new URL(this.webVaultUrl).origin;\n this.iframe.src = this.connectorLink.href;\n\n this.win.addEventListener(\"message\", this.parseFunction, false);\n }\n }\n\n stop() {\n this.sendMessage(\"stop\");\n }\n\n start() {\n this.sendMessage(\"start\");\n }\n\n sendMessage(message: any) {\n if (!this.iframe || !this.iframe.src || !this.iframe.contentWindow) {\n return;\n }\n\n this.iframe.contentWindow.postMessage(message, this.iframe.src);\n }\n\n base64Encode(str: string): string {\n return btoa(\n encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, (match, p1) => {\n return String.fromCharCode((\"0x\" + p1) as any);\n }),\n );\n }\n\n cleanup() {\n this.win.removeEventListener(\"message\", this.parseFunction, false);\n }\n\n private parseMessage(event: MessageEvent) {\n if (!this.validMessage(event)) {\n return;\n }\n\n const parts: string[] = event.data.split(\"|\");\n if (parts[0] === \"success\" && this.successCallback) {\n this.successCallback(parts[1]);\n } else if (parts[0] === \"error\" && this.errorCallback) {\n this.errorCallback(parts[1]);\n } else if (parts[0] === \"info\" && this.infoCallback) {\n this.infoCallback(parts[1]);\n }\n }\n\n private validMessage(event: MessageEvent) {\n if (\n event.origin == null ||\n event.origin === \"\" ||\n event.origin !== (this.connectorLink as any).origin ||\n event.data == null ||\n typeof event.data !== \"string\"\n ) {\n return false;\n }\n\n return (\n event.data.indexOf(\"success|\") === 0 ||\n event.data.indexOf(\"error|\") === 0 ||\n event.data.indexOf(\"info|\") === 0\n );\n }\n}\n","import { Directive, Inject, OnDestroy, OnInit } from \"@angular/core\";\nimport { ActivatedRoute, NavigationExtras, Router } from \"@angular/router\";\nimport * as DuoWebSDK from \"duo_web_sdk\";\nimport { firstValueFrom } from \"rxjs\";\nimport { first } from \"rxjs/operators\";\n\n// eslint-disable-next-line no-restricted-imports\nimport { WINDOW } from \"@bitwarden/angular/services/injection-tokens\";\nimport {\n LoginStrategyServiceAbstraction,\n TrustedDeviceUserDecryptionOption,\n UserDecryptionOptions,\n UserDecryptionOptionsServiceAbstraction,\n} from \"@bitwarden/auth/common\";\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { LoginService } from \"@bitwarden/common/auth/abstractions/login.service\";\nimport { SsoLoginServiceAbstraction } from \"@bitwarden/common/auth/abstractions/sso-login.service.abstraction\";\nimport { TwoFactorService } from \"@bitwarden/common/auth/abstractions/two-factor.service\";\nimport { AuthenticationType } from \"@bitwarden/common/auth/enums/authentication-type\";\nimport { TwoFactorProviderType } from \"@bitwarden/common/auth/enums/two-factor-provider-type\";\nimport { AuthResult } from \"@bitwarden/common/auth/models/domain/auth-result\";\nimport { ForceSetPasswordReason } from \"@bitwarden/common/auth/models/domain/force-set-password-reason\";\nimport { TokenTwoFactorRequest } from \"@bitwarden/common/auth/models/request/identity-token/token-two-factor.request\";\nimport { TwoFactorEmailRequest } from \"@bitwarden/common/auth/models/request/two-factor-email.request\";\nimport { TwoFactorProviders } from \"@bitwarden/common/auth/services/two-factor.service\";\nimport { WebAuthnIFrame } from \"@bitwarden/common/auth/webauthn-iframe\";\nimport { AppIdService } from \"@bitwarden/common/platform/abstractions/app-id.service\";\nimport { ConfigServiceAbstraction } from \"@bitwarden/common/platform/abstractions/config/config.service.abstraction\";\nimport { EnvironmentService } from \"@bitwarden/common/platform/abstractions/environment.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\n\nimport { CaptchaProtectedComponent } from \"./captcha-protected.component\";\n\n@Directive()\nexport class TwoFactorComponent extends CaptchaProtectedComponent implements OnInit, OnDestroy {\n token = \"\";\n remember = false;\n webAuthnReady = false;\n webAuthnNewTab = false;\n providers = TwoFactorProviders;\n providerType = TwoFactorProviderType;\n selectedProviderType: TwoFactorProviderType = TwoFactorProviderType.Authenticator;\n webAuthnSupported = false;\n webAuthn: WebAuthnIFrame = null;\n title = \"\";\n twoFactorEmail: string = null;\n formPromise: Promise;\n emailPromise: Promise;\n orgIdentifier: string = null;\n\n duoFrameless = false;\n duoFramelessUrl: string = null;\n duoResultListenerInitialized = false;\n\n onSuccessfulLogin: () => Promise;\n onSuccessfulLoginNavigate: () => Promise;\n\n onSuccessfulLoginTde: () => Promise;\n onSuccessfulLoginTdeNavigate: () => Promise;\n\n protected loginRoute = \"login\";\n\n protected trustedDeviceEncRoute = \"login-initiated\";\n protected changePasswordRoute = \"set-password\";\n protected forcePasswordResetRoute = \"update-temp-password\";\n protected successRoute = \"vault\";\n\n get isDuoProvider(): boolean {\n return (\n this.selectedProviderType === TwoFactorProviderType.Duo ||\n this.selectedProviderType === TwoFactorProviderType.OrganizationDuo\n );\n }\n\n constructor(\n protected loginStrategyService: LoginStrategyServiceAbstraction,\n protected router: Router,\n protected i18nService: I18nService,\n protected apiService: ApiService,\n protected platformUtilsService: PlatformUtilsService,\n @Inject(WINDOW) protected win: Window,\n protected environmentService: EnvironmentService,\n protected stateService: StateService,\n protected route: ActivatedRoute,\n protected logService: LogService,\n protected twoFactorService: TwoFactorService,\n protected appIdService: AppIdService,\n protected loginService: LoginService,\n protected userDecryptionOptionsService: UserDecryptionOptionsServiceAbstraction,\n protected ssoLoginService: SsoLoginServiceAbstraction,\n protected configService: ConfigServiceAbstraction,\n ) {\n super(environmentService, i18nService, platformUtilsService);\n this.webAuthnSupported = this.platformUtilsService.supportsWebAuthn(win);\n }\n\n async ngOnInit() {\n if (!(await this.authing()) || this.twoFactorService.getProviders() == null) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([this.loginRoute]);\n return;\n }\n\n this.route.queryParams.pipe(first()).subscribe((qParams) => {\n if (qParams.identifier != null) {\n this.orgIdentifier = qParams.identifier;\n }\n });\n\n if (await this.needsLock()) {\n this.successRoute = \"lock\";\n }\n\n if (this.win != null && this.webAuthnSupported) {\n const env = await firstValueFrom(this.environmentService.environment$);\n const webVaultUrl = env.getWebVaultUrl();\n this.webAuthn = new WebAuthnIFrame(\n this.win,\n webVaultUrl,\n this.webAuthnNewTab,\n this.platformUtilsService,\n this.i18nService,\n (token: string) => {\n this.token = token;\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.submit();\n },\n (error: string) => {\n this.platformUtilsService.showToast(\"error\", this.i18nService.t(\"errorOccurred\"), error);\n },\n (info: string) => {\n if (info === \"ready\") {\n this.webAuthnReady = true;\n }\n },\n );\n }\n\n this.selectedProviderType = this.twoFactorService.getDefaultProvider(this.webAuthnSupported);\n await this.init();\n }\n\n ngOnDestroy(): void {\n this.cleanupWebAuthn();\n this.webAuthn = null;\n }\n\n async init() {\n if (this.selectedProviderType == null) {\n this.title = this.i18nService.t(\"loginUnavailable\");\n return;\n }\n\n this.cleanupWebAuthn();\n this.title = (TwoFactorProviders as any)[this.selectedProviderType].name;\n const providerData = this.twoFactorService.getProviders().get(this.selectedProviderType);\n switch (this.selectedProviderType) {\n case TwoFactorProviderType.WebAuthn:\n if (!this.webAuthnNewTab) {\n setTimeout(() => {\n this.authWebAuthn();\n }, 500);\n }\n break;\n case TwoFactorProviderType.Duo:\n case TwoFactorProviderType.OrganizationDuo:\n // 2 Duo 2FA flows available\n // 1. Duo Web SDK (iframe) - existing, to be deprecated\n // 2. Duo Frameless (new tab) - new\n\n // AuthUrl only exists for new Duo Frameless flow\n if (providerData.AuthUrl) {\n this.duoFrameless = true;\n // Setup listener for duo-redirect.ts connector to send back the code\n\n if (!this.duoResultListenerInitialized) {\n // setup client specific duo result listener\n this.setupDuoResultListener();\n this.duoResultListenerInitialized = true;\n }\n\n // flow must be launched by user so they can choose to remember the device or not.\n this.duoFramelessUrl = providerData.AuthUrl;\n } else {\n // Duo Web SDK (iframe) flow\n // TODO: remove when we remove the \"duo-redirect\" feature flag\n setTimeout(() => {\n DuoWebSDK.init({\n iframe: undefined,\n host: providerData.Host,\n sig_request: providerData.Signature,\n submit_callback: async (f: HTMLFormElement) => {\n const sig = f.querySelector('input[name=\"sig_response\"]') as HTMLInputElement;\n if (sig != null) {\n this.token = sig.value;\n await this.submit();\n }\n },\n });\n }, 0);\n }\n\n break;\n case TwoFactorProviderType.Email:\n this.twoFactorEmail = providerData.Email;\n if (this.twoFactorService.getProviders().size > 1) {\n await this.sendEmail(false);\n }\n break;\n default:\n break;\n }\n }\n\n async submit() {\n await this.setupCaptcha();\n\n if (this.token == null || this.token === \"\") {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"verificationCodeRequired\"),\n );\n return;\n }\n\n if (this.selectedProviderType === TwoFactorProviderType.WebAuthn) {\n if (this.webAuthn != null) {\n this.webAuthn.stop();\n } else {\n return;\n }\n } else if (\n this.selectedProviderType === TwoFactorProviderType.Email ||\n this.selectedProviderType === TwoFactorProviderType.Authenticator\n ) {\n this.token = this.token.replace(\" \", \"\").trim();\n }\n\n try {\n await this.doSubmit();\n } catch {\n if (this.selectedProviderType === TwoFactorProviderType.WebAuthn && this.webAuthn != null) {\n this.webAuthn.start();\n }\n }\n }\n\n async doSubmit() {\n this.formPromise = this.loginStrategyService.logInTwoFactor(\n new TokenTwoFactorRequest(this.selectedProviderType, this.token, this.remember),\n this.captchaToken,\n );\n const authResult: AuthResult = await this.formPromise;\n\n await this.handleLoginResponse(authResult);\n }\n\n protected handleMigrateEncryptionKey(result: AuthResult): boolean {\n if (!result.requiresEncryptionKeyMigration) {\n return false;\n }\n\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccured\"),\n this.i18nService.t(\"encryptionKeyMigrationRequired\"),\n );\n return true;\n }\n\n // Each client will have own implementation\n protected setupDuoResultListener(): void {}\n\n private async handleLoginResponse(authResult: AuthResult) {\n if (this.handleCaptchaRequired(authResult)) {\n return;\n } else if (this.handleMigrateEncryptionKey(authResult)) {\n return;\n }\n\n // Save off the OrgSsoIdentifier for use in the TDE flows\n // - TDE login decryption options component\n // - Browser SSO on extension open\n await this.ssoLoginService.setActiveUserOrganizationSsoIdentifier(this.orgIdentifier);\n this.loginService.clearValues();\n\n // note: this flow affects both TDE & standard users\n if (this.isForcePasswordResetRequired(authResult)) {\n return await this.handleForcePasswordReset(this.orgIdentifier);\n }\n\n const userDecryptionOpts = await firstValueFrom(\n this.userDecryptionOptionsService.userDecryptionOptions$,\n );\n\n const tdeEnabled = await this.isTrustedDeviceEncEnabled(userDecryptionOpts.trustedDeviceOption);\n\n if (tdeEnabled) {\n return await this.handleTrustedDeviceEncryptionEnabled(\n authResult,\n this.orgIdentifier,\n userDecryptionOpts,\n );\n }\n\n // User must set password if they don't have one and they aren't using either TDE or key connector.\n const requireSetPassword =\n !userDecryptionOpts.hasMasterPassword && userDecryptionOpts.keyConnectorOption === undefined;\n\n if (requireSetPassword || authResult.resetMasterPassword) {\n // Change implies going no password -> password in this case\n return await this.handleChangePasswordRequired(this.orgIdentifier);\n }\n\n return await this.handleSuccessfulLogin();\n }\n\n private async isTrustedDeviceEncEnabled(\n trustedDeviceOption: TrustedDeviceUserDecryptionOption,\n ): Promise {\n const ssoTo2faFlowActive = this.route.snapshot.queryParamMap.get(\"sso\") === \"true\";\n\n return ssoTo2faFlowActive && trustedDeviceOption !== undefined;\n }\n\n private async handleTrustedDeviceEncryptionEnabled(\n authResult: AuthResult,\n orgIdentifier: string,\n userDecryptionOpts: UserDecryptionOptions,\n ): Promise {\n // If user doesn't have a MP, but has reset password permission, they must set a MP\n if (\n !userDecryptionOpts.hasMasterPassword &&\n userDecryptionOpts.trustedDeviceOption.hasManageResetPasswordPermission\n ) {\n // Set flag so that auth guard can redirect to set password screen after decryption (trusted or untrusted device)\n // Note: we cannot directly navigate to the set password screen in this scenario as we are in a pre-decryption state, and\n // if you try to set a new MP before decrypting, you will invalidate the user's data by making a new user key.\n await this.stateService.setForceSetPasswordReason(\n ForceSetPasswordReason.TdeUserWithoutPasswordHasPasswordResetPermission,\n );\n }\n\n if (this.onSuccessfulLoginTde != null) {\n // Note: awaiting this will currently cause a hang on desktop & browser as they will wait for a full sync to complete\n // before navigating to the success route.\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.onSuccessfulLoginTde();\n }\n\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.navigateViaCallbackOrRoute(\n this.onSuccessfulLoginTdeNavigate,\n // Navigate to TDE page (if user was on trusted device and TDE has decrypted\n // their user key, the login-initiated guard will redirect them to the vault)\n [this.trustedDeviceEncRoute],\n );\n }\n\n private async handleChangePasswordRequired(orgIdentifier: string) {\n await this.router.navigate([this.changePasswordRoute], {\n queryParams: {\n identifier: orgIdentifier,\n },\n });\n }\n\n /**\n * Determines if a user needs to reset their password based on certain conditions.\n * Users can be forced to reset their password via an admin or org policy disallowing weak passwords.\n * Note: this is different from the SSO component login flow as a user can\n * login with MP and then have to pass 2FA to finish login and we can actually\n * evaluate if they have a weak password at that time.\n *\n * @param {AuthResult} authResult - The authentication result.\n * @returns {boolean} Returns true if a password reset is required, false otherwise.\n */\n private isForcePasswordResetRequired(authResult: AuthResult): boolean {\n const forceResetReasons = [\n ForceSetPasswordReason.AdminForcePasswordReset,\n ForceSetPasswordReason.WeakMasterPassword,\n ];\n\n return forceResetReasons.includes(authResult.forcePasswordReset);\n }\n\n private async handleForcePasswordReset(orgIdentifier: string) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([this.forcePasswordResetRoute], {\n queryParams: {\n identifier: orgIdentifier,\n },\n });\n }\n\n private async handleSuccessfulLogin() {\n if (this.onSuccessfulLogin != null) {\n // Note: awaiting this will currently cause a hang on desktop & browser as they will wait for a full sync to complete\n // before navigating to the success route.\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.onSuccessfulLogin();\n }\n await this.navigateViaCallbackOrRoute(this.onSuccessfulLoginNavigate, [this.successRoute]);\n }\n\n private async navigateViaCallbackOrRoute(\n callback: () => Promise,\n commands: unknown[],\n extras?: NavigationExtras,\n ): Promise {\n if (callback) {\n await callback();\n } else {\n await this.router.navigate(commands, extras);\n }\n }\n\n async sendEmail(doToast: boolean) {\n if (this.selectedProviderType !== TwoFactorProviderType.Email) {\n return;\n }\n\n if (this.emailPromise != null) {\n return;\n }\n\n if ((await this.loginStrategyService.getEmail()) == null) {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"sessionTimeout\"),\n );\n return;\n }\n\n try {\n const request = new TwoFactorEmailRequest();\n request.email = await this.loginStrategyService.getEmail();\n request.masterPasswordHash = await this.loginStrategyService.getMasterPasswordHash();\n request.ssoEmail2FaSessionToken =\n await this.loginStrategyService.getSsoEmail2FaSessionToken();\n request.deviceIdentifier = await this.appIdService.getAppId();\n request.authRequestAccessCode = await this.loginStrategyService.getAccessCode();\n request.authRequestId = await this.loginStrategyService.getAuthRequestId();\n this.emailPromise = this.apiService.postTwoFactorEmail(request);\n await this.emailPromise;\n if (doToast) {\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"verificationCodeEmailSent\", this.twoFactorEmail),\n );\n }\n } catch (e) {\n this.logService.error(e);\n }\n\n this.emailPromise = null;\n }\n\n authWebAuthn() {\n const providerData = this.twoFactorService.getProviders().get(this.selectedProviderType);\n\n if (!this.webAuthnSupported || this.webAuthn == null) {\n return;\n }\n\n this.webAuthn.init(providerData);\n }\n\n private cleanupWebAuthn() {\n if (this.webAuthn != null) {\n this.webAuthn.stop();\n this.webAuthn.cleanup();\n }\n }\n\n private async authing(): Promise {\n return (await firstValueFrom(this.loginStrategyService.currentAuthType$)) !== null;\n }\n\n private async needsLock(): Promise {\n const authType = await firstValueFrom(this.loginStrategyService.currentAuthType$);\n return authType == AuthenticationType.Sso || authType == AuthenticationType.UserApiKey;\n }\n\n // implemented in clients\n async launchDuoFrameless() {}\n}\n","import { Directive, EventEmitter, OnInit, Output } from \"@angular/core\";\nimport { Router } from \"@angular/router\";\nimport { firstValueFrom } from \"rxjs\";\n\nimport { TwoFactorService } from \"@bitwarden/common/auth/abstractions/two-factor.service\";\nimport { TwoFactorProviderType } from \"@bitwarden/common/auth/enums/two-factor-provider-type\";\nimport { EnvironmentService } from \"@bitwarden/common/platform/abstractions/environment.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\n\n@Directive()\nexport class TwoFactorOptionsComponent implements OnInit {\n @Output() onProviderSelected = new EventEmitter();\n @Output() onRecoverSelected = new EventEmitter();\n\n providers: any[] = [];\n\n constructor(\n protected twoFactorService: TwoFactorService,\n protected router: Router,\n protected i18nService: I18nService,\n protected platformUtilsService: PlatformUtilsService,\n protected win: Window,\n protected environmentService: EnvironmentService,\n ) {}\n\n ngOnInit() {\n this.providers = this.twoFactorService.getSupportedProviders(this.win);\n }\n\n choose(p: any) {\n this.onProviderSelected.emit(p.type);\n }\n\n async recover() {\n const env = await firstValueFrom(this.environmentService.environment$);\n const webVault = env.getWebVaultUrl();\n this.platformUtilsService.launchUri(webVault + \"/#/recover-2fa\");\n this.onRecoverSelected.emit();\n }\n}\n","
\n
\n
\n
\n

{{ \"twoStepOptions\" | i18n }}

\n \n ×\n \n
\n
\n
\n
\n
\n
\n \n
\n
\n

{{ p.name }}

\n {{ p.description }}\n
\n
\n \n {{ \"select\" | i18n }}\n \n
\n
\n
\n
\n
\n
\n \"rc\n
\n
\n

{{ \"recoveryCodeTitle\" | i18n }}

\n {{ \"recoveryCodeDesc\" | i18n }}\n
\n
\n \n {{ \"select\" | i18n }}\n \n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n","import { Component } from \"@angular/core\";\nimport { Router } from \"@angular/router\";\n\nimport { TwoFactorOptionsComponent as BaseTwoFactorOptionsComponent } from \"@bitwarden/angular/auth/components/two-factor-options.component\";\nimport { TwoFactorService } from \"@bitwarden/common/auth/abstractions/two-factor.service\";\nimport { EnvironmentService } from \"@bitwarden/common/platform/abstractions/environment.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\n\n@Component({\n selector: \"app-two-factor-options\",\n templateUrl: \"two-factor-options.component.html\",\n})\nexport class TwoFactorOptionsComponent extends BaseTwoFactorOptionsComponent {\n constructor(\n twoFactorService: TwoFactorService,\n router: Router,\n i18nService: I18nService,\n platformUtilsService: PlatformUtilsService,\n environmentService: EnvironmentService,\n ) {\n super(twoFactorService, router, i18nService, platformUtilsService, window, environmentService);\n }\n}\n","\n
\n \n

{{ title }}

\n
\n
\n \n

\n {{ \"enterVerificationCodeApp\" | i18n }}\n

\n

\n {{ \"enterVerificationCodeEmail\" | i18n: twoFactorEmail }}\n

\n
\n \n \n

{{ \"insertYubiKey\" | i18n }}

\n \n \n \n \"\"\n \n
\n \n \n
\n
\n \n
\n \n
\n
\n \n \n \n

\n {{ \"duoRequiredByOrgForAccount\" | i18n }}\n

\n

{{ \"launchDuoAndFollowStepsToFinishLoggingIn\" | i18n }}

\n
\n\n \n
\n \n
\n
\n
\n \n
\n \n \n
\n \n

{{ \"noTwoStepProviders\" | i18n }}

\n

{{ \"noTwoStepProviders2\" | i18n }}

\n
\n
\n
\n \n
\n \n
\n \n \n {{ \"continue\" | i18n }}\n \n \n \n \n {{ \"launchDuo\" | i18n }} \n \n \n {{ \"cancel\" | i18n }}\n \n
\n \n
\n
\n
\n \n\n\n","import { Component, Inject, OnDestroy, ViewChild, ViewContainerRef } from \"@angular/core\";\nimport { ActivatedRoute, Router } from \"@angular/router\";\n\nimport { TwoFactorComponent as BaseTwoFactorComponent } from \"@bitwarden/angular/auth/components/two-factor.component\";\nimport { WINDOW } from \"@bitwarden/angular/services/injection-tokens\";\nimport { ModalService } from \"@bitwarden/angular/services/modal.service\";\nimport {\n LoginStrategyServiceAbstraction,\n UserDecryptionOptionsServiceAbstraction,\n} from \"@bitwarden/auth/common\";\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { LoginService } from \"@bitwarden/common/auth/abstractions/login.service\";\nimport { SsoLoginServiceAbstraction } from \"@bitwarden/common/auth/abstractions/sso-login.service.abstraction\";\nimport { TwoFactorService } from \"@bitwarden/common/auth/abstractions/two-factor.service\";\nimport { TwoFactorProviderType } from \"@bitwarden/common/auth/enums/two-factor-provider-type\";\nimport { AuthResult } from \"@bitwarden/common/auth/models/domain/auth-result\";\nimport { AppIdService } from \"@bitwarden/common/platform/abstractions/app-id.service\";\nimport { ConfigServiceAbstraction } from \"@bitwarden/common/platform/abstractions/config/config.service.abstraction\";\nimport { EnvironmentService } from \"@bitwarden/common/platform/abstractions/environment.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\n\nimport { TwoFactorOptionsComponent } from \"./two-factor-options.component\";\n\n@Component({\n selector: \"app-two-factor\",\n templateUrl: \"two-factor.component.html\",\n})\n// eslint-disable-next-line rxjs-angular/prefer-takeuntil\nexport class TwoFactorComponent extends BaseTwoFactorComponent implements OnDestroy {\n @ViewChild(\"twoFactorOptions\", { read: ViewContainerRef, static: true })\n twoFactorOptionsModal: ViewContainerRef;\n\n constructor(\n loginStrategyService: LoginStrategyServiceAbstraction,\n router: Router,\n i18nService: I18nService,\n apiService: ApiService,\n platformUtilsService: PlatformUtilsService,\n stateService: StateService,\n environmentService: EnvironmentService,\n private modalService: ModalService,\n route: ActivatedRoute,\n logService: LogService,\n twoFactorService: TwoFactorService,\n appIdService: AppIdService,\n loginService: LoginService,\n userDecryptionOptionsService: UserDecryptionOptionsServiceAbstraction,\n ssoLoginService: SsoLoginServiceAbstraction,\n configService: ConfigServiceAbstraction,\n @Inject(WINDOW) protected win: Window,\n ) {\n super(\n loginStrategyService,\n router,\n i18nService,\n apiService,\n platformUtilsService,\n win,\n environmentService,\n stateService,\n route,\n logService,\n twoFactorService,\n appIdService,\n loginService,\n userDecryptionOptionsService,\n ssoLoginService,\n configService,\n );\n this.onSuccessfulLoginNavigate = this.goAfterLogIn;\n }\n\n async anotherMethod() {\n const [modal] = await this.modalService.openViewRef(\n TwoFactorOptionsComponent,\n this.twoFactorOptionsModal,\n (comp) => {\n // eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe\n comp.onProviderSelected.subscribe(async (provider: TwoFactorProviderType) => {\n modal.close();\n this.selectedProviderType = provider;\n await this.init();\n });\n // eslint-disable-next-line rxjs-angular/prefer-takeuntil\n comp.onRecoverSelected.subscribe(() => {\n modal.close();\n });\n },\n );\n }\n\n protected override handleMigrateEncryptionKey(result: AuthResult): boolean {\n if (!result.requiresEncryptionKeyMigration) {\n return false;\n }\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"migrate-legacy-encryption\"]);\n return true;\n }\n\n goAfterLogIn = async () => {\n this.loginService.clearValues();\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([this.successRoute], {\n queryParams: {\n identifier: this.orgIdentifier,\n },\n });\n };\n\n private duoResultChannel: BroadcastChannel;\n\n protected override setupDuoResultListener() {\n if (!this.duoResultChannel) {\n this.duoResultChannel = new BroadcastChannel(\"duoResult\");\n this.duoResultChannel.addEventListener(\"message\", this.handleDuoResultMessage);\n }\n }\n\n private handleDuoResultMessage = async (msg: { data: { code: string; state: string } }) => {\n this.token = msg.data.code + \"|\" + msg.data.state;\n await this.submit();\n };\n\n override async launchDuoFrameless() {\n const duoHandOffMessage = {\n title: this.i18nService.t(\"youSuccessfullyLoggedIn\"),\n message: this.i18nService.t(\"thisWindowWillCloseIn5Seconds\"),\n buttonText: this.i18nService.t(\"close\"),\n isCountdown: true,\n };\n document.cookie = `duoHandOffMessage=${JSON.stringify(duoHandOffMessage)}; SameSite=strict;`;\n this.platformUtilsService.launchUri(this.duoFramelessUrl);\n }\n\n async ngOnDestroy() {\n super.ngOnDestroy();\n\n if (this.duoResultChannel) {\n // clean up duo listener if it was initialized.\n this.duoResultChannel.removeEventListener(\"message\", this.handleDuoResultMessage);\n this.duoResultChannel.close();\n }\n }\n}\n","import { Directive } from \"@angular/core\";\nimport { Router } from \"@angular/router\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { PolicyService } from \"@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction\";\nimport { MasterPasswordPolicyOptions } from \"@bitwarden/common/admin-console/models/domain/master-password-policy-options\";\nimport { UserVerificationService } from \"@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction\";\nimport { VerificationType } from \"@bitwarden/common/auth/enums/verification-type\";\nimport { PasswordRequest } from \"@bitwarden/common/auth/models/request/password.request\";\nimport { Verification } from \"@bitwarden/common/auth/types/verification\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { EncString } from \"@bitwarden/common/platform/models/domain/enc-string\";\nimport { PasswordGenerationServiceAbstraction } from \"@bitwarden/common/tools/generator/password\";\nimport { MasterKey, UserKey } from \"@bitwarden/common/types/key\";\nimport { DialogService } from \"@bitwarden/components\";\n\nimport { ChangePasswordComponent as BaseChangePasswordComponent } from \"./change-password.component\";\n\n@Directive()\nexport class UpdatePasswordComponent extends BaseChangePasswordComponent {\n hint: string;\n key: string;\n enforcedPolicyOptions: MasterPasswordPolicyOptions;\n showPassword = false;\n currentMasterPassword: string;\n\n onSuccessfulChangePassword: () => Promise;\n\n constructor(\n protected router: Router,\n i18nService: I18nService,\n platformUtilsService: PlatformUtilsService,\n passwordGenerationService: PasswordGenerationServiceAbstraction,\n policyService: PolicyService,\n cryptoService: CryptoService,\n messagingService: MessagingService,\n private apiService: ApiService,\n stateService: StateService,\n private userVerificationService: UserVerificationService,\n private logService: LogService,\n dialogService: DialogService,\n ) {\n super(\n i18nService,\n cryptoService,\n messagingService,\n passwordGenerationService,\n platformUtilsService,\n policyService,\n stateService,\n dialogService,\n );\n }\n\n togglePassword(confirmField: boolean) {\n this.showPassword = !this.showPassword;\n document.getElementById(confirmField ? \"masterPasswordRetype\" : \"masterPassword\").focus();\n }\n\n async cancel() {\n await this.stateService.setOrganizationInvitation(null);\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/vault\"]);\n }\n\n async setupSubmitActions(): Promise {\n if (this.currentMasterPassword == null || this.currentMasterPassword === \"\") {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"masterPasswordRequired\"),\n );\n return false;\n }\n\n const secret: Verification = {\n type: VerificationType.MasterPassword,\n secret: this.currentMasterPassword,\n };\n try {\n await this.userVerificationService.verifyUser(secret);\n } catch (e) {\n this.platformUtilsService.showToast(\"error\", this.i18nService.t(\"errorOccurred\"), e.message);\n return false;\n }\n\n this.kdf = await this.stateService.getKdfType();\n this.kdfConfig = await this.stateService.getKdfConfig();\n return true;\n }\n\n async performSubmitActions(\n newMasterKeyHash: string,\n newMasterKey: MasterKey,\n newUserKey: [UserKey, EncString],\n ) {\n try {\n // Create Request\n const request = new PasswordRequest();\n request.masterPasswordHash = await this.cryptoService.hashMasterKey(\n this.currentMasterPassword,\n await this.cryptoService.getOrDeriveMasterKey(this.currentMasterPassword),\n );\n request.newMasterPasswordHash = newMasterKeyHash;\n request.key = newUserKey[1].encryptedString;\n\n // Update user's password\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.apiService.postPassword(request);\n\n this.platformUtilsService.showToast(\n \"success\",\n this.i18nService.t(\"masterPasswordChanged\"),\n this.i18nService.t(\"logBackIn\"),\n );\n\n if (this.onSuccessfulChangePassword != null) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.onSuccessfulChangePassword();\n } else {\n this.messagingService.send(\"logout\");\n }\n } catch (e) {\n this.logService.error(e);\n }\n }\n}\n","
\n
\n
\n

{{ \"updateMasterPassword\" | i18n }}

\n
\n
\n {{ \"masterPasswordInvalidWarning\" | i18n }} \n \n\n \n
\n
\n
\n \n \n
\n
\n
\n
\n
\n
\n \n \n \n
\n
\n
\n
\n \n \n
\n
\n
\n \n \n \n
\n
\n
\n
\n\n","import { Component } from \"@angular/core\";\nimport { Router } from \"@angular/router\";\n\nimport { UpdatePasswordComponent as BaseUpdatePasswordComponent } from \"@bitwarden/angular/auth/components/update-password.component\";\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { PolicyService } from \"@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction\";\nimport { UserVerificationService } from \"@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { PasswordGenerationServiceAbstraction } from \"@bitwarden/common/tools/generator/password\";\nimport { DialogService } from \"@bitwarden/components\";\n\n@Component({\n selector: \"app-update-password\",\n templateUrl: \"update-password.component.html\",\n})\nexport class UpdatePasswordComponent extends BaseUpdatePasswordComponent {\n constructor(\n router: Router,\n i18nService: I18nService,\n platformUtilsService: PlatformUtilsService,\n passwordGenerationService: PasswordGenerationServiceAbstraction,\n policyService: PolicyService,\n cryptoService: CryptoService,\n messagingService: MessagingService,\n apiService: ApiService,\n logService: LogService,\n stateService: StateService,\n userVerificationService: UserVerificationService,\n dialogService: DialogService,\n ) {\n super(\n router,\n i18nService,\n platformUtilsService,\n passwordGenerationService,\n policyService,\n cryptoService,\n messagingService,\n apiService,\n stateService,\n userVerificationService,\n logService,\n dialogService,\n );\n }\n}\n","import { OrganizationUserResetPasswordRequest } from \"../../../admin-console/abstractions/organization-user/requests\";\n\nexport class UpdateTempPasswordRequest extends OrganizationUserResetPasswordRequest {\n masterPasswordHint: string;\n}\n","import { Directive } from \"@angular/core\";\nimport { Router } from \"@angular/router\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { PolicyService } from \"@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction\";\nimport { MasterPasswordPolicyOptions } from \"@bitwarden/common/admin-console/models/domain/master-password-policy-options\";\nimport { UserVerificationService } from \"@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction\";\nimport { VerificationType } from \"@bitwarden/common/auth/enums/verification-type\";\nimport { ForceSetPasswordReason } from \"@bitwarden/common/auth/models/domain/force-set-password-reason\";\nimport { PasswordRequest } from \"@bitwarden/common/auth/models/request/password.request\";\nimport { UpdateTempPasswordRequest } from \"@bitwarden/common/auth/models/request/update-temp-password.request\";\nimport { MasterPasswordVerification } from \"@bitwarden/common/auth/types/verification\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { EncString } from \"@bitwarden/common/platform/models/domain/enc-string\";\nimport { PasswordGenerationServiceAbstraction } from \"@bitwarden/common/tools/generator/password\";\nimport { MasterKey, UserKey } from \"@bitwarden/common/types/key\";\nimport { SyncService } from \"@bitwarden/common/vault/abstractions/sync/sync.service.abstraction\";\nimport { DialogService } from \"@bitwarden/components\";\n\nimport { ChangePasswordComponent as BaseChangePasswordComponent } from \"./change-password.component\";\n\n@Directive()\nexport class UpdateTempPasswordComponent extends BaseChangePasswordComponent {\n hint: string;\n key: string;\n enforcedPolicyOptions: MasterPasswordPolicyOptions;\n showPassword = false;\n reason: ForceSetPasswordReason = ForceSetPasswordReason.None;\n verification: MasterPasswordVerification = {\n type: VerificationType.MasterPassword,\n secret: \"\",\n };\n\n onSuccessfulChangePassword: () => Promise;\n\n get requireCurrentPassword(): boolean {\n return this.reason === ForceSetPasswordReason.WeakMasterPassword;\n }\n\n constructor(\n i18nService: I18nService,\n platformUtilsService: PlatformUtilsService,\n passwordGenerationService: PasswordGenerationServiceAbstraction,\n policyService: PolicyService,\n cryptoService: CryptoService,\n messagingService: MessagingService,\n private apiService: ApiService,\n stateService: StateService,\n private syncService: SyncService,\n private logService: LogService,\n private userVerificationService: UserVerificationService,\n protected router: Router,\n dialogService: DialogService,\n ) {\n super(\n i18nService,\n cryptoService,\n messagingService,\n passwordGenerationService,\n platformUtilsService,\n policyService,\n stateService,\n dialogService,\n );\n }\n\n async ngOnInit() {\n await this.syncService.fullSync(true);\n\n this.reason = await this.stateService.getForceSetPasswordReason();\n\n // If we somehow end up here without a reason, go back to the home page\n if (this.reason == ForceSetPasswordReason.None) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/\"]);\n return;\n }\n\n await super.ngOnInit();\n }\n\n get masterPasswordWarningText(): string {\n return this.reason == ForceSetPasswordReason.WeakMasterPassword\n ? this.i18nService.t(\"updateWeakMasterPasswordWarning\")\n : this.i18nService.t(\"updateMasterPasswordWarning\");\n }\n\n togglePassword(confirmField: boolean) {\n this.showPassword = !this.showPassword;\n document.getElementById(confirmField ? \"masterPasswordRetype\" : \"masterPassword\").focus();\n }\n\n async setupSubmitActions(): Promise {\n this.email = await this.stateService.getEmail();\n this.kdf = await this.stateService.getKdfType();\n this.kdfConfig = await this.stateService.getKdfConfig();\n return true;\n }\n\n async submit() {\n // Validation\n if (!(await this.strongPassword())) {\n return;\n }\n\n if (!(await this.setupSubmitActions())) {\n return;\n }\n\n try {\n // Create new key and hash new password\n const newMasterKey = await this.cryptoService.makeMasterKey(\n this.masterPassword,\n this.email.trim().toLowerCase(),\n this.kdf,\n this.kdfConfig,\n );\n const newPasswordHash = await this.cryptoService.hashMasterKey(\n this.masterPassword,\n newMasterKey,\n );\n\n // Grab user key\n const userKey = await this.cryptoService.getUserKey();\n\n // Encrypt user key with new master key\n const newProtectedUserKey = await this.cryptoService.encryptUserKeyWithMasterKey(\n newMasterKey,\n userKey,\n );\n\n await this.performSubmitActions(newPasswordHash, newMasterKey, newProtectedUserKey);\n } catch (e) {\n this.logService.error(e);\n }\n }\n\n async performSubmitActions(\n masterPasswordHash: string,\n masterKey: MasterKey,\n userKey: [UserKey, EncString],\n ) {\n try {\n switch (this.reason) {\n case ForceSetPasswordReason.AdminForcePasswordReset:\n this.formPromise = this.updateTempPassword(masterPasswordHash, userKey);\n break;\n case ForceSetPasswordReason.WeakMasterPassword:\n this.formPromise = this.updatePassword(masterPasswordHash, userKey);\n break;\n }\n\n await this.formPromise;\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"updatedMasterPassword\"),\n );\n\n await this.stateService.setForceSetPasswordReason(ForceSetPasswordReason.None);\n\n if (this.onSuccessfulChangePassword != null) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.onSuccessfulChangePassword();\n } else {\n this.messagingService.send(\"logout\");\n }\n } catch (e) {\n this.logService.error(e);\n }\n }\n private async updateTempPassword(masterPasswordHash: string, userKey: [UserKey, EncString]) {\n const request = new UpdateTempPasswordRequest();\n request.key = userKey[1].encryptedString;\n request.newMasterPasswordHash = masterPasswordHash;\n request.masterPasswordHint = this.hint;\n\n return this.apiService.putUpdateTempPassword(request);\n }\n\n private async updatePassword(newMasterPasswordHash: string, userKey: [UserKey, EncString]) {\n const request = await this.userVerificationService.buildRequest(\n this.verification,\n PasswordRequest,\n );\n request.masterPasswordHint = this.hint;\n request.newMasterPasswordHash = newMasterPasswordHash;\n request.key = userKey[1].encryptedString;\n\n return this.apiService.postPassword(request);\n }\n}\n","
\n
\n
\n

{{ \"updateMasterPassword\" | i18n }}

\n \n {{ masterPasswordWarningText }} \n \n \n \n {{ \"currentMasterPass\" | i18n }}\n \n \n \n
\n \n {{ \"newMasterPass\" | i18n }}\n \n \n \n \n \n
\n \n {{ \"confirmNewMasterPass\" | i18n }}\n \n \n \n \n {{ \"masterPassHint\" | i18n }}\n \n {{ \"masterPassHintDesc\" | i18n }}\n \n
\n
\n \n {{ \"submit\" | i18n }}\n \n \n
\n
\n
\n \n
\n","import { Component } from \"@angular/core\";\n\nimport { UpdateTempPasswordComponent as BaseUpdateTempPasswordComponent } from \"@bitwarden/angular/auth/components/update-temp-password.component\";\n\n@Component({\n selector: \"app-update-temp-password\",\n templateUrl: \"update-temp-password.component.html\",\n})\nexport class UpdateTempPasswordComponent extends BaseUpdateTempPasswordComponent {}\n","export class VerifyEmailRequest {\n userId: string;\n token: string;\n\n constructor(userId: string, token: string) {\n this.userId = userId;\n this.token = token;\n }\n}\n","import { Component, OnInit } from \"@angular/core\";\nimport { ActivatedRoute, Router } from \"@angular/router\";\nimport { first } from \"rxjs/operators\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { VerifyEmailRequest } from \"@bitwarden/common/models/request/verify-email.request\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\n\n@Component({\n selector: \"app-verify-email-token\",\n templateUrl: \"verify-email-token.component.html\",\n})\n// eslint-disable-next-line rxjs-angular/prefer-takeuntil\nexport class VerifyEmailTokenComponent implements OnInit {\n constructor(\n private router: Router,\n private platformUtilsService: PlatformUtilsService,\n private i18nService: I18nService,\n private route: ActivatedRoute,\n private apiService: ApiService,\n private logService: LogService,\n private stateService: StateService,\n ) {}\n\n ngOnInit() {\n // eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe\n this.route.queryParams.pipe(first()).subscribe(async (qParams) => {\n if (qParams.userId != null && qParams.token != null) {\n try {\n await this.apiService.postAccountVerifyEmailToken(\n new VerifyEmailRequest(qParams.userId, qParams.token),\n );\n if (await this.stateService.getIsAuthenticated()) {\n await this.apiService.refreshIdentityToken();\n }\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"emailVerified\"));\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/\"]);\n return;\n } catch (e) {\n this.logService.error(e);\n }\n }\n this.platformUtilsService.showToast(\"error\", null, this.i18nService.t(\"emailVerifiedFailed\"));\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/\"]);\n });\n }\n}\n","
\n
\n \"Bitwarden\"\n

\n \n {{ \"loading\" | i18n }}\n

\n
\n
\n","export class VerifyDeleteRecoverRequest {\n userId: string;\n token: string;\n\n constructor(userId: string, token: string) {\n this.userId = userId;\n this.token = token;\n }\n}\n","import { Component, OnInit } from \"@angular/core\";\nimport { ActivatedRoute, Router } from \"@angular/router\";\nimport { first } from \"rxjs/operators\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { VerifyDeleteRecoverRequest } from \"@bitwarden/common/models/request/verify-delete-recover.request\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\n\n@Component({\n selector: \"app-verify-recover-delete\",\n templateUrl: \"verify-recover-delete.component.html\",\n})\n// eslint-disable-next-line rxjs-angular/prefer-takeuntil\nexport class VerifyRecoverDeleteComponent implements OnInit {\n email: string;\n formPromise: Promise;\n\n private userId: string;\n private token: string;\n\n constructor(\n private router: Router,\n private apiService: ApiService,\n private platformUtilsService: PlatformUtilsService,\n private i18nService: I18nService,\n private route: ActivatedRoute,\n private logService: LogService,\n ) {}\n\n ngOnInit() {\n // eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe\n this.route.queryParams.pipe(first()).subscribe(async (qParams) => {\n if (qParams.userId != null && qParams.token != null && qParams.email != null) {\n this.userId = qParams.userId;\n this.token = qParams.token;\n this.email = qParams.email;\n } else {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/\"]);\n }\n });\n }\n\n async submit() {\n try {\n const request = new VerifyDeleteRecoverRequest(this.userId, this.token);\n this.formPromise = this.apiService.postAccountRecoverDeleteToken(request);\n await this.formPromise;\n this.platformUtilsService.showToast(\n \"success\",\n this.i18nService.t(\"accountDeleted\"),\n this.i18nService.t(\"accountDeletedDesc\"),\n );\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/\"]);\n } catch (e) {\n this.logService.error(e);\n }\n }\n}\n","
\n
\n
\n

{{ \"deleteAccount\" | i18n }}

\n
\n
\n {{ \"deleteAccountWarning\" | i18n }}\n

\n {{ email }}\n

\n

{{ \"deleteRecoverConfirmDesc\" | i18n }}

\n
\n
\n \n {{ \"deleteAccount\" | i18n }}\n \n \n \n {{ \"cancel\" | i18n }}\n \n
\n
\n
\n
\n
\n
\n","export class UpdateDomainsRequest {\n equivalentDomains: string[][];\n excludedGlobalEquivalentDomains: number[];\n}\n","\n\n\n

{{ \"domainRulesDesc\" | i18n }}

\n
\n

{{ \"customEqDomains\" | i18n }}

\n

\n \n {{ \"loading\" | i18n }}\n

\n \n
\n
\n \n \n
\n \n \n \n
\n \n {{ \"newCustomDomainDesc\" | i18n }}\n
\n \n

{{ \"globalEqDomains\" | i18n }}

\n

\n \n {{ \"loading\" | i18n }}\n

\n 0\">\n \n \n \n \n \n \n
{{ d.domains }}\n
\n \n \n \n
\n \n \n {{ \"exclude\" | i18n }}\n \n \n \n {{ \"include\" | i18n }}\n \n \n \n {{ \"customize\" | i18n }}\n \n
\n
\n
\n \n
\n
\n","import { Component, OnInit } from \"@angular/core\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { UpdateDomainsRequest } from \"@bitwarden/common/models/request/update-domains.request\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\n\n@Component({\n selector: \"app-domain-rules\",\n templateUrl: \"domain-rules.component.html\",\n})\nexport class DomainRulesComponent implements OnInit {\n loading = true;\n custom: string[] = [];\n global: any[] = [];\n formPromise: Promise;\n\n constructor(\n private apiService: ApiService,\n private i18nService: I18nService,\n private platformUtilsService: PlatformUtilsService,\n private logService: LogService,\n ) {}\n\n async ngOnInit() {\n const response = await this.apiService.getSettingsDomains();\n this.loading = false;\n if (response.equivalentDomains != null) {\n this.custom = response.equivalentDomains.map((d) => d.join(\", \"));\n }\n if (response.globalEquivalentDomains != null) {\n this.global = response.globalEquivalentDomains.map((d) => {\n return {\n domains: d.domains.join(\", \"),\n excluded: d.excluded,\n key: d.type,\n };\n });\n }\n }\n\n toggleExcluded(globalDomain: any) {\n globalDomain.excluded = !globalDomain.excluded;\n }\n\n customize(globalDomain: any) {\n globalDomain.excluded = true;\n this.custom.push(globalDomain.domains);\n }\n\n remove(index: number) {\n this.custom.splice(index, 1);\n }\n\n add() {\n this.custom.push(\"\");\n }\n\n async submit() {\n const request = new UpdateDomainsRequest();\n request.excludedGlobalEquivalentDomains = this.global\n .filter((d) => d.excluded)\n .map((d) => d.key);\n if (request.excludedGlobalEquivalentDomains.length === 0) {\n request.excludedGlobalEquivalentDomains = null;\n }\n request.equivalentDomains = this.custom\n .filter((d) => d != null && d.trim() !== \"\")\n .map((d) => d.split(\",\").map((d2) => d2.trim()));\n if (request.equivalentDomains.length === 0) {\n request.equivalentDomains = null;\n }\n\n try {\n this.formPromise = this.apiService.putSettingsDomains(request);\n await this.formPromise;\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"domainsUpdated\"));\n } catch (e) {\n this.logService.error(e);\n }\n }\n\n indexTrackBy(index: number, obj: any): any {\n return index;\n }\n}\n","import { Directive, Input, OnChanges, OnDestroy, OnInit } from \"@angular/core\";\nimport {\n AbstractControl,\n ControlValueAccessor,\n FormBuilder,\n ValidationErrors,\n Validator,\n} from \"@angular/forms\";\nimport { filter, map, Observable, Subject, takeUntil } from \"rxjs\";\n\nimport { VaultTimeoutSettingsService } from \"@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service\";\nimport { PolicyService } from \"@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction\";\nimport { PolicyType } from \"@bitwarden/common/admin-console/enums\";\nimport { Policy } from \"@bitwarden/common/admin-console/models/domain/policy\";\nimport { VaultTimeoutAction } from \"@bitwarden/common/enums/vault-timeout-action.enum\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\n\ninterface VaultTimeoutFormValue {\n vaultTimeout: number | null;\n custom: {\n hours: number | null;\n minutes: number | null;\n };\n}\n\n@Directive()\nexport class VaultTimeoutInputComponent\n implements ControlValueAccessor, Validator, OnInit, OnDestroy, OnChanges\n{\n get showCustom() {\n return this.form.get(\"vaultTimeout\").value === VaultTimeoutInputComponent.CUSTOM_VALUE;\n }\n\n get exceedsMinimumTimout(): boolean {\n return (\n !this.showCustom || this.customTimeInMinutes() > VaultTimeoutInputComponent.MIN_CUSTOM_MINUTES\n );\n }\n\n static CUSTOM_VALUE = -100;\n static MIN_CUSTOM_MINUTES = 0;\n\n form = this.formBuilder.group({\n vaultTimeout: [null],\n custom: this.formBuilder.group({\n hours: [null],\n minutes: [null],\n }),\n });\n\n @Input() vaultTimeoutOptions: { name: string; value: number }[];\n vaultTimeoutPolicy: Policy;\n vaultTimeoutPolicyHours: number;\n vaultTimeoutPolicyMinutes: number;\n\n protected canLockVault$: Observable;\n\n private onChange: (vaultTimeout: number) => void;\n private validatorChange: () => void;\n private destroy$ = new Subject();\n\n constructor(\n private formBuilder: FormBuilder,\n private policyService: PolicyService,\n private vaultTimeoutSettingsService: VaultTimeoutSettingsService,\n private i18nService: I18nService,\n ) {}\n\n async ngOnInit() {\n this.policyService\n .get$(PolicyType.MaximumVaultTimeout)\n .pipe(\n filter((policy) => policy != null),\n takeUntil(this.destroy$),\n )\n .subscribe((policy) => {\n this.vaultTimeoutPolicy = policy;\n this.applyVaultTimeoutPolicy();\n });\n\n this.form.valueChanges\n .pipe(takeUntil(this.destroy$))\n .subscribe((value: VaultTimeoutFormValue) => {\n if (this.onChange) {\n this.onChange(this.getVaultTimeout(value));\n }\n });\n\n // Assign the current value to the custom fields\n // so that if the user goes from a numeric value to custom\n // we can initialize the custom fields with the current value\n // ex: user picks 5 min, goes to custom, we want to show 0 hr, 5 min in the custom fields\n this.form.controls.vaultTimeout.valueChanges\n .pipe(\n filter((value) => value !== VaultTimeoutInputComponent.CUSTOM_VALUE),\n takeUntil(this.destroy$),\n )\n .subscribe((value) => {\n const current = Math.max(value, 0);\n\n // This cannot emit an event b/c it would cause form.valueChanges to fire again\n // and we are already handling that above so just silently update\n // custom fields when vaultTimeout changes to a non-custom value\n this.form.patchValue(\n {\n custom: {\n hours: Math.floor(current / 60),\n minutes: current % 60,\n },\n },\n { emitEvent: false },\n );\n });\n\n this.canLockVault$ = this.vaultTimeoutSettingsService\n .availableVaultTimeoutActions$()\n .pipe(map((actions) => actions.includes(VaultTimeoutAction.Lock)));\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n ngOnChanges() {\n if (\n !this.vaultTimeoutOptions.find((p) => p.value === VaultTimeoutInputComponent.CUSTOM_VALUE)\n ) {\n this.vaultTimeoutOptions.push({\n name: this.i18nService.t(\"custom\"),\n value: VaultTimeoutInputComponent.CUSTOM_VALUE,\n });\n }\n }\n\n getVaultTimeout(value: VaultTimeoutFormValue) {\n if (value.vaultTimeout !== VaultTimeoutInputComponent.CUSTOM_VALUE) {\n return value.vaultTimeout;\n }\n\n return value.custom.hours * 60 + value.custom.minutes;\n }\n\n writeValue(value: number): void {\n if (value == null) {\n return;\n }\n\n if (this.vaultTimeoutOptions.every((p) => p.value !== value)) {\n this.form.setValue({\n vaultTimeout: VaultTimeoutInputComponent.CUSTOM_VALUE,\n custom: {\n hours: Math.floor(value / 60),\n minutes: value % 60,\n },\n });\n return;\n }\n\n this.form.patchValue({\n vaultTimeout: value,\n });\n }\n\n registerOnChange(onChange: any): void {\n this.onChange = onChange;\n }\n\n registerOnTouched(onTouched: any): void {\n // Empty\n }\n\n setDisabledState?(isDisabled: boolean): void {\n // Empty\n }\n\n validate(control: AbstractControl): ValidationErrors {\n if (this.vaultTimeoutPolicy && this.vaultTimeoutPolicy?.data?.minutes < control.value) {\n return { policyError: true };\n }\n\n if (!this.exceedsMinimumTimout) {\n return { minTimeoutError: true };\n }\n\n return null;\n }\n\n registerOnValidatorChange(fn: () => void): void {\n this.validatorChange = fn;\n }\n\n private customTimeInMinutes() {\n return this.form.value.custom.hours * 60 + this.form.value.custom.minutes;\n }\n\n private applyVaultTimeoutPolicy() {\n this.vaultTimeoutPolicyHours = Math.floor(this.vaultTimeoutPolicy.data.minutes / 60);\n this.vaultTimeoutPolicyMinutes = this.vaultTimeoutPolicy.data.minutes % 60;\n\n this.vaultTimeoutOptions = this.vaultTimeoutOptions.filter(\n (t) =>\n t.value <= this.vaultTimeoutPolicy.data.minutes &&\n (t.value > 0 || t.value === VaultTimeoutInputComponent.CUSTOM_VALUE) &&\n t.value != null,\n );\n this.validatorChange();\n }\n}\n","
\n
\n \n \n \n \n {{\n ((canLockVault$ | async) ? \"vaultTimeoutDesc\" : \"vaultTimeoutLogoutDesc\") | i18n\n }}\n
\n
\n \n
\n
\n \n {{ \"hours\" | i18n }}\n
\n
\n \n {{ \"minutes\" | i18n }}\n
\n
\n\n \n {{ \"vaultCustomTimeoutMinimum\" | i18n }}\n \n
\n
\n","import { Component } from \"@angular/core\";\nimport { NG_VALIDATORS, NG_VALUE_ACCESSOR } from \"@angular/forms\";\n\nimport { VaultTimeoutInputComponent as VaultTimeoutInputComponentBase } from \"@bitwarden/angular/components/settings/vault-timeout-input.component\";\n\n@Component({\n selector: \"app-vault-timeout-input\",\n templateUrl: \"vault-timeout-input.component.html\",\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n multi: true,\n useExisting: VaultTimeoutInputComponent,\n },\n {\n provide: NG_VALIDATORS,\n multi: true,\n useExisting: VaultTimeoutInputComponent,\n },\n ],\n})\nexport class VaultTimeoutInputComponent extends VaultTimeoutInputComponentBase {}\n","\n\n\n

{{ \"preferencesDesc\" | i18n }}

\n
\n
\n
\n \n \n {{\n \"vaultTimeoutPolicyWithActionInEffect\"\n | i18n: policy.timeout.hours : policy.timeout.minutes : (policy.action | i18n)\n }}\n \n \n {{ \"vaultTimeoutPolicyInEffect\" | i18n: policy.timeout.hours : policy.timeout.minutes }}\n \n \n {{ \"vaultTimeoutActionPolicyInEffect\" | i18n: (policy.action | i18n) }}\n \n \n \n \n
\n
\n \n
1\" class=\"form-group\">\n \n \n \n \n
\n \n \n \n \n \n
\n
\n
\n
\n
\n \n \n \n \n
\n \n {{ \"languageDesc\" | i18n }}\n
\n
\n
\n
\n
\n \n \n \n \n \n
\n {{ \"faviconDesc\" | i18n }}\n
\n
\n
\n
\n \n \n {{ \"themeDesc\" | i18n }}\n
\n
\n
\n \n
\n
\n","import { Component, OnInit } from \"@angular/core\";\nimport { FormBuilder } from \"@angular/forms\";\nimport { concatMap, filter, firstValueFrom, map, Observable, Subject, takeUntil, tap } from \"rxjs\";\n\nimport { VaultTimeoutSettingsService } from \"@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service\";\nimport { PolicyService } from \"@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction\";\nimport { PolicyType } from \"@bitwarden/common/admin-console/enums\";\nimport { DomainSettingsService } from \"@bitwarden/common/autofill/services/domain-settings.service\";\nimport { VaultTimeoutAction } from \"@bitwarden/common/enums/vault-timeout-action.enum\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { ThemeType } from \"@bitwarden/common/platform/enums\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\nimport { ThemeStateService } from \"@bitwarden/common/platform/theming/theme-state.service\";\nimport { DialogService } from \"@bitwarden/components\";\n\n@Component({\n selector: \"app-preferences\",\n templateUrl: \"preferences.component.html\",\n})\nexport class PreferencesComponent implements OnInit {\n // For use in template\n protected readonly VaultTimeoutAction = VaultTimeoutAction;\n\n protected availableVaultTimeoutActions$: Observable;\n\n vaultTimeoutPolicyCallout: Observable<{\n timeout: { hours: number; minutes: number };\n action: VaultTimeoutAction;\n }>;\n vaultTimeoutOptions: { name: string; value: number }[];\n localeOptions: any[];\n themeOptions: any[];\n\n private startingLocale: string;\n private destroy$ = new Subject();\n\n form = this.formBuilder.group({\n vaultTimeout: [null as number | null],\n vaultTimeoutAction: [VaultTimeoutAction.Lock],\n enableFavicons: true,\n theme: [ThemeType.Light],\n locale: [null as string | null],\n });\n\n constructor(\n private formBuilder: FormBuilder,\n private policyService: PolicyService,\n private i18nService: I18nService,\n private vaultTimeoutSettingsService: VaultTimeoutSettingsService,\n private platformUtilsService: PlatformUtilsService,\n private themeStateService: ThemeStateService,\n private domainSettingsService: DomainSettingsService,\n private dialogService: DialogService,\n ) {\n this.vaultTimeoutOptions = [\n { name: i18nService.t(\"oneMinute\"), value: 1 },\n { name: i18nService.t(\"fiveMinutes\"), value: 5 },\n { name: i18nService.t(\"fifteenMinutes\"), value: 15 },\n { name: i18nService.t(\"thirtyMinutes\"), value: 30 },\n { name: i18nService.t(\"oneHour\"), value: 60 },\n { name: i18nService.t(\"fourHours\"), value: 240 },\n { name: i18nService.t(\"onRefresh\"), value: -1 },\n ];\n if (this.platformUtilsService.isDev()) {\n this.vaultTimeoutOptions.push({ name: i18nService.t(\"never\"), value: null });\n }\n\n const localeOptions: any[] = [];\n i18nService.supportedTranslationLocales.forEach((locale) => {\n let name = locale;\n if (i18nService.localeNames.has(locale)) {\n name += \" - \" + i18nService.localeNames.get(locale);\n }\n localeOptions.push({ name: name, value: locale });\n });\n localeOptions.sort(Utils.getSortFunction(i18nService, \"name\"));\n localeOptions.splice(0, 0, { name: i18nService.t(\"default\"), value: null });\n this.localeOptions = localeOptions;\n this.themeOptions = [\n { name: i18nService.t(\"themeLight\"), value: ThemeType.Light },\n { name: i18nService.t(\"themeDark\"), value: ThemeType.Dark },\n { name: i18nService.t(\"themeSystem\"), value: ThemeType.System },\n ];\n }\n\n async ngOnInit() {\n this.availableVaultTimeoutActions$ =\n this.vaultTimeoutSettingsService.availableVaultTimeoutActions$();\n\n this.vaultTimeoutPolicyCallout = this.policyService.get$(PolicyType.MaximumVaultTimeout).pipe(\n filter((policy) => policy != null),\n map((policy) => {\n let timeout;\n if (policy.data?.minutes) {\n timeout = {\n hours: Math.floor(policy.data?.minutes / 60),\n minutes: policy.data?.minutes % 60,\n };\n }\n return { timeout: timeout, action: policy.data?.action };\n }),\n tap((policy) => {\n if (policy.action) {\n this.form.controls.vaultTimeoutAction.disable({ emitEvent: false });\n } else {\n this.form.controls.vaultTimeoutAction.enable({ emitEvent: false });\n }\n }),\n );\n\n this.form.controls.vaultTimeoutAction.valueChanges\n .pipe(\n concatMap(async (action) => {\n if (action === VaultTimeoutAction.LogOut) {\n const confirmed = await this.dialogService.openSimpleDialog({\n title: { key: \"vaultTimeoutLogOutConfirmationTitle\" },\n content: { key: \"vaultTimeoutLogOutConfirmation\" },\n type: \"warning\",\n });\n\n if (!confirmed) {\n this.form.controls.vaultTimeoutAction.patchValue(VaultTimeoutAction.Lock, {\n emitEvent: false,\n });\n return;\n }\n }\n }),\n takeUntil(this.destroy$),\n )\n .subscribe();\n const initialFormValues = {\n vaultTimeout: await this.vaultTimeoutSettingsService.getVaultTimeout(),\n vaultTimeoutAction: await firstValueFrom(\n this.vaultTimeoutSettingsService.vaultTimeoutAction$(),\n ),\n enableFavicons: await firstValueFrom(this.domainSettingsService.showFavicons$),\n theme: await firstValueFrom(this.themeStateService.selectedTheme$),\n locale: (await firstValueFrom(this.i18nService.userSetLocale$)) ?? null,\n };\n this.startingLocale = initialFormValues.locale;\n this.form.setValue(initialFormValues, { emitEvent: false });\n }\n\n async submit() {\n if (!this.form.controls.vaultTimeout.valid) {\n this.platformUtilsService.showToast(\n \"error\",\n null,\n this.i18nService.t(\"vaultTimeoutRangeError\"),\n );\n return;\n }\n const values = this.form.value;\n\n await this.vaultTimeoutSettingsService.setVaultTimeoutOptions(\n values.vaultTimeout,\n values.vaultTimeoutAction,\n );\n await this.domainSettingsService.setShowFavicons(values.enableFavicons);\n await this.themeStateService.setSelectedTheme(values.theme);\n await this.i18nService.setLocale(values.locale);\n if (values.locale !== this.startingLocale) {\n window.location.reload();\n } else {\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"preferencesUpdated\"),\n );\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n}\n","import { Directive, EventEmitter, Input, OnInit, Output } from \"@angular/core\";\nimport { ActivatedRoute } from \"@angular/router\";\nimport { BehaviorSubject } from \"rxjs\";\nimport { debounceTime, first, map } from \"rxjs/operators\";\n\nimport { PasswordGeneratorPolicyOptions } from \"@bitwarden/common/admin-console/models/domain/password-generator-policy-options\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { GeneratorOptions } from \"@bitwarden/common/tools/generator/generator-options\";\nimport {\n PasswordGenerationServiceAbstraction,\n PasswordGeneratorOptions,\n} from \"@bitwarden/common/tools/generator/password\";\nimport { DefaultBoundaries } from \"@bitwarden/common/tools/generator/password/password-generator-options-evaluator\";\nimport {\n UsernameGenerationServiceAbstraction,\n UsernameGeneratorOptions,\n} from \"@bitwarden/common/tools/generator/username\";\nimport { EmailForwarderOptions } from \"@bitwarden/common/tools/models/domain/email-forwarder-options\";\n\n@Directive()\nexport class GeneratorComponent implements OnInit {\n @Input() comingFromAddEdit = false;\n @Input() type: string;\n @Output() onSelected = new EventEmitter();\n\n usernameGeneratingPromise: Promise;\n typeOptions: any[];\n passTypeOptions: any[];\n usernameTypeOptions: any[];\n subaddressOptions: any[];\n catchallOptions: any[];\n forwardOptions: EmailForwarderOptions[];\n usernameOptions: UsernameGeneratorOptions = {};\n passwordOptions: PasswordGeneratorOptions = {};\n username = \"-\";\n password = \"-\";\n showOptions = false;\n avoidAmbiguous = false;\n enforcedPasswordPolicyOptions: PasswordGeneratorPolicyOptions;\n usernameWebsite: string = null;\n\n // update screen reader minimum password length with 500ms debounce\n // so that the user isn't flooded with status updates\n private _passwordOptionsMinLengthForReader = new BehaviorSubject(\n DefaultBoundaries.length.min,\n );\n protected passwordOptionsMinLengthForReader$ = this._passwordOptionsMinLengthForReader.pipe(\n map((val) => val || DefaultBoundaries.length.min),\n debounceTime(500),\n );\n\n constructor(\n protected passwordGenerationService: PasswordGenerationServiceAbstraction,\n protected usernameGenerationService: UsernameGenerationServiceAbstraction,\n protected platformUtilsService: PlatformUtilsService,\n protected stateService: StateService,\n protected i18nService: I18nService,\n protected logService: LogService,\n protected route: ActivatedRoute,\n private win: Window,\n ) {\n this.typeOptions = [\n { name: i18nService.t(\"password\"), value: \"password\" },\n { name: i18nService.t(\"username\"), value: \"username\" },\n ];\n this.passTypeOptions = [\n { name: i18nService.t(\"password\"), value: \"password\" },\n { name: i18nService.t(\"passphrase\"), value: \"passphrase\" },\n ];\n this.usernameTypeOptions = [\n {\n name: i18nService.t(\"plusAddressedEmail\"),\n value: \"subaddress\",\n desc: i18nService.t(\"plusAddressedEmailDesc\"),\n },\n {\n name: i18nService.t(\"catchallEmail\"),\n value: \"catchall\",\n desc: i18nService.t(\"catchallEmailDesc\"),\n },\n {\n name: i18nService.t(\"forwardedEmail\"),\n value: \"forwarded\",\n desc: i18nService.t(\"forwardedEmailDesc\"),\n },\n { name: i18nService.t(\"randomWord\"), value: \"word\" },\n ];\n this.subaddressOptions = [{ name: i18nService.t(\"random\"), value: \"random\" }];\n this.catchallOptions = [{ name: i18nService.t(\"random\"), value: \"random\" }];\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.initForwardOptions();\n }\n\n async ngOnInit() {\n // eslint-disable-next-line rxjs/no-async-subscribe\n this.route.queryParams.pipe(first()).subscribe(async (qParams) => {\n const passwordOptionsResponse = await this.passwordGenerationService.getOptions();\n this.passwordOptions = passwordOptionsResponse[0];\n this.enforcedPasswordPolicyOptions = passwordOptionsResponse[1];\n this.avoidAmbiguous = !this.passwordOptions.ambiguous;\n this.passwordOptions.type =\n this.passwordOptions.type === \"passphrase\" ? \"passphrase\" : \"password\";\n\n this.usernameOptions = await this.usernameGenerationService.getOptions();\n if (this.usernameOptions.type == null) {\n this.usernameOptions.type = \"word\";\n }\n if (\n this.usernameOptions.subaddressEmail == null ||\n this.usernameOptions.subaddressEmail === \"\"\n ) {\n this.usernameOptions.subaddressEmail = await this.stateService.getEmail();\n }\n if (this.usernameWebsite == null) {\n this.usernameOptions.subaddressType = this.usernameOptions.catchallType = \"random\";\n } else {\n this.usernameOptions.website = this.usernameWebsite;\n const websiteOption = { name: this.i18nService.t(\"websiteName\"), value: \"website-name\" };\n this.subaddressOptions.push(websiteOption);\n this.catchallOptions.push(websiteOption);\n }\n\n if (this.type !== \"username\" && this.type !== \"password\") {\n if (qParams.type === \"username\" || qParams.type === \"password\") {\n this.type = qParams.type;\n } else {\n const generatorOptions = await this.stateService.getGeneratorOptions();\n this.type = generatorOptions?.type ?? \"password\";\n }\n }\n if (this.regenerateWithoutButtonPress()) {\n await this.regenerate();\n }\n });\n }\n\n async typeChanged() {\n await this.stateService.setGeneratorOptions({ type: this.type } as GeneratorOptions);\n if (this.regenerateWithoutButtonPress()) {\n await this.regenerate();\n }\n }\n\n async regenerate() {\n if (this.type === \"password\") {\n await this.regeneratePassword();\n } else if (this.type === \"username\") {\n await this.regenerateUsername();\n }\n }\n\n async sliderChanged() {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.savePasswordOptions(false);\n await this.passwordGenerationService.addHistory(this.password);\n }\n\n async onPasswordOptionsMinNumberInput($event: Event) {\n // `savePasswordOptions()` replaces the null\n this.passwordOptions.number = null;\n\n await this.savePasswordOptions();\n\n // fixes UI desync that occurs when minNumber has a fixed value\n // that is reset through normalization\n ($event.target as HTMLInputElement).value = `${this.passwordOptions.minNumber}`;\n }\n\n async setPasswordOptionsNumber($event: boolean) {\n this.passwordOptions.number = $event;\n // `savePasswordOptions()` replaces the null\n this.passwordOptions.minNumber = null;\n\n await this.savePasswordOptions();\n }\n\n async onPasswordOptionsMinSpecialInput($event: Event) {\n // `savePasswordOptions()` replaces the null\n this.passwordOptions.special = null;\n\n await this.savePasswordOptions();\n\n // fixes UI desync that occurs when minSpecial has a fixed value\n // that is reset through normalization\n ($event.target as HTMLInputElement).value = `${this.passwordOptions.minSpecial}`;\n }\n\n async setPasswordOptionsSpecial($event: boolean) {\n this.passwordOptions.special = $event;\n // `savePasswordOptions()` replaces the null\n this.passwordOptions.minSpecial = null;\n\n await this.savePasswordOptions();\n }\n\n async sliderInput() {\n this.normalizePasswordOptions();\n this.password = await this.passwordGenerationService.generatePassword(this.passwordOptions);\n }\n\n async savePasswordOptions(regenerate = true) {\n this.normalizePasswordOptions();\n await this.passwordGenerationService.saveOptions(this.passwordOptions);\n\n if (regenerate && this.regenerateWithoutButtonPress()) {\n await this.regeneratePassword();\n }\n }\n\n async saveUsernameOptions(regenerate = true) {\n await this.usernameGenerationService.saveOptions(this.usernameOptions);\n if (this.usernameOptions.type === \"forwarded\") {\n this.username = \"-\";\n }\n if (regenerate && this.regenerateWithoutButtonPress()) {\n await this.regenerateUsername();\n }\n }\n\n async regeneratePassword() {\n this.password = await this.passwordGenerationService.generatePassword(this.passwordOptions);\n await this.passwordGenerationService.addHistory(this.password);\n }\n\n regenerateUsername() {\n return this.generateUsername();\n }\n\n async generateUsername() {\n try {\n this.usernameGeneratingPromise = this.usernameGenerationService.generateUsername(\n this.usernameOptions,\n );\n this.username = await this.usernameGeneratingPromise;\n if (this.username === \"\" || this.username === null) {\n this.username = \"-\";\n }\n } catch (e) {\n this.logService.error(e);\n }\n }\n\n copy() {\n const password = this.type === \"password\";\n const copyOptions = this.win != null ? { window: this.win } : null;\n this.platformUtilsService.copyToClipboard(\n password ? this.password : this.username,\n copyOptions,\n );\n this.platformUtilsService.showToast(\n \"info\",\n null,\n this.i18nService.t(\"valueCopied\", this.i18nService.t(password ? \"password\" : \"username\")),\n );\n }\n\n select() {\n this.onSelected.emit(this.type === \"password\" ? this.password : this.username);\n }\n\n toggleOptions() {\n this.showOptions = !this.showOptions;\n }\n\n regenerateWithoutButtonPress() {\n return this.type !== \"username\" || this.usernameOptions.type !== \"forwarded\";\n }\n\n private normalizePasswordOptions() {\n // Application level normalize options dependent on class variables\n this.passwordOptions.ambiguous = !this.avoidAmbiguous;\n\n if (\n !this.passwordOptions.uppercase &&\n !this.passwordOptions.lowercase &&\n !this.passwordOptions.number &&\n !this.passwordOptions.special\n ) {\n this.passwordOptions.lowercase = true;\n if (this.win != null) {\n const lowercase = this.win.document.querySelector(\"#lowercase\") as HTMLInputElement;\n if (lowercase) {\n lowercase.checked = true;\n }\n }\n }\n\n this.passwordGenerationService.normalizeOptions(\n this.passwordOptions,\n this.enforcedPasswordPolicyOptions,\n );\n\n this._passwordOptionsMinLengthForReader.next(this.passwordOptions.minLength);\n }\n\n private async initForwardOptions() {\n this.forwardOptions = [\n { name: \"addy.io\", value: \"anonaddy\", validForSelfHosted: true },\n { name: \"DuckDuckGo\", value: \"duckduckgo\", validForSelfHosted: false },\n { name: \"Fastmail\", value: \"fastmail\", validForSelfHosted: true },\n { name: \"Firefox Relay\", value: \"firefoxrelay\", validForSelfHosted: false },\n { name: \"SimpleLogin\", value: \"simplelogin\", validForSelfHosted: true },\n { name: \"Forward Email\", value: \"forwardemail\", validForSelfHosted: true },\n ];\n\n this.usernameOptions = await this.usernameGenerationService.getOptions();\n if (\n this.usernameOptions.forwardedService == null ||\n this.usernameOptions.forwardedService === \"\"\n ) {\n this.forwardOptions.push({ name: \"\", value: null, validForSelfHosted: false });\n }\n\n this.forwardOptions = this.forwardOptions.sort((a, b) => a.name.localeCompare(b.name));\n }\n}\n","import { Directive, OnInit } from \"@angular/core\";\n\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport {\n GeneratedPasswordHistory,\n PasswordGenerationServiceAbstraction,\n} from \"@bitwarden/common/tools/generator/password\";\n\n@Directive()\nexport class PasswordGeneratorHistoryComponent implements OnInit {\n history: GeneratedPasswordHistory[] = [];\n\n constructor(\n protected passwordGenerationService: PasswordGenerationServiceAbstraction,\n protected platformUtilsService: PlatformUtilsService,\n protected i18nService: I18nService,\n private win: Window,\n ) {}\n\n async ngOnInit() {\n this.history = await this.passwordGenerationService.getHistory();\n }\n\n clear = async () => {\n this.history = [];\n await this.passwordGenerationService.clear();\n };\n\n copy(password: string) {\n const copyOptions = this.win != null ? { window: this.win } : null;\n this.platformUtilsService.copyToClipboard(password, copyOptions);\n this.platformUtilsService.showToast(\n \"info\",\n null,\n this.i18nService.t(\"valueCopied\", this.i18nService.t(\"password\")),\n );\n }\n}\n","import { Directive, ElementRef, HostListener, Input } from \"@angular/core\";\n\nimport { ClientType } from \"@bitwarden/common/enums\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\n\n@Directive({\n selector: \"[appCopyText]\",\n})\nexport class CopyTextDirective {\n constructor(\n private el: ElementRef,\n private platformUtilsService: PlatformUtilsService,\n ) {}\n\n @Input(\"appCopyText\") copyText: string;\n\n @HostListener(\"copy\") onCopy() {\n if (window == null) {\n return;\n }\n\n const timeout = this.platformUtilsService.getClientType() === ClientType.Desktop ? 100 : 0;\n setTimeout(() => {\n this.platformUtilsService.copyToClipboard(this.copyText, { window: window });\n }, timeout);\n }\n}\n","\n \n {{ \"passwordHistory\" | i18n }}\n \n \n \n \n \n \n \n \n {{ h.date | date: \"medium\" }}\n \n \n \n \n \n \n \n \n
\n {{ \"noPasswordsInList\" | i18n }}\n
\n
\n \n \n \n \n
\n","import { Component } from \"@angular/core\";\n\nimport { PasswordGeneratorHistoryComponent as BasePasswordGeneratorHistoryComponent } from \"@bitwarden/angular/tools/generator/components/password-generator-history.component\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { PasswordGenerationServiceAbstraction } from \"@bitwarden/common/tools/generator/password\";\n\n@Component({\n selector: \"app-password-generator-history\",\n templateUrl: \"password-generator-history.component.html\",\n})\nexport class PasswordGeneratorHistoryComponent extends BasePasswordGeneratorHistoryComponent {\n constructor(\n passwordGenerationService: PasswordGenerationServiceAbstraction,\n platformUtilsService: PlatformUtilsService,\n i18nService: I18nService,\n ) {\n super(passwordGenerationService, platformUtilsService, i18nService, window);\n }\n}\n","\n\n\n \n {{ \"passwordGeneratorPolicyInEffect\" | i18n }}\n \n
\n
\n \n
\n
\n
\n \n
\n \n \n
\n
\n \n
\n \n
\n \n \n
\n
\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n \n
\n
\n \n \n
\n
\n \n \n \n {{ passwordOptionsMinLengthForReader$ | async }}\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n
\n
\n \n \n
\n
\n \n \n \n
\n
\n
\n \n
\n
\n \n \n \n \n
\n
\n \n \n
\n
\n \n
\n \n \n \n \n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n
\n \n \n
\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n
\n \n \n
\n
\n
\n
\n \n \n
\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n
\n
\n \n \n
\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n
\n
\n \n \n {{ \"regenerateUsername\" | i18n }}\n \n \n
\n
\n \n
\n","import { Component } from \"@angular/core\";\nimport { ActivatedRoute } from \"@angular/router\";\n\nimport { GeneratorComponent as BaseGeneratorComponent } from \"@bitwarden/angular/tools/generator/components/generator.component\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { PasswordGenerationServiceAbstraction } from \"@bitwarden/common/tools/generator/password\";\nimport { UsernameGenerationServiceAbstraction } from \"@bitwarden/common/tools/generator/username\";\nimport { DialogService } from \"@bitwarden/components\";\n\nimport { PasswordGeneratorHistoryComponent } from \"./password-generator-history.component\";\n\n@Component({\n selector: \"app-generator\",\n templateUrl: \"generator.component.html\",\n})\nexport class GeneratorComponent extends BaseGeneratorComponent {\n constructor(\n passwordGenerationService: PasswordGenerationServiceAbstraction,\n usernameGenerationService: UsernameGenerationServiceAbstraction,\n stateService: StateService,\n platformUtilsService: PlatformUtilsService,\n i18nService: I18nService,\n logService: LogService,\n route: ActivatedRoute,\n private dialogService: DialogService,\n ) {\n super(\n passwordGenerationService,\n usernameGenerationService,\n platformUtilsService,\n stateService,\n i18nService,\n logService,\n route,\n window,\n );\n if (platformUtilsService.isSelfHost()) {\n // Allow only valid email forwarders for self host\n this.forwardOptions = this.forwardOptions.filter((forwarder) => forwarder.validForSelfHosted);\n }\n }\n\n get isSelfHosted(): boolean {\n return this.platformUtilsService.isSelfHost();\n }\n\n async history() {\n this.dialogService.open(PasswordGeneratorHistoryComponent);\n }\n\n lengthChanged() {\n document.getElementById(\"length\").focus();\n }\n\n minNumberChanged() {\n document.getElementById(\"min-number\").focus();\n }\n\n minSpecialChanged() {\n document.getElementById(\"min-special\").focus();\n }\n}\n","import { Directive, NgZone, OnDestroy, OnInit } from \"@angular/core\";\nimport { Subject, firstValueFrom, takeUntil } from \"rxjs\";\n\nimport { SearchService } from \"@bitwarden/common/abstractions/search.service\";\nimport { PolicyService } from \"@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction\";\nimport { PolicyType } from \"@bitwarden/common/admin-console/enums\";\nimport { EnvironmentService } from \"@bitwarden/common/platform/abstractions/environment.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { SendType } from \"@bitwarden/common/tools/send/enums/send-type\";\nimport { SendView } from \"@bitwarden/common/tools/send/models/view/send.view\";\nimport { SendApiService } from \"@bitwarden/common/tools/send/services/send-api.service.abstraction\";\nimport { SendService } from \"@bitwarden/common/tools/send/services/send.service.abstraction\";\nimport { DialogService } from \"@bitwarden/components\";\n\n@Directive()\nexport class SendComponent implements OnInit, OnDestroy {\n disableSend = false;\n sendType = SendType;\n loaded = false;\n loading = true;\n refreshing = false;\n expired = false;\n type: SendType = null;\n sends: SendView[] = [];\n searchText: string;\n selectedType: SendType;\n selectedAll: boolean;\n filter: (cipher: SendView) => boolean;\n searchPending = false;\n hasSearched = false; // search() function called - returns true if text qualifies for search\n\n actionPromise: any;\n onSuccessfulRemovePassword: () => Promise;\n onSuccessfulDelete: () => Promise;\n onSuccessfulLoad: () => Promise;\n\n private searchTimeout: any;\n private destroy$ = new Subject();\n private _filteredSends: SendView[];\n\n get filteredSends(): SendView[] {\n return this._filteredSends;\n }\n\n set filteredSends(filteredSends: SendView[]) {\n this._filteredSends = filteredSends;\n }\n\n constructor(\n protected sendService: SendService,\n protected i18nService: I18nService,\n protected platformUtilsService: PlatformUtilsService,\n protected environmentService: EnvironmentService,\n protected ngZone: NgZone,\n protected searchService: SearchService,\n protected policyService: PolicyService,\n private logService: LogService,\n protected sendApiService: SendApiService,\n protected dialogService: DialogService,\n ) {}\n\n async ngOnInit() {\n this.policyService\n .policyAppliesToActiveUser$(PolicyType.DisableSend)\n .pipe(takeUntil(this.destroy$))\n .subscribe((policyAppliesToActiveUser) => {\n this.disableSend = policyAppliesToActiveUser;\n });\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n async load(filter: (send: SendView) => boolean = null) {\n this.loading = true;\n this.sendService.sendViews$.pipe(takeUntil(this.destroy$)).subscribe((sends) => {\n this.sends = sends;\n });\n if (this.onSuccessfulLoad != null) {\n await this.onSuccessfulLoad();\n } else {\n // Default action\n this.selectAll();\n }\n this.loading = false;\n this.loaded = true;\n }\n\n async reload(filter: (send: SendView) => boolean = null) {\n this.loaded = false;\n this.sends = [];\n await this.load(filter);\n }\n\n async refresh() {\n try {\n this.refreshing = true;\n await this.reload(this.filter);\n } finally {\n this.refreshing = false;\n }\n }\n\n async applyFilter(filter: (send: SendView) => boolean = null) {\n this.filter = filter;\n await this.search(null);\n }\n\n async search(timeout: number = null) {\n this.searchPending = false;\n if (this.searchTimeout != null) {\n clearTimeout(this.searchTimeout);\n }\n if (timeout == null) {\n this.hasSearched = this.searchService.isSearchable(this.searchText);\n this.filteredSends = this.sends.filter((s) => this.filter == null || this.filter(s));\n this.applyTextSearch();\n return;\n }\n this.searchPending = true;\n this.searchTimeout = setTimeout(async () => {\n this.hasSearched = this.searchService.isSearchable(this.searchText);\n this.filteredSends = this.sends.filter((s) => this.filter == null || this.filter(s));\n this.applyTextSearch();\n this.searchPending = false;\n }, timeout);\n }\n\n async removePassword(s: SendView): Promise {\n if (this.actionPromise != null || s.password == null) {\n return;\n }\n\n const confirmed = await this.dialogService.openSimpleDialog({\n title: { key: \"removePassword\" },\n content: { key: \"removePasswordConfirmation\" },\n type: \"warning\",\n });\n\n if (!confirmed) {\n return false;\n }\n\n try {\n this.actionPromise = this.sendApiService.removePassword(s.id);\n await this.actionPromise;\n if (this.onSuccessfulRemovePassword != null) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.onSuccessfulRemovePassword();\n } else {\n // Default actions\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"removedPassword\"));\n await this.load();\n }\n } catch (e) {\n this.logService.error(e);\n }\n this.actionPromise = null;\n }\n\n async delete(s: SendView): Promise {\n if (this.actionPromise != null) {\n return false;\n }\n\n const confirmed = await this.dialogService.openSimpleDialog({\n title: { key: \"deleteSend\" },\n content: { key: \"deleteSendConfirmation\" },\n type: \"warning\",\n });\n\n if (!confirmed) {\n return false;\n }\n\n try {\n this.actionPromise = this.sendApiService.delete(s.id);\n await this.actionPromise;\n\n if (this.onSuccessfulDelete != null) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.onSuccessfulDelete();\n } else {\n // Default actions\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"deletedSend\"));\n await this.refresh();\n }\n } catch (e) {\n this.logService.error(e);\n }\n this.actionPromise = null;\n return true;\n }\n\n async copy(s: SendView) {\n const env = await firstValueFrom(this.environmentService.environment$);\n const link = env.getSendUrl() + s.accessId + \"/\" + s.urlB64Key;\n this.platformUtilsService.copyToClipboard(link);\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"valueCopied\", this.i18nService.t(\"sendLink\")),\n );\n }\n\n searchTextChanged() {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.search(200);\n }\n\n selectAll() {\n this.clearSelections();\n this.selectedAll = true;\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.applyFilter(null);\n }\n\n selectType(type: SendType) {\n this.clearSelections();\n this.selectedType = type;\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.applyFilter((s) => s.type === type);\n }\n\n clearSelections() {\n this.selectedAll = false;\n this.selectedType = null;\n }\n\n private applyTextSearch() {\n if (this.searchText != null) {\n this.filteredSends = this.searchService.searchSends(this.filteredSends, this.searchText);\n }\n }\n}\n","import { DatePipe } from \"@angular/common\";\nimport { Directive, EventEmitter, Input, OnDestroy, OnInit, Output } from \"@angular/core\";\nimport { FormBuilder, Validators } from \"@angular/forms\";\nimport { Subject, firstValueFrom, takeUntil, map, BehaviorSubject, concatMap } from \"rxjs\";\n\nimport { PolicyService } from \"@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction\";\nimport { PolicyType } from \"@bitwarden/common/admin-console/enums\";\nimport { BillingAccountProfileStateService } from \"@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service\";\nimport { EnvironmentService } from \"@bitwarden/common/platform/abstractions/environment.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\nimport { EncArrayBuffer } from \"@bitwarden/common/platform/models/domain/enc-array-buffer\";\nimport { SendType } from \"@bitwarden/common/tools/send/enums/send-type\";\nimport { Send } from \"@bitwarden/common/tools/send/models/domain/send\";\nimport { SendFileView } from \"@bitwarden/common/tools/send/models/view/send-file.view\";\nimport { SendTextView } from \"@bitwarden/common/tools/send/models/view/send-text.view\";\nimport { SendView } from \"@bitwarden/common/tools/send/models/view/send.view\";\nimport { SendApiService } from \"@bitwarden/common/tools/send/services/send-api.service.abstraction\";\nimport { SendService } from \"@bitwarden/common/tools/send/services/send.service.abstraction\";\nimport { DialogService } from \"@bitwarden/components\";\n\n// Value = hours\nenum DatePreset {\n OneHour = 1,\n OneDay = 24,\n TwoDays = 48,\n ThreeDays = 72,\n SevenDays = 168,\n ThirtyDays = 720,\n Custom = 0,\n Never = null,\n}\n\ninterface DatePresetSelectOption {\n name: string;\n value: DatePreset;\n}\n\n@Directive()\nexport class AddEditComponent implements OnInit, OnDestroy {\n @Input() sendId: string;\n @Input() type: SendType;\n\n @Output() onSavedSend = new EventEmitter();\n @Output() onDeletedSend = new EventEmitter();\n @Output() onCancelled = new EventEmitter();\n\n deletionDatePresets: DatePresetSelectOption[] = [\n { name: this.i18nService.t(\"oneHour\"), value: DatePreset.OneHour },\n { name: this.i18nService.t(\"oneDay\"), value: DatePreset.OneDay },\n { name: this.i18nService.t(\"days\", \"2\"), value: DatePreset.TwoDays },\n { name: this.i18nService.t(\"days\", \"3\"), value: DatePreset.ThreeDays },\n { name: this.i18nService.t(\"days\", \"7\"), value: DatePreset.SevenDays },\n { name: this.i18nService.t(\"days\", \"30\"), value: DatePreset.ThirtyDays },\n { name: this.i18nService.t(\"custom\"), value: DatePreset.Custom },\n ];\n\n expirationDatePresets: DatePresetSelectOption[] = [\n { name: this.i18nService.t(\"never\"), value: DatePreset.Never },\n ...this.deletionDatePresets,\n ];\n\n copyLink = false;\n disableSend = false;\n disableHideEmail = false;\n send: SendView;\n hasPassword: boolean;\n showPassword = false;\n formPromise: Promise;\n deletePromise: Promise;\n sendType = SendType;\n typeOptions: any[];\n canAccessPremium = true;\n emailVerified = true;\n alertShown = false;\n showOptions = false;\n\n protected componentName = \"\";\n private sendLinkBaseUrl: string;\n private destroy$ = new Subject();\n\n protected formGroup = this.formBuilder.group({\n name: [\"\", Validators.required],\n text: [],\n textHidden: [false],\n fileContents: [],\n file: [null, Validators.required],\n link: [],\n copyLink: false,\n maxAccessCount: [],\n accessCount: [],\n password: [],\n notes: [],\n hideEmail: false,\n disabled: false,\n type: [],\n defaultExpirationDateTime: [],\n defaultDeletionDateTime: [\"\", Validators.required],\n selectedDeletionDatePreset: [DatePreset.SevenDays, Validators.required],\n selectedExpirationDatePreset: [],\n });\n\n constructor(\n protected i18nService: I18nService,\n protected platformUtilsService: PlatformUtilsService,\n protected environmentService: EnvironmentService,\n protected datePipe: DatePipe,\n protected sendService: SendService,\n protected messagingService: MessagingService,\n protected policyService: PolicyService,\n protected logService: LogService,\n protected stateService: StateService,\n protected sendApiService: SendApiService,\n protected dialogService: DialogService,\n protected formBuilder: FormBuilder,\n protected billingAccountProfileStateService: BillingAccountProfileStateService,\n ) {\n this.typeOptions = [\n { name: i18nService.t(\"sendTypeFile\"), value: SendType.File, premium: true },\n { name: i18nService.t(\"sendTypeText\"), value: SendType.Text, premium: false },\n ];\n }\n\n get link(): string {\n if (this.send != null && this.send.id != null && this.send.accessId != null) {\n return this.sendLinkBaseUrl + this.send.accessId + \"/\" + this.send.urlB64Key;\n }\n return null;\n }\n\n get isSafari() {\n return this.platformUtilsService.isSafari();\n }\n\n get isDateTimeLocalSupported(): boolean {\n return !(this.platformUtilsService.isFirefox() || this.platformUtilsService.isSafari());\n }\n\n async ngOnInit() {\n this.policyService\n .policyAppliesToActiveUser$(PolicyType.DisableSend)\n .pipe(takeUntil(this.destroy$))\n .subscribe((policyAppliesToActiveUser) => {\n this.disableSend = policyAppliesToActiveUser;\n if (this.disableSend) {\n this.formGroup.disable();\n }\n });\n\n this.policyService\n .getAll$(PolicyType.SendOptions)\n .pipe(\n map((policies) => policies?.some((p) => p.data.disableHideEmail)),\n takeUntil(this.destroy$),\n )\n .subscribe((policyAppliesToActiveUser) => {\n if (\n (this.disableHideEmail = policyAppliesToActiveUser) &&\n !this.formGroup.controls.hideEmail.value\n ) {\n this.formGroup.controls.hideEmail.disable();\n } else {\n this.formGroup.controls.hideEmail.enable();\n }\n });\n\n this.formGroup.controls.type.valueChanges.pipe(takeUntil(this.destroy$)).subscribe((val) => {\n this.type = val;\n this.typeChanged();\n });\n\n this.formGroup.controls.selectedDeletionDatePreset.valueChanges\n .pipe(takeUntil(this.destroy$))\n .subscribe((datePreset) => {\n datePreset === DatePreset.Custom\n ? this.formGroup.controls.defaultDeletionDateTime.enable()\n : this.formGroup.controls.defaultDeletionDateTime.disable();\n });\n\n this.formGroup.controls.hideEmail.valueChanges\n .pipe(takeUntil(this.destroy$))\n .subscribe((val) => {\n if (!val && this.disableHideEmail && this.formGroup.controls.hideEmail.enabled) {\n this.formGroup.controls.hideEmail.disable();\n }\n });\n\n const env = await firstValueFrom(this.environmentService.environment$);\n this.sendLinkBaseUrl = env.getSendUrl();\n\n this.billingAccountProfileStateService.hasPremiumFromAnySource$\n .pipe(takeUntil(this.destroy$))\n .subscribe((hasPremiumFromAnySource) => {\n this.canAccessPremium = hasPremiumFromAnySource;\n });\n\n await this.load();\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n get editMode(): boolean {\n return this.sendId != null;\n }\n\n get title(): string {\n return this.i18nService.t(this.editMode ? \"editSend\" : \"createSend\");\n }\n\n async load() {\n this.emailVerified = await this.stateService.getEmailVerified();\n\n this.type = !this.canAccessPremium || !this.emailVerified ? SendType.Text : SendType.File;\n if (this.send == null) {\n const send = new BehaviorSubject(this.send);\n send.subscribe({\n next: (decryptedSend: SendView | undefined) => {\n if (!(decryptedSend instanceof SendView)) {\n return;\n }\n\n this.send = decryptedSend;\n decryptedSend.type = decryptedSend.type ?? this.type;\n this.type = this.send.type;\n this.updateFormValues();\n this.hasPassword = this.send.password != null && this.send.password.trim() !== \"\";\n },\n error: (error: unknown) => {\n const errorMessage = (error as Error).message ?? \"An unknown error occurred\";\n this.logService.error(\"Failed to decrypt send: \" + errorMessage);\n },\n });\n\n if (this.editMode) {\n this.sendService\n .get$(this.sendId)\n .pipe(\n //Promise.reject will complete the BehaviourSubject, if desktop starts relying only on BehaviourSubject, this should be changed.\n concatMap((s) =>\n s instanceof Send ? s.decrypt() : Promise.reject(new Error(\"Failed to load send.\")),\n ),\n takeUntil(this.destroy$),\n )\n .subscribe(send);\n } else {\n const sendView = new SendView();\n sendView.type = this.type;\n sendView.file = new SendFileView();\n sendView.text = new SendTextView();\n sendView.deletionDate = new Date();\n sendView.deletionDate.setDate(sendView.deletionDate.getDate() + 7);\n send.next(sendView);\n }\n }\n }\n\n async submit(): Promise {\n this.formGroup.markAllAsTouched();\n\n if (this.disableSend) {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"sendDisabledWarning\"),\n );\n return false;\n }\n\n this.send.name = this.formGroup.controls.name.value;\n this.send.text.text = this.formGroup.controls.text.value;\n this.send.text.hidden = this.formGroup.controls.textHidden.value;\n this.send.maxAccessCount = this.formGroup.controls.maxAccessCount.value;\n this.send.accessCount = this.formGroup.controls.accessCount.value;\n this.send.password = this.formGroup.controls.password.value;\n this.send.notes = this.formGroup.controls.notes.value;\n this.send.hideEmail = this.formGroup.controls.hideEmail.value;\n this.send.disabled = this.formGroup.controls.disabled.value;\n this.send.type = this.type;\n\n if (Utils.isNullOrWhitespace(this.send.name)) {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"nameRequired\"),\n );\n return false;\n }\n\n let file: File = null;\n if (this.type === SendType.File && !this.editMode) {\n const fileEl = document.getElementById(\"file\") as HTMLInputElement;\n const files = fileEl.files;\n if (files == null || files.length === 0) {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"selectFile\"),\n );\n return;\n }\n\n file = files[0];\n if (files[0].size > 524288000) {\n // 500 MB\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"maxFileSize\"),\n );\n return;\n }\n }\n\n if (Utils.isNullOrWhitespace(this.send.password)) {\n this.send.password = null;\n }\n\n this.formPromise = this.encryptSend(file).then(async (encSend) => {\n const uploadPromise = this.sendApiService.save(encSend);\n await uploadPromise;\n if (this.send.id == null) {\n this.send.id = encSend[0].id;\n }\n if (this.send.accessId == null) {\n this.send.accessId = encSend[0].accessId;\n }\n this.onSavedSend.emit(this.send);\n if (this.formGroup.controls.copyLink.value && this.link != null) {\n await this.handleCopyLinkToClipboard();\n return;\n }\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(this.editMode ? \"editedSend\" : \"createdSend\"),\n );\n });\n try {\n await this.formPromise;\n return true;\n } catch (e) {\n this.logService.error(e);\n }\n return false;\n }\n\n async copyLinkToClipboard(link: string): Promise {\n return Promise.resolve(this.platformUtilsService.copyToClipboard(link));\n }\n\n protected async delete(): Promise {\n if (this.deletePromise != null) {\n return false;\n }\n\n const confirmed = await this.dialogService.openSimpleDialog({\n title: { key: \"deleteSend\" },\n content: { key: \"deleteSendConfirmation\" },\n type: \"warning\",\n });\n\n if (!confirmed) {\n return false;\n }\n\n try {\n this.deletePromise = this.sendApiService.delete(this.send.id);\n await this.deletePromise;\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"deletedSend\"));\n await this.load();\n this.onDeletedSend.emit(this.send);\n return true;\n } catch (e) {\n this.logService.error(e);\n }\n\n return false;\n }\n\n typeChanged() {\n if (this.type === SendType.File && !this.alertShown) {\n if (!this.canAccessPremium) {\n this.alertShown = true;\n this.messagingService.send(\"premiumRequired\");\n } else if (!this.emailVerified) {\n this.alertShown = true;\n this.messagingService.send(\"emailVerificationRequired\");\n }\n }\n this.type === SendType.Text || this.editMode\n ? this.formGroup.controls.file.disable()\n : this.formGroup.controls.file.enable();\n }\n\n toggleOptions() {\n this.showOptions = !this.showOptions;\n }\n\n protected loadSend(): Promise {\n return firstValueFrom(this.sendService.get$(this.sendId));\n }\n\n protected async encryptSend(file: File): Promise<[Send, EncArrayBuffer]> {\n const sendData = await this.sendService.encrypt(this.send, file, this.send.password, null);\n\n // Parse dates\n try {\n sendData[0].deletionDate =\n this.formattedDeletionDate == null ? null : new Date(this.formattedDeletionDate);\n } catch {\n sendData[0].deletionDate = null;\n }\n try {\n sendData[0].expirationDate =\n this.formattedExpirationDate == null ? null : new Date(this.formattedExpirationDate);\n } catch {\n sendData[0].expirationDate = null;\n }\n\n return sendData;\n }\n\n protected togglePasswordVisible() {\n this.showPassword = !this.showPassword;\n document.getElementById(\"password\").focus();\n }\n\n updateFormValues() {\n this.formGroup.patchValue({\n name: this.send?.name ?? \"\",\n text: this.send?.text?.text ?? \"\",\n textHidden: this.send?.text?.hidden ?? false,\n link: this.link ?? \"\",\n maxAccessCount: this.send?.maxAccessCount,\n accessCount: this.send?.accessCount ?? 0,\n notes: this.send?.notes ?? \"\",\n hideEmail: this.send?.hideEmail ?? false,\n disabled: this.send?.disabled ?? false,\n type: this.send.type ?? this.type,\n password: null,\n\n selectedDeletionDatePreset: this.editMode ? DatePreset.Custom : DatePreset.SevenDays,\n selectedExpirationDatePreset: this.editMode ? DatePreset.Custom : DatePreset.Never,\n defaultExpirationDateTime:\n this.send.expirationDate != null\n ? this.datePipe.transform(new Date(this.send.expirationDate), \"yyyy-MM-ddTHH:mm\")\n : null,\n defaultDeletionDateTime: this.datePipe.transform(\n new Date(this.send.deletionDate),\n \"yyyy-MM-ddTHH:mm\",\n ),\n });\n\n if (this.send.hideEmail) {\n this.formGroup.controls.hideEmail.enable();\n }\n }\n\n private async handleCopyLinkToClipboard() {\n const copySuccess = await this.copyLinkToClipboard(this.link);\n if (copySuccess ?? true) {\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(this.editMode ? \"editedSend\" : \"createdSend\"),\n );\n } else {\n await this.dialogService.openSimpleDialog({\n title: \"\",\n content: { key: this.editMode ? \"editedSend\" : \"createdSend\" },\n acceptButtonText: { key: \"ok\" },\n cancelButtonText: null,\n type: \"success\",\n });\n\n await this.copyLinkToClipboard(this.link);\n }\n }\n\n clearExpiration() {\n this.formGroup.controls.defaultExpirationDateTime.patchValue(null);\n }\n\n get formattedExpirationDate(): string {\n switch (this.formGroup.controls.selectedExpirationDatePreset.value as DatePreset) {\n case DatePreset.Never:\n return null;\n case DatePreset.Custom:\n if (!this.formGroup.controls.defaultExpirationDateTime.value) {\n return null;\n }\n return this.formGroup.controls.defaultExpirationDateTime.value;\n default: {\n const now = new Date();\n const milliseconds = now.setTime(\n now.getTime() +\n (this.formGroup.controls.selectedExpirationDatePreset.value as number) * 60 * 60 * 1000,\n );\n return new Date(milliseconds).toString();\n }\n }\n }\n\n get formattedDeletionDate(): string {\n switch (this.formGroup.controls.selectedDeletionDatePreset.value as DatePreset) {\n case DatePreset.Never:\n this.formGroup.controls.selectedDeletionDatePreset.patchValue(DatePreset.SevenDays);\n return this.formattedDeletionDate;\n case DatePreset.Custom:\n return this.formGroup.controls.defaultDeletionDateTime.value;\n default: {\n const now = new Date();\n const milliseconds = now.setTime(\n now.getTime() +\n (this.formGroup.controls.selectedDeletionDatePreset.value as number) * 60 * 60 * 1000,\n );\n return new Date(milliseconds).toString();\n }\n }\n }\n}\n","\n \n \n {{ title }}\n \n \n \n {{ \"sendDisabledWarning\" | i18n }}\n \n \n {{ \"sendOptionsPolicyInEffect\" | i18n }}\n
    \n
  • {{ \"sendDisableHideEmailInEffect\" | i18n }}
  • \n
\n
\n \n {{ \"name\" | i18n }}\n \n {{ \"sendNameDesc\" | i18n }}\n \n
\n \n {{ \"whatTypeOfSend\" | i18n }}\n\n \n \n {{ o.name }}\n \n \n \n \n
\n \n \n \n {{ \"sendTypeText\" | i18n }}\n \n {{ \"sendTextDesc\" | i18n }}\n \n \n \n {{ \"textHiddenByDefault\" | i18n }}\n \n \n \n \n
\n
\n {{ \"file\" | i18n }}\n

\n {{ send.file.fileName }} ({{ send.file.sizeName }})\n

\n
\n \n {{ \"file\" | i18n }}\n
\n \n {{ selectedFile?.name ?? (\"noFileChosen\" | i18n) }}\n
\n \n {{ \"sendFileDesc\" | i18n }} {{ \"maxFileSize\" | i18n }}\n
\n
\n
\n

{{ \"share\" | i18n }}

\n\n \n {{ \"sendLinkLabel\" | i18n }}\n \n \n\n \n \n {{ \"copySendLinkOnSave\" | i18n }}\n \n
\n

\n \n

\n
\n
\n
\n
\n \n {{ \"deletionDate\" | i18n }}\n \n \n \n \n \n \n {{ \"deletionDateDesc\" | i18n }}\n \n
\n
\n \n {{ \"deletionDate\" | i18n }}\n \n {{ \"deletionDateDesc\" | i18n }}\n \n
\n
\n \n \n {{ \"expirationDate\" | i18n }}\n \n \n \n \n \n \n \n {{ \"expirationDateDesc\" | i18n }}\n \n
\n
\n \n \n {{ \"expirationDate\" | i18n }}\n\n \n {{ \"clear\" | i18n }}\n \n \n \n {{ \"expirationDateDesc\" | i18n }}\n \n
\n
\n
\n \n {{ \"maxAccessCount\" | i18n }}\n \n {{ \"maxAccessCountDesc\" | i18n }}\n \n \n {{ \"currentAccessCount\" | i18n }}\n \n \n
\n
\n \n {{ \"password\" | i18n }}\n {{ \"newPassword\" | i18n }}\n\n \n \n {{ \"sendPasswordDesc\" | i18n }}\n \n
\n \n {{ \"notes\" | i18n }}\n \n {{ \"sendNotesDesc\" | i18n }}\n \n\n \n \n {{ \"hideEmail\" | i18n }}\n \n\n \n \n {{ \"disableThisSend\" | i18n }}\n \n
\n
\n \n \n {{ \"save\" | i18n }}\n \n \n {{ \"cancel\" | i18n }}\n \n\n \n \n
\n\n","import { DIALOG_DATA, DialogRef } from \"@angular/cdk/dialog\";\nimport { DatePipe } from \"@angular/common\";\nimport { Component, Inject } from \"@angular/core\";\nimport { FormBuilder } from \"@angular/forms\";\n\nimport { AddEditComponent as BaseAddEditComponent } from \"@bitwarden/angular/tools/send/add-edit.component\";\nimport { PolicyService } from \"@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction\";\nimport { BillingAccountProfileStateService } from \"@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service\";\nimport { EnvironmentService } from \"@bitwarden/common/platform/abstractions/environment.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { SendApiService } from \"@bitwarden/common/tools/send/services/send-api.service.abstraction\";\nimport { SendService } from \"@bitwarden/common/tools/send/services/send.service.abstraction\";\nimport { DialogService } from \"@bitwarden/components\";\n\n@Component({\n selector: \"app-send-add-edit\",\n templateUrl: \"add-edit.component.html\",\n})\nexport class AddEditComponent extends BaseAddEditComponent {\n override componentName = \"app-send-add-edit\";\n protected selectedFile: File;\n\n constructor(\n i18nService: I18nService,\n platformUtilsService: PlatformUtilsService,\n environmentService: EnvironmentService,\n datePipe: DatePipe,\n sendService: SendService,\n stateService: StateService,\n messagingService: MessagingService,\n policyService: PolicyService,\n logService: LogService,\n sendApiService: SendApiService,\n dialogService: DialogService,\n formBuilder: FormBuilder,\n billingAccountProfileStateService: BillingAccountProfileStateService,\n protected dialogRef: DialogRef,\n @Inject(DIALOG_DATA) params: { sendId: string },\n ) {\n super(\n i18nService,\n platformUtilsService,\n environmentService,\n datePipe,\n sendService,\n messagingService,\n policyService,\n logService,\n stateService,\n sendApiService,\n dialogService,\n formBuilder,\n billingAccountProfileStateService,\n );\n\n this.sendId = params.sendId;\n }\n\n async copyLinkToClipboard(link: string): Promise {\n // Copy function on web depends on the modal being open or not. Since this event occurs during a transition\n // of the modal closing we need to add a small delay to make sure state of the DOM is consistent.\n return new Promise((resolve) => {\n window.setTimeout(() => resolve(super.copyLinkToClipboard(link)), 500);\n });\n }\n\n protected setSelectedFile(event: Event) {\n const fileInputEl = event.target;\n const file = fileInputEl.files.length > 0 ? fileInputEl.files[0] : null;\n this.selectedFile = file;\n }\n\n submitAndClose = async () => {\n this.formGroup.markAllAsTouched();\n if (this.formGroup.invalid) {\n return;\n }\n\n const success = await this.submit();\n if (success) {\n this.dialogRef.close();\n }\n };\n\n deleteAndClose = async () => {\n const success = await this.delete();\n if (success) {\n this.dialogRef.close();\n }\n };\n}\n","import { svgIcon } from \"@bitwarden/components\";\n\nexport const NoSend = svgIcon`\n \n \n \n \n \n \n \n \n \n `;\n","\n \n \n \n \n {{ \"loading\" | i18n }}\n \n \n \n\n \n\n\n\n {{ \"sendDisabledWarning\" | i18n }}\n\n
\n
\n
\n
\n {{ \"filters\" | i18n }}\n
\n
\n
\n \n
\n
\n
    \n
  • \n \n \n \n
  • \n
\n
\n
\n
\n

{{ \"types\" | i18n }}

\n
\n
    \n
  • \n \n \n {{ \"sendTypeText\" | i18n }}\n \n \n
  • \n
  • \n \n \n {{ \"sendTypeFile\" | i18n }}\n \n \n
  • \n
\n
\n
\n
\n
\n
\n \n \n \n \n {{ \"name\" | i18n }}\n {{ \"deletionDate\" | i18n }}\n {{ \"options\" | i18n }}\n \n \n \n \n \n \n \n \n \n \n \n \n {{ \"disabled\" | i18n }}\n \n \n \n {{ \"password\" | i18n }}\n \n \n \n {{ \"maxAccessCountReached\" | i18n }}\n \n \n \n {{ \"expired\" | i18n }}\n \n \n \n {{ \"pendingDeletion\" | i18n }}\n \n \n \n {{ s.deletionDate | date: \"medium\" }}\n \n \n \n \n \n \n \n {{ \"removePassword\" | i18n }}\n \n \n \n \n \n \n \n
\n \n \n {{ \"loading\" | i18n }}\n \n \n \n {{ \"sendsNoItemsTitle\" | i18n }}\n {{ \"sendsNoItemsMessage\" | i18n }}\n \n \n \n
\n
\n
\n\n","import { Component, NgZone, ViewChild, ViewContainerRef } from \"@angular/core\";\nimport { lastValueFrom } from \"rxjs\";\n\nimport { SendComponent as BaseSendComponent } from \"@bitwarden/angular/tools/send/send.component\";\nimport { SearchService } from \"@bitwarden/common/abstractions/search.service\";\nimport { PolicyService } from \"@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction\";\nimport { BroadcasterService } from \"@bitwarden/common/platform/abstractions/broadcaster.service\";\nimport { EnvironmentService } from \"@bitwarden/common/platform/abstractions/environment.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { SendView } from \"@bitwarden/common/tools/send/models/view/send.view\";\nimport { SendApiService } from \"@bitwarden/common/tools/send/services/send-api.service.abstraction\";\nimport { SendService } from \"@bitwarden/common/tools/send/services/send.service.abstraction\";\nimport { DialogService, NoItemsModule, SearchModule, TableDataSource } from \"@bitwarden/components\";\n\nimport { HeaderModule } from \"../../layouts/header/header.module\";\nimport { SharedModule } from \"../../shared\";\n\nimport { AddEditComponent } from \"./add-edit.component\";\nimport { NoSend } from \"./icons/no-send.icon\";\n\nconst BroadcasterSubscriptionId = \"SendComponent\";\n\n@Component({\n selector: \"app-send\",\n standalone: true,\n imports: [SharedModule, SearchModule, NoItemsModule, HeaderModule],\n templateUrl: \"send.component.html\",\n})\nexport class SendComponent extends BaseSendComponent {\n @ViewChild(\"sendAddEdit\", { read: ViewContainerRef, static: true })\n sendAddEditModalRef: ViewContainerRef;\n noItemIcon = NoSend;\n\n override set filteredSends(filteredSends: SendView[]) {\n super.filteredSends = filteredSends;\n this.dataSource.data = filteredSends;\n }\n\n override get filteredSends() {\n return super.filteredSends;\n }\n\n protected dataSource = new TableDataSource();\n\n constructor(\n sendService: SendService,\n i18nService: I18nService,\n platformUtilsService: PlatformUtilsService,\n environmentService: EnvironmentService,\n ngZone: NgZone,\n searchService: SearchService,\n policyService: PolicyService,\n private broadcasterService: BroadcasterService,\n logService: LogService,\n sendApiService: SendApiService,\n dialogService: DialogService,\n ) {\n super(\n sendService,\n i18nService,\n platformUtilsService,\n environmentService,\n ngZone,\n searchService,\n policyService,\n logService,\n sendApiService,\n dialogService,\n );\n }\n\n async ngOnInit() {\n await super.ngOnInit();\n await this.load();\n\n // Broadcaster subscription - load if sync completes in the background\n this.broadcasterService.subscribe(BroadcasterSubscriptionId, (message: any) => {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.ngZone.run(async () => {\n switch (message.command) {\n case \"syncCompleted\":\n if (message.successfully) {\n await this.load();\n }\n break;\n }\n });\n });\n }\n\n ngOnDestroy() {\n this.broadcasterService.unsubscribe(BroadcasterSubscriptionId);\n }\n\n async addSend() {\n if (this.disableSend) {\n return;\n }\n\n await this.editSend(null);\n }\n\n async editSend(send: SendView) {\n const dialog = this.dialogService.open(AddEditComponent, {\n data: {\n sendId: send == null ? null : send.id,\n },\n });\n\n await lastValueFrom(dialog.closed);\n await this.load();\n }\n}\n","import { NgModule } from \"@angular/core\";\n\nimport { SharedModule } from \"../../../shared\";\n\nimport { BulkDeleteDialogComponent } from \"./bulk-delete-dialog/bulk-delete-dialog.component\";\nimport { BulkMoveDialogComponent } from \"./bulk-move-dialog/bulk-move-dialog.component\";\nimport { BulkShareDialogComponent } from \"./bulk-share-dialog/bulk-share-dialog.component\";\n\n@NgModule({\n imports: [SharedModule],\n declarations: [BulkDeleteDialogComponent, BulkMoveDialogComponent, BulkShareDialogComponent],\n exports: [BulkDeleteDialogComponent, BulkMoveDialogComponent, BulkShareDialogComponent],\n})\nexport class BulkDialogsModule {}\n","import { Observable } from \"rxjs\";\n\nimport { VaultOnboardingTasks } from \"../vault-onboarding.service\";\n\nexport abstract class VaultOnboardingService {\n vaultOnboardingState$: Observable;\n abstract setVaultOnboardingTasks(newState: VaultOnboardingTasks): Promise;\n}\n","import { Injectable } from \"@angular/core\";\nimport { Observable } from \"rxjs\";\n\nimport {\n ActiveUserState,\n KeyDefinition,\n StateProvider,\n VAULT_ONBOARDING,\n} from \"@bitwarden/common/platform/state\";\n\nimport { VaultOnboardingService as VaultOnboardingServiceAbstraction } from \"./abstraction/vault-onboarding.service\";\n\nexport type VaultOnboardingTasks = {\n createAccount: boolean;\n importData: boolean;\n installExtension: boolean;\n};\n\nconst VAULT_ONBOARDING_KEY = new KeyDefinition(VAULT_ONBOARDING, \"tasks\", {\n deserializer: (jsonData) => jsonData,\n});\n\n@Injectable()\nexport class VaultOnboardingService implements VaultOnboardingServiceAbstraction {\n private vaultOnboardingState: ActiveUserState;\n vaultOnboardingState$: Observable;\n\n constructor(private stateProvider: StateProvider) {\n this.vaultOnboardingState = this.stateProvider.getActive(VAULT_ONBOARDING_KEY);\n this.vaultOnboardingState$ = this.vaultOnboardingState.state$;\n }\n\n async setVaultOnboardingTasks(newState: VaultOnboardingTasks): Promise {\n await this.vaultOnboardingState.update(() => {\n return { ...newState };\n });\n }\n}\n","const VaultOnboardingMessages = {\n HasBwInstalled: \"hasBwInstalled\",\n checkBwInstalled: \"checkIfBWExtensionInstalled\",\n} as const;\n\nexport { VaultOnboardingMessages };\n","\n \n \n\n \n

\n {{ \"onboardingImportDataDetailsPartOne\" | i18n }}\n \n \n {{ \"onboardingImportDataDetailsPartTwoNoOrgs\" | i18n }}\n \n

\n \n\n \n \n {{ \"installBrowserExtensionDetails\" | i18n }}\n \n \n \n\n","import { CommonModule } from \"@angular/common\";\nimport {\n Component,\n OnInit,\n Input,\n Output,\n EventEmitter,\n OnDestroy,\n SimpleChanges,\n OnChanges,\n} from \"@angular/core\";\nimport { Subject, takeUntil, Observable, firstValueFrom, fromEvent } from \"rxjs\";\n\nimport { JslibModule } from \"@bitwarden/angular/jslib.module\";\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { PolicyService } from \"@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction\";\nimport { PolicyType } from \"@bitwarden/common/admin-console/enums\";\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\nimport { FeatureFlag } from \"@bitwarden/common/enums/feature-flag.enum\";\nimport { ConfigServiceAbstraction } from \"@bitwarden/common/platform/abstractions/config/config.service.abstraction\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { VaultOnboardingMessages } from \"@bitwarden/common/vault/enums/vault-onboarding.enum\";\nimport { CipherView } from \"@bitwarden/common/vault/models/view/cipher.view\";\nimport { LinkModule } from \"@bitwarden/components\";\n\nimport { OnboardingModule } from \"../../../shared/components/onboarding/onboarding.module\";\n\nimport { VaultOnboardingService as VaultOnboardingServiceAbstraction } from \"./services/abstraction/vault-onboarding.service\";\nimport { VaultOnboardingTasks } from \"./services/vault-onboarding.service\";\n\n@Component({\n standalone: true,\n imports: [OnboardingModule, CommonModule, JslibModule, LinkModule],\n selector: \"app-vault-onboarding\",\n templateUrl: \"vault-onboarding.component.html\",\n})\nexport class VaultOnboardingComponent implements OnInit, OnChanges, OnDestroy {\n @Input() ciphers: CipherView[];\n @Input() orgs: Organization[];\n @Output() onAddCipher = new EventEmitter();\n\n extensionUrl: string;\n isIndividualPolicyVault: boolean;\n private destroy$ = new Subject();\n isNewAccount: boolean;\n private readonly onboardingReleaseDate = new Date(\"2024-04-02\");\n showOnboardingAccess$: Observable;\n\n protected currentTasks: VaultOnboardingTasks;\n\n protected onboardingTasks$: Observable;\n protected showOnboarding = false;\n\n constructor(\n protected platformUtilsService: PlatformUtilsService,\n protected policyService: PolicyService,\n private apiService: ApiService,\n private configService: ConfigServiceAbstraction,\n private vaultOnboardingService: VaultOnboardingServiceAbstraction,\n ) {}\n\n async ngOnInit() {\n this.showOnboardingAccess$ = await this.configService.getFeatureFlag$(\n FeatureFlag.VaultOnboarding,\n false,\n );\n this.onboardingTasks$ = this.vaultOnboardingService.vaultOnboardingState$;\n await this.setOnboardingTasks();\n this.setInstallExtLink();\n this.individualVaultPolicyCheck();\n this.checkForBrowserExtension();\n }\n\n async ngOnChanges(changes: SimpleChanges) {\n if (this.showOnboarding && changes?.ciphers) {\n const currentTasks = await firstValueFrom(this.onboardingTasks$);\n const updatedTasks = {\n createAccount: true,\n importData: this.ciphers.length > 0,\n installExtension: currentTasks.installExtension,\n };\n await this.vaultOnboardingService.setVaultOnboardingTasks(updatedTasks);\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n checkForBrowserExtension() {\n if (this.showOnboarding) {\n fromEvent(window, \"message\")\n .pipe(takeUntil(this.destroy$))\n .subscribe((event) => {\n void this.getMessages(event);\n });\n\n window.postMessage({ command: VaultOnboardingMessages.checkBwInstalled });\n }\n }\n\n async getMessages(event: any) {\n if (event.data.command === VaultOnboardingMessages.HasBwInstalled && this.showOnboarding) {\n const currentTasks = await firstValueFrom(this.onboardingTasks$);\n const updatedTasks = {\n createAccount: currentTasks.createAccount,\n importData: currentTasks.importData,\n installExtension: true,\n };\n await this.vaultOnboardingService.setVaultOnboardingTasks(updatedTasks);\n }\n }\n\n async checkCreationDate() {\n const userProfile = await this.apiService.getProfile();\n const profileCreationDate = new Date(userProfile.creationDate);\n\n this.isNewAccount = this.onboardingReleaseDate < profileCreationDate ? true : false;\n\n if (!this.isNewAccount) {\n await this.hideOnboarding();\n }\n }\n\n protected async hideOnboarding() {\n await this.saveCompletedTasks({\n createAccount: true,\n importData: true,\n installExtension: true,\n });\n }\n\n async setOnboardingTasks() {\n const currentTasks = await firstValueFrom(this.onboardingTasks$);\n if (currentTasks == null) {\n const freshStart = {\n createAccount: true,\n importData: this.ciphers?.length > 0,\n installExtension: false,\n };\n await this.saveCompletedTasks(freshStart);\n } else if (currentTasks) {\n this.showOnboarding = Object.values(currentTasks).includes(false);\n }\n\n if (this.showOnboarding) {\n await this.checkCreationDate();\n }\n }\n\n private async saveCompletedTasks(vaultTasks: VaultOnboardingTasks) {\n this.showOnboarding = Object.values(vaultTasks).includes(false);\n await this.vaultOnboardingService.setVaultOnboardingTasks(vaultTasks);\n }\n\n individualVaultPolicyCheck() {\n this.policyService\n .policyAppliesToActiveUser$(PolicyType.PersonalOwnership)\n .pipe(takeUntil(this.destroy$))\n .subscribe((data) => {\n this.isIndividualPolicyVault = data;\n });\n }\n\n emitToAddCipher() {\n this.onAddCipher.emit();\n }\n\n setInstallExtLink() {\n if (this.platformUtilsService.isChrome()) {\n this.extensionUrl =\n \"https://chrome.google.com/webstore/detail/bitwarden-free-password-m/nngceckbapebfimnlniiiahkandclblb\";\n } else if (this.platformUtilsService.isFirefox()) {\n this.extensionUrl =\n \"https://addons.mozilla.org/en-US/firefox/addon/bitwarden-password-manager/\";\n } else if (this.platformUtilsService.isSafari()) {\n this.extensionUrl = \"https://apps.apple.com/us/app/bitwarden/id1352778147?mt=12\";\n } else if (this.platformUtilsService.isOpera()) {\n this.extensionUrl =\n \"https://addons.opera.com/extensions/details/bitwarden-free-password-manager/\";\n } else if (this.platformUtilsService.isEdge()) {\n this.extensionUrl =\n \"https://microsoftedge.microsoft.com/addons/detail/jbkfoedolllekgbhcbcoahefnbanhhlh\";\n } else {\n this.extensionUrl = \"https://bitwarden.com/download/#downloads-web-browser\";\n }\n }\n\n navigateToExtension() {\n window.open(this.extensionUrl, \"_blank\");\n }\n}\n","import { DialogConfig, DialogRef, DIALOG_DATA } from \"@angular/cdk/dialog\";\nimport { Component, Inject, OnInit } from \"@angular/core\";\nimport { FormBuilder, Validators } from \"@angular/forms\";\nimport { firstValueFrom, Observable } from \"rxjs\";\n\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { CipherService } from \"@bitwarden/common/vault/abstractions/cipher.service\";\nimport { FolderService } from \"@bitwarden/common/vault/abstractions/folder/folder.service.abstraction\";\nimport { FolderView } from \"@bitwarden/common/vault/models/view/folder.view\";\nimport { DialogService } from \"@bitwarden/components\";\n\nexport interface BulkMoveDialogParams {\n cipherIds?: string[];\n}\n\nexport enum BulkMoveDialogResult {\n Moved = \"moved\",\n Canceled = \"canceled\",\n}\n\n/**\n * Strongly typed helper to open a BulkMoveDialog\n * @param dialogService Instance of the dialog service that will be used to open the dialog\n * @param config Configuration for the dialog\n */\nexport const openBulkMoveDialog = (\n dialogService: DialogService,\n config: DialogConfig,\n) => {\n return dialogService.open(\n BulkMoveDialogComponent,\n config,\n );\n};\n\n@Component({\n templateUrl: \"bulk-move-dialog.component.html\",\n})\nexport class BulkMoveDialogComponent implements OnInit {\n cipherIds: string[] = [];\n\n formGroup = this.formBuilder.group({\n folderId: [\"\", [Validators.required]],\n });\n folders$: Observable;\n\n constructor(\n @Inject(DIALOG_DATA) params: BulkMoveDialogParams,\n private dialogRef: DialogRef,\n private cipherService: CipherService,\n private platformUtilsService: PlatformUtilsService,\n private i18nService: I18nService,\n private folderService: FolderService,\n private formBuilder: FormBuilder,\n ) {\n this.cipherIds = params.cipherIds ?? [];\n }\n\n async ngOnInit() {\n this.folders$ = this.folderService.folderViews$;\n this.formGroup.patchValue({\n folderId: (await firstValueFrom(this.folders$))[0].id,\n });\n }\n\n protected cancel() {\n this.close(BulkMoveDialogResult.Canceled);\n }\n\n protected submit = async () => {\n if (this.formGroup.invalid) {\n return;\n }\n\n await this.cipherService.moveManyWithServer(this.cipherIds, this.formGroup.value.folderId);\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"movedItems\"));\n this.close(BulkMoveDialogResult.Moved);\n };\n\n private close(result: BulkMoveDialogResult) {\n this.dialogRef.close(result);\n }\n}\n","
\n \n \n {{ \"moveSelected\" | i18n }}\n \n \n

{{ \"moveSelectedItemsDesc\" | i18n: cipherIds.length }}

\n \n {{ \"folder\" | i18n }}\n \n \n
\n \n \n \n \n
\n
\n","type CheckableBase = {\n checked?: boolean;\n};\n\nexport type Checkable = T & CheckableBase;\n\nexport function isChecked(item: CheckableBase): boolean {\n return !!item.checked;\n}\n","import { DialogConfig, DialogRef, DIALOG_DATA } from \"@angular/cdk/dialog\";\nimport { Component, Inject, OnInit } from \"@angular/core\";\n\nimport { OrganizationService } from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { Checkable, isChecked } from \"@bitwarden/common/types/checkable\";\nimport { CipherService } from \"@bitwarden/common/vault/abstractions/cipher.service\";\nimport { CollectionService } from \"@bitwarden/common/vault/abstractions/collection.service\";\nimport { CipherView } from \"@bitwarden/common/vault/models/view/cipher.view\";\nimport { CollectionView } from \"@bitwarden/common/vault/models/view/collection.view\";\nimport { DialogService } from \"@bitwarden/components\";\n\nexport interface BulkShareDialogParams {\n ciphers: CipherView[];\n organizationId?: string;\n}\n\nexport enum BulkShareDialogResult {\n Shared = \"shared\",\n Canceled = \"canceled\",\n}\n\n/**\n * Strongly typed helper to open a BulkShareDialog\n * @param dialogService Instance of the dialog service that will be used to open the dialog\n * @param config Configuration for the dialog\n */\nexport const openBulkShareDialog = (\n dialogService: DialogService,\n config: DialogConfig,\n) => {\n return dialogService.open(\n BulkShareDialogComponent,\n config,\n );\n};\n\n@Component({\n templateUrl: \"bulk-share-dialog.component.html\",\n})\nexport class BulkShareDialogComponent implements OnInit {\n ciphers: CipherView[] = [];\n organizationId: string;\n\n nonShareableCount = 0;\n collections: Checkable[] = [];\n organizations: Organization[] = [];\n shareableCiphers: CipherView[] = [];\n\n private writeableCollections: CollectionView[] = [];\n\n constructor(\n @Inject(DIALOG_DATA) params: BulkShareDialogParams,\n private dialogRef: DialogRef,\n private cipherService: CipherService,\n private platformUtilsService: PlatformUtilsService,\n private i18nService: I18nService,\n private collectionService: CollectionService,\n private organizationService: OrganizationService,\n private logService: LogService,\n ) {\n this.ciphers = params.ciphers ?? [];\n this.organizationId = params.organizationId;\n }\n\n async ngOnInit() {\n this.shareableCiphers = this.ciphers.filter(\n (c) => !c.hasOldAttachments && c.organizationId == null,\n );\n this.nonShareableCount = this.ciphers.length - this.shareableCiphers.length;\n const allCollections = await this.collectionService.getAllDecrypted();\n this.writeableCollections = allCollections.filter((c) => !c.readOnly);\n this.organizations = await this.organizationService.getAll();\n if (this.organizationId == null && this.organizations.length > 0) {\n this.organizationId = this.organizations[0].id;\n }\n this.filterCollections();\n }\n\n ngOnDestroy() {\n this.selectAll(false);\n }\n\n filterCollections() {\n this.selectAll(false);\n if (this.organizationId == null || this.writeableCollections.length === 0) {\n this.collections = [];\n } else {\n this.collections = this.writeableCollections.filter(\n (c) => c.organizationId === this.organizationId,\n );\n }\n }\n\n submit = async () => {\n const checkedCollectionIds = this.collections.filter(isChecked).map((c) => c.id);\n try {\n await this.cipherService.shareManyWithServer(\n this.shareableCiphers,\n this.organizationId,\n checkedCollectionIds,\n );\n const orgName =\n this.organizations.find((o) => o.id === this.organizationId)?.name ??\n this.i18nService.t(\"organization\");\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"movedItemsToOrg\", orgName),\n );\n this.close(BulkShareDialogResult.Shared);\n } catch (e) {\n this.logService.error(e);\n }\n };\n\n check(c: Checkable, select?: boolean) {\n c.checked = select == null ? !c.checked : select;\n }\n\n selectAll(select: boolean) {\n const collections = select ? this.collections : this.writeableCollections;\n collections.forEach((c) => this.check(c, select));\n }\n\n get canSave() {\n if (\n this.shareableCiphers != null &&\n this.shareableCiphers.length > 0 &&\n this.collections != null\n ) {\n for (let i = 0; i < this.collections.length; i++) {\n if (this.collections[i].checked) {\n return true;\n }\n }\n }\n return false;\n }\n\n protected cancel() {\n this.close(BulkShareDialogResult.Canceled);\n }\n\n private close(result: BulkShareDialogResult) {\n this.dialogRef.close(result);\n }\n}\n","\n \n {{ \"moveSelectedToOrg\" | i18n }}\n \n \n

{{ \"moveManyToOrgDesc\" | i18n }}

\n

\n {{\n \"moveSelectedItemsCountDesc\"\n | i18n: this.ciphers.length : shareableCiphers.length : nonShareableCount\n }}\n

\n \n {{ \"organization\" | i18n }}\n \n \n \n \n\n
\n \n
\n \n \n
\n
\n
\n {{ \"noCollectionsInList\" | i18n }}\n
\n \n \n \n \n \n \n \n {{ c.name }}\n \n \n \n \n
\n \n \n \n \n
\n","import { Directive, EventEmitter, Input, OnInit, Output } from \"@angular/core\";\nimport { Validators, FormBuilder } from \"@angular/forms\";\n\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { FolderApiServiceAbstraction } from \"@bitwarden/common/vault/abstractions/folder/folder-api.service.abstraction\";\nimport { FolderService } from \"@bitwarden/common/vault/abstractions/folder/folder.service.abstraction\";\nimport { FolderView } from \"@bitwarden/common/vault/models/view/folder.view\";\nimport { DialogService } from \"@bitwarden/components\";\n\n@Directive()\nexport class FolderAddEditComponent implements OnInit {\n @Input() folderId: string;\n @Output() onSavedFolder = new EventEmitter();\n @Output() onDeletedFolder = new EventEmitter();\n\n editMode = false;\n folder: FolderView = new FolderView();\n title: string;\n formPromise: Promise;\n deletePromise: Promise;\n protected componentName = \"\";\n\n formGroup = this.formBuilder.group({\n name: [\"\", [Validators.required]],\n });\n\n constructor(\n protected folderService: FolderService,\n protected folderApiService: FolderApiServiceAbstraction,\n protected i18nService: I18nService,\n protected platformUtilsService: PlatformUtilsService,\n protected logService: LogService,\n protected dialogService: DialogService,\n protected formBuilder: FormBuilder,\n ) {}\n\n async ngOnInit() {\n await this.init();\n }\n\n async submit(): Promise {\n this.folder.name = this.formGroup.controls.name.value;\n if (this.folder.name == null || this.folder.name === \"\") {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"nameRequired\"),\n );\n return false;\n }\n\n try {\n const folder = await this.folderService.encrypt(this.folder);\n this.formPromise = this.folderApiService.save(folder);\n await this.formPromise;\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(this.editMode ? \"editedFolder\" : \"addedFolder\"),\n );\n this.onSavedFolder.emit(this.folder);\n return true;\n } catch (e) {\n this.logService.error(e);\n }\n\n return false;\n }\n\n async delete(): Promise {\n const confirmed = await this.dialogService.openSimpleDialog({\n title: { key: \"deleteFolder\" },\n content: { key: \"deleteFolderConfirmation\" },\n type: \"warning\",\n });\n\n if (!confirmed) {\n return false;\n }\n\n try {\n this.deletePromise = this.folderApiService.delete(this.folder.id);\n await this.deletePromise;\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"deletedFolder\"));\n this.onDeletedFolder.emit(this.folder);\n } catch (e) {\n this.logService.error(e);\n }\n\n return true;\n }\n\n protected async init() {\n this.editMode = this.folderId != null;\n\n if (this.editMode) {\n this.editMode = true;\n this.title = this.i18nService.t(\"editFolder\");\n const folder = await this.folderService.get(this.folderId);\n this.folder = await folder.decrypt();\n } else {\n this.title = this.i18nService.t(\"addFolder\");\n }\n this.formGroup.controls.name.setValue(this.folder.name);\n }\n}\n","import { DIALOG_DATA, DialogConfig, DialogRef } from \"@angular/cdk/dialog\";\nimport { Component, Inject } from \"@angular/core\";\nimport { FormBuilder } from \"@angular/forms\";\n\nimport { FolderAddEditComponent as BaseFolderAddEditComponent } from \"@bitwarden/angular/vault/components/folder-add-edit.component\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { FolderApiServiceAbstraction } from \"@bitwarden/common/vault/abstractions/folder/folder-api.service.abstraction\";\nimport { FolderService } from \"@bitwarden/common/vault/abstractions/folder/folder.service.abstraction\";\nimport { DialogService } from \"@bitwarden/components\";\n\n@Component({\n selector: \"app-folder-add-edit\",\n templateUrl: \"folder-add-edit.component.html\",\n})\nexport class FolderAddEditComponent extends BaseFolderAddEditComponent {\n protected override componentName = \"app-folder-add-edit\";\n constructor(\n folderService: FolderService,\n folderApiService: FolderApiServiceAbstraction,\n i18nService: I18nService,\n platformUtilsService: PlatformUtilsService,\n logService: LogService,\n dialogService: DialogService,\n formBuilder: FormBuilder,\n protected dialogRef: DialogRef,\n @Inject(DIALOG_DATA) params: FolderAddEditDialogParams,\n ) {\n super(\n folderService,\n folderApiService,\n i18nService,\n platformUtilsService,\n logService,\n dialogService,\n formBuilder,\n );\n params?.folderId ? (this.folderId = params.folderId) : null;\n }\n\n deleteAndClose = async () => {\n const confirmed = await this.dialogService.openSimpleDialog({\n title: { key: \"deleteFolder\" },\n content: { key: \"deleteFolderConfirmation\" },\n type: \"warning\",\n });\n\n if (!confirmed) {\n return;\n }\n\n try {\n this.deletePromise = this.folderApiService.delete(this.folder.id);\n await this.deletePromise;\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"deletedFolder\"));\n this.onDeletedFolder.emit(this.folder);\n } catch (e) {\n this.logService.error(e);\n }\n\n this.dialogRef.close(FolderAddEditDialogResult.Deleted);\n };\n\n submitAndClose = async () => {\n this.folder.name = this.formGroup.controls.name.value;\n if (this.folder.name == null || this.folder.name === \"\") {\n this.formGroup.controls.name.markAsTouched();\n return;\n }\n\n try {\n const folder = await this.folderService.encrypt(this.folder);\n this.formPromise = this.folderApiService.save(folder);\n await this.formPromise;\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(this.editMode ? \"editedFolder\" : \"addedFolder\"),\n );\n this.onSavedFolder.emit(this.folder);\n this.dialogRef.close(FolderAddEditDialogResult.Saved);\n } catch (e) {\n this.logService.error(e);\n }\n return;\n };\n}\n\nexport interface FolderAddEditDialogParams {\n folderId: string;\n}\n\nexport enum FolderAddEditDialogResult {\n Deleted = \"deleted\",\n Canceled = \"canceled\",\n Saved = \"saved\",\n}\n\n/**\n * Strongly typed helper to open a FolderAddEdit dialog\n * @param dialogService Instance of the dialog service that will be used to open the dialog\n * @param config Optional configuration for the dialog\n */\nexport function openFolderAddEditDialog(\n dialogService: DialogService,\n config?: DialogConfig,\n) {\n return dialogService.open(\n FolderAddEditComponent,\n config,\n );\n}\n","
\n \n \n {{ title }}\n \n \n \n {{ \"name\" | i18n }}\n \n \n \n \n \n \n
\n \n
\n
\n
\n
\n","import { Directive, EventEmitter, Input, OnDestroy, OnInit, Output } from \"@angular/core\";\nimport { firstValueFrom, map, Observable, Subject, takeUntil } from \"rxjs\";\n\nimport { OrganizationService } from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport { OrganizationUserStatusType } from \"@bitwarden/common/admin-console/enums\";\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\nimport { Checkable, isChecked } from \"@bitwarden/common/types/checkable\";\nimport { CipherService } from \"@bitwarden/common/vault/abstractions/cipher.service\";\nimport { CollectionService } from \"@bitwarden/common/vault/abstractions/collection.service\";\nimport { CipherView } from \"@bitwarden/common/vault/models/view/cipher.view\";\nimport { CollectionView } from \"@bitwarden/common/vault/models/view/collection.view\";\n\n@Directive()\nexport class ShareComponent implements OnInit, OnDestroy {\n @Input() cipherId: string;\n @Input() organizationId: string;\n @Output() onSharedCipher = new EventEmitter();\n\n formPromise: Promise;\n cipher: CipherView;\n collections: Checkable[] = [];\n organizations$: Observable;\n\n protected writeableCollections: Checkable[] = [];\n\n private _destroy = new Subject();\n\n constructor(\n protected collectionService: CollectionService,\n protected platformUtilsService: PlatformUtilsService,\n protected i18nService: I18nService,\n protected cipherService: CipherService,\n private logService: LogService,\n protected organizationService: OrganizationService,\n ) {}\n\n async ngOnInit() {\n await this.load();\n }\n\n ngOnDestroy(): void {\n this._destroy.next();\n this._destroy.complete();\n }\n\n async load() {\n const allCollections = await this.collectionService.getAllDecrypted();\n this.writeableCollections = allCollections.map((c) => c).filter((c) => !c.readOnly);\n\n this.organizations$ = this.organizationService.memberOrganizations$.pipe(\n map((orgs) => {\n return orgs\n .filter((o) => o.enabled && o.status === OrganizationUserStatusType.Confirmed)\n .sort(Utils.getSortFunction(this.i18nService, \"name\"));\n }),\n );\n\n this.organizations$.pipe(takeUntil(this._destroy)).subscribe((orgs) => {\n if (this.organizationId == null && orgs.length > 0) {\n this.organizationId = orgs[0].id;\n this.filterCollections();\n }\n });\n\n const cipherDomain = await this.cipherService.get(this.cipherId);\n this.cipher = await cipherDomain.decrypt(\n await this.cipherService.getKeyForCipherKeyDecryption(cipherDomain),\n );\n }\n\n filterCollections() {\n this.writeableCollections.forEach((c) => (c.checked = false));\n if (this.organizationId == null || this.writeableCollections.length === 0) {\n this.collections = [];\n } else {\n this.collections = this.writeableCollections.filter(\n (c) => c.organizationId === this.organizationId,\n );\n }\n }\n\n async submit(): Promise {\n const selectedCollectionIds = this.collections.filter(isChecked).map((c) => c.id);\n if (selectedCollectionIds.length === 0) {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"selectOneCollection\"),\n );\n return;\n }\n\n const cipherDomain = await this.cipherService.get(this.cipherId);\n const cipherView = await cipherDomain.decrypt(\n await this.cipherService.getKeyForCipherKeyDecryption(cipherDomain),\n );\n const orgs = await firstValueFrom(this.organizations$);\n const orgName =\n orgs.find((o) => o.id === this.organizationId)?.name ?? this.i18nService.t(\"organization\");\n\n try {\n this.formPromise = this.cipherService\n .shareWithServer(cipherView, this.organizationId, selectedCollectionIds)\n .then(async () => {\n this.onSharedCipher.emit();\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"movedItemToOrg\", cipherView.name, orgName),\n );\n });\n await this.formPromise;\n return true;\n } catch (e) {\n this.logService.error(e);\n }\n return false;\n }\n\n get canSave() {\n if (this.collections != null) {\n for (let i = 0; i < this.collections.length; i++) {\n if (this.collections[i].checked) {\n return true;\n }\n }\n }\n return false;\n }\n}\n","
\n
\n
\n
\n

\n {{ \"moveToOrganization\" | i18n }}\n {{ cipher.name }}\n

\n \n ×\n \n
\n \n
\n {{ \"noOrganizationsList\" | i18n }}\n
\n
\n

{{ \"moveToOrgDesc\" | i18n }}

\n
\n \n \n \n \n
\n
\n

{{ \"collections\" | i18n }}

\n
\n \n \n
\n
\n
\n {{ \"noCollectionsInList\" | i18n }}\n
\n \n \n \n \n \n \n \n {{ c.name }}\n \n \n \n \n
\n
\n \n \n {{ \"save\" | i18n }}\n \n \n {{ \"newOrganization\" | i18n }}\n \n \n
\n
\n
\n
\n
\n","import { Component, OnDestroy } from \"@angular/core\";\n\nimport { ShareComponent as BaseShareComponent } from \"@bitwarden/angular/components/share.component\";\nimport { OrganizationService } from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { CipherService } from \"@bitwarden/common/vault/abstractions/cipher.service\";\nimport { CollectionService } from \"@bitwarden/common/vault/abstractions/collection.service\";\nimport { CollectionView } from \"@bitwarden/common/vault/models/view/collection.view\";\n\n@Component({\n selector: \"app-vault-share\",\n templateUrl: \"share.component.html\",\n})\nexport class ShareComponent extends BaseShareComponent implements OnDestroy {\n constructor(\n collectionService: CollectionService,\n platformUtilsService: PlatformUtilsService,\n i18nService: I18nService,\n cipherService: CipherService,\n organizationService: OrganizationService,\n logService: LogService,\n ) {\n super(\n collectionService,\n platformUtilsService,\n i18nService,\n cipherService,\n logService,\n organizationService,\n );\n }\n\n ngOnDestroy() {\n this.selectAll(false);\n }\n\n check(c: CollectionView, select?: boolean) {\n (c as any).checked = select == null ? !(c as any).checked : select;\n }\n\n selectAll(select: boolean) {\n const collections = select ? this.collections : this.writeableCollections;\n collections.forEach((c) => this.check(c, select));\n }\n}\n","import { Component, EventEmitter, Output } from \"@angular/core\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { TokenService } from \"@bitwarden/common/auth/abstractions/token.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\n\n@Component({\n selector: \"app-verify-email\",\n templateUrl: \"verify-email.component.html\",\n})\nexport class VerifyEmailComponent {\n actionPromise: Promise;\n\n @Output() onVerified = new EventEmitter();\n\n constructor(\n private apiService: ApiService,\n private i18nService: I18nService,\n private platformUtilsService: PlatformUtilsService,\n private logService: LogService,\n private tokenService: TokenService,\n ) {}\n\n async verifyEmail(): Promise {\n await this.apiService.refreshIdentityToken();\n if (await this.tokenService.getEmailVerified()) {\n this.onVerified.emit(true);\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"emailVerified\"));\n return;\n }\n\n await this.apiService.postAccountVerifyEmail();\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"checkInboxForVerification\"),\n );\n }\n\n send = async () => {\n await this.verifyEmail();\n };\n}\n","
\n
\n {{ \"verifyEmail\" | i18n }}\n
\n
\n

{{ \"verifyEmailDesc\" | i18n }}

\n \n
\n
\n","import { Component } from \"@angular/core\";\n\n@Component({\n selector: \"app-low-kdf\",\n templateUrl: \"low-kdf.component.html\",\n})\nexport class LowKdfComponent {}\n","
\n
\n \n {{ \"lowKdfIterations\" | i18n }}\n
\n
\n

{{ \"updateLowKdfIterationsDesc\" | i18n }}

\n \n {{ \"updateKdfSettings\" | i18n }}\n \n
\n
\n","\n \n \n {{ activeOrganizationId | orgNameFromId: organizations }} {{ \"vault\" | i18n | lowercase }}\n \n \n \n {{ collection.name }}\n \n \n \n\n \n \n \n \n \n \n {{ \"editInfo\" | i18n }}\n \n \n \n {{ \"access\" | i18n }}\n \n \n \n \n \n \n {{ \"loading\" | i18n }}\n \n \n\n
\n
\n \n {{ \"new\" | i18n }}\n \n \n \n \n \n \n
\n
\n
\n","import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from \"@angular/core\";\n\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { TreeNode } from \"@bitwarden/common/vault/models/domain/tree-node\";\nimport { CollectionView } from \"@bitwarden/common/vault/models/view/collection.view\";\n\nimport { CollectionDialogTabType } from \"../../components/collection-dialog\";\nimport {\n All,\n RoutedVaultFilterModel,\n Unassigned,\n} from \"../vault-filter/shared/models/routed-vault-filter.model\";\n\n@Component({\n selector: \"app-vault-header\",\n templateUrl: \"./vault-header.component.html\",\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class VaultHeaderComponent {\n protected Unassigned = Unassigned;\n protected All = All;\n protected CollectionDialogTabType = CollectionDialogTabType;\n\n /**\n * Boolean to determine the loading state of the header.\n * Shows a loading spinner if set to true\n */\n @Input() loading: boolean;\n\n /** Current active filter */\n @Input() filter: RoutedVaultFilterModel;\n\n /** All organizations that can be shown */\n @Input() organizations: Organization[] = [];\n\n /** Currently selected collection */\n @Input() collection?: TreeNode;\n\n /** Whether 'Collection' option is shown in the 'New' dropdown */\n @Input() canCreateCollections: boolean;\n\n /** Emits an event when the new item button is clicked in the header */\n @Output() onAddCipher = new EventEmitter();\n\n /** Emits an event when the new collection button is clicked in the 'New' dropdown menu */\n @Output() onAddCollection = new EventEmitter();\n\n /** Emits an event when the new folder button is clicked in the 'New' dropdown menu */\n @Output() onAddFolder = new EventEmitter();\n\n /** Emits an event when the edit collection button is clicked in the header */\n @Output() onEditCollection = new EventEmitter<{ tab: CollectionDialogTabType }>();\n\n /** Emits an event when the delete collection button is clicked in the header */\n @Output() onDeleteCollection = new EventEmitter();\n\n constructor(private i18nService: I18nService) {}\n\n /**\n * The id of the organization that is currently being filtered on.\n * This can come from a collection filter or organization filter, if applied.\n */\n protected get activeOrganizationId() {\n if (this.collection != undefined) {\n return this.collection.node.organizationId;\n }\n\n if (this.filter.organizationId !== undefined) {\n return this.filter.organizationId;\n }\n\n return undefined;\n }\n\n protected get activeOrganization() {\n const organizationId = this.activeOrganizationId;\n return this.organizations?.find((org) => org.id === organizationId);\n }\n\n protected get showBreadcrumbs() {\n return this.filter.collectionId !== undefined && this.filter.collectionId !== All;\n }\n\n protected get title() {\n if (this.filter.collectionId === Unassigned) {\n return this.i18nService.t(\"unassigned\");\n }\n\n if (this.collection) {\n return this.collection.node.name;\n }\n\n if (this.filter.organizationId === Unassigned) {\n return this.i18nService.t(\"myVault\");\n }\n\n const activeOrganization = this.activeOrganization;\n if (activeOrganization) {\n return `${activeOrganization.name} ${this.i18nService.t(\"vault\").toLowerCase()}`;\n }\n\n return this.i18nService.t(\"allVaults\");\n }\n\n protected get icon() {\n return this.filter.collectionId && this.filter.collectionId !== All ? \"bwi-collection\" : \"\";\n }\n\n /**\n * A list of collection filters that form a chain from the organization root to currently selected collection.\n * Begins from the organization root and excludes the currently selected collection.\n */\n protected get collections() {\n if (this.collection == undefined) {\n return [];\n }\n\n const collections = [this.collection];\n while (collections[collections.length - 1].parent != undefined) {\n collections.push(collections[collections.length - 1].parent);\n }\n\n return collections\n .slice(1)\n .reverse()\n .map((treeNode) => treeNode.node);\n }\n\n get canEditCollection(): boolean {\n // Only edit collections if not editing \"Unassigned\"\n if (this.collection == null) {\n return false;\n }\n\n // Otherwise, check if we can edit the specified collection\n const organization = this.organizations.find(\n (o) => o.id === this.collection?.node.organizationId,\n );\n return this.collection.node.canEdit(organization);\n }\n\n async editCollection(tab: CollectionDialogTabType): Promise {\n this.onEditCollection.emit({ tab });\n }\n\n get canDeleteCollection(): boolean {\n // Only delete collections if not deleting \"Unassigned\"\n if (this.collection === undefined) {\n return false;\n }\n\n // Otherwise, check if we can delete the specified collection\n const organization = this.organizations.find(\n (o) => o.id === this.collection?.node.organizationId,\n );\n\n return this.collection.node.canDelete(organization);\n }\n\n deleteCollection() {\n this.onDeleteCollection.emit();\n }\n\n protected addCipher() {\n this.onAddCipher.emit();\n }\n\n async addFolder(): Promise {\n this.onAddFolder.emit();\n }\n\n async addCollection(): Promise {\n this.onAddCollection.emit();\n }\n}\n","\n\n\n\n\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n \n {{ trashCleanupWarning }}\n \n \n \n \n \n {{ \"loading\" | i18n }}\n
\n \n \n

{{ \"noItemsInList\" | i18n }}

\n \n \n {{ \"newItem\" | i18n }}\n \n
\n \n
\n \n\n \n\n
\n
\n \n {{ \"updateBrowser\" | i18n }}\n
\n
\n

{{ \"updateBrowserDesc\" | i18n }}

\n \n {{ \"updateBrowser\" | i18n }}\n \n
\n
\n
\n
\n {{ \"goPremium\" | i18n }}\n
\n
\n

{{ \"premiumUpgradeUnlockFeatures\" | i18n }}

\n \n {{ \"goPremium\" | i18n }}\n \n
\n
\n
\n\n\n\n\n\n\n\n\n","import {\n ChangeDetectorRef,\n Component,\n NgZone,\n OnDestroy,\n OnInit,\n ViewChild,\n ViewContainerRef,\n} from \"@angular/core\";\nimport { ActivatedRoute, Params, Router } from \"@angular/router\";\nimport {\n BehaviorSubject,\n combineLatest,\n firstValueFrom,\n lastValueFrom,\n Observable,\n Subject,\n} from \"rxjs\";\nimport {\n concatMap,\n debounceTime,\n filter,\n first,\n map,\n shareReplay,\n switchMap,\n takeUntil,\n tap,\n} from \"rxjs/operators\";\n\nimport { SearchPipe } from \"@bitwarden/angular/pipes/search.pipe\";\nimport { ModalService } from \"@bitwarden/angular/services/modal.service\";\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { EventCollectionService } from \"@bitwarden/common/abstractions/event/event-collection.service\";\nimport { SearchService } from \"@bitwarden/common/abstractions/search.service\";\nimport { OrganizationService } from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\nimport { TokenService } from \"@bitwarden/common/auth/abstractions/token.service\";\nimport { UserVerificationService } from \"@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction\";\nimport { BillingAccountProfileStateService } from \"@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service\";\nimport { EventType } from \"@bitwarden/common/enums\";\nimport { FeatureFlag } from \"@bitwarden/common/enums/feature-flag.enum\";\nimport { BroadcasterService } from \"@bitwarden/common/platform/abstractions/broadcaster.service\";\nimport { ConfigServiceAbstraction } from \"@bitwarden/common/platform/abstractions/config/config.service.abstraction\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { KdfType, PBKDF2_ITERATIONS } from \"@bitwarden/common/platform/enums\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\nimport { CipherService } from \"@bitwarden/common/vault/abstractions/cipher.service\";\nimport { CollectionService } from \"@bitwarden/common/vault/abstractions/collection.service\";\nimport { SyncService } from \"@bitwarden/common/vault/abstractions/sync/sync.service.abstraction\";\nimport { TotpService } from \"@bitwarden/common/vault/abstractions/totp.service\";\nimport { CipherRepromptType } from \"@bitwarden/common/vault/enums/cipher-reprompt-type\";\nimport { CollectionData } from \"@bitwarden/common/vault/models/data/collection.data\";\nimport { TreeNode } from \"@bitwarden/common/vault/models/domain/tree-node\";\nimport { CollectionDetailsResponse } from \"@bitwarden/common/vault/models/response/collection.response\";\nimport { CipherView } from \"@bitwarden/common/vault/models/view/cipher.view\";\nimport { CollectionView } from \"@bitwarden/common/vault/models/view/collection.view\";\nimport { ServiceUtils } from \"@bitwarden/common/vault/service-utils\";\nimport { DialogService, Icons } from \"@bitwarden/components\";\nimport { PasswordRepromptService } from \"@bitwarden/vault\";\n\nimport {\n CollectionDialogAction,\n CollectionDialogTabType,\n openCollectionDialog,\n} from \"../components/collection-dialog\";\nimport { VaultItem } from \"../components/vault-items/vault-item\";\nimport { VaultItemEvent } from \"../components/vault-items/vault-item-event\";\nimport { getNestedCollectionTree } from \"../utils/collection-utils\";\n\nimport { AddEditComponent } from \"./add-edit.component\";\nimport { AttachmentsComponent } from \"./attachments.component\";\nimport {\n BulkDeleteDialogResult,\n openBulkDeleteDialog,\n} from \"./bulk-action-dialogs/bulk-delete-dialog/bulk-delete-dialog.component\";\nimport {\n BulkMoveDialogResult,\n openBulkMoveDialog,\n} from \"./bulk-action-dialogs/bulk-move-dialog/bulk-move-dialog.component\";\nimport {\n BulkShareDialogResult,\n openBulkShareDialog,\n} from \"./bulk-action-dialogs/bulk-share-dialog/bulk-share-dialog.component\";\nimport { CollectionsComponent } from \"./collections.component\";\nimport { FolderAddEditDialogResult, openFolderAddEditDialog } from \"./folder-add-edit.component\";\nimport { ShareComponent } from \"./share.component\";\nimport { VaultFilterComponent } from \"./vault-filter/components/vault-filter.component\";\nimport { VaultFilterService } from \"./vault-filter/services/abstractions/vault-filter.service\";\nimport { RoutedVaultFilterBridgeService } from \"./vault-filter/services/routed-vault-filter-bridge.service\";\nimport { RoutedVaultFilterService } from \"./vault-filter/services/routed-vault-filter.service\";\nimport { createFilterFunction } from \"./vault-filter/shared/models/filter-function\";\nimport {\n All,\n RoutedVaultFilterModel,\n Unassigned,\n} from \"./vault-filter/shared/models/routed-vault-filter.model\";\nimport { VaultFilter } from \"./vault-filter/shared/models/vault-filter.model\";\nimport { FolderFilter, OrganizationFilter } from \"./vault-filter/shared/models/vault-filter.type\";\n\nconst BroadcasterSubscriptionId = \"VaultComponent\";\nconst SearchTextDebounceInterval = 200;\n\n@Component({\n selector: \"app-vault\",\n templateUrl: \"vault.component.html\",\n providers: [RoutedVaultFilterService, RoutedVaultFilterBridgeService],\n})\nexport class VaultComponent implements OnInit, OnDestroy {\n @ViewChild(\"vaultFilter\", { static: true }) filterComponent: VaultFilterComponent;\n @ViewChild(\"attachments\", { read: ViewContainerRef, static: true })\n attachmentsModalRef: ViewContainerRef;\n @ViewChild(\"folderAddEdit\", { read: ViewContainerRef, static: true })\n folderAddEditModalRef: ViewContainerRef;\n @ViewChild(\"cipherAddEdit\", { read: ViewContainerRef, static: true })\n cipherAddEditModalRef: ViewContainerRef;\n @ViewChild(\"share\", { read: ViewContainerRef, static: true }) shareModalRef: ViewContainerRef;\n @ViewChild(\"collectionsModal\", { read: ViewContainerRef, static: true })\n collectionsModalRef: ViewContainerRef;\n\n showVerifyEmail = false;\n showBrowserOutdated = false;\n showPremiumCallout = false;\n showLowKdf = false;\n trashCleanupWarning: string = null;\n kdfIterations: number;\n activeFilter: VaultFilter = new VaultFilter();\n\n protected noItemIcon = Icons.Search;\n protected performingInitialLoad = true;\n protected refreshing = false;\n protected processingEvent = false;\n protected filter: RoutedVaultFilterModel = {};\n protected showBulkMove: boolean;\n protected canAccessPremium: boolean;\n protected allCollections: CollectionView[];\n protected allOrganizations: Organization[] = [];\n protected ciphers: CipherView[];\n protected collections: CollectionView[];\n protected isEmpty: boolean;\n protected selectedCollection: TreeNode | undefined;\n protected canCreateCollections = false;\n protected currentSearchText$: Observable;\n protected showBulkCollectionAccess$ = this.configService.getFeatureFlag$(\n FeatureFlag.BulkCollectionAccess,\n false,\n );\n\n private searchText$ = new Subject();\n private refresh$ = new BehaviorSubject(null);\n private destroy$ = new Subject();\n\n constructor(\n private syncService: SyncService,\n private route: ActivatedRoute,\n private router: Router,\n private changeDetectorRef: ChangeDetectorRef,\n private i18nService: I18nService,\n private modalService: ModalService,\n private dialogService: DialogService,\n private tokenService: TokenService,\n private messagingService: MessagingService,\n private platformUtilsService: PlatformUtilsService,\n private broadcasterService: BroadcasterService,\n private ngZone: NgZone,\n private stateService: StateService,\n private organizationService: OrganizationService,\n private vaultFilterService: VaultFilterService,\n private routedVaultFilterService: RoutedVaultFilterService,\n private routedVaultFilterBridgeService: RoutedVaultFilterBridgeService,\n private cipherService: CipherService,\n private passwordRepromptService: PasswordRepromptService,\n private collectionService: CollectionService,\n private logService: LogService,\n private totpService: TotpService,\n private eventCollectionService: EventCollectionService,\n private searchService: SearchService,\n private searchPipe: SearchPipe,\n private configService: ConfigServiceAbstraction,\n private apiService: ApiService,\n private userVerificationService: UserVerificationService,\n private billingAccountProfileStateService: BillingAccountProfileStateService,\n ) {}\n\n async ngOnInit() {\n this.showBrowserOutdated = window.navigator.userAgent.indexOf(\"MSIE\") !== -1;\n this.trashCleanupWarning = this.i18nService.t(\n this.platformUtilsService.isSelfHost()\n ? \"trashCleanupWarningSelfHosted\"\n : \"trashCleanupWarning\",\n );\n\n const firstSetup$ = this.route.queryParams.pipe(\n first(),\n switchMap(async (params: Params) => {\n this.showVerifyEmail = !(await this.tokenService.getEmailVerified());\n this.showLowKdf = (await this.userVerificationService.hasMasterPassword())\n ? await this.isLowKdfIteration()\n : false;\n await this.syncService.fullSync(false);\n\n const canAccessPremium = await firstValueFrom(\n this.billingAccountProfileStateService.hasPremiumFromAnySource$,\n );\n this.showPremiumCallout =\n !this.showVerifyEmail && !canAccessPremium && !this.platformUtilsService.isSelfHost();\n\n const cipherId = getCipherIdFromParams(params);\n if (!cipherId) {\n return;\n }\n const cipherView = new CipherView();\n cipherView.id = cipherId;\n if (params.action === \"clone\") {\n await this.cloneCipher(cipherView);\n } else if (params.action === \"edit\") {\n await this.editCipher(cipherView);\n }\n }),\n shareReplay({ refCount: true, bufferSize: 1 }),\n );\n\n this.broadcasterService.subscribe(BroadcasterSubscriptionId, (message: any) => {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.ngZone.run(async () => {\n switch (message.command) {\n case \"syncCompleted\":\n if (message.successfully) {\n this.refresh();\n this.changeDetectorRef.detectChanges();\n }\n break;\n }\n });\n });\n\n this.routedVaultFilterBridgeService.activeFilter$\n .pipe(takeUntil(this.destroy$))\n .subscribe((activeFilter) => {\n this.activeFilter = activeFilter;\n });\n\n const filter$ = this.routedVaultFilterService.filter$;\n const allCollections$ = this.collectionService.decryptedCollections$;\n const nestedCollections$ = allCollections$.pipe(\n map((collections) => getNestedCollectionTree(collections)),\n );\n\n this.searchText$\n .pipe(debounceTime(SearchTextDebounceInterval), takeUntil(this.destroy$))\n .subscribe((searchText) =>\n this.router.navigate([], {\n queryParams: { search: Utils.isNullOrEmpty(searchText) ? null : searchText },\n queryParamsHandling: \"merge\",\n replaceUrl: true,\n }),\n );\n\n this.currentSearchText$ = this.route.queryParams.pipe(map((queryParams) => queryParams.search));\n\n const ciphers$ = combineLatest([\n Utils.asyncToObservable(() => this.cipherService.getAllDecrypted()),\n filter$,\n this.currentSearchText$,\n ]).pipe(\n filter(([ciphers, filter]) => ciphers != undefined && filter != undefined),\n concatMap(async ([ciphers, filter, searchText]) => {\n const filterFunction = createFilterFunction(filter);\n\n if (this.searchService.isSearchable(searchText)) {\n return await this.searchService.searchCiphers(searchText, [filterFunction], ciphers);\n }\n\n return ciphers.filter(filterFunction);\n }),\n shareReplay({ refCount: true, bufferSize: 1 }),\n );\n\n const collections$ = combineLatest([nestedCollections$, filter$, this.currentSearchText$]).pipe(\n filter(([collections, filter]) => collections != undefined && filter != undefined),\n map(([collections, filter, searchText]) => {\n if (filter.collectionId === undefined || filter.collectionId === Unassigned) {\n return [];\n }\n\n let collectionsToReturn = [];\n if (filter.organizationId !== undefined && filter.collectionId === All) {\n collectionsToReturn = collections\n .filter((c) => c.node.organizationId === filter.organizationId)\n .map((c) => c.node);\n } else if (filter.collectionId === All) {\n collectionsToReturn = collections.map((c) => c.node);\n } else {\n const selectedCollection = ServiceUtils.getTreeNodeObjectFromList(\n collections,\n filter.collectionId,\n );\n collectionsToReturn = selectedCollection?.children.map((c) => c.node) ?? [];\n }\n\n if (this.searchService.isSearchable(searchText)) {\n collectionsToReturn = this.searchPipe.transform(\n collectionsToReturn,\n searchText,\n (collection) => collection.name,\n (collection) => collection.id,\n );\n }\n\n return collectionsToReturn;\n }),\n shareReplay({ refCount: true, bufferSize: 1 }),\n );\n\n const selectedCollection$ = combineLatest([nestedCollections$, filter$]).pipe(\n filter(([collections, filter]) => collections != undefined && filter != undefined),\n map(([collections, filter]) => {\n if (\n filter.collectionId === undefined ||\n filter.collectionId === All ||\n filter.collectionId === Unassigned\n ) {\n return undefined;\n }\n\n return ServiceUtils.getTreeNodeObjectFromList(collections, filter.collectionId);\n }),\n shareReplay({ refCount: true, bufferSize: 1 }),\n );\n\n firstSetup$\n .pipe(\n switchMap(() => this.route.queryParams),\n switchMap(async (params) => {\n const cipherId = getCipherIdFromParams(params);\n if (cipherId) {\n if ((await this.cipherService.get(cipherId)) != null) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.editCipherId(cipherId);\n } else {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"unknownCipher\"),\n );\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([], {\n queryParams: { itemId: null, cipherId: null },\n queryParamsHandling: \"merge\",\n });\n }\n }\n }),\n takeUntil(this.destroy$),\n )\n .subscribe();\n\n firstSetup$\n .pipe(\n switchMap(() => this.refresh$),\n tap(() => (this.refreshing = true)),\n switchMap(() =>\n combineLatest([\n filter$,\n this.billingAccountProfileStateService.hasPremiumFromAnySource$,\n allCollections$,\n this.organizationService.organizations$,\n ciphers$,\n collections$,\n selectedCollection$,\n ]),\n ),\n takeUntil(this.destroy$),\n )\n .subscribe(\n ([\n filter,\n canAccessPremium,\n allCollections,\n allOrganizations,\n ciphers,\n collections,\n selectedCollection,\n ]) => {\n this.filter = filter;\n this.canAccessPremium = canAccessPremium;\n this.allCollections = allCollections;\n this.allOrganizations = allOrganizations;\n this.ciphers = ciphers;\n this.collections = collections;\n this.selectedCollection = selectedCollection;\n\n this.canCreateCollections = allOrganizations?.some(\n (o) => o.canCreateNewCollections && !o.isProviderUser,\n );\n\n this.showBulkMove =\n filter.type !== \"trash\" &&\n (filter.organizationId === undefined || filter.organizationId === Unassigned);\n this.isEmpty = collections?.length === 0 && ciphers?.length === 0;\n\n this.performingInitialLoad = false;\n this.refreshing = false;\n },\n );\n }\n\n get isShowingCards() {\n return (\n this.showBrowserOutdated || this.showPremiumCallout || this.showVerifyEmail || this.showLowKdf\n );\n }\n\n emailVerified(verified: boolean) {\n this.showVerifyEmail = !verified;\n }\n\n ngOnDestroy() {\n this.broadcasterService.unsubscribe(BroadcasterSubscriptionId);\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n async onVaultItemsEvent(event: VaultItemEvent) {\n this.processingEvent = true;\n try {\n if (event.type === \"viewAttachments\") {\n await this.editCipherAttachments(event.item);\n } else if (event.type === \"viewCollections\") {\n await this.editCipherCollections(event.item);\n } else if (event.type === \"clone\") {\n await this.cloneCipher(event.item);\n } else if (event.type === \"restore\") {\n if (event.items.length === 1) {\n await this.restore(event.items[0]);\n } else {\n await this.bulkRestore(event.items);\n }\n } else if (event.type === \"delete\") {\n await this.handleDeleteEvent(event.items);\n } else if (event.type === \"moveToFolder\") {\n await this.bulkMove(event.items);\n } else if (event.type === \"moveToOrganization\") {\n if (event.items.length === 1) {\n await this.shareCipher(event.items[0]);\n } else {\n await this.bulkShare(event.items);\n }\n } else if (event.type === \"copyField\") {\n await this.copy(event.item, event.field);\n } else if (event.type === \"editCollection\") {\n await this.editCollection(event.item, CollectionDialogTabType.Info);\n } else if (event.type === \"viewCollectionAccess\") {\n await this.editCollection(event.item, CollectionDialogTabType.Access);\n }\n } finally {\n this.processingEvent = false;\n }\n }\n\n async applyOrganizationFilter(orgId: string) {\n if (orgId == null) {\n orgId = \"MyVault\";\n }\n const orgs = await firstValueFrom(this.filterComponent.filters.organizationFilter.data$);\n const orgNode = ServiceUtils.getTreeNodeObject(orgs, orgId) as TreeNode;\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.filterComponent.filters?.organizationFilter?.action(orgNode);\n }\n\n addFolder = async (): Promise => {\n openFolderAddEditDialog(this.dialogService);\n };\n\n editFolder = async (folder: FolderFilter): Promise => {\n const dialog = openFolderAddEditDialog(this.dialogService, {\n data: {\n folderId: folder.id,\n },\n });\n\n const result = await lastValueFrom(dialog.closed);\n\n if (result === FolderAddEditDialogResult.Deleted) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([], {\n queryParams: { folderId: null },\n queryParamsHandling: \"merge\",\n replaceUrl: true,\n });\n }\n };\n\n filterSearchText(searchText: string) {\n this.searchText$.next(searchText);\n }\n\n async editCipherAttachments(cipher: CipherView) {\n if (cipher?.reprompt !== 0 && !(await this.passwordRepromptService.showPasswordPrompt())) {\n this.go({ cipherId: null, itemId: null });\n return;\n }\n\n if (cipher.organizationId == null && !this.canAccessPremium) {\n this.messagingService.send(\"premiumRequired\");\n return;\n } else if (cipher.organizationId != null) {\n const org = await this.organizationService.get(cipher.organizationId);\n if (org != null && (org.maxStorageGb == null || org.maxStorageGb === 0)) {\n this.messagingService.send(\"upgradeOrganization\", {\n organizationId: cipher.organizationId,\n });\n return;\n }\n }\n\n let madeAttachmentChanges = false;\n const [modal] = await this.modalService.openViewRef(\n AttachmentsComponent,\n this.attachmentsModalRef,\n (comp) => {\n comp.cipherId = cipher.id;\n comp.onUploadedAttachment\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => (madeAttachmentChanges = true));\n comp.onDeletedAttachment\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => (madeAttachmentChanges = true));\n comp.onReuploadedAttachment\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => (madeAttachmentChanges = true));\n },\n );\n\n modal.onClosed.pipe(takeUntil(this.destroy$)).subscribe(() => {\n if (madeAttachmentChanges) {\n this.refresh();\n }\n madeAttachmentChanges = false;\n });\n }\n\n async shareCipher(cipher: CipherView) {\n if (cipher?.reprompt !== 0 && !(await this.passwordRepromptService.showPasswordPrompt())) {\n this.go({ cipherId: null, itemId: null });\n return;\n }\n const [modal] = await this.modalService.openViewRef(\n ShareComponent,\n this.shareModalRef,\n (comp) => {\n comp.cipherId = cipher.id;\n comp.onSharedCipher.pipe(takeUntil(this.destroy$)).subscribe(() => {\n modal.close();\n this.refresh();\n });\n },\n );\n }\n\n async editCipherCollections(cipher: CipherView) {\n const [modal] = await this.modalService.openViewRef(\n CollectionsComponent,\n this.collectionsModalRef,\n (comp) => {\n comp.cipherId = cipher.id;\n comp.onSavedCollections.pipe(takeUntil(this.destroy$)).subscribe(() => {\n modal.close();\n this.refresh();\n });\n },\n );\n }\n\n async addCipher() {\n const component = await this.editCipher(null);\n component.type = this.activeFilter.cipherType;\n if (this.activeFilter.organizationId !== \"MyVault\") {\n component.organizationId = this.activeFilter.organizationId;\n component.collections = (\n await firstValueFrom(this.vaultFilterService.filteredCollections$)\n ).filter((c) => !c.readOnly && c.id != null);\n }\n const selectedColId = this.activeFilter.collectionId;\n if (selectedColId !== \"AllCollections\") {\n component.organizationId = component.collections.find(\n (collection) => collection.id === selectedColId,\n )?.organizationId;\n component.collectionIds = [selectedColId];\n }\n component.folderId = this.activeFilter.folderId;\n }\n\n async navigateToCipher(cipher: CipherView) {\n this.go({ itemId: cipher?.id });\n }\n\n async editCipher(cipher: CipherView) {\n return this.editCipherId(cipher?.id);\n }\n\n async editCipherId(id: string) {\n const cipher = await this.cipherService.get(id);\n // if cipher exists (cipher is null when new) and MP reprompt\n // is on for this cipher, then show password reprompt\n if (\n cipher &&\n cipher.reprompt !== 0 &&\n !(await this.passwordRepromptService.showPasswordPrompt())\n ) {\n // didn't pass password prompt, so don't open add / edit modal\n this.go({ cipherId: null, itemId: null });\n return;\n }\n\n const [modal, childComponent] = await this.modalService.openViewRef(\n AddEditComponent,\n this.cipherAddEditModalRef,\n (comp) => {\n comp.cipherId = id;\n comp.onSavedCipher.pipe(takeUntil(this.destroy$)).subscribe(() => {\n modal.close();\n this.refresh();\n });\n comp.onDeletedCipher.pipe(takeUntil(this.destroy$)).subscribe(() => {\n modal.close();\n this.refresh();\n });\n comp.onRestoredCipher.pipe(takeUntil(this.destroy$)).subscribe(() => {\n modal.close();\n this.refresh();\n });\n },\n );\n\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n modal.onClosedPromise().then(() => {\n this.go({ cipherId: null, itemId: null });\n });\n\n return childComponent;\n }\n\n async addCollection() {\n const dialog = openCollectionDialog(this.dialogService, {\n data: {\n organizationId: this.allOrganizations\n .filter((o) => o.canCreateNewCollections && !o.isProviderUser)\n .sort(Utils.getSortFunction(this.i18nService, \"name\"))[0].id,\n parentCollectionId: this.filter.collectionId,\n showOrgSelector: true,\n collectionIds: this.allCollections.map((c) => c.id),\n },\n });\n const result = await lastValueFrom(dialog.closed);\n if (result.action === CollectionDialogAction.Saved) {\n if (result.collection) {\n // Update CollectionService with the new collection\n const c = new CollectionData(result.collection as CollectionDetailsResponse);\n await this.collectionService.upsert(c);\n }\n this.refresh();\n }\n }\n\n async editCollection(c: CollectionView, tab: CollectionDialogTabType): Promise {\n const dialog = openCollectionDialog(this.dialogService, {\n data: { collectionId: c?.id, organizationId: c.organizationId, initialTab: tab },\n });\n\n const result = await lastValueFrom(dialog.closed);\n if (result.action === CollectionDialogAction.Saved) {\n if (result.collection) {\n // Update CollectionService with the new collection\n const c = new CollectionData(result.collection as CollectionDetailsResponse);\n await this.collectionService.upsert(c);\n }\n this.refresh();\n } else if (result.action === CollectionDialogAction.Deleted) {\n await this.collectionService.delete(result.collection?.id);\n this.refresh();\n }\n }\n\n async deleteCollection(collection: CollectionView): Promise {\n const organization = await this.organizationService.get(collection.organizationId);\n if (!collection.canDelete(organization)) {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"missingPermissions\"),\n );\n return;\n }\n const confirmed = await this.dialogService.openSimpleDialog({\n title: collection.name,\n content: { key: \"deleteCollectionConfirmation\" },\n type: \"warning\",\n });\n if (!confirmed) {\n return;\n }\n try {\n await this.apiService.deleteCollection(collection.organizationId, collection.id);\n await this.collectionService.delete(collection.id);\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"deletedCollectionId\", collection.name),\n );\n // Navigate away if we deleted the collection we were viewing\n if (this.selectedCollection?.node.id === collection.id) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([], {\n queryParams: { collectionId: this.selectedCollection.parent?.node.id ?? null },\n queryParamsHandling: \"merge\",\n replaceUrl: true,\n });\n }\n this.refresh();\n } catch (e) {\n this.logService.error(e);\n }\n }\n\n async cloneCipher(cipher: CipherView) {\n if (cipher.login?.hasFido2Credentials) {\n const confirmed = await this.dialogService.openSimpleDialog({\n title: { key: \"passkeyNotCopied\" },\n content: { key: \"passkeyNotCopiedAlert\" },\n type: \"info\",\n });\n\n if (!confirmed) {\n return false;\n }\n }\n\n const component = await this.editCipher(cipher);\n component.cloneMode = true;\n }\n\n async restore(c: CipherView): Promise {\n if (!(await this.repromptCipher([c]))) {\n return;\n }\n\n if (!c.isDeleted) {\n return;\n }\n\n try {\n await this.cipherService.restoreWithServer(c.id);\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"restoredItem\"));\n this.refresh();\n } catch (e) {\n this.logService.error(e);\n }\n }\n\n async bulkRestore(ciphers: CipherView[]) {\n if (!(await this.repromptCipher(ciphers))) {\n return;\n }\n\n const selectedCipherIds = ciphers.map((cipher) => cipher.id);\n if (selectedCipherIds.length === 0) {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"nothingSelected\"),\n );\n return;\n }\n\n await this.cipherService.restoreManyWithServer(selectedCipherIds);\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"restoredItems\"));\n this.refresh();\n }\n\n private async handleDeleteEvent(items: VaultItem[]) {\n const ciphers = items.filter((i) => i.collection === undefined).map((i) => i.cipher);\n const collections = items.filter((i) => i.cipher === undefined).map((i) => i.collection);\n if (ciphers.length === 1 && collections.length === 0) {\n await this.deleteCipher(ciphers[0]);\n } else if (ciphers.length === 0 && collections.length === 1) {\n await this.deleteCollection(collections[0]);\n } else {\n const orgIds = items\n .filter((i) => i.cipher === undefined)\n .map((i) => i.collection.organizationId);\n const orgs = await firstValueFrom(\n this.organizationService.organizations$.pipe(\n map((orgs) => orgs.filter((o) => orgIds.includes(o.id))),\n ),\n );\n await this.bulkDelete(ciphers, collections, orgs);\n }\n }\n\n async deleteCipher(c: CipherView): Promise {\n if (!(await this.repromptCipher([c]))) {\n return;\n }\n\n const permanent = c.isDeleted;\n\n const confirmed = await this.dialogService.openSimpleDialog({\n title: { key: permanent ? \"permanentlyDeleteItem\" : \"deleteItem\" },\n content: { key: permanent ? \"permanentlyDeleteItemConfirmation\" : \"deleteItemConfirmation\" },\n type: \"warning\",\n });\n\n if (!confirmed) {\n return false;\n }\n\n try {\n await this.deleteCipherWithServer(c.id, permanent);\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(permanent ? \"permanentlyDeletedItem\" : \"deletedItem\"),\n );\n this.refresh();\n } catch (e) {\n this.logService.error(e);\n }\n }\n\n async bulkDelete(\n ciphers: CipherView[],\n collections: CollectionView[],\n organizations: Organization[],\n ) {\n if (!(await this.repromptCipher(ciphers))) {\n return;\n }\n\n if (ciphers.length === 0 && collections.length === 0) {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"nothingSelected\"),\n );\n return;\n }\n const dialog = openBulkDeleteDialog(this.dialogService, {\n data: {\n permanent: this.filter.type === \"trash\",\n cipherIds: ciphers.map((c) => c.id),\n organizations: organizations,\n collections: collections,\n },\n });\n\n const result = await lastValueFrom(dialog.closed);\n if (result === BulkDeleteDialogResult.Deleted) {\n this.refresh();\n }\n }\n\n async bulkMove(ciphers: CipherView[]) {\n if (!(await this.repromptCipher(ciphers))) {\n return;\n }\n\n const selectedCipherIds = ciphers.map((cipher) => cipher.id);\n if (selectedCipherIds.length === 0) {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"nothingSelected\"),\n );\n return;\n }\n\n const dialog = openBulkMoveDialog(this.dialogService, {\n data: { cipherIds: selectedCipherIds },\n });\n\n const result = await lastValueFrom(dialog.closed);\n if (result === BulkMoveDialogResult.Moved) {\n this.refresh();\n }\n }\n\n async copy(cipher: CipherView, field: \"username\" | \"password\" | \"totp\") {\n let aType;\n let value;\n let typeI18nKey;\n\n if (field === \"username\") {\n aType = \"Username\";\n value = cipher.login.username;\n typeI18nKey = \"username\";\n } else if (field === \"password\") {\n aType = \"Password\";\n value = cipher.login.password;\n typeI18nKey = \"password\";\n } else if (field === \"totp\") {\n aType = \"TOTP\";\n value = await this.totpService.getCode(cipher.login.totp);\n typeI18nKey = \"verificationCodeTotp\";\n } else {\n this.platformUtilsService.showToast(\"info\", null, this.i18nService.t(\"unexpectedError\"));\n return;\n }\n\n if (\n this.passwordRepromptService.protectedFields().includes(aType) &&\n !(await this.repromptCipher([cipher]))\n ) {\n return;\n }\n\n if (!cipher.viewPassword) {\n return;\n }\n\n this.platformUtilsService.copyToClipboard(value, { window: window });\n this.platformUtilsService.showToast(\n \"info\",\n null,\n this.i18nService.t(\"valueCopied\", this.i18nService.t(typeI18nKey)),\n );\n\n if (field === \"password\") {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.eventCollectionService.collect(EventType.Cipher_ClientCopiedPassword, cipher.id);\n } else if (field === \"totp\") {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.eventCollectionService.collect(EventType.Cipher_ClientCopiedHiddenField, cipher.id);\n }\n }\n\n async bulkShare(ciphers: CipherView[]) {\n if (!(await this.repromptCipher(ciphers))) {\n return;\n }\n\n if (ciphers.length === 0) {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"nothingSelected\"),\n );\n return;\n }\n\n const dialog = openBulkShareDialog(this.dialogService, { data: { ciphers } });\n\n const result = await lastValueFrom(dialog.closed);\n if (result === BulkShareDialogResult.Shared) {\n this.refresh();\n }\n }\n\n protected deleteCipherWithServer(id: string, permanent: boolean) {\n return permanent\n ? this.cipherService.deleteWithServer(id)\n : this.cipherService.softDeleteWithServer(id);\n }\n\n async isLowKdfIteration() {\n const kdfType = await this.stateService.getKdfType();\n const kdfOptions = await this.stateService.getKdfConfig();\n return (\n kdfType === KdfType.PBKDF2_SHA256 && kdfOptions.iterations < PBKDF2_ITERATIONS.defaultValue\n );\n }\n\n protected async repromptCipher(ciphers: CipherView[]) {\n const notProtected = !ciphers.find((cipher) => cipher.reprompt !== CipherRepromptType.None);\n\n return notProtected || (await this.passwordRepromptService.showPasswordPrompt());\n }\n\n private refresh() {\n this.refresh$.next();\n }\n\n private go(queryParams: any = null) {\n if (queryParams == null) {\n queryParams = {\n favorites: this.activeFilter.isFavorites || null,\n type: this.activeFilter.cipherType,\n folderId: this.activeFilter.folderId,\n collectionId: this.activeFilter.collectionId,\n deleted: this.activeFilter.isDeleted || null,\n };\n }\n\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([], {\n relativeTo: this.route,\n queryParams: queryParams,\n queryParamsHandling: \"merge\",\n replaceUrl: true,\n });\n }\n}\n\n/**\n * Allows backwards compatibility with\n * old links that used the original `cipherId` param\n */\nconst getCipherIdFromParams = (params: Params): string => {\n return params[\"itemId\"] || params[\"cipherId\"];\n};\n","import { NgModule } from \"@angular/core\";\nimport { RouterModule, Routes } from \"@angular/router\";\n\nimport { VaultComponent } from \"./vault.component\";\nconst routes: Routes = [\n {\n path: \"\",\n component: VaultComponent,\n data: { titleId: \"vaults\" },\n },\n];\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule],\n})\nexport class VaultRoutingModule {}\n","import { NgModule } from \"@angular/core\";\n\nimport { BreadcrumbsModule } from \"@bitwarden/components\";\n\nimport { LooseComponentsModule, SharedModule } from \"../../shared\";\nimport { CollectionDialogModule } from \"../components/collection-dialog\";\nimport { VaultItemsModule } from \"../components/vault-items/vault-items.module\";\nimport { CollectionBadgeModule } from \"../org-vault/collection-badge/collection-badge.module\";\nimport { GroupBadgeModule } from \"../org-vault/group-badge/group-badge.module\";\n\nimport { BulkDialogsModule } from \"./bulk-action-dialogs/bulk-dialogs.module\";\nimport { OrganizationBadgeModule } from \"./organization-badge/organization-badge.module\";\nimport { PipesModule } from \"./pipes/pipes.module\";\nimport { VaultFilterModule } from \"./vault-filter/vault-filter.module\";\nimport { VaultHeaderComponent } from \"./vault-header/vault-header.component\";\nimport { VaultOnboardingService as VaultOnboardingServiceAbstraction } from \"./vault-onboarding/services/abstraction/vault-onboarding.service\";\nimport { VaultOnboardingService } from \"./vault-onboarding/services/vault-onboarding.service\";\nimport { VaultOnboardingComponent } from \"./vault-onboarding/vault-onboarding.component\";\nimport { VaultRoutingModule } from \"./vault-routing.module\";\nimport { VaultComponent } from \"./vault.component\";\n\n@NgModule({\n imports: [\n VaultFilterModule,\n VaultRoutingModule,\n OrganizationBadgeModule,\n GroupBadgeModule,\n CollectionBadgeModule,\n PipesModule,\n SharedModule,\n LooseComponentsModule,\n BulkDialogsModule,\n BreadcrumbsModule,\n VaultItemsModule,\n CollectionDialogModule,\n VaultOnboardingComponent,\n ],\n declarations: [VaultComponent, VaultHeaderComponent],\n exports: [VaultComponent],\n providers: [\n {\n provide: VaultOnboardingServiceAbstraction,\n useClass: VaultOnboardingService,\n },\n ],\n})\nexport class VaultModule {}\n","import { NgModule } from \"@angular/core\";\nimport { Route, RouterModule, Routes } from \"@angular/router\";\n\nimport {\n AuthGuard,\n lockGuard,\n redirectGuard,\n tdeDecryptionRequiredGuard,\n UnauthGuard,\n} from \"@bitwarden/angular/auth/guards\";\n\nimport { flagEnabled, Flags } from \"../utils/flags\";\n\nimport { AcceptFamilySponsorshipComponent } from \"./admin-console/organizations/sponsorships/accept-family-sponsorship.component\";\nimport { FamiliesForEnterpriseSetupComponent } from \"./admin-console/organizations/sponsorships/families-for-enterprise-setup.component\";\nimport { CreateOrganizationComponent } from \"./admin-console/settings/create-organization.component\";\nimport { SponsoredFamiliesComponent } from \"./admin-console/settings/sponsored-families.component\";\nimport { AcceptOrganizationComponent } from \"./auth/accept-organization.component\";\nimport { deepLinkGuard } from \"./auth/guards/deep-link.guard\";\nimport { HintComponent } from \"./auth/hint.component\";\nimport { LockComponent } from \"./auth/lock.component\";\nimport { LoginDecryptionOptionsComponent } from \"./auth/login/login-decryption-options/login-decryption-options.component\";\nimport { LoginViaAuthRequestComponent } from \"./auth/login/login-via-auth-request.component\";\nimport { LoginViaWebAuthnComponent } from \"./auth/login/login-via-webauthn/login-via-webauthn.component\";\nimport { LoginComponent } from \"./auth/login/login.component\";\nimport { RecoverDeleteComponent } from \"./auth/recover-delete.component\";\nimport { RecoverTwoFactorComponent } from \"./auth/recover-two-factor.component\";\nimport { RemovePasswordComponent } from \"./auth/remove-password.component\";\nimport { SetPasswordComponent } from \"./auth/set-password.component\";\nimport { AccountComponent } from \"./auth/settings/account/account.component\";\nimport { EmergencyAccessComponent } from \"./auth/settings/emergency-access/emergency-access.component\";\nimport { EmergencyAccessViewComponent } from \"./auth/settings/emergency-access/view/emergency-access-view.component\";\nimport { SecurityRoutingModule } from \"./auth/settings/security/security-routing.module\";\nimport { SsoComponent } from \"./auth/sso.component\";\nimport { TrialInitiationComponent } from \"./auth/trial-initiation/trial-initiation.component\";\nimport { TwoFactorComponent } from \"./auth/two-factor.component\";\nimport { UpdatePasswordComponent } from \"./auth/update-password.component\";\nimport { UpdateTempPasswordComponent } from \"./auth/update-temp-password.component\";\nimport { VerifyEmailTokenComponent } from \"./auth/verify-email-token.component\";\nimport { VerifyRecoverDeleteComponent } from \"./auth/verify-recover-delete.component\";\nimport { FrontendLayoutComponent } from \"./layouts/frontend-layout.component\";\nimport { UserLayoutComponent } from \"./layouts/user-layout.component\";\nimport { DomainRulesComponent } from \"./settings/domain-rules.component\";\nimport { PreferencesComponent } from \"./settings/preferences.component\";\nimport { GeneratorComponent } from \"./tools/generator.component\";\nimport { ReportsModule } from \"./tools/reports\";\nimport { AccessComponent } from \"./tools/send/access.component\";\nimport { SendComponent } from \"./tools/send/send.component\";\nimport { VaultModule } from \"./vault/individual-vault/vault.module\";\n\nconst routes: Routes = [\n {\n path: \"\",\n component: FrontendLayoutComponent,\n data: { doNotSaveUrl: true },\n children: [\n {\n path: \"\",\n pathMatch: \"full\",\n children: [], // Children lets us have an empty component.\n canActivate: [redirectGuard()], // Redirects either to vault, login, or lock page.\n },\n { path: \"login\", component: LoginComponent, canActivate: [UnauthGuard] },\n {\n path: \"login-with-device\",\n component: LoginViaAuthRequestComponent,\n data: { titleId: \"loginWithDevice\" },\n },\n {\n path: \"login-with-passkey\",\n component: LoginViaWebAuthnComponent,\n data: { titleId: \"loginWithPasskey\" },\n },\n {\n path: \"admin-approval-requested\",\n component: LoginViaAuthRequestComponent,\n data: { titleId: \"adminApprovalRequested\" },\n },\n { path: \"2fa\", component: TwoFactorComponent, canActivate: [UnauthGuard] },\n {\n path: \"login-initiated\",\n component: LoginDecryptionOptionsComponent,\n canActivate: [tdeDecryptionRequiredGuard()],\n },\n {\n path: \"register\",\n component: TrialInitiationComponent,\n canActivate: [UnauthGuard],\n data: { titleId: \"createAccount\" },\n },\n {\n path: \"trial\",\n redirectTo: \"register\",\n pathMatch: \"full\",\n },\n {\n path: \"sso\",\n component: SsoComponent,\n canActivate: [UnauthGuard],\n data: { titleId: \"enterpriseSingleSignOn\" },\n },\n {\n path: \"set-password\",\n component: SetPasswordComponent,\n data: { titleId: \"setMasterPassword\" },\n },\n {\n path: \"hint\",\n component: HintComponent,\n canActivate: [UnauthGuard],\n data: { titleId: \"passwordHint\" },\n },\n {\n path: \"lock\",\n component: LockComponent,\n canActivate: [deepLinkGuard(), lockGuard()],\n },\n { path: \"verify-email\", component: VerifyEmailTokenComponent },\n {\n path: \"accept-organization\",\n component: AcceptOrganizationComponent,\n canActivate: [deepLinkGuard()],\n data: { titleId: \"joinOrganization\", doNotSaveUrl: false },\n },\n {\n path: \"accept-emergency\",\n canActivate: [deepLinkGuard()],\n data: { titleId: \"acceptEmergency\", doNotSaveUrl: false },\n loadComponent: () =>\n import(\"./auth/emergency-access/accept/accept-emergency.component\").then(\n (mod) => mod.AcceptEmergencyComponent,\n ),\n },\n {\n path: \"accept-families-for-enterprise\",\n component: AcceptFamilySponsorshipComponent,\n canActivate: [deepLinkGuard()],\n data: { titleId: \"acceptFamilySponsorship\", doNotSaveUrl: false },\n },\n { path: \"recover\", pathMatch: \"full\", redirectTo: \"recover-2fa\" },\n {\n path: \"recover-2fa\",\n component: RecoverTwoFactorComponent,\n canActivate: [UnauthGuard],\n data: { titleId: \"recoverAccountTwoStep\" },\n },\n {\n path: \"recover-delete\",\n component: RecoverDeleteComponent,\n canActivate: [UnauthGuard],\n data: { titleId: \"deleteAccount\" },\n },\n {\n path: \"verify-recover-delete\",\n component: VerifyRecoverDeleteComponent,\n canActivate: [UnauthGuard],\n data: { titleId: \"deleteAccount\" },\n },\n {\n path: \"send/:sendId/:key\",\n component: AccessComponent,\n data: { title: \"Bitwarden Send\" },\n },\n {\n path: \"update-temp-password\",\n component: UpdateTempPasswordComponent,\n canActivate: [AuthGuard],\n data: { titleId: \"updateTempPassword\" },\n },\n {\n path: \"update-password\",\n component: UpdatePasswordComponent,\n canActivate: [AuthGuard],\n data: { titleId: \"updatePassword\" },\n },\n {\n path: \"remove-password\",\n component: RemovePasswordComponent,\n canActivate: [AuthGuard],\n data: { titleId: \"removeMasterPassword\" },\n },\n {\n path: \"migrate-legacy-encryption\",\n loadComponent: () =>\n import(\"./auth/migrate-encryption/migrate-legacy-encryption.component\").then(\n (mod) => mod.MigrateFromLegacyEncryptionComponent,\n ),\n },\n ],\n },\n {\n path: \"\",\n component: UserLayoutComponent,\n canActivate: [deepLinkGuard(), AuthGuard],\n children: [\n {\n path: \"vault\",\n loadChildren: () => VaultModule,\n },\n { path: \"sends\", component: SendComponent, data: { titleId: \"send\" } },\n {\n path: \"create-organization\",\n component: CreateOrganizationComponent,\n data: { titleId: \"newOrganization\" },\n },\n {\n path: \"settings\",\n children: [\n { path: \"\", pathMatch: \"full\", redirectTo: \"account\" },\n { path: \"account\", component: AccountComponent, data: { titleId: \"myAccount\" } },\n {\n path: \"preferences\",\n component: PreferencesComponent,\n data: { titleId: \"preferences\" },\n },\n {\n path: \"security\",\n loadChildren: () => SecurityRoutingModule,\n },\n {\n path: \"domain-rules\",\n component: DomainRulesComponent,\n data: { titleId: \"domainRules\" },\n },\n {\n path: \"subscription\",\n loadChildren: () =>\n import(\"./billing/individual/individual-billing.module\").then(\n (m) => m.IndividualBillingModule,\n ),\n },\n {\n path: \"emergency-access\",\n children: [\n {\n path: \"\",\n component: EmergencyAccessComponent,\n data: { titleId: \"emergencyAccess\" },\n },\n {\n path: \":id\",\n component: EmergencyAccessViewComponent,\n data: { titleId: \"emergencyAccess\" },\n },\n ],\n },\n {\n path: \"sponsored-families\",\n component: SponsoredFamiliesComponent,\n data: { titleId: \"sponsoredFamilies\" },\n },\n ],\n },\n {\n path: \"tools\",\n canActivate: [AuthGuard],\n children: [\n { path: \"\", pathMatch: \"full\", redirectTo: \"generator\" },\n {\n path: \"import\",\n loadComponent: () =>\n import(\"./tools/import/import-web.component\").then((mod) => mod.ImportWebComponent),\n data: {\n titleId: \"importData\",\n },\n },\n {\n path: \"export\",\n loadChildren: () =>\n import(\"./tools/vault-export/export.module\").then((m) => m.ExportModule),\n },\n {\n path: \"generator\",\n component: GeneratorComponent,\n data: { titleId: \"generator\" },\n },\n ],\n },\n {\n path: \"reports\",\n loadChildren: () => ReportsModule,\n },\n { path: \"setup/families-for-enterprise\", component: FamiliesForEnterpriseSetupComponent },\n ],\n },\n {\n path: \"organizations\",\n loadChildren: () =>\n import(\"./admin-console/organizations/organization.module\").then((m) => m.OrganizationModule),\n },\n];\n\n@NgModule({\n imports: [\n RouterModule.forRoot(routes, {\n useHash: true,\n paramsInheritanceStrategy: \"always\",\n // enableTracing: true,\n }),\n ],\n exports: [RouterModule],\n})\nexport class OssRoutingModule {}\n\nexport function buildFlaggedRoute(flagName: keyof Flags, route: Route): Route {\n return flagEnabled(flagName)\n ? route\n : {\n path: route.path,\n redirectTo: \"/\",\n };\n}\n","\n
\n

\n {{ fingerprintLabel }}:\n \n \n
\n {{ fingerprint }}\n

\n
\n","import { Component, Input, OnInit } from \"@angular/core\";\n\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\n\nimport { SharedModule } from \"../../shared.module\";\n\n@Component({\n selector: \"app-account-fingerprint\",\n templateUrl: \"account-fingerprint.component.html\",\n standalone: true,\n imports: [SharedModule],\n})\nexport class AccountFingerprintComponent implements OnInit {\n @Input() fingerprintMaterial: string;\n @Input() publicKeyBuffer: Uint8Array;\n @Input() fingerprintLabel: string;\n\n protected fingerprint: string;\n\n constructor(private cryptoService: CryptoService) {}\n\n async ngOnInit() {\n // TODO - In the future, remove this code and use the fingerprint pipe once merged\n const generatedFingerprint = await this.cryptoService.getFingerprint(\n this.fingerprintMaterial,\n this.publicKeyBuffer,\n );\n this.fingerprint = generatedFingerprint?.join(\"-\") ?? null;\n }\n}\n","\n
{{ title }}\n\n\n
  • \n \n \n \n \n \n \n \n
  • \n","import { Component, Input } from \"@angular/core\";\n\n@Component({\n selector: \"app-onboarding-task\",\n templateUrl: \"./onboarding-task.component.html\",\n host: {\n class: \"tw-max-w-max\",\n },\n})\nexport class OnboardingTaskComponent {\n @Input()\n completed = false;\n\n @Input()\n icon = \"bwi-info-circle\";\n\n @Input()\n title: string;\n\n @Input()\n route: string | any[];\n\n @Input()\n isDisabled: boolean = false;\n\n handleClick(ev: MouseEvent) {\n /**\n * If the main `ng-content` is clicked, we don't want to trigger the task's click handler.\n */\n ev.stopPropagation();\n }\n}\n","
    \n \n
    \n \n
    {{ title }}
    \n \n 0; else spinner\">\n {{ \"complete\" | i18n: amountCompleted : tasks.length }}\n \n
    \n
    \n
    \n
      \n \n
    \n
    \n \n
    \n
    \n\n\n \n\n","import { Component, ContentChildren, EventEmitter, Input, Output, QueryList } from \"@angular/core\";\n\nimport { OnboardingTaskComponent } from \"./onboarding-task.component\";\n\n@Component({\n selector: \"app-onboarding\",\n templateUrl: \"./onboarding.component.html\",\n})\nexport class OnboardingComponent {\n @ContentChildren(OnboardingTaskComponent) tasks: QueryList;\n @Input() title: string;\n\n @Output() dismiss = new EventEmitter();\n\n protected open = true;\n protected visible = false;\n\n protected get amountCompleted(): number {\n return this.tasks.filter((task) => task.completed).length;\n }\n\n protected get barWidth(): number {\n return this.tasks.length === 0 ? 0 : (this.amountCompleted / this.tasks.length) * 100;\n }\n\n protected toggle() {\n this.open = !this.open;\n }\n}\n","import { NgModule } from \"@angular/core\";\n\nimport { ProgressModule } from \"@bitwarden/components\";\n\nimport { SharedModule } from \"../../shared.module\";\n\nimport { OnboardingTaskComponent } from \"./onboarding-task.component\";\nimport { OnboardingComponent } from \"./onboarding.component\";\n\n@NgModule({\n imports: [SharedModule, ProgressModule],\n exports: [OnboardingComponent, OnboardingTaskComponent],\n declarations: [OnboardingComponent, OnboardingTaskComponent],\n})\nexport class OnboardingModule {}\n","import { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\n\nimport { SharedModule } from \"../../../../shared\";\n\nimport { ChangeKdfConfirmationComponent } from \"./change-kdf-confirmation.component\";\nimport { ChangeKdfComponent } from \"./change-kdf.component\";\n\n@NgModule({\n imports: [CommonModule, SharedModule],\n declarations: [ChangeKdfComponent, ChangeKdfConfirmationComponent],\n exports: [ChangeKdfComponent, ChangeKdfConfirmationComponent],\n})\nexport class ChangeKdfModule {}\n","import { NgModule } from \"@angular/core\";\n\nimport { PasswordCalloutComponent } from \"@bitwarden/auth/angular\";\nimport { LayoutComponent, NavigationModule } from \"@bitwarden/components\";\n\nimport { OrganizationLayoutComponent } from \"../admin-console/organizations/layouts/organization-layout.component\";\nimport { EventsComponent as OrgEventsComponent } from \"../admin-console/organizations/manage/events.component\";\nimport { UserConfirmComponent as OrgUserConfirmComponent } from \"../admin-console/organizations/manage/user-confirm.component\";\nimport { AcceptFamilySponsorshipComponent } from \"../admin-console/organizations/sponsorships/accept-family-sponsorship.component\";\nimport { ExposedPasswordsReportComponent as OrgExposedPasswordsReportComponent } from \"../admin-console/organizations/tools/exposed-passwords-report.component\";\nimport { InactiveTwoFactorReportComponent as OrgInactiveTwoFactorReportComponent } from \"../admin-console/organizations/tools/inactive-two-factor-report.component\";\nimport { ReusedPasswordsReportComponent as OrgReusedPasswordsReportComponent } from \"../admin-console/organizations/tools/reused-passwords-report.component\";\nimport { UnsecuredWebsitesReportComponent as OrgUnsecuredWebsitesReportComponent } from \"../admin-console/organizations/tools/unsecured-websites-report.component\";\nimport { WeakPasswordsReportComponent as OrgWeakPasswordsReportComponent } from \"../admin-console/organizations/tools/weak-passwords-report.component\";\nimport { ProvidersComponent } from \"../admin-console/providers/providers.component\";\nimport { SponsoredFamiliesComponent } from \"../admin-console/settings/sponsored-families.component\";\nimport { SponsoringOrgRowComponent } from \"../admin-console/settings/sponsoring-org-row.component\";\nimport { AcceptOrganizationComponent } from \"../auth/accept-organization.component\";\nimport { HintComponent } from \"../auth/hint.component\";\nimport { LockComponent } from \"../auth/lock.component\";\nimport { RecoverDeleteComponent } from \"../auth/recover-delete.component\";\nimport { RecoverTwoFactorComponent } from \"../auth/recover-two-factor.component\";\nimport { RegisterFormModule } from \"../auth/register-form/register-form.module\";\nimport { RemovePasswordComponent } from \"../auth/remove-password.component\";\nimport { SetPasswordComponent } from \"../auth/set-password.component\";\nimport { AccountComponent } from \"../auth/settings/account/account.component\";\nimport { ChangeAvatarComponent } from \"../auth/settings/account/change-avatar.component\";\nimport { ChangeEmailComponent } from \"../auth/settings/account/change-email.component\";\nimport { DangerZoneComponent } from \"../auth/settings/account/danger-zone.component\";\nimport { DeauthorizeSessionsComponent } from \"../auth/settings/account/deauthorize-sessions.component\";\nimport { DeleteAccountComponent } from \"../auth/settings/account/delete-account.component\";\nimport { ProfileComponent } from \"../auth/settings/account/profile.component\";\nimport { EmergencyAccessAttachmentsComponent } from \"../auth/settings/emergency-access/attachments/emergency-access-attachments.component\";\nimport { EmergencyAccessConfirmComponent } from \"../auth/settings/emergency-access/confirm/emergency-access-confirm.component\";\nimport { EmergencyAccessAddEditComponent } from \"../auth/settings/emergency-access/emergency-access-add-edit.component\";\nimport { EmergencyAccessComponent } from \"../auth/settings/emergency-access/emergency-access.component\";\nimport { EmergencyAccessTakeoverComponent } from \"../auth/settings/emergency-access/takeover/emergency-access-takeover.component\";\nimport { EmergencyAccessViewComponent } from \"../auth/settings/emergency-access/view/emergency-access-view.component\";\nimport { EmergencyAddEditCipherComponent } from \"../auth/settings/emergency-access/view/emergency-add-edit-cipher.component\";\nimport { ApiKeyComponent } from \"../auth/settings/security/api-key.component\";\nimport { ChangeKdfModule } from \"../auth/settings/security/change-kdf/change-kdf.module\";\nimport { SecurityKeysComponent } from \"../auth/settings/security/security-keys.component\";\nimport { SecurityComponent } from \"../auth/settings/security/security.component\";\nimport { TwoFactorAuthenticatorComponent } from \"../auth/settings/two-factor-authenticator.component\";\nimport { TwoFactorDuoComponent } from \"../auth/settings/two-factor-duo.component\";\nimport { TwoFactorEmailComponent } from \"../auth/settings/two-factor-email.component\";\nimport { TwoFactorRecoveryComponent } from \"../auth/settings/two-factor-recovery.component\";\nimport { TwoFactorSetupComponent } from \"../auth/settings/two-factor-setup.component\";\nimport { TwoFactorVerifyComponent } from \"../auth/settings/two-factor-verify.component\";\nimport { TwoFactorWebAuthnComponent } from \"../auth/settings/two-factor-webauthn.component\";\nimport { TwoFactorYubiKeyComponent } from \"../auth/settings/two-factor-yubikey.component\";\nimport { VerifyEmailComponent } from \"../auth/settings/verify-email.component\";\nimport { UserVerificationModule } from \"../auth/shared/components/user-verification\";\nimport { SsoComponent } from \"../auth/sso.component\";\nimport { TwoFactorOptionsComponent } from \"../auth/two-factor-options.component\";\nimport { TwoFactorComponent } from \"../auth/two-factor.component\";\nimport { UpdatePasswordComponent } from \"../auth/update-password.component\";\nimport { UpdateTempPasswordComponent } from \"../auth/update-temp-password.component\";\nimport { VerifyEmailTokenComponent } from \"../auth/verify-email-token.component\";\nimport { VerifyRecoverDeleteComponent } from \"../auth/verify-recover-delete.component\";\nimport { PaymentMethodWarningsModule } from \"../billing/shared\";\nimport { DynamicAvatarComponent } from \"../components/dynamic-avatar.component\";\nimport { SelectableAvatarComponent } from \"../components/selectable-avatar.component\";\nimport { FrontendLayoutComponent } from \"../layouts/frontend-layout.component\";\nimport { HeaderModule } from \"../layouts/header/header.module\";\nimport { ProductSwitcherModule } from \"../layouts/product-switcher/product-switcher.module\";\nimport { UserLayoutComponent } from \"../layouts/user-layout.component\";\nimport { DomainRulesComponent } from \"../settings/domain-rules.component\";\nimport { LowKdfComponent } from \"../settings/low-kdf.component\";\nimport { PreferencesComponent } from \"../settings/preferences.component\";\nimport { VaultTimeoutInputComponent } from \"../settings/vault-timeout-input.component\";\nimport { GeneratorComponent } from \"../tools/generator.component\";\nimport { PasswordGeneratorHistoryComponent } from \"../tools/password-generator-history.component\";\nimport { AddEditComponent as SendAddEditComponent } from \"../tools/send/add-edit.component\";\nimport { PremiumBadgeComponent } from \"../vault/components/premium-badge.component\";\nimport { AddEditCustomFieldsComponent } from \"../vault/individual-vault/add-edit-custom-fields.component\";\nimport { AddEditComponent } from \"../vault/individual-vault/add-edit.component\";\nimport { AttachmentsComponent } from \"../vault/individual-vault/attachments.component\";\nimport { CollectionsComponent } from \"../vault/individual-vault/collections.component\";\nimport { FolderAddEditComponent } from \"../vault/individual-vault/folder-add-edit.component\";\nimport { OrganizationBadgeModule } from \"../vault/individual-vault/organization-badge/organization-badge.module\";\nimport { PipesModule } from \"../vault/individual-vault/pipes/pipes.module\";\nimport { ShareComponent } from \"../vault/individual-vault/share.component\";\nimport { AddEditComponent as OrgAddEditComponent } from \"../vault/org-vault/add-edit.component\";\nimport { AttachmentsComponent as OrgAttachmentsComponent } from \"../vault/org-vault/attachments.component\";\nimport { CollectionsComponent as OrgCollectionsComponent } from \"../vault/org-vault/collections.component\";\nimport { PurgeVaultComponent } from \"../vault/settings/purge-vault.component\";\n\nimport { EnvironmentSelectorModule } from \"./../components/environment-selector/environment-selector.module\";\nimport { AccountFingerprintComponent } from \"./components/account-fingerprint/account-fingerprint.component\";\nimport { SharedModule } from \"./shared.module\";\n\n// Please do not add to this list of declarations - we should refactor these into modules when doing so makes sense until there are none left.\n// If you are building new functionality, please create or extend a feature module instead.\n@NgModule({\n imports: [\n SharedModule,\n RegisterFormModule,\n ProductSwitcherModule,\n UserVerificationModule,\n ChangeKdfModule,\n DynamicAvatarComponent,\n EnvironmentSelectorModule,\n AccountFingerprintComponent,\n OrganizationBadgeModule,\n PipesModule,\n PasswordCalloutComponent,\n DangerZoneComponent,\n LayoutComponent,\n NavigationModule,\n HeaderModule,\n OrganizationLayoutComponent,\n UserLayoutComponent,\n PaymentMethodWarningsModule,\n ],\n declarations: [\n AcceptFamilySponsorshipComponent,\n AcceptOrganizationComponent,\n AccountComponent,\n AddEditComponent,\n AddEditCustomFieldsComponent,\n AddEditCustomFieldsComponent,\n ApiKeyComponent,\n AttachmentsComponent,\n ChangeEmailComponent,\n CollectionsComponent,\n DeauthorizeSessionsComponent,\n DeleteAccountComponent,\n DomainRulesComponent,\n EmergencyAccessAddEditComponent,\n EmergencyAccessAttachmentsComponent,\n EmergencyAccessComponent,\n EmergencyAccessConfirmComponent,\n EmergencyAccessTakeoverComponent,\n EmergencyAccessViewComponent,\n EmergencyAddEditCipherComponent,\n FolderAddEditComponent,\n FrontendLayoutComponent,\n HintComponent,\n LockComponent,\n OrgAddEditComponent,\n OrgAttachmentsComponent,\n OrgCollectionsComponent,\n OrgEventsComponent,\n OrgExposedPasswordsReportComponent,\n OrgInactiveTwoFactorReportComponent,\n OrgReusedPasswordsReportComponent,\n OrgUnsecuredWebsitesReportComponent,\n OrgUserConfirmComponent,\n OrgWeakPasswordsReportComponent,\n GeneratorComponent,\n PasswordGeneratorHistoryComponent,\n PreferencesComponent,\n PremiumBadgeComponent,\n ProfileComponent,\n ChangeAvatarComponent,\n ProvidersComponent,\n PurgeVaultComponent,\n RecoverDeleteComponent,\n RecoverTwoFactorComponent,\n RemovePasswordComponent,\n SecurityComponent,\n SecurityKeysComponent,\n SelectableAvatarComponent,\n SendAddEditComponent,\n SetPasswordComponent,\n ShareComponent,\n SponsoredFamiliesComponent,\n SponsoringOrgRowComponent,\n SsoComponent,\n TwoFactorAuthenticatorComponent,\n TwoFactorComponent,\n TwoFactorDuoComponent,\n TwoFactorEmailComponent,\n TwoFactorOptionsComponent,\n TwoFactorRecoveryComponent,\n TwoFactorSetupComponent,\n TwoFactorVerifyComponent,\n TwoFactorWebAuthnComponent,\n TwoFactorYubiKeyComponent,\n UpdatePasswordComponent,\n UpdateTempPasswordComponent,\n VaultTimeoutInputComponent,\n VerifyEmailComponent,\n VerifyEmailTokenComponent,\n VerifyRecoverDeleteComponent,\n LowKdfComponent,\n ],\n exports: [\n UserVerificationModule,\n PremiumBadgeComponent,\n AcceptOrganizationComponent,\n AccountComponent,\n AddEditComponent,\n AddEditCustomFieldsComponent,\n AddEditCustomFieldsComponent,\n ApiKeyComponent,\n AttachmentsComponent,\n ChangeEmailComponent,\n CollectionsComponent,\n DeauthorizeSessionsComponent,\n DeleteAccountComponent,\n DomainRulesComponent,\n DynamicAvatarComponent,\n EmergencyAccessAddEditComponent,\n EmergencyAccessAttachmentsComponent,\n EmergencyAccessComponent,\n EmergencyAccessConfirmComponent,\n EmergencyAccessTakeoverComponent,\n EmergencyAccessViewComponent,\n EmergencyAddEditCipherComponent,\n FolderAddEditComponent,\n FrontendLayoutComponent,\n HintComponent,\n LockComponent,\n OrgAddEditComponent,\n OrganizationLayoutComponent,\n OrgAttachmentsComponent,\n OrgCollectionsComponent,\n OrgEventsComponent,\n OrgExposedPasswordsReportComponent,\n OrgInactiveTwoFactorReportComponent,\n OrgReusedPasswordsReportComponent,\n OrgUnsecuredWebsitesReportComponent,\n OrgUserConfirmComponent,\n OrgWeakPasswordsReportComponent,\n GeneratorComponent,\n PasswordGeneratorHistoryComponent,\n PreferencesComponent,\n PremiumBadgeComponent,\n ProfileComponent,\n ChangeAvatarComponent,\n ProvidersComponent,\n PurgeVaultComponent,\n RecoverDeleteComponent,\n RecoverTwoFactorComponent,\n RemovePasswordComponent,\n SecurityComponent,\n SecurityKeysComponent,\n SelectableAvatarComponent,\n SendAddEditComponent,\n SetPasswordComponent,\n ShareComponent,\n SponsoredFamiliesComponent,\n SponsoringOrgRowComponent,\n SsoComponent,\n TwoFactorAuthenticatorComponent,\n TwoFactorComponent,\n TwoFactorDuoComponent,\n TwoFactorEmailComponent,\n TwoFactorOptionsComponent,\n TwoFactorRecoveryComponent,\n TwoFactorSetupComponent,\n TwoFactorVerifyComponent,\n TwoFactorWebAuthnComponent,\n TwoFactorYubiKeyComponent,\n UpdatePasswordComponent,\n UpdateTempPasswordComponent,\n UserLayoutComponent,\n VaultTimeoutInputComponent,\n VerifyEmailComponent,\n VerifyEmailTokenComponent,\n VerifyRecoverDeleteComponent,\n LowKdfComponent,\n HeaderModule,\n DangerZoneComponent,\n ],\n})\nexport class LooseComponentsModule {}\n","import { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\n\nimport { AvatarComponent } from \"./avatar.component\";\n\n@NgModule({\n imports: [CommonModule],\n exports: [AvatarComponent],\n declarations: [AvatarComponent],\n})\nexport class AvatarModule {}\n","import { NgModule } from \"@angular/core\";\n\nimport { BadgeModule } from \"../badge\";\nimport { SharedModule } from \"../shared\";\n\nimport { BadgeListComponent } from \"./badge-list.component\";\n\n@NgModule({\n imports: [SharedModule, BadgeModule],\n exports: [BadgeListComponent],\n declarations: [BadgeListComponent],\n})\nexport class BadgeListModule {}\n","import { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\n\nimport { ColorPasswordComponent } from \"./color-password.component\";\n\n@NgModule({\n imports: [CommonModule],\n exports: [ColorPasswordComponent],\n declarations: [ColorPasswordComponent],\n})\nexport class ColorPasswordModule {}\n","import { PortalModule } from \"@angular/cdk/portal\";\nimport { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\nimport { RouterModule } from \"@angular/router\";\n\nimport { TabHeaderComponent } from \"./shared/tab-header.component\";\nimport { TabListContainerDirective } from \"./shared/tab-list-container.directive\";\nimport { TabListItemDirective } from \"./shared/tab-list-item.directive\";\nimport { TabBodyComponent } from \"./tab-group/tab-body.component\";\nimport { TabGroupComponent } from \"./tab-group/tab-group.component\";\nimport { TabLabelDirective } from \"./tab-group/tab-label.directive\";\nimport { TabComponent } from \"./tab-group/tab.component\";\nimport { TabLinkComponent } from \"./tab-nav-bar/tab-link.component\";\nimport { TabNavBarComponent } from \"./tab-nav-bar/tab-nav-bar.component\";\n\n@NgModule({\n imports: [CommonModule, RouterModule, PortalModule],\n exports: [\n TabGroupComponent,\n TabComponent,\n TabLabelDirective,\n TabNavBarComponent,\n TabLinkComponent,\n ],\n declarations: [\n TabGroupComponent,\n TabComponent,\n TabLabelDirective,\n TabListContainerDirective,\n TabListItemDirective,\n TabHeaderComponent,\n TabNavBarComponent,\n TabLinkComponent,\n TabBodyComponent,\n ],\n})\nexport class TabsModule {}\n","import { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\n\nimport { BadgeModule } from \"../badge\";\n\nimport { ToggleGroupComponent } from \"./toggle-group.component\";\nimport { ToggleComponent } from \"./toggle.component\";\n\n@NgModule({\n imports: [CommonModule, BadgeModule],\n exports: [ToggleGroupComponent, ToggleComponent],\n declarations: [ToggleGroupComponent, ToggleComponent],\n})\nexport class ToggleGroupModule {}\n","import { registerLocaleData } from \"@angular/common\";\nimport localeAf from \"@angular/common/locales/af\";\nimport localeAr from \"@angular/common/locales/ar\";\nimport localeAz from \"@angular/common/locales/az\";\nimport localeBe from \"@angular/common/locales/be\";\nimport localeBg from \"@angular/common/locales/bg\";\nimport localeBn from \"@angular/common/locales/bn\";\nimport localeBs from \"@angular/common/locales/bs\";\nimport localeCa from \"@angular/common/locales/ca\";\nimport localeCs from \"@angular/common/locales/cs\";\nimport localeCy from \"@angular/common/locales/cy\";\nimport localeDa from \"@angular/common/locales/da\";\nimport localeDe from \"@angular/common/locales/de\";\nimport localeEl from \"@angular/common/locales/el\";\nimport localeEnGb from \"@angular/common/locales/en-GB\";\nimport localeEnIn from \"@angular/common/locales/en-IN\";\nimport localeEo from \"@angular/common/locales/eo\";\nimport localeEs from \"@angular/common/locales/es\";\nimport localeEt from \"@angular/common/locales/et\";\nimport localeEu from \"@angular/common/locales/eu\";\nimport localeFa from \"@angular/common/locales/fa\";\nimport localeFi from \"@angular/common/locales/fi\";\nimport localeFil from \"@angular/common/locales/fil\";\nimport localeFr from \"@angular/common/locales/fr\";\nimport localeGl from \"@angular/common/locales/gl\";\nimport localeHe from \"@angular/common/locales/he\";\nimport localeHi from \"@angular/common/locales/hi\";\nimport localeHr from \"@angular/common/locales/hr\";\nimport localeHu from \"@angular/common/locales/hu\";\nimport localeId from \"@angular/common/locales/id\";\nimport localeIt from \"@angular/common/locales/it\";\nimport localeJa from \"@angular/common/locales/ja\";\nimport localeKa from \"@angular/common/locales/ka\";\nimport localeKm from \"@angular/common/locales/km\";\nimport localeKn from \"@angular/common/locales/kn\";\nimport localeKo from \"@angular/common/locales/ko\";\nimport localeLv from \"@angular/common/locales/lv\";\nimport localeMl from \"@angular/common/locales/ml\";\nimport localeMr from \"@angular/common/locales/mr\";\nimport localeMy from \"@angular/common/locales/my\";\nimport localeNb from \"@angular/common/locales/nb\";\nimport localeNe from \"@angular/common/locales/ne\";\nimport localeNl from \"@angular/common/locales/nl\";\nimport localeNn from \"@angular/common/locales/nn\";\nimport localeOr from \"@angular/common/locales/or\";\nimport localePl from \"@angular/common/locales/pl\";\nimport localePtBr from \"@angular/common/locales/pt\";\nimport localePtPt from \"@angular/common/locales/pt-PT\";\nimport localeRo from \"@angular/common/locales/ro\";\nimport localeRu from \"@angular/common/locales/ru\";\nimport localeSi from \"@angular/common/locales/si\";\nimport localeSk from \"@angular/common/locales/sk\";\nimport localeSl from \"@angular/common/locales/sl\";\nimport localeSr from \"@angular/common/locales/sr\";\nimport localeSv from \"@angular/common/locales/sv\";\nimport localeTe from \"@angular/common/locales/te\";\nimport localeTh from \"@angular/common/locales/th\";\nimport localeTr from \"@angular/common/locales/tr\";\nimport localeUk from \"@angular/common/locales/uk\";\nimport localeVi from \"@angular/common/locales/vi\";\nimport localeZhCn from \"@angular/common/locales/zh-Hans\";\nimport localeZhTw from \"@angular/common/locales/zh-Hant\";\n\nregisterLocaleData(localeAf, \"af\");\nregisterLocaleData(localeAr, \"ar\");\nregisterLocaleData(localeAz, \"az\");\nregisterLocaleData(localeBe, \"be\");\nregisterLocaleData(localeBg, \"bg\");\nregisterLocaleData(localeBn, \"bn\");\nregisterLocaleData(localeBs, \"bs\");\nregisterLocaleData(localeCa, \"ca\");\nregisterLocaleData(localeCs, \"cs\");\nregisterLocaleData(localeCy, \"cy\");\nregisterLocaleData(localeDa, \"da\");\nregisterLocaleData(localeDe, \"de\");\nregisterLocaleData(localeEl, \"el\");\nregisterLocaleData(localeEnGb, \"en-GB\");\nregisterLocaleData(localeEnIn, \"en-IN\");\nregisterLocaleData(localeEo, \"eo\");\nregisterLocaleData(localeEs, \"es\");\nregisterLocaleData(localeEt, \"et\");\nregisterLocaleData(localeEu, \"eu\");\nregisterLocaleData(localeFa, \"fa\");\nregisterLocaleData(localeFi, \"fi\");\nregisterLocaleData(localeFil, \"fil\");\nregisterLocaleData(localeFr, \"fr\");\nregisterLocaleData(localeGl, \"gl\");\nregisterLocaleData(localeHe, \"he\");\nregisterLocaleData(localeHi, \"hi\");\nregisterLocaleData(localeHr, \"hr\");\nregisterLocaleData(localeHu, \"hu\");\nregisterLocaleData(localeId, \"id\");\nregisterLocaleData(localeIt, \"it\");\nregisterLocaleData(localeJa, \"ja\");\nregisterLocaleData(localeKa, \"ka\");\nregisterLocaleData(localeKm, \"km\");\nregisterLocaleData(localeKn, \"kn\");\nregisterLocaleData(localeKo, \"ko\");\nregisterLocaleData(localeLv, \"lv\");\nregisterLocaleData(localeMl, \"ml\");\nregisterLocaleData(localeMr, \"mr\");\nregisterLocaleData(localeMy, \"my\");\nregisterLocaleData(localeNb, \"nb\");\nregisterLocaleData(localeNe, \"ne\");\nregisterLocaleData(localeNl, \"nl\");\nregisterLocaleData(localeNn, \"nn\");\nregisterLocaleData(localeOr, \"or\");\nregisterLocaleData(localePl, \"pl\");\nregisterLocaleData(localePtBr, \"pt-BR\");\nregisterLocaleData(localePtPt, \"pt-PT\");\nregisterLocaleData(localeRo, \"ro\");\nregisterLocaleData(localeRu, \"ru\");\nregisterLocaleData(localeSi, \"si\");\nregisterLocaleData(localeSk, \"sk\");\nregisterLocaleData(localeSl, \"sl\");\nregisterLocaleData(localeSr, \"sr\");\nregisterLocaleData(localeSv, \"sv\");\nregisterLocaleData(localeTe, \"te\");\nregisterLocaleData(localeTh, \"th\");\nregisterLocaleData(localeTr, \"tr\");\nregisterLocaleData(localeUk, \"uk\");\nregisterLocaleData(localeVi, \"vi\");\nregisterLocaleData(localeZhCn, \"zh-CN\");\nregisterLocaleData(localeZhTw, \"zh-TW\");\n","import { DragDropModule } from \"@angular/cdk/drag-drop\";\nimport { CommonModule, DatePipe } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\nimport { FormsModule, ReactiveFormsModule } from \"@angular/forms\";\nimport { RouterModule } from \"@angular/router\";\nimport { InfiniteScrollModule } from \"ngx-infinite-scroll\";\nimport { ToastrModule } from \"ngx-toastr\";\n\nimport { JslibModule } from \"@bitwarden/angular/jslib.module\";\nimport {\n AsyncActionsModule,\n AvatarModule,\n BadgeListModule,\n BadgeModule,\n ButtonModule,\n CalloutModule,\n CheckboxModule,\n ColorPasswordModule,\n ContainerComponent,\n DialogModule,\n FormFieldModule,\n IconButtonModule,\n IconModule,\n LinkModule,\n MenuModule,\n MultiSelectModule,\n ProgressModule,\n RadioButtonModule,\n SectionComponent,\n SelectModule,\n TableModule,\n TabsModule,\n ToggleGroupModule,\n TypographyModule,\n} from \"@bitwarden/components\";\n\n// Register the locales for the application\nimport \"./locales\";\n\n/**\n * This NgModule should contain the most basic shared directives, pipes, and components. They\n * should be widely used by other modules to be considered for adding to this module. If in doubt\n * do not add to this module.\n *\n * See: https://angular.io/guide/module-types#shared-ngmodules\n */\n@NgModule({\n imports: [\n CommonModule,\n DragDropModule,\n FormsModule,\n ReactiveFormsModule,\n InfiniteScrollModule,\n RouterModule,\n ToastrModule,\n JslibModule,\n\n // Component library modules\n // Only add components that are used almost everywhere in the application\n AsyncActionsModule,\n AvatarModule,\n BadgeListModule,\n BadgeModule,\n ButtonModule,\n CalloutModule,\n CheckboxModule,\n ColorPasswordModule,\n ContainerComponent,\n DialogModule,\n FormFieldModule,\n IconButtonModule,\n IconModule,\n LinkModule,\n MenuModule,\n MultiSelectModule,\n ProgressModule,\n RadioButtonModule,\n SectionComponent,\n TableModule,\n TabsModule,\n ToggleGroupModule,\n TypographyModule,\n\n // Web specific\n ],\n exports: [\n CommonModule,\n DragDropModule,\n FormsModule,\n ReactiveFormsModule,\n InfiniteScrollModule,\n RouterModule,\n ToastrModule,\n JslibModule,\n\n // Component library\n AsyncActionsModule,\n AvatarModule,\n BadgeListModule,\n BadgeModule,\n ButtonModule,\n CalloutModule,\n CheckboxModule,\n ColorPasswordModule,\n ContainerComponent,\n DialogModule,\n FormFieldModule,\n IconButtonModule,\n IconModule,\n LinkModule,\n MenuModule,\n MultiSelectModule,\n ProgressModule,\n RadioButtonModule,\n SectionComponent,\n SelectModule,\n TableModule,\n TabsModule,\n ToggleGroupModule,\n TypographyModule,\n\n // Web specific\n ],\n providers: [DatePipe],\n bootstrap: [],\n})\nexport class SharedModule {}\n","import { EventType } from \"@bitwarden/common/enums\";\nimport { EventView } from \"@bitwarden/common/models/view/event.view\";\n\nexport class EventExport {\n message: string;\n appIcon: string;\n appName: string;\n userId: string;\n userName: string;\n userEmail: string;\n date: string;\n ip: string;\n type: string;\n installationId: string;\n\n constructor(event: EventView) {\n this.message = event.humanReadableMessage;\n this.appIcon = event.appIcon;\n this.appName = event.appName;\n this.userId = event.userId;\n this.userName = event.userName;\n this.userEmail = event.userEmail;\n this.date = event.date;\n this.ip = event.ip;\n this.type = EventType[event.type];\n this.installationId = event.installationId;\n }\n}\n","import { Injectable } from \"@angular/core\";\nimport * as papa from \"papaparse\";\n\nimport { EventView } from \"@bitwarden/common/models/view/event.view\";\n\nimport { EventExport } from \"./event.export\";\n\n@Injectable({\n providedIn: \"root\",\n})\nexport class EventExportService {\n async getEventExport(events: EventView[]): Promise {\n return papa.unparse(events.map((e) => new EventExport(e)));\n }\n\n getFileName(prefix: string = null, extension = \"csv\"): string {\n const now = new Date();\n const dateString =\n now.getFullYear() +\n \"\" +\n this.padNumber(now.getMonth() + 1, 2) +\n \"\" +\n this.padNumber(now.getDate(), 2) +\n this.padNumber(now.getHours(), 2) +\n \"\" +\n this.padNumber(now.getMinutes(), 2) +\n this.padNumber(now.getSeconds(), 2);\n\n return \"bitwarden\" + (prefix ? \"_\" + prefix : \"\") + \"_export_\" + dateString + \".\" + extension;\n }\n\n private padNumber(num: number, width: number, padCharacter = \"0\"): string {\n const numString = num.toString();\n return numString.length >= width\n ? numString\n : new Array(width - numString.length + 1).join(padCharacter) + numString;\n }\n}\n","import { inject } from \"@angular/core\";\nimport {\n ActivatedRouteSnapshot,\n RouterStateSnapshot,\n Router,\n CanActivateFn,\n UrlTree,\n} from \"@angular/router\";\nimport { Observable } from \"rxjs\";\nimport { tap } from \"rxjs/operators\";\n\nimport { BillingAccountProfileStateService } from \"@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\n\n/**\n * CanActivate guard that checks if the user has premium and otherwise triggers the \"premiumRequired\"\n * message and blocks navigation.\n */\nexport function hasPremiumGuard(): CanActivateFn {\n return (\n _route: ActivatedRouteSnapshot,\n _state: RouterStateSnapshot,\n ): Observable => {\n const router = inject(Router);\n const messagingService = inject(MessagingService);\n const billingAccountProfileStateService = inject(BillingAccountProfileStateService);\n\n return billingAccountProfileStateService.hasPremiumFromAnySource$.pipe(\n tap((userHasPremium: boolean) => {\n if (!userHasPremium) {\n messagingService.send(\"premiumRequired\");\n }\n }),\n // Prevent trapping the user on the login page, since that's an awful UX flow\n tap((userHasPremium: boolean) => {\n if (!userHasPremium && router.url === \"/login\") {\n return router.createUrlTree([\"/\"]);\n }\n }),\n );\n };\n}\n","\n\n\n

    {{ \"breachDesc\" | i18n }}

    \n
    \n
    \n
    \n \n \n {{ \"breachCheckUsernameEmail\" | i18n }}\n
    \n
    \n \n
    \n
    \n

    {{ \"reportError\" | i18n }}...

    \n \n \n {{ \"breachUsernameNotFound\" | i18n: checkedUsername }}\n \n \n {{ \"breachUsernameFound\" | i18n: checkedUsername : breachedAccounts.length }}\n \n
      \n
    • \n
      \n
      \n \"\"\n
      \n
      \n

      {{ a.title }}

      \n

      \n

      {{ \"compromisedData\" | i18n }}:

      \n
        \n
      • {{ d }}
      • \n
      \n
      \n
      \n
      \n
      {{ \"website\" | i18n }}
      \n
      {{ a.domain }}
      \n
      {{ \"affectedUsers\" | i18n }}
      \n
      {{ a.pwnCount | number }}
      \n
      {{ \"breachOccurred\" | i18n }}
      \n
      {{ a.breachDate | date: \"mediumDate\" }}
      \n
      {{ \"breachReported\" | i18n }}
      \n
      {{ a.addedDate | date: \"mediumDate\" }}
      \n
      \n
      \n
      \n
    • \n
    \n
    \n
    \n
    \n","import { Component, OnInit } from \"@angular/core\";\n\nimport { AuditService } from \"@bitwarden/common/abstractions/audit.service\";\nimport { BreachAccountResponse } from \"@bitwarden/common/models/response/breach-account.response\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\n\n@Component({\n selector: \"app-breach-report\",\n templateUrl: \"breach-report.component.html\",\n})\nexport class BreachReportComponent implements OnInit {\n error = false;\n username: string;\n checkedUsername: string;\n breachedAccounts: BreachAccountResponse[] = [];\n formPromise: Promise;\n\n constructor(\n private auditService: AuditService,\n private stateService: StateService,\n ) {}\n\n async ngOnInit() {\n this.username = await this.stateService.getEmail();\n }\n\n async submit() {\n this.error = false;\n this.username = this.username.toLowerCase();\n try {\n this.formPromise = this.auditService.breachedAccounts(this.username);\n this.breachedAccounts = await this.formPromise;\n } catch {\n this.error = true;\n }\n this.checkedUsername = this.username;\n }\n}\n","import { svgIcon } from \"@bitwarden/components\";\n\nexport const ReportBreach = svgIcon`\n \n \n \n \n \n \n \n \n \n \n`;\n","import { svgIcon } from \"@bitwarden/components\";\n\nexport const ReportExposedPasswords = svgIcon`\n \n \n \n \n \n \n \n \n \n \n \n \n`;\n","import { svgIcon } from \"@bitwarden/components\";\n\nexport const ReportInactiveTwoFactor = svgIcon`\n \n \n \n \n \n \n`;\n","import { svgIcon } from \"@bitwarden/components\";\n\nexport const ReportReusedPasswords = svgIcon`\n \n \n \n \n \n`;\n","import { svgIcon } from \"@bitwarden/components\";\n\nexport const ReportUnsecuredWebsites = svgIcon`\n \n \n \n \n \n \n \n \n`;\n","import { svgIcon } from \"@bitwarden/components\";\n\nexport const ReportWeakPasswords = svgIcon`\n \n \n \n \n \n \n`;\n","import { ReportBreach } from \"./icons/report-breach.icon\";\nimport { ReportExposedPasswords } from \"./icons/report-exposed-passwords.icon\";\nimport { ReportInactiveTwoFactor } from \"./icons/report-inactive-two-factor.icon\";\nimport { ReportReusedPasswords } from \"./icons/report-reused-passwords.icon\";\nimport { ReportUnsecuredWebsites } from \"./icons/report-unsecured-websites.icon\";\nimport { ReportWeakPasswords } from \"./icons/report-weak-passwords.icon\";\nimport { ReportEntry } from \"./shared\";\n\nexport enum ReportType {\n ExposedPasswords = \"exposedPasswords\",\n ReusedPasswords = \"reusedPasswords\",\n WeakPasswords = \"weakPasswords\",\n UnsecuredWebsites = \"unsecuredWebsites\",\n Inactive2fa = \"inactive2fa\",\n DataBreach = \"dataBreach\",\n}\n\ntype ReportWithoutVariant = Omit;\n\nexport const reports: Record = {\n [ReportType.ExposedPasswords]: {\n title: \"exposedPasswordsReport\",\n description: \"exposedPasswordsReportDesc\",\n route: \"exposed-passwords-report\",\n icon: ReportExposedPasswords,\n },\n [ReportType.ReusedPasswords]: {\n title: \"reusedPasswordsReport\",\n description: \"reusedPasswordsReportDesc\",\n route: \"reused-passwords-report\",\n icon: ReportReusedPasswords,\n },\n [ReportType.WeakPasswords]: {\n title: \"weakPasswordsReport\",\n description: \"weakPasswordsReportDesc\",\n route: \"weak-passwords-report\",\n icon: ReportWeakPasswords,\n },\n [ReportType.UnsecuredWebsites]: {\n title: \"unsecuredWebsitesReport\",\n description: \"unsecuredWebsitesReportDesc\",\n route: \"unsecured-websites-report\",\n icon: ReportUnsecuredWebsites,\n },\n [ReportType.Inactive2fa]: {\n title: \"inactive2faReport\",\n description: \"inactive2faReportDesc\",\n route: \"inactive-two-factor-report\",\n icon: ReportInactiveTwoFactor,\n },\n [ReportType.DataBreach]: {\n title: \"dataBreachReport\",\n description: \"breachDesc\",\n route: \"breach-report\",\n icon: ReportBreach,\n },\n};\n","import { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\n\nimport { SharedModule } from \"../../../shared/shared.module\";\n\nimport { ReportCardComponent } from \"./report-card/report-card.component\";\nimport { ReportListComponent } from \"./report-list/report-list.component\";\n\n@NgModule({\n imports: [CommonModule, SharedModule],\n declarations: [ReportCardComponent, ReportListComponent],\n exports: [ReportCardComponent, ReportListComponent],\n})\nexport class ReportsSharedModule {}\n","import { Component, OnInit } from \"@angular/core\";\nimport { firstValueFrom } from \"rxjs\";\n\nimport { BillingAccountProfileStateService } from \"@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service\";\n\nimport { reports, ReportType } from \"../reports\";\nimport { ReportEntry, ReportVariant } from \"../shared\";\n\n@Component({\n selector: \"app-reports-home\",\n templateUrl: \"reports-home.component.html\",\n})\nexport class ReportsHomeComponent implements OnInit {\n reports: ReportEntry[];\n\n constructor(private billingAccountProfileStateService: BillingAccountProfileStateService) {}\n\n async ngOnInit(): Promise {\n const userHasPremium = await firstValueFrom(\n this.billingAccountProfileStateService.hasPremiumFromAnySource$,\n );\n const reportRequiresPremium = userHasPremium\n ? ReportVariant.Enabled\n : ReportVariant.RequiresPremium;\n\n this.reports = [\n {\n ...reports[ReportType.ExposedPasswords],\n variant: reportRequiresPremium,\n },\n {\n ...reports[ReportType.ReusedPasswords],\n variant: reportRequiresPremium,\n },\n {\n ...reports[ReportType.WeakPasswords],\n variant: reportRequiresPremium,\n },\n {\n ...reports[ReportType.UnsecuredWebsites],\n variant: reportRequiresPremium,\n },\n {\n ...reports[ReportType.Inactive2fa],\n variant: reportRequiresPremium,\n },\n {\n ...reports[ReportType.DataBreach],\n variant: ReportVariant.Enabled,\n },\n ];\n }\n}\n","\n\n\n

    {{ \"reportsDesc\" | i18n }}

    \n\n \n
    \n","\n\n\n","import { Component, OnDestroy } from \"@angular/core\";\nimport { NavigationEnd, Router } from \"@angular/router\";\nimport { Subscription } from \"rxjs\";\nimport { filter } from \"rxjs/operators\";\n\n@Component({\n selector: \"app-reports-layout\",\n templateUrl: \"reports-layout.component.html\",\n})\nexport class ReportsLayoutComponent implements OnDestroy {\n homepage = true;\n subscription: Subscription;\n\n constructor(router: Router) {\n this.subscription = router.events\n .pipe(filter((event) => event instanceof NavigationEnd))\n // eslint-disable-next-line rxjs-angular/prefer-takeuntil\n .subscribe((event) => {\n this.homepage = (event as NavigationEnd).url == \"/reports\";\n });\n }\n\n ngOnDestroy(): void {\n this.subscription?.unsubscribe();\n }\n}\n","import { NgModule } from \"@angular/core\";\nimport { RouterModule, Routes } from \"@angular/router\";\n\nimport { AuthGuard } from \"@bitwarden/angular/auth/guards\";\n\nimport { hasPremiumGuard } from \"../../core/guards/has-premium.guard\";\n\nimport { BreachReportComponent } from \"./pages/breach-report.component\";\nimport { ExposedPasswordsReportComponent } from \"./pages/exposed-passwords-report.component\";\nimport { InactiveTwoFactorReportComponent } from \"./pages/inactive-two-factor-report.component\";\nimport { ReportsHomeComponent } from \"./pages/reports-home.component\";\nimport { ReusedPasswordsReportComponent } from \"./pages/reused-passwords-report.component\";\nimport { UnsecuredWebsitesReportComponent } from \"./pages/unsecured-websites-report.component\";\nimport { WeakPasswordsReportComponent } from \"./pages/weak-passwords-report.component\";\nimport { ReportsLayoutComponent } from \"./reports-layout.component\";\n\nconst routes: Routes = [\n {\n path: \"\",\n component: ReportsLayoutComponent,\n canActivate: [AuthGuard],\n children: [\n {\n path: \"\",\n pathMatch: \"full\",\n component: ReportsHomeComponent,\n data: { titleId: \"reports\", homepage: true },\n },\n {\n path: \"breach-report\",\n component: BreachReportComponent,\n data: { titleId: \"dataBreachReport\" },\n },\n {\n path: \"reused-passwords-report\",\n component: ReusedPasswordsReportComponent,\n data: { titleId: \"reusedPasswordsReport\" },\n canActivate: [hasPremiumGuard()],\n },\n {\n path: \"unsecured-websites-report\",\n component: UnsecuredWebsitesReportComponent,\n data: { titleId: \"unsecuredWebsitesReport\" },\n canActivate: [hasPremiumGuard()],\n },\n {\n path: \"weak-passwords-report\",\n component: WeakPasswordsReportComponent,\n data: { titleId: \"weakPasswordsReport\" },\n canActivate: [hasPremiumGuard()],\n },\n {\n path: \"exposed-passwords-report\",\n component: ExposedPasswordsReportComponent,\n data: { titleId: \"exposedPasswordsReport\" },\n canActivate: [hasPremiumGuard()],\n },\n {\n path: \"inactive-two-factor-report\",\n component: InactiveTwoFactorReportComponent,\n data: { titleId: \"inactive2faReport\" },\n canActivate: [hasPremiumGuard()],\n },\n ],\n },\n];\n\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule],\n})\nexport class ReportsRoutingModule {}\n","import { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\n\nimport { HeaderModule } from \"../../layouts/header/header.module\";\nimport { SharedModule } from \"../../shared\";\nimport { OrganizationBadgeModule } from \"../../vault/individual-vault/organization-badge/organization-badge.module\";\nimport { PipesModule } from \"../../vault/individual-vault/pipes/pipes.module\";\n\nimport { BreachReportComponent } from \"./pages/breach-report.component\";\nimport { ExposedPasswordsReportComponent } from \"./pages/exposed-passwords-report.component\";\nimport { InactiveTwoFactorReportComponent } from \"./pages/inactive-two-factor-report.component\";\nimport { ReportsHomeComponent } from \"./pages/reports-home.component\";\nimport { ReusedPasswordsReportComponent } from \"./pages/reused-passwords-report.component\";\nimport { UnsecuredWebsitesReportComponent } from \"./pages/unsecured-websites-report.component\";\nimport { WeakPasswordsReportComponent } from \"./pages/weak-passwords-report.component\";\nimport { ReportsLayoutComponent } from \"./reports-layout.component\";\nimport { ReportsRoutingModule } from \"./reports-routing.module\";\nimport { ReportsSharedModule } from \"./shared\";\n\n@NgModule({\n imports: [\n CommonModule,\n SharedModule,\n ReportsSharedModule,\n ReportsRoutingModule,\n OrganizationBadgeModule,\n PipesModule,\n HeaderModule,\n ],\n declarations: [\n BreachReportComponent,\n ExposedPasswordsReportComponent,\n InactiveTwoFactorReportComponent,\n ReportsLayoutComponent,\n ReportsHomeComponent,\n ReusedPasswordsReportComponent,\n UnsecuredWebsitesReportComponent,\n WeakPasswordsReportComponent,\n ],\n})\nexport class ReportsModule {}\n","import { Directive, ViewChild, ViewContainerRef } from \"@angular/core\";\nimport { Observable } from \"rxjs\";\n\nimport { ModalService } from \"@bitwarden/angular/services/modal.service\";\nimport { OrganizationService } from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\nimport { CipherRepromptType } from \"@bitwarden/common/vault/enums/cipher-reprompt-type\";\nimport { CipherView } from \"@bitwarden/common/vault/models/view/cipher.view\";\nimport { PasswordRepromptService } from \"@bitwarden/vault\";\n\nimport { AddEditComponent } from \"../../../vault/individual-vault/add-edit.component\";\nimport { AddEditComponent as OrgAddEditComponent } from \"../../../vault/org-vault/add-edit.component\";\n\n@Directive()\nexport class CipherReportComponent {\n @ViewChild(\"cipherAddEdit\", { read: ViewContainerRef, static: true })\n cipherAddEditModalRef: ViewContainerRef;\n\n loading = false;\n hasLoaded = false;\n ciphers: CipherView[] = [];\n organization: Organization;\n organizations$: Observable;\n\n constructor(\n private modalService: ModalService,\n protected passwordRepromptService: PasswordRepromptService,\n protected organizationService: OrganizationService,\n ) {\n this.organizations$ = this.organizationService.organizations$;\n }\n\n async load() {\n this.loading = true;\n await this.setCiphers();\n this.loading = false;\n this.hasLoaded = true;\n }\n\n async selectCipher(cipher: CipherView) {\n if (!(await this.repromptCipher(cipher))) {\n return;\n }\n\n const type = this.organization != null ? OrgAddEditComponent : AddEditComponent;\n\n const [modal, childComponent] = await this.modalService.openViewRef(\n type,\n this.cipherAddEditModalRef,\n (comp: OrgAddEditComponent | AddEditComponent) => {\n if (this.organization != null) {\n (comp as OrgAddEditComponent).organization = this.organization;\n comp.organizationId = this.organization.id;\n }\n\n comp.cipherId = cipher == null ? null : cipher.id;\n // eslint-disable-next-line rxjs/no-async-subscribe\n comp.onSavedCipher.subscribe(async () => {\n modal.close();\n await this.load();\n });\n // eslint-disable-next-line rxjs/no-async-subscribe\n comp.onDeletedCipher.subscribe(async () => {\n modal.close();\n await this.load();\n });\n // eslint-disable-next-line rxjs/no-async-subscribe\n comp.onRestoredCipher.subscribe(async () => {\n modal.close();\n await this.load();\n });\n },\n );\n\n return childComponent;\n }\n\n protected async setCiphers() {\n this.ciphers = [];\n }\n\n protected async repromptCipher(c: CipherView) {\n return (\n c.reprompt === CipherRepromptType.None ||\n (await this.passwordRepromptService.showPasswordPrompt())\n );\n }\n}\n","\n\n\n

    {{ \"exposedPasswordsReportDesc\" | i18n }}

    \n \n
    \n \n {{ \"noExposedPasswords\" | i18n }}\n \n \n \n {{ \"exposedPasswordsFoundDesc\" | i18n: (ciphers.length | number) }}\n \n \n \n \n \n \n \n \n \n \n
    \n \n \n \n {{ c.name }}\n \n \n {{ c.name }}\n \n \n \n {{ \"shared\" | i18n }}\n \n \n \n {{ \"attachments\" | i18n }}\n \n
    \n {{ c.subTitle }}\n
    \n \n \n \n \n {{ \"exposedXTimes\" | i18n: (exposedPasswordMap.get(c.id) | number) }}\n \n
    \n
    \n
    \n \n
    \n","import { Component, OnInit } from \"@angular/core\";\n\nimport { ModalService } from \"@bitwarden/angular/services/modal.service\";\nimport { AuditService } from \"@bitwarden/common/abstractions/audit.service\";\nimport { OrganizationService } from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport { CipherService } from \"@bitwarden/common/vault/abstractions/cipher.service\";\nimport { CipherType } from \"@bitwarden/common/vault/enums\";\nimport { CipherView } from \"@bitwarden/common/vault/models/view/cipher.view\";\nimport { PasswordRepromptService } from \"@bitwarden/vault\";\n\nimport { CipherReportComponent } from \"./cipher-report.component\";\n\n@Component({\n selector: \"app-exposed-passwords-report\",\n templateUrl: \"exposed-passwords-report.component.html\",\n})\nexport class ExposedPasswordsReportComponent extends CipherReportComponent implements OnInit {\n exposedPasswordMap = new Map();\n disabled = true;\n\n constructor(\n protected cipherService: CipherService,\n protected auditService: AuditService,\n protected organizationService: OrganizationService,\n modalService: ModalService,\n passwordRepromptService: PasswordRepromptService,\n ) {\n super(modalService, passwordRepromptService, organizationService);\n }\n\n async ngOnInit() {\n await super.load();\n }\n\n async setCiphers() {\n const allCiphers = await this.getAllCiphers();\n const exposedPasswordCiphers: CipherView[] = [];\n const promises: Promise[] = [];\n allCiphers.forEach((ciph) => {\n const { type, login, isDeleted, edit, viewPassword, id } = ciph;\n if (\n type !== CipherType.Login ||\n login.password == null ||\n login.password === \"\" ||\n isDeleted ||\n (!this.organization && !edit) ||\n !viewPassword\n ) {\n return;\n }\n const promise = this.auditService.passwordLeaked(login.password).then((exposedCount) => {\n if (exposedCount > 0) {\n exposedPasswordCiphers.push(ciph);\n this.exposedPasswordMap.set(id, exposedCount);\n }\n });\n promises.push(promise);\n });\n await Promise.all(promises);\n this.ciphers = [...exposedPasswordCiphers];\n }\n\n protected getAllCiphers(): Promise {\n return this.cipherService.getAllDecrypted();\n }\n\n protected canManageCipher(c: CipherView): boolean {\n // this will only ever be false from the org view;\n return true;\n }\n}\n","\n\n\n

    {{ \"inactive2faReportDesc\" | i18n }}

    \n
    \n \n {{ \"loading\" | i18n }}\n
    \n
    \n \n {{ \"noInactive2fa\" | i18n }}\n \n \n \n {{ \"inactive2faFoundDesc\" | i18n: (ciphers.length | number) }}\n \n \n \n \n \n \n \n \n \n \n
    \n \n \n {{\n c.name\n }}\n \n \n {{ \"shared\" | i18n }}\n \n \n \n {{ \"attachments\" | i18n }}\n \n
    \n {{ c.subTitle }}\n
    \n \n \n \n \n {{ \"instructions\" | i18n }}\n
    \n
    \n
    \n \n\n","import { Component, OnInit } from \"@angular/core\";\n\nimport { ModalService } from \"@bitwarden/angular/services/modal.service\";\nimport { OrganizationService } from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\nimport { CipherService } from \"@bitwarden/common/vault/abstractions/cipher.service\";\nimport { CipherType } from \"@bitwarden/common/vault/enums\";\nimport { CipherView } from \"@bitwarden/common/vault/models/view/cipher.view\";\nimport { PasswordRepromptService } from \"@bitwarden/vault\";\n\nimport { CipherReportComponent } from \"./cipher-report.component\";\n\n@Component({\n selector: \"app-inactive-two-factor-report\",\n templateUrl: \"inactive-two-factor-report.component.html\",\n})\nexport class InactiveTwoFactorReportComponent extends CipherReportComponent implements OnInit {\n services = new Map();\n cipherDocs = new Map();\n disabled = true;\n\n constructor(\n protected cipherService: CipherService,\n protected organizationService: OrganizationService,\n modalService: ModalService,\n private logService: LogService,\n passwordRepromptService: PasswordRepromptService,\n ) {\n super(modalService, passwordRepromptService, organizationService);\n }\n\n async ngOnInit() {\n await super.load();\n }\n\n async setCiphers() {\n try {\n await this.load2fa();\n } catch (e) {\n this.logService.error(e);\n }\n\n if (this.services.size > 0) {\n const allCiphers = await this.getAllCiphers();\n const inactive2faCiphers: CipherView[] = [];\n const docs = new Map();\n\n allCiphers.forEach((ciph) => {\n const { type, login, isDeleted, edit, id, viewPassword } = ciph;\n if (\n type !== CipherType.Login ||\n (login.totp != null && login.totp !== \"\") ||\n !login.hasUris ||\n isDeleted ||\n (!this.organization && !edit) ||\n !viewPassword\n ) {\n return;\n }\n for (let i = 0; i < login.uris.length; i++) {\n const u = login.uris[i];\n if (u.uri != null && u.uri !== \"\") {\n const uri = u.uri.replace(\"www.\", \"\");\n const domain = Utils.getDomain(uri);\n if (domain != null && this.services.has(domain)) {\n if (this.services.get(domain) != null) {\n docs.set(id, this.services.get(domain));\n }\n // If the uri is in the 2fa list. Add the cipher to the inactive\n // collection. No need to check any additional uris for the cipher.\n inactive2faCiphers.push(ciph);\n return;\n }\n }\n }\n });\n this.ciphers = [...inactive2faCiphers];\n this.cipherDocs = docs;\n }\n }\n\n protected getAllCiphers(): Promise {\n return this.cipherService.getAllDecrypted();\n }\n\n private async load2fa() {\n if (this.services.size > 0) {\n return;\n }\n const response = await fetch(new Request(\"https://api.2fa.directory/v3/totp.json\"));\n if (response.status !== 200) {\n throw new Error();\n }\n const responseJson = await response.json();\n for (const service of responseJson) {\n const serviceData = service[1];\n if (serviceData.domain == null) {\n continue;\n }\n if (serviceData.documentation == null) {\n continue;\n }\n if (serviceData[\"additional-domains\"] != null) {\n for (const additionalDomain of serviceData[\"additional-domains\"]) {\n this.services.set(additionalDomain, serviceData.documentation);\n }\n }\n this.services.set(serviceData.domain, serviceData.documentation);\n }\n }\n}\n","\n\n\n

    {{ \"reusedPasswordsReportDesc\" | i18n }}

    \n
    \n \n {{ \"loading\" | i18n }}\n
    \n
    \n \n {{ \"noReusedPasswords\" | i18n }}\n \n \n \n {{ \"reusedPasswordsFoundDesc\" | i18n: (ciphers.length | number) }}\n \n \n \n \n \n \n \n \n \n \n
    \n \n \n \n {{ c.name }}\n \n \n {{ c.name }}\n \n \n \n {{ \"shared\" | i18n }}\n \n \n \n {{ \"attachments\" | i18n }}\n \n
    \n {{ c.subTitle }}\n
    \n \n \n \n \n {{ \"reusedXTimes\" | i18n: passwordUseMap.get(c.login.password) }}\n \n
    \n
    \n
    \n \n\n","import { Component, OnInit } from \"@angular/core\";\n\nimport { ModalService } from \"@bitwarden/angular/services/modal.service\";\nimport { OrganizationService } from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport { CipherService } from \"@bitwarden/common/vault/abstractions/cipher.service\";\nimport { CipherType } from \"@bitwarden/common/vault/enums\";\nimport { CipherView } from \"@bitwarden/common/vault/models/view/cipher.view\";\nimport { PasswordRepromptService } from \"@bitwarden/vault\";\n\nimport { CipherReportComponent } from \"./cipher-report.component\";\n\n@Component({\n selector: \"app-reused-passwords-report\",\n templateUrl: \"reused-passwords-report.component.html\",\n})\nexport class ReusedPasswordsReportComponent extends CipherReportComponent implements OnInit {\n passwordUseMap: Map;\n disabled = true;\n\n constructor(\n protected cipherService: CipherService,\n protected organizationService: OrganizationService,\n modalService: ModalService,\n passwordRepromptService: PasswordRepromptService,\n ) {\n super(modalService, passwordRepromptService, organizationService);\n }\n\n async ngOnInit() {\n await super.load();\n }\n\n async setCiphers() {\n const allCiphers = await this.getAllCiphers();\n const ciphersWithPasswords: CipherView[] = [];\n this.passwordUseMap = new Map();\n allCiphers.forEach((ciph) => {\n const { type, login, isDeleted, edit, viewPassword } = ciph;\n if (\n type !== CipherType.Login ||\n login.password == null ||\n login.password === \"\" ||\n isDeleted ||\n (!this.organization && !edit) ||\n !viewPassword\n ) {\n return;\n }\n ciphersWithPasswords.push(ciph);\n if (this.passwordUseMap.has(login.password)) {\n this.passwordUseMap.set(login.password, this.passwordUseMap.get(login.password) + 1);\n } else {\n this.passwordUseMap.set(login.password, 1);\n }\n });\n const reusedPasswordCiphers = ciphersWithPasswords.filter(\n (c) =>\n this.passwordUseMap.has(c.login.password) && this.passwordUseMap.get(c.login.password) > 1,\n );\n this.ciphers = reusedPasswordCiphers;\n }\n\n protected getAllCiphers(): Promise {\n return this.cipherService.getAllDecrypted();\n }\n\n protected canManageCipher(c: CipherView): boolean {\n // this will only ever be false from an organization view\n return true;\n }\n}\n","\n\n\n

    {{ \"unsecuredWebsitesReportDesc\" | i18n }}

    \n
    \n \n {{ \"loading\" | i18n }}\n
    \n
    \n \n {{ \"noUnsecuredWebsites\" | i18n }}\n \n \n \n {{ \"unsecuredWebsitesFoundDesc\" | i18n: (ciphers.length | number) }}\n \n \n \n \n \n \n \n \n \n
    \n \n \n {{\n c.name\n }}\n \n \n {{ \"shared\" | i18n }}\n \n \n \n {{ \"attachments\" | i18n }}\n \n
    \n {{ c.subTitle }}\n
    \n \n \n
    \n
    \n
    \n \n
    \n","import { Component, OnInit } from \"@angular/core\";\n\nimport { ModalService } from \"@bitwarden/angular/services/modal.service\";\nimport { OrganizationService } from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport { CipherService } from \"@bitwarden/common/vault/abstractions/cipher.service\";\nimport { CipherType } from \"@bitwarden/common/vault/enums\";\nimport { CipherView } from \"@bitwarden/common/vault/models/view/cipher.view\";\nimport { PasswordRepromptService } from \"@bitwarden/vault\";\n\nimport { CipherReportComponent } from \"./cipher-report.component\";\n\n@Component({\n selector: \"app-unsecured-websites-report\",\n templateUrl: \"unsecured-websites-report.component.html\",\n})\nexport class UnsecuredWebsitesReportComponent extends CipherReportComponent implements OnInit {\n disabled = true;\n\n constructor(\n protected cipherService: CipherService,\n protected organizationService: OrganizationService,\n modalService: ModalService,\n passwordRepromptService: PasswordRepromptService,\n ) {\n super(modalService, passwordRepromptService, organizationService);\n }\n\n async ngOnInit() {\n await super.load();\n }\n\n async setCiphers() {\n const allCiphers = await this.getAllCiphers();\n const unsecuredCiphers = allCiphers.filter((c) => {\n if (c.type !== CipherType.Login || !c.login.hasUris || c.isDeleted) {\n return false;\n }\n return c.login.uris.some((u) => u.uri != null && u.uri.indexOf(\"http://\") === 0);\n });\n this.ciphers = unsecuredCiphers.filter(\n (c) => (!this.organization && c.edit) || (this.organization && !c.edit),\n );\n }\n\n protected getAllCiphers(): Promise {\n return this.cipherService.getAllDecrypted();\n }\n}\n","\n\n\n

    {{ \"weakPasswordsReportDesc\" | i18n }}

    \n
    \n \n {{ \"loading\" | i18n }}\n
    \n
    \n \n {{ \"noWeakPasswords\" | i18n }}\n \n \n \n {{ \"weakPasswordsFoundDesc\" | i18n: (ciphers.length | number) }}\n \n \n \n \n \n \n \n \n \n \n
    \n \n \n \n {{ c.name }}\n \n \n {{ c.name }}\n \n \n \n {{ \"shared\" | i18n }}\n \n \n \n {{ \"attachments\" | i18n }}\n \n
    \n {{ c.subTitle }}\n
    \n \n \n \n \n {{ passwordStrengthMap.get(c.id)[0] | i18n }}\n \n
    \n
    \n
    \n \n
    \n","import { Component, OnInit } from \"@angular/core\";\n\nimport { ModalService } from \"@bitwarden/angular/services/modal.service\";\nimport { OrganizationService } from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\nimport { PasswordStrengthServiceAbstraction } from \"@bitwarden/common/tools/password-strength\";\nimport { CipherService } from \"@bitwarden/common/vault/abstractions/cipher.service\";\nimport { CipherType } from \"@bitwarden/common/vault/enums\";\nimport { CipherView } from \"@bitwarden/common/vault/models/view/cipher.view\";\nimport { BadgeVariant } from \"@bitwarden/components\";\nimport { PasswordRepromptService } from \"@bitwarden/vault\";\n\nimport { CipherReportComponent } from \"./cipher-report.component\";\n\n@Component({\n selector: \"app-weak-passwords-report\",\n templateUrl: \"weak-passwords-report.component.html\",\n})\nexport class WeakPasswordsReportComponent extends CipherReportComponent implements OnInit {\n passwordStrengthMap = new Map();\n disabled = true;\n\n private passwordStrengthCache = new Map();\n weakPasswordCiphers: CipherView[] = [];\n\n constructor(\n protected cipherService: CipherService,\n protected passwordStrengthService: PasswordStrengthServiceAbstraction,\n protected organizationService: OrganizationService,\n modalService: ModalService,\n passwordRepromptService: PasswordRepromptService,\n ) {\n super(modalService, passwordRepromptService, organizationService);\n }\n\n async ngOnInit() {\n await super.load();\n }\n\n async setCiphers() {\n const allCiphers = await this.getAllCiphers();\n this.findWeakPasswords(allCiphers);\n }\n\n protected findWeakPasswords(ciphers: any[]): void {\n ciphers.forEach((ciph) => {\n const { type, login, isDeleted, edit, viewPassword, id } = ciph;\n if (\n type !== CipherType.Login ||\n login.password == null ||\n login.password === \"\" ||\n isDeleted ||\n (!this.organization && !edit) ||\n !viewPassword\n ) {\n return;\n }\n const hasUserName = this.isUserNameNotEmpty(ciph);\n const cacheKey = this.getCacheKey(ciph);\n if (!this.passwordStrengthCache.has(cacheKey)) {\n let userInput: string[] = [];\n if (hasUserName) {\n const atPosition = login.username.indexOf(\"@\");\n if (atPosition > -1) {\n userInput = userInput\n .concat(\n login.username\n .substr(0, atPosition)\n .trim()\n .toLowerCase()\n .split(/[^A-Za-z0-9]/),\n )\n .filter((i) => i.length >= 3);\n } else {\n userInput = login.username\n .trim()\n .toLowerCase()\n .split(/[^A-Za-z0-9]/)\n .filter((i: any) => i.length >= 3);\n }\n }\n const result = this.passwordStrengthService.getPasswordStrength(\n login.password,\n null,\n userInput.length > 0 ? userInput : null,\n );\n this.passwordStrengthCache.set(cacheKey, result.score);\n }\n const score = this.passwordStrengthCache.get(cacheKey);\n if (score != null && score <= 2) {\n this.passwordStrengthMap.set(id, this.scoreKey(score));\n this.weakPasswordCiphers.push(ciph);\n }\n });\n this.weakPasswordCiphers.sort((a, b) => {\n return (\n this.passwordStrengthCache.get(this.getCacheKey(a)) -\n this.passwordStrengthCache.get(this.getCacheKey(b))\n );\n });\n this.ciphers = [...this.weakPasswordCiphers];\n }\n\n protected getAllCiphers(): Promise {\n return this.cipherService.getAllDecrypted();\n }\n\n protected canManageCipher(c: CipherView): boolean {\n // this will only ever be false from the org view;\n return true;\n }\n\n private isUserNameNotEmpty(c: CipherView): boolean {\n return !Utils.isNullOrWhitespace(c.login.username);\n }\n\n private getCacheKey(c: CipherView): string {\n return c.login.password + \"_____\" + (this.isUserNameNotEmpty(c) ? c.login.username : \"\");\n }\n\n private scoreKey(score: number): [string, BadgeVariant] {\n switch (score) {\n case 4:\n return [\"strong\", \"success\"];\n case 3:\n return [\"good\", \"primary\"];\n case 2:\n return [\"weak\", \"warning\"];\n default:\n return [\"veryWeak\", \"danger\"];\n }\n }\n}\n","export enum ReportVariant {\n Enabled = \"Enabled\",\n RequiresPremium = \"RequiresPremium\",\n RequiresUpgrade = \"RequiresUpgrade\",\n}\n","\n
    \n \n
    \n
    \n
    \n

    {{ title }}

    \n

    {{ description }}

    \n
    \n \n {{ \"premium\" | i18n }}\n {{ \"upgrade\" | i18n }}\n \n \n\n","import { Component, Input } from \"@angular/core\";\n\nimport { Icon } from \"@bitwarden/components\";\n\nimport { ReportVariant } from \"../models/report-variant\";\n\n@Component({\n selector: \"app-report-card\",\n templateUrl: \"report-card.component.html\",\n})\nexport class ReportCardComponent {\n @Input() title: string;\n @Input() description: string;\n @Input() route: string;\n @Input() icon: Icon;\n @Input() variant: ReportVariant;\n\n protected get disabled() {\n return this.variant != ReportVariant.Enabled;\n }\n\n protected get requiresPremium() {\n return this.variant == ReportVariant.RequiresPremium;\n }\n}\n","
    \n
    \n \n
    \n
    \n","import { Component, Input } from \"@angular/core\";\n\nimport { ReportEntry } from \"../models/report-entry\";\n\n@Component({\n selector: \"app-report-list\",\n templateUrl: \"report-list.component.html\",\n})\nexport class ReportListComponent {\n @Input() reports: ReportEntry[];\n}\n","import { View } from \"../../../../models/view/view\";\nimport { SendType } from \"../../enums/send-type\";\nimport { SendAccess } from \"../domain/send-access\";\n\nimport { SendFileView } from \"./send-file.view\";\nimport { SendTextView } from \"./send-text.view\";\n\nexport class SendAccessView implements View {\n id: string = null;\n name: string = null;\n type: SendType = null;\n text = new SendTextView();\n file = new SendFileView();\n expirationDate: Date = null;\n creatorIdentifier: string = null;\n\n constructor(s?: SendAccess) {\n if (!s) {\n return;\n }\n\n this.id = s.id;\n this.type = s.type;\n this.expirationDate = s.expirationDate;\n this.creatorIdentifier = s.creatorIdentifier;\n }\n}\n","import Domain from \"../../../../platform/models/domain/domain-base\";\nimport { EncString } from \"../../../../platform/models/domain/enc-string\";\nimport { SymmetricCryptoKey } from \"../../../../platform/models/domain/symmetric-crypto-key\";\nimport { SendType } from \"../../enums/send-type\";\nimport { SendAccessResponse } from \"../response/send-access.response\";\nimport { SendAccessView } from \"../view/send-access.view\";\n\nimport { SendFile } from \"./send-file\";\nimport { SendText } from \"./send-text\";\n\nexport class SendAccess extends Domain {\n id: string;\n type: SendType;\n name: EncString;\n file: SendFile;\n text: SendText;\n expirationDate: Date;\n creatorIdentifier: string;\n\n constructor(obj?: SendAccessResponse) {\n super();\n if (obj == null) {\n return;\n }\n\n this.buildDomainModel(\n this,\n obj,\n {\n id: null,\n name: null,\n expirationDate: null,\n creatorIdentifier: null,\n },\n [\"id\", \"expirationDate\", \"creatorIdentifier\"],\n );\n\n this.type = obj.type;\n\n switch (this.type) {\n case SendType.Text:\n this.text = new SendText(obj.text);\n break;\n case SendType.File:\n this.file = new SendFile(obj.file);\n break;\n default:\n break;\n }\n }\n\n async decrypt(key: SymmetricCryptoKey): Promise {\n const model = new SendAccessView(this);\n\n await this.decryptObj(\n model,\n {\n name: null,\n },\n null,\n key,\n );\n\n switch (this.type) {\n case SendType.File:\n model.file = await this.file.decrypt(key);\n break;\n case SendType.Text:\n model.text = await this.text.decrypt(key);\n break;\n default:\n break;\n }\n\n return model;\n }\n}\n","export class SendAccessRequest {\n password: string;\n}\n","import { svgIcon } from \"@bitwarden/components\";\n\nexport const ExpiredSend = svgIcon`\n \n \n \n \n \n \n \n`;\n","import { Component, Input } from \"@angular/core\";\n\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { FileDownloadService } from \"@bitwarden/common/platform/abstractions/file-download/file-download.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\nimport { EncArrayBuffer } from \"@bitwarden/common/platform/models/domain/enc-array-buffer\";\nimport { SymmetricCryptoKey } from \"@bitwarden/common/platform/models/domain/symmetric-crypto-key\";\nimport { SendAccessRequest } from \"@bitwarden/common/tools/send/models/request/send-access.request\";\nimport { SendAccessView } from \"@bitwarden/common/tools/send/models/view/send-access.view\";\nimport { SendApiService } from \"@bitwarden/common/tools/send/services/send-api.service.abstraction\";\n\nimport { SharedModule } from \"../../shared\";\n\n@Component({\n selector: \"app-send-access-file\",\n templateUrl: \"send-access-file.component.html\",\n imports: [SharedModule],\n standalone: true,\n})\nexport class SendAccessFileComponent {\n @Input() send: SendAccessView;\n @Input() decKey: SymmetricCryptoKey;\n @Input() accessRequest: SendAccessRequest;\n constructor(\n private i18nService: I18nService,\n private platformUtilsService: PlatformUtilsService,\n private cryptoService: CryptoService,\n private fileDownloadService: FileDownloadService,\n private sendApiService: SendApiService,\n ) {}\n\n protected download = async () => {\n if (this.send == null || this.decKey == null) {\n return;\n }\n\n const downloadData = await this.sendApiService.getSendFileDownloadData(\n this.send,\n this.accessRequest,\n );\n\n if (Utils.isNullOrWhitespace(downloadData.url)) {\n this.platformUtilsService.showToast(\"error\", null, this.i18nService.t(\"missingSendFile\"));\n return;\n }\n\n const response = await fetch(new Request(downloadData.url, { cache: \"no-store\" }));\n if (response.status !== 200) {\n this.platformUtilsService.showToast(\"error\", null, this.i18nService.t(\"errorOccurred\"));\n return;\n }\n\n try {\n const encBuf = await EncArrayBuffer.fromResponse(response);\n const decBuf = await this.cryptoService.decryptFromBytes(encBuf, this.decKey);\n this.fileDownloadService.download({\n fileName: this.send.file.fileName,\n blobData: decBuf,\n downloadMethod: \"save\",\n });\n } catch (e) {\n this.platformUtilsService.showToast(\"error\", null, this.i18nService.t(\"errorOccurred\"));\n }\n };\n}\n","

    {{ send.file.fileName }}

    \n\n","import { Component, EventEmitter, Input, Output } from \"@angular/core\";\nimport { FormBuilder, Validators } from \"@angular/forms\";\nimport { Subject, takeUntil } from \"rxjs\";\n\nimport { SharedModule } from \"../../shared\";\n\n@Component({\n selector: \"app-send-access-password\",\n templateUrl: \"send-access-password.component.html\",\n imports: [SharedModule],\n standalone: true,\n})\nexport class SendAccessPasswordComponent {\n private destroy$ = new Subject();\n protected formGroup = this.formBuilder.group({\n password: [\"\", [Validators.required]],\n });\n\n @Input() loading: boolean;\n @Output() setPasswordEvent = new EventEmitter();\n\n constructor(private formBuilder: FormBuilder) {}\n\n async ngOnInit() {\n this.formGroup.controls.password.valueChanges\n .pipe(takeUntil(this.destroy$))\n .subscribe((val) => {\n this.setPasswordEvent.emit(val);\n });\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n}\n","

    {{ \"sendProtectedPassword\" | i18n }}

    \n

    {{ \"sendProtectedPasswordDontKnow\" | i18n }}

    \n
    \n \n {{ \"password\" | i18n }}\n \n \n \n
    \n \n {{ \"continue\" | i18n }} \n \n
    \n
    \n","{{ \"sendHiddenByDefault\" | i18n }}\n\n \n\n
    \n \n \n {{ \"toggleVisibility\" | i18n }}\n \n
    \n
    \n \n
    \n","import { Component, Input } from \"@angular/core\";\nimport { FormBuilder } from \"@angular/forms\";\n\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { SendAccessView } from \"@bitwarden/common/tools/send/models/view/send-access.view\";\n\nimport { SharedModule } from \"../../shared\";\n\n@Component({\n selector: \"app-send-access-text\",\n templateUrl: \"send-access-text.component.html\",\n imports: [SharedModule],\n standalone: true,\n})\nexport class SendAccessTextComponent {\n private _send: SendAccessView = null;\n protected showText = false;\n\n protected formGroup = this.formBuilder.group({\n sendText: [\"\"],\n });\n\n constructor(\n private i18nService: I18nService,\n private platformUtilsService: PlatformUtilsService,\n private formBuilder: FormBuilder,\n ) {}\n\n get send(): SendAccessView {\n return this._send;\n }\n\n @Input() set send(value: SendAccessView) {\n this._send = value;\n this.showText = this.send.text != null ? !this.send.text.hidden : true;\n\n if (this.send == null || this.send.text == null) {\n return;\n }\n\n this.formGroup.controls.sendText.patchValue(\n this.showText ? this.send.text.text : this.send.text.maskedText,\n );\n }\n\n protected copyText() {\n this.platformUtilsService.copyToClipboard(this.send.text.text);\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"valueCopied\", this.i18nService.t(\"sendTypeText\")),\n );\n }\n\n protected toggleText() {\n this.showText = !this.showText;\n this.formGroup.controls.sendText.patchValue(\n this.showText ? this.send.text.text : this.send.text.maskedText,\n );\n }\n}\n","
    \n \n \n
    \n

    View Send

    \n
    \n
    \n

    {{ \"sendAccessCreatorIdentifier\" | i18n: creatorIdentifier }}

    \n
    \n \n {{ \"viewSendHiddenEmailWarning\" | i18n }}\n {{\n \"learnMore\" | i18n\n }}.\n \n \n \n \n \n {{ \"sendAccessUnavailable\" | i18n }}\n \n \n {{ \"unexpectedErrorSend\" | i18n }}\n \n
    \n

    \n {{ send.name }}\n

    \n
    \n \n \n \n \n \n \n \n \n

    \n Expires: {{ expirationDate | date: \"medium\" }}\n

    \n
    \n
    \n \n
    \n \n {{ \"loading\" | i18n }}\n
    \n
    \n \n
    \n \n\n","import { Component, OnInit } from \"@angular/core\";\nimport { FormBuilder } from \"@angular/forms\";\nimport { ActivatedRoute } from \"@angular/router\";\n\nimport { ErrorResponse } from \"@bitwarden/common/models/response/error.response\";\nimport { CryptoFunctionService } from \"@bitwarden/common/platform/abstractions/crypto-function.service\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\nimport { SymmetricCryptoKey } from \"@bitwarden/common/platform/models/domain/symmetric-crypto-key\";\nimport { SendType } from \"@bitwarden/common/tools/send/enums/send-type\";\nimport { SendAccess } from \"@bitwarden/common/tools/send/models/domain/send-access\";\nimport { SendAccessRequest } from \"@bitwarden/common/tools/send/models/request/send-access.request\";\nimport { SendAccessResponse } from \"@bitwarden/common/tools/send/models/response/send-access.response\";\nimport { SendAccessView } from \"@bitwarden/common/tools/send/models/view/send-access.view\";\nimport { SEND_KDF_ITERATIONS } from \"@bitwarden/common/tools/send/send-kdf\";\nimport { SendApiService } from \"@bitwarden/common/tools/send/services/send-api.service.abstraction\";\nimport { NoItemsModule } from \"@bitwarden/components\";\n\nimport { SharedModule } from \"../../shared\";\n\nimport { ExpiredSend } from \"./icons/expired-send.icon\";\nimport { SendAccessFileComponent } from \"./send-access-file.component\";\nimport { SendAccessPasswordComponent } from \"./send-access-password.component\";\nimport { SendAccessTextComponent } from \"./send-access-text.component\";\n\n@Component({\n selector: \"app-send-access\",\n templateUrl: \"access.component.html\",\n standalone: true,\n imports: [\n SendAccessFileComponent,\n SendAccessTextComponent,\n SendAccessPasswordComponent,\n SharedModule,\n NoItemsModule,\n ],\n})\n// eslint-disable-next-line rxjs-angular/prefer-takeuntil\nexport class AccessComponent implements OnInit {\n protected send: SendAccessView;\n protected sendType = SendType;\n protected loading = true;\n protected passwordRequired = false;\n protected formPromise: Promise;\n protected password: string;\n protected unavailable = false;\n protected error = false;\n protected hideEmail = false;\n protected decKey: SymmetricCryptoKey;\n protected accessRequest: SendAccessRequest;\n protected expiredSendIcon = ExpiredSend;\n\n protected formGroup = this.formBuilder.group({});\n\n private id: string;\n private key: string;\n\n constructor(\n private cryptoFunctionService: CryptoFunctionService,\n private route: ActivatedRoute,\n private cryptoService: CryptoService,\n private sendApiService: SendApiService,\n private platformUtilsService: PlatformUtilsService,\n private i18nService: I18nService,\n protected formBuilder: FormBuilder,\n ) {}\n\n protected get expirationDate() {\n if (this.send == null || this.send.expirationDate == null) {\n return null;\n }\n return this.send.expirationDate;\n }\n\n protected get creatorIdentifier() {\n if (this.send == null || this.send.creatorIdentifier == null) {\n return null;\n }\n return this.send.creatorIdentifier;\n }\n\n ngOnInit() {\n // eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe\n this.route.params.subscribe(async (params) => {\n this.id = params.sendId;\n this.key = params.key;\n if (this.key == null || this.id == null) {\n return;\n }\n await this.load();\n });\n }\n\n protected load = async () => {\n this.unavailable = false;\n this.error = false;\n this.hideEmail = false;\n try {\n const keyArray = Utils.fromUrlB64ToArray(this.key);\n this.accessRequest = new SendAccessRequest();\n if (this.password != null) {\n const passwordHash = await this.cryptoFunctionService.pbkdf2(\n this.password,\n keyArray,\n \"sha256\",\n SEND_KDF_ITERATIONS,\n );\n this.accessRequest.password = Utils.fromBufferToB64(passwordHash);\n }\n let sendResponse: SendAccessResponse = null;\n if (this.loading) {\n sendResponse = await this.sendApiService.postSendAccess(this.id, this.accessRequest);\n } else {\n this.formPromise = this.sendApiService.postSendAccess(this.id, this.accessRequest);\n sendResponse = await this.formPromise;\n }\n this.passwordRequired = false;\n const sendAccess = new SendAccess(sendResponse);\n this.decKey = await this.cryptoService.makeSendKey(keyArray);\n this.send = await sendAccess.decrypt(this.decKey);\n } catch (e) {\n if (e instanceof ErrorResponse) {\n if (e.statusCode === 401) {\n this.passwordRequired = true;\n } else if (e.statusCode === 404) {\n this.unavailable = true;\n } else if (e.statusCode === 400) {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n e.message,\n );\n } else {\n this.error = true;\n }\n } else {\n this.error = true;\n }\n }\n this.loading = false;\n this.hideEmail =\n this.creatorIdentifier == null &&\n !this.passwordRequired &&\n !this.loading &&\n !this.unavailable;\n };\n\n protected setPassword(password: string) {\n this.password = password;\n }\n}\n","import { DIALOG_DATA, DialogConfig, DialogRef } from \"@angular/cdk/dialog\";\nimport { ChangeDetectorRef, Component, Inject, OnDestroy, OnInit } from \"@angular/core\";\nimport { AbstractControl, FormBuilder, Validators } from \"@angular/forms\";\nimport {\n combineLatest,\n from,\n map,\n Observable,\n of,\n shareReplay,\n Subject,\n switchMap,\n takeUntil,\n} from \"rxjs\";\nimport { first } from \"rxjs/operators\";\n\nimport { OrganizationService } from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport { OrganizationUserService } from \"@bitwarden/common/admin-console/abstractions/organization-user/organization-user.service\";\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\nimport { FeatureFlag } from \"@bitwarden/common/enums/feature-flag.enum\";\nimport { ConfigServiceAbstraction } from \"@bitwarden/common/platform/abstractions/config/config.service.abstraction\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\nimport { CollectionService } from \"@bitwarden/common/vault/abstractions/collection.service\";\nimport { CollectionResponse } from \"@bitwarden/common/vault/models/response/collection.response\";\nimport { CollectionView } from \"@bitwarden/common/vault/models/view/collection.view\";\nimport { BitValidators, DialogService } from \"@bitwarden/components\";\n\nimport { GroupService, GroupView } from \"../../../admin-console/organizations/core\";\nimport { PermissionMode } from \"../../../admin-console/organizations/shared/components/access-selector/access-selector.component\";\nimport {\n AccessItemType,\n AccessItemValue,\n AccessItemView,\n CollectionPermission,\n convertToPermission,\n convertToSelectionView,\n mapGroupToAccessItemView,\n mapUserToAccessItemView,\n} from \"../../../admin-console/organizations/shared/components/access-selector/access-selector.models\";\nimport { CollectionAdminService } from \"../../core/collection-admin.service\";\nimport { CollectionAdminView } from \"../../core/views/collection-admin.view\";\n\nexport enum CollectionDialogTabType {\n Info = 0,\n Access = 1,\n}\n\nexport interface CollectionDialogParams {\n collectionId?: string;\n organizationId: string;\n initialTab?: CollectionDialogTabType;\n parentCollectionId?: string;\n showOrgSelector?: boolean;\n collectionIds?: string[];\n}\n\nexport interface CollectionDialogResult {\n action: CollectionDialogAction;\n collection: CollectionResponse | CollectionView;\n}\n\nexport enum CollectionDialogAction {\n Saved = \"saved\",\n Canceled = \"canceled\",\n Deleted = \"deleted\",\n}\n\n@Component({\n templateUrl: \"collection-dialog.component.html\",\n})\nexport class CollectionDialogComponent implements OnInit, OnDestroy {\n protected flexibleCollectionsV1Enabled$ = this.configService\n .getFeatureFlag$(FeatureFlag.FlexibleCollectionsV1, false)\n .pipe(first());\n\n private destroy$ = new Subject();\n protected organizations$: Observable;\n\n protected tabIndex: CollectionDialogTabType;\n protected loading = true;\n protected organization?: Organization;\n protected collection?: CollectionView;\n protected nestOptions: CollectionView[] = [];\n protected accessItems: AccessItemView[] = [];\n protected deletedParentName: string | undefined;\n protected showOrgSelector = false;\n protected formGroup = this.formBuilder.group({\n name: [\"\", [Validators.required, BitValidators.forbiddenCharacters([\"/\"])]],\n externalId: \"\",\n parent: undefined as string | undefined,\n access: [[] as AccessItemValue[]],\n selectedOrg: \"\",\n });\n protected PermissionMode = PermissionMode;\n protected showDeleteButton = false;\n\n constructor(\n @Inject(DIALOG_DATA) private params: CollectionDialogParams,\n private formBuilder: FormBuilder,\n private dialogRef: DialogRef,\n private organizationService: OrganizationService,\n private groupService: GroupService,\n private collectionAdminService: CollectionAdminService,\n private collectionService: CollectionService,\n private i18nService: I18nService,\n private platformUtilsService: PlatformUtilsService,\n private organizationUserService: OrganizationUserService,\n private configService: ConfigServiceAbstraction,\n private dialogService: DialogService,\n private changeDetectorRef: ChangeDetectorRef,\n ) {\n this.tabIndex = params.initialTab ?? CollectionDialogTabType.Info;\n }\n\n async ngOnInit() {\n // Opened from the individual vault\n if (this.params.showOrgSelector) {\n this.showOrgSelector = true;\n this.formGroup.controls.selectedOrg.valueChanges\n .pipe(takeUntil(this.destroy$))\n .subscribe((id) => this.loadOrg(id, this.params.collectionIds));\n this.organizations$ = this.organizationService.organizations$.pipe(\n first(),\n map((orgs) =>\n orgs\n .filter((o) => o.canCreateNewCollections && !o.isProviderUser)\n .sort(Utils.getSortFunction(this.i18nService, \"name\")),\n ),\n );\n // patchValue will trigger a call to loadOrg() in this case, so no need to call it again here\n this.formGroup.patchValue({ selectedOrg: this.params.organizationId });\n } else {\n // Opened from the org vault\n this.formGroup.patchValue({ selectedOrg: this.params.organizationId });\n await this.loadOrg(this.params.organizationId, this.params.collectionIds);\n }\n }\n\n async loadOrg(orgId: string, collectionIds: string[]) {\n const organization$ = this.organizationService\n .get$(orgId)\n .pipe(shareReplay({ refCount: true, bufferSize: 1 }));\n const groups$ = organization$.pipe(\n switchMap((organization) => {\n if (!organization.useGroups) {\n return of([] as GroupView[]);\n }\n\n return this.groupService.getAll(orgId);\n }),\n );\n combineLatest({\n organization: organization$,\n collections: this.collectionAdminService.getAll(orgId),\n collectionDetails: this.params.collectionId\n ? from(this.collectionAdminService.get(orgId, this.params.collectionId))\n : of(null),\n groups: groups$,\n users: this.organizationUserService.getAllUsers(orgId),\n collection: this.params.collectionId\n ? this.collectionService.get(this.params.collectionId)\n : of(null),\n flexibleCollectionsV1: this.flexibleCollectionsV1Enabled$,\n })\n .pipe(takeUntil(this.formGroup.controls.selectedOrg.valueChanges), takeUntil(this.destroy$))\n .subscribe(\n ({\n organization,\n collections,\n collectionDetails,\n groups,\n users,\n collection,\n flexibleCollectionsV1,\n }) => {\n this.organization = organization;\n this.accessItems = [].concat(\n groups.map(mapGroupToAccessItemView),\n users.data.map(mapUserToAccessItemView),\n );\n\n // Force change detection to update the access selector's items\n this.changeDetectorRef.detectChanges();\n\n if (collectionIds) {\n collections = collections.filter((c) => collectionIds.includes(c.id));\n }\n\n if (this.params.collectionId) {\n this.collection = collections.find((c) => c.id === this.collectionId);\n this.nestOptions = collections.filter((c) => c.id !== this.collectionId);\n\n if (!this.collection) {\n throw new Error(\"Could not find collection to edit.\");\n }\n\n const { name, parent } = parseName(this.collection);\n if (parent !== undefined && !this.nestOptions.find((c) => c.name === parent)) {\n this.deletedParentName = parent;\n }\n\n const accessSelections = mapToAccessSelections(collectionDetails);\n this.formGroup.patchValue({\n name,\n externalId: this.collection.externalId,\n parent,\n access: accessSelections,\n });\n this.collection.manage = collection?.manage ?? false; // Get manage flag from sync data collection\n this.showDeleteButton = this.collection.canDelete(organization);\n } else {\n this.nestOptions = collections;\n const parent = collections.find((c) => c.id === this.params.parentCollectionId);\n const currentOrgUserId = users.data.find(\n (u) => u.userId === this.organization?.userId,\n )?.id;\n const initialSelection: AccessItemValue[] =\n currentOrgUserId !== undefined && organization.flexibleCollections\n ? [\n {\n id: currentOrgUserId,\n type: AccessItemType.Member,\n permission: CollectionPermission.Manage,\n },\n ]\n : [];\n\n this.formGroup.patchValue({\n parent: parent?.name ?? undefined,\n access: initialSelection,\n });\n }\n\n if (\n organization.flexibleCollections &&\n flexibleCollectionsV1 &&\n !organization.allowAdminAccessToAllCollectionItems\n ) {\n this.formGroup.controls.access.addValidators(validateCanManagePermission);\n } else {\n this.formGroup.controls.access.removeValidators(validateCanManagePermission);\n }\n this.formGroup.controls.access.updateValueAndValidity();\n\n this.loading = false;\n },\n );\n }\n\n protected get collectionId() {\n return this.params.collectionId;\n }\n\n protected get editMode() {\n return this.params.collectionId != undefined;\n }\n\n protected async cancel() {\n this.close(CollectionDialogAction.Canceled);\n }\n\n protected submit = async () => {\n this.formGroup.markAllAsTouched();\n\n if (this.formGroup.invalid) {\n const accessTabError = this.formGroup.controls.access.hasError(\"managePermissionRequired\");\n\n if (this.tabIndex === CollectionDialogTabType.Access && !accessTabError) {\n this.platformUtilsService.showToast(\n \"error\",\n null,\n this.i18nService.t(\"fieldOnTabRequiresAttention\", this.i18nService.t(\"collectionInfo\")),\n );\n } else if (this.tabIndex === CollectionDialogTabType.Info && accessTabError) {\n this.platformUtilsService.showToast(\n \"error\",\n null,\n this.i18nService.t(\"fieldOnTabRequiresAttention\", this.i18nService.t(\"access\")),\n );\n }\n return;\n }\n\n const collectionView = new CollectionAdminView();\n collectionView.id = this.params.collectionId;\n collectionView.organizationId = this.formGroup.controls.selectedOrg.value;\n collectionView.externalId = this.formGroup.controls.externalId.value;\n collectionView.groups = this.formGroup.controls.access.value\n .filter((v) => v.type === AccessItemType.Group)\n .map(convertToSelectionView);\n collectionView.users = this.formGroup.controls.access.value\n .filter((v) => v.type === AccessItemType.Member)\n .map(convertToSelectionView);\n\n const parent = this.formGroup.controls.parent.value;\n if (parent) {\n collectionView.name = `${parent}/${this.formGroup.controls.name.value}`;\n } else {\n collectionView.name = this.formGroup.controls.name.value;\n }\n\n const savedCollection = await this.collectionAdminService.save(collectionView);\n\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\n this.editMode ? \"editedCollectionId\" : \"createdCollectionId\",\n collectionView.name,\n ),\n );\n\n this.close(CollectionDialogAction.Saved, savedCollection);\n };\n\n protected delete = async () => {\n const confirmed = await this.dialogService.openSimpleDialog({\n title: this.collection?.name,\n content: { key: \"deleteCollectionConfirmation\" },\n type: \"warning\",\n });\n\n if (!confirmed && this.params.collectionId) {\n return false;\n }\n\n await this.collectionAdminService.delete(this.params.organizationId, this.params.collectionId);\n\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"deletedCollectionId\", this.collection?.name),\n );\n\n this.close(CollectionDialogAction.Deleted, this.collection);\n };\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private close(action: CollectionDialogAction, collection?: CollectionResponse | CollectionView) {\n this.dialogRef.close({ action, collection } as CollectionDialogResult);\n }\n}\n\nfunction parseName(collection: CollectionView) {\n const nameParts = collection.name?.split(\"/\");\n const name = nameParts[nameParts.length - 1];\n const parent = nameParts.length > 1 ? nameParts.slice(0, -1).join(\"/\") : undefined;\n\n return { name, parent };\n}\n\nfunction mapToAccessSelections(collectionDetails: CollectionAdminView): AccessItemValue[] {\n if (collectionDetails == undefined) {\n return [];\n }\n return [].concat(\n collectionDetails.groups.map((selection) => ({\n id: selection.id,\n type: AccessItemType.Group,\n permission: convertToPermission(selection),\n })),\n collectionDetails.users.map((selection) => ({\n id: selection.id,\n type: AccessItemType.Member,\n permission: convertToPermission(selection),\n })),\n );\n}\n\n/**\n * Validator to ensure that at least one access item has Manage permission\n */\nfunction validateCanManagePermission(control: AbstractControl) {\n const access = control.value as AccessItemValue[];\n const hasManagePermission = access.some((a) => a.permission === CollectionPermission.Manage);\n\n return hasManagePermission ? null : { managePermissionRequired: true };\n}\n\n/**\n * Strongly typed helper to open a CollectionDialog\n * @param dialogService Instance of the dialog service that will be used to open the dialog\n * @param config Configuration for the dialog\n */\nexport function openCollectionDialog(\n dialogService: DialogService,\n config: DialogConfig,\n) {\n return dialogService.open(\n CollectionDialogComponent,\n config,\n );\n}\n","
    \n \n \n \n {{ \"editCollection\" | i18n }}\n {{\n collection.name\n }}\n \n \n {{ \"newCollection\" | i18n }}\n \n \n
    \n \n \n \n \n \n \n {{ \"name\" | i18n }}\n \n \n\n \n {{ \"organization\" | i18n }}\n \n \n \n \n \n\n \n {{ \"externalId\" | i18n }}\n \n {{ \"externalIdDesc\" | i18n }}\n \n\n \n {{ \"nestCollectionUnder\" | i18n }}\n \n \n \n \n \n \n \n \n \n \n
    \n {{ \"grantCollectionAccess\" | i18n }}\n {{\n \"grantCollectionAccessMembersOnly\" | i18n\n }}\n {{ \" \" + (\"adminCollectionAccess\" | i18n) }}\n
    \n \n {{ \"managePermissionRequired\" | i18n }}\n
    \n \n \n \n \n \n \n \n \n {{ \"cancel\" | i18n }}\n \n \n \n
    \n
    \n","import { AbstractControl, FormControl, ValidationErrors, ValidatorFn } from \"@angular/forms\";\n\nexport function forbiddenCharacters(characters: string[]): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n if (!(control instanceof FormControl)) {\n throw new Error(\"forbiddenCharacters only supports validating FormControls\");\n }\n\n if (control.value === null || control.value === undefined) {\n return null;\n }\n\n const value = String(control.value);\n\n for (const char of value) {\n if (characters.includes(char)) {\n return { forbiddenCharacters: { value: control.value, characters } };\n }\n }\n\n return null;\n };\n}\n","import { NgModule } from \"@angular/core\";\n\nimport { SelectModule } from \"@bitwarden/components\";\n\nimport { AccessSelectorModule } from \"../../../admin-console/organizations/shared/components/access-selector/access-selector.module\";\nimport { SharedModule } from \"../../../shared\";\n\nimport { CollectionDialogComponent } from \"./collection-dialog.component\";\n@NgModule({\n imports: [SharedModule, AccessSelectorModule, SelectModule],\n declarations: [CollectionDialogComponent],\n exports: [CollectionDialogComponent],\n})\nexport class CollectionDialogModule {}\n","import { Directive, OnInit, TemplateRef, ViewContainerRef } from \"@angular/core\";\nimport { firstValueFrom } from \"rxjs\";\n\nimport { BillingAccountProfileStateService } from \"@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service\";\n\n/**\n * Hides the element if the user has premium.\n */\n@Directive({\n selector: \"[appNotPremium]\",\n})\nexport class NotPremiumDirective implements OnInit {\n constructor(\n private templateRef: TemplateRef,\n private viewContainer: ViewContainerRef,\n private billingAccountProfileStateService: BillingAccountProfileStateService,\n ) {}\n\n async ngOnInit(): Promise {\n const premium = await firstValueFrom(\n this.billingAccountProfileStateService.hasPremiumFromAnySource$,\n );\n\n if (premium) {\n this.viewContainer.clear();\n } else {\n this.viewContainer.createEmbeddedView(this.templateRef);\n }\n }\n}\n","import { Component } from \"@angular/core\";\n\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\n\n@Component({\n selector: \"app-premium-badge\",\n template: `\n \n `,\n})\nexport class PremiumBadgeComponent {\n constructor(private messagingService: MessagingService) {}\n\n premiumRequired() {\n this.messagingService.send(\"premiumRequired\");\n }\n}\n","\n \n \n \n \n \n \n \n {{ \"name\" | i18n }}\n {{ \"owner\" | i18n }}\n {{ \"collections\" | i18n }}\n {{ \"groups\" | i18n }}\n \n {{ \"permission\" | i18n }}\n \n \n \n \n \n \n \n {{ \"access\" | i18n }}\n \n \n \n {{ \"assignToCollections\" | i18n }}\n \n \n \n {{ \"moveSelectedToOrg\" | i18n }}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n","import { SelectionModel } from \"@angular/cdk/collections\";\nimport { Component, EventEmitter, Input, Output } from \"@angular/core\";\n\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\nimport { CipherView } from \"@bitwarden/common/vault/models/view/cipher.view\";\nimport { CollectionView } from \"@bitwarden/common/vault/models/view/collection.view\";\nimport { TableDataSource } from \"@bitwarden/components\";\n\nimport { GroupView } from \"../../../admin-console/organizations/core\";\nimport { Unassigned } from \"../../individual-vault/vault-filter/shared/models/routed-vault-filter.model\";\n\nimport { VaultItem } from \"./vault-item\";\nimport { VaultItemEvent } from \"./vault-item-event\";\n\n// Fixed manual row height required due to how cdk-virtual-scroll works\nexport const RowHeight = 65;\nexport const RowHeightClass = `tw-h-[65px]`;\n\nconst MaxSelectionCount = 500;\n\n@Component({\n selector: \"app-vault-items\",\n templateUrl: \"vault-items.component.html\",\n // TODO: Improve change detection, see: https://bitwarden.atlassian.net/browse/TDL-220\n // changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class VaultItemsComponent {\n protected RowHeight = RowHeight;\n\n @Input() disabled: boolean;\n @Input() showOwner: boolean;\n @Input() showCollections: boolean;\n @Input() showGroups: boolean;\n @Input() useEvents: boolean;\n @Input() cloneableOrganizationCiphers: boolean;\n @Input() showPremiumFeatures: boolean;\n @Input() showBulkMove: boolean;\n @Input() showBulkTrashOptions: boolean;\n // Encompasses functionality only available from the organization vault context\n @Input() showAdminActions: boolean;\n @Input() allOrganizations: Organization[] = [];\n @Input() allCollections: CollectionView[] = [];\n @Input() allGroups: GroupView[] = [];\n @Input() showBulkEditCollectionAccess = false;\n @Input() showBulkAddToCollections = false;\n @Input() showPermissionsColumn = false;\n @Input() viewingOrgVault: boolean;\n\n private _ciphers?: CipherView[] = [];\n @Input() get ciphers(): CipherView[] {\n return this._ciphers;\n }\n set ciphers(value: CipherView[] | undefined) {\n this._ciphers = value ?? [];\n this.refreshItems();\n }\n\n private _collections?: CollectionView[] = [];\n @Input() get collections(): CollectionView[] {\n return this._collections;\n }\n set collections(value: CollectionView[] | undefined) {\n this._collections = value ?? [];\n this.refreshItems();\n }\n\n @Output() onEvent = new EventEmitter();\n\n protected editableItems: VaultItem[] = [];\n protected dataSource = new TableDataSource();\n protected selection = new SelectionModel(true, [], true);\n\n get showExtraColumn() {\n return this.showCollections || this.showGroups || this.showOwner;\n }\n\n get isAllSelected() {\n return this.editableItems\n .slice(0, MaxSelectionCount)\n .every((item) => this.selection.isSelected(item));\n }\n\n get isEmpty() {\n return this.dataSource.data.length === 0;\n }\n\n get bulkMoveAllowed() {\n return (\n this.showBulkMove && this.selection.selected.filter((item) => item.collection).length === 0\n );\n }\n\n get bulkAssignToCollectionsAllowed() {\n return this.showBulkAddToCollections && this.ciphers.length > 0;\n }\n\n protected canEditCollection(collection: CollectionView): boolean {\n // Only allow allow deletion if collection editing is enabled and not deleting \"Unassigned\"\n if (collection.id === Unassigned) {\n return false;\n }\n\n const organization = this.allOrganizations.find((o) => o.id === collection.organizationId);\n return collection.canEdit(organization);\n }\n\n protected canDeleteCollection(collection: CollectionView): boolean {\n // Only allow allow deletion if collection editing is enabled and not deleting \"Unassigned\"\n if (collection.id === Unassigned) {\n return false;\n }\n\n const organization = this.allOrganizations.find((o) => o.id === collection.organizationId);\n return collection.canDelete(organization);\n }\n\n protected toggleAll() {\n this.isAllSelected\n ? this.selection.clear()\n : this.selection.select(...this.editableItems.slice(0, MaxSelectionCount));\n }\n\n protected event(event: VaultItemEvent) {\n this.onEvent.emit(event);\n }\n\n protected bulkMoveToFolder() {\n this.event({\n type: \"moveToFolder\",\n items: this.selection.selected\n .filter((item) => item.cipher !== undefined)\n .map((item) => item.cipher),\n });\n }\n\n protected bulkMoveToOrganization() {\n this.event({\n type: \"moveToOrganization\",\n items: this.selection.selected\n .filter((item) => item.cipher !== undefined)\n .map((item) => item.cipher),\n });\n }\n\n protected bulkRestore() {\n this.event({\n type: \"restore\",\n items: this.selection.selected\n .filter((item) => item.cipher !== undefined)\n .map((item) => item.cipher),\n });\n }\n\n protected bulkDelete() {\n this.event({\n type: \"delete\",\n items: this.selection.selected,\n });\n }\n\n protected canClone(vaultItem: VaultItem) {\n return (\n (vaultItem.cipher.organizationId && this.cloneableOrganizationCiphers) ||\n vaultItem.cipher.organizationId == null\n );\n }\n\n private refreshItems() {\n const collections: VaultItem[] = this.collections.map((collection) => ({ collection }));\n const ciphers: VaultItem[] = this.ciphers.map((cipher) => ({ cipher }));\n const items: VaultItem[] = [].concat(collections).concat(ciphers);\n\n this.selection.clear();\n this.editableItems = items.filter(\n (item) =>\n item.cipher !== undefined ||\n (item.collection !== undefined && this.canDeleteCollection(item.collection)),\n );\n this.dataSource.data = items;\n }\n\n protected bulkEditCollectionAccess() {\n this.event({\n type: \"bulkEditCollectionAccess\",\n items: this.selection.selected\n .filter((item) => item.collection !== undefined)\n .map((item) => item.collection),\n });\n }\n\n protected assignToCollections() {\n this.event({\n type: \"assignToCollections\",\n items: this.selection.selected\n .filter((item) => item.cipher !== undefined)\n .map((item) => item.cipher),\n });\n }\n}\n","import { Pipe, PipeTransform } from \"@angular/core\";\n\nimport { CollectionView } from \"@bitwarden/common/vault/models/view/collection.view\";\n\n@Pipe({\n name: \"collectionNameFromId\",\n pure: true,\n})\nexport class GetCollectionNameFromIdPipe implements PipeTransform {\n transform(value: string, collections: CollectionView[]) {\n return collections.find((o) => o.id === value)?.name;\n }\n}\n","\n {{ c | collectionNameFromId: collections }}\n\n\n + {{ xMoreCount }} more\n\n","import { Component, Input } from \"@angular/core\";\n\nimport { CollectionView } from \"@bitwarden/common/vault/models/view/collection.view\";\n\n@Component({\n selector: \"app-collection-badge\",\n templateUrl: \"collection-name-badge.component.html\",\n})\nexport class CollectionNameBadgeComponent {\n @Input() collectionIds: string[];\n @Input() collections: CollectionView[];\n\n get shownCollections(): string[] {\n return this.showXMore ? this.collectionIds.slice(0, 2) : this.collectionIds;\n }\n\n get showXMore(): boolean {\n return this.collectionIds.length > 3;\n }\n\n get xMoreCount(): number {\n return this.collectionIds.length - 2;\n }\n}\n","\n \n\n\n \n\n\n
    \n \n {{ cipher.name }}\n \n \n \n {{ \"attachments\" | i18n }}\n \n \n {{ \"attachmentsNeedFix\" | i18n }}\n \n \n
    \n
    \n {{ cipher.subTitle }}\n\n\n \n \n\n\n \n\n\n\n\n \n \n \n \n \n \n \n \n {{ \"launch\" | i18n }}\n \n \n\n \n \n \n \n {{ \"moveToOrganization\" | i18n }}\n \n \n \n {{ \"collections\" | i18n }}\n \n \n \n \n \n\n","import { Component, EventEmitter, Input, Output } from \"@angular/core\";\n\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\nimport { CipherType } from \"@bitwarden/common/vault/enums\";\nimport { CipherView } from \"@bitwarden/common/vault/models/view/cipher.view\";\nimport { CollectionView } from \"@bitwarden/common/vault/models/view/collection.view\";\n\nimport { VaultItemEvent } from \"./vault-item-event\";\nimport { RowHeightClass } from \"./vault-items.component\";\n\n@Component({\n selector: \"tr[appVaultCipherRow]\",\n templateUrl: \"vault-cipher-row.component.html\",\n})\nexport class VaultCipherRowComponent {\n protected RowHeightClass = RowHeightClass;\n\n @Input() disabled: boolean;\n @Input() cipher: CipherView;\n @Input() showOwner: boolean;\n @Input() showCollections: boolean;\n @Input() showGroups: boolean;\n @Input() showPremiumFeatures: boolean;\n @Input() useEvents: boolean;\n @Input() cloneable: boolean;\n @Input() organizations: Organization[];\n @Input() collections: CollectionView[];\n @Input() viewingOrgVault: boolean;\n\n @Output() onEvent = new EventEmitter();\n\n @Input() checked: boolean;\n @Output() checkedToggled = new EventEmitter();\n\n protected CipherType = CipherType;\n\n protected get showTotpCopyButton() {\n return (\n (this.cipher.login?.hasTotp ?? false) &&\n (this.cipher.organizationUseTotp || this.showPremiumFeatures)\n );\n }\n\n protected get showFixOldAttachments() {\n return this.cipher.hasOldAttachments && this.cipher.organizationId == null;\n }\n\n protected copy(field: \"username\" | \"password\" | \"totp\") {\n this.onEvent.emit({ type: \"copyField\", item: this.cipher, field });\n }\n\n protected clone() {\n this.onEvent.emit({ type: \"clone\", item: this.cipher });\n }\n\n protected moveToOrganization() {\n this.onEvent.emit({ type: \"moveToOrganization\", items: [this.cipher] });\n }\n\n protected editCollections() {\n this.onEvent.emit({ type: \"viewCollections\", item: this.cipher });\n }\n\n protected events() {\n this.onEvent.emit({ type: \"viewEvents\", item: this.cipher });\n }\n\n protected restore() {\n this.onEvent.emit({ type: \"restore\", items: [this.cipher] });\n }\n\n protected deleteCipher() {\n this.onEvent.emit({ type: \"delete\", items: [{ cipher: this.cipher }] });\n }\n\n protected attachments() {\n this.onEvent.emit({ type: \"viewAttachments\", item: this.cipher });\n }\n}\n","import { Component, Input, OnChanges } from \"@angular/core\";\n\nimport { SelectionReadOnlyRequest } from \"@bitwarden/common/admin-console/models/request/selection-read-only.request\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\n\nimport { GroupView } from \"../../../admin-console/organizations/core\";\n\n@Component({\n selector: \"app-group-badge\",\n templateUrl: \"group-name-badge.component.html\",\n})\nexport class GroupNameBadgeComponent implements OnChanges {\n @Input() selectedGroups: SelectionReadOnlyRequest[];\n @Input() allGroups: GroupView[];\n\n protected groupNames: string[] = [];\n\n constructor(private i18nService: I18nService) {}\n\n ngOnChanges() {\n this.groupNames = this.selectedGroups\n .map((g) => {\n return this.allGroups.find((o) => o.id === g.id)?.name;\n })\n .sort(this.i18nService.collator.compare);\n }\n}\n","\n","\n \n\n\n
    \n \n
    \n\n\n \n {{ collection.name }}\n \n\n\n \n \n\n\n\n \n\n\n

    \n {{ permissionText }}\n

    \n\n\n \n \n \n \n \n \n\n","import { Component, EventEmitter, Input, Output } from \"@angular/core\";\n\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { CollectionView } from \"@bitwarden/common/vault/models/view/collection.view\";\n\nimport { GroupView } from \"../../../admin-console/organizations/core\";\nimport { CollectionAdminView } from \"../../core/views/collection-admin.view\";\n\nimport {\n convertToPermission,\n getPermissionList,\n} from \"./../../../admin-console/organizations/shared/components/access-selector/access-selector.models\";\nimport { VaultItemEvent } from \"./vault-item-event\";\nimport { RowHeightClass } from \"./vault-items.component\";\n\n@Component({\n selector: \"tr[appVaultCollectionRow]\",\n templateUrl: \"vault-collection-row.component.html\",\n})\nexport class VaultCollectionRowComponent {\n protected RowHeightClass = RowHeightClass;\n\n @Input() disabled: boolean;\n @Input() collection: CollectionView;\n @Input() showOwner: boolean;\n @Input() showCollections: boolean;\n @Input() showGroups: boolean;\n @Input() canEditCollection: boolean;\n @Input() canDeleteCollection: boolean;\n @Input() organizations: Organization[];\n @Input() groups: GroupView[];\n @Input() showPermissionsColumn: boolean;\n\n @Output() onEvent = new EventEmitter();\n\n @Input() checked: boolean;\n @Output() checkedToggled = new EventEmitter();\n\n constructor(private i18nService: I18nService) {}\n\n get collectionGroups() {\n if (!(this.collection instanceof CollectionAdminView)) {\n return [];\n }\n\n return this.collection.groups;\n }\n\n get organization() {\n return this.organizations.find((o) => o.id === this.collection.organizationId);\n }\n\n get permissionText() {\n if (!(this.collection as CollectionAdminView).assigned) {\n return \"-\";\n } else {\n const permissionList = getPermissionList(this.organization?.flexibleCollections);\n return this.i18nService.t(\n permissionList.find((p) => p.perm === convertToPermission(this.collection))?.labelId,\n );\n }\n }\n\n protected edit() {\n this.onEvent.next({ type: \"editCollection\", item: this.collection });\n }\n\n protected access() {\n this.onEvent.next({ type: \"viewCollectionAccess\", item: this.collection });\n }\n\n protected deleteCollection() {\n this.onEvent.next({ type: \"delete\", items: [{ collection: this.collection }] });\n }\n}\n","import { ScrollingModule } from \"@angular/cdk/scrolling\";\nimport { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\nimport { RouterModule } from \"@angular/router\";\n\nimport { TableModule } from \"@bitwarden/components\";\n\nimport { SharedModule } from \"../../../shared/shared.module\";\nimport { OrganizationBadgeModule } from \"../../individual-vault/organization-badge/organization-badge.module\";\nimport { PipesModule } from \"../../individual-vault/pipes/pipes.module\";\nimport { CollectionBadgeModule } from \"../../org-vault/collection-badge/collection-badge.module\";\nimport { GroupBadgeModule } from \"../../org-vault/group-badge/group-badge.module\";\n\nimport { VaultCipherRowComponent } from \"./vault-cipher-row.component\";\nimport { VaultCollectionRowComponent } from \"./vault-collection-row.component\";\nimport { VaultItemsComponent } from \"./vault-items.component\";\n\n@NgModule({\n imports: [\n CommonModule,\n RouterModule,\n ScrollingModule,\n SharedModule,\n TableModule,\n OrganizationBadgeModule,\n CollectionBadgeModule,\n GroupBadgeModule,\n PipesModule,\n ],\n declarations: [VaultItemsComponent, VaultCipherRowComponent, VaultCollectionRowComponent],\n exports: [VaultItemsComponent],\n})\nexport class VaultItemsModule {}\n","import { SelectionReadOnlyRequest } from \"@bitwarden/common/admin-console/models/request/selection-read-only.request\";\n\nexport class BulkCollectionAccessRequest {\n collectionIds: string[];\n users: SelectionReadOnlyRequest[];\n groups: SelectionReadOnlyRequest[];\n}\n","import { Injectable } from \"@angular/core\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { SelectionReadOnlyRequest } from \"@bitwarden/common/admin-console/models/request/selection-read-only.request\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { EncString } from \"@bitwarden/common/platform/models/domain/enc-string\";\nimport { CollectionService } from \"@bitwarden/common/vault/abstractions/collection.service\";\nimport { CollectionData } from \"@bitwarden/common/vault/models/data/collection.data\";\nimport { CollectionRequest } from \"@bitwarden/common/vault/models/request/collection.request\";\nimport {\n CollectionAccessDetailsResponse,\n CollectionDetailsResponse,\n CollectionResponse,\n} from \"@bitwarden/common/vault/models/response/collection.response\";\n\nimport { CollectionAccessSelectionView } from \"../../admin-console/organizations/core\";\n\nimport { BulkCollectionAccessRequest } from \"./bulk-collection-access.request\";\nimport { CollectionAdminView } from \"./views/collection-admin.view\";\n\n@Injectable()\nexport class CollectionAdminService {\n constructor(\n private apiService: ApiService,\n private cryptoService: CryptoService,\n private collectionService: CollectionService,\n ) {}\n\n async getAll(organizationId: string): Promise {\n const collectionResponse =\n await this.apiService.getManyCollectionsWithAccessDetails(organizationId);\n\n if (collectionResponse?.data == null || collectionResponse.data.length === 0) {\n return [];\n }\n\n return await this.decryptMany(organizationId, collectionResponse.data);\n }\n\n async get(\n organizationId: string,\n collectionId: string,\n ): Promise {\n const collectionResponse = await this.apiService.getCollectionAccessDetails(\n organizationId,\n collectionId,\n );\n\n if (collectionResponse == null) {\n return undefined;\n }\n\n const [view] = await this.decryptMany(organizationId, [collectionResponse]);\n\n return view;\n }\n\n async save(collection: CollectionAdminView): Promise {\n const request = await this.encrypt(collection);\n\n let response: CollectionDetailsResponse;\n if (collection.id == null) {\n response = await this.apiService.postCollection(collection.organizationId, request);\n collection.id = response.id;\n } else {\n response = await this.apiService.putCollection(\n collection.organizationId,\n collection.id,\n request,\n );\n }\n\n if (response.assigned) {\n await this.collectionService.upsert(new CollectionData(response));\n } else {\n await this.collectionService.delete(collection.id);\n }\n\n return response;\n }\n\n async delete(organizationId: string, collectionId: string): Promise {\n await this.apiService.deleteCollection(organizationId, collectionId);\n }\n\n async bulkAssignAccess(\n organizationId: string,\n collectionIds: string[],\n users: CollectionAccessSelectionView[],\n groups: CollectionAccessSelectionView[],\n ): Promise {\n const request = new BulkCollectionAccessRequest();\n request.collectionIds = collectionIds;\n request.users = users.map(\n (u) => new SelectionReadOnlyRequest(u.id, u.readOnly, u.hidePasswords, u.manage),\n );\n request.groups = groups.map(\n (g) => new SelectionReadOnlyRequest(g.id, g.readOnly, g.hidePasswords, g.manage),\n );\n\n await this.apiService.send(\n \"POST\",\n `/organizations/${organizationId}/collections/bulk-access`,\n request,\n true,\n false,\n );\n }\n\n private async decryptMany(\n organizationId: string,\n collections: CollectionResponse[] | CollectionAccessDetailsResponse[],\n ): Promise {\n const orgKey = await this.cryptoService.getOrgKey(organizationId);\n\n const promises = collections.map(async (c) => {\n const view = new CollectionAdminView();\n view.id = c.id;\n view.name = await this.cryptoService.decryptToUtf8(new EncString(c.name), orgKey);\n view.externalId = c.externalId;\n view.organizationId = c.organizationId;\n\n if (isCollectionAccessDetailsResponse(c)) {\n view.groups = c.groups;\n view.users = c.users;\n view.assigned = c.assigned;\n }\n\n return view;\n });\n\n return await Promise.all(promises);\n }\n\n private async encrypt(model: CollectionAdminView): Promise {\n if (model.organizationId == null) {\n throw new Error(\"Collection has no organization id.\");\n }\n const key = await this.cryptoService.getOrgKey(model.organizationId);\n if (key == null) {\n throw new Error(\"No key for this collection's organization.\");\n }\n const collection = new CollectionRequest();\n collection.externalId = model.externalId;\n collection.name = (await this.cryptoService.encrypt(model.name, key)).encryptedString;\n collection.groups = model.groups.map(\n (group) =>\n new SelectionReadOnlyRequest(group.id, group.readOnly, group.hidePasswords, group.manage),\n );\n collection.users = model.users.map(\n (user) =>\n new SelectionReadOnlyRequest(user.id, user.readOnly, user.hidePasswords, user.manage),\n );\n return collection;\n }\n}\n\nfunction isCollectionAccessDetailsResponse(\n response: CollectionResponse | CollectionAccessDetailsResponse,\n): response is CollectionAccessDetailsResponse {\n const anyResponse = response as any;\n\n return anyResponse?.groups instanceof Array && anyResponse?.users instanceof Array;\n}\n","import { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\nimport { CollectionAccessDetailsResponse } from \"@bitwarden/common/src/vault/models/response/collection.response\";\nimport { CollectionView } from \"@bitwarden/common/vault/models/view/collection.view\";\n\nimport { CollectionAccessSelectionView } from \"../../../admin-console/organizations/core/views/collection-access-selection.view\";\n\nexport class CollectionAdminView extends CollectionView {\n groups: CollectionAccessSelectionView[] = [];\n users: CollectionAccessSelectionView[] = [];\n\n /**\n * Flag indicating the user has been explicitly assigned to this Collection\n */\n assigned: boolean;\n\n constructor(response?: CollectionAccessDetailsResponse) {\n super(response);\n\n if (!response) {\n return;\n }\n\n this.groups = response.groups\n ? response.groups.map((g) => new CollectionAccessSelectionView(g))\n : [];\n\n this.users = response.users\n ? response.users.map((g) => new CollectionAccessSelectionView(g))\n : [];\n\n this.assigned = response.assigned;\n }\n\n override canEdit(org: Organization): boolean {\n return org?.flexibleCollections\n ? org?.canEditAnyCollection || this.manage\n : org?.canEditAnyCollection || (org?.canEditAssignedCollections && this.assigned);\n }\n\n override canDelete(org: Organization): boolean {\n return org?.flexibleCollections\n ? org?.canDeleteAnyCollection || (!org?.limitCollectionCreationDeletion && this.manage)\n : org?.canDeleteAnyCollection || (org?.canDeleteAssignedCollections && this.assigned);\n }\n}\n","import { CdkDragDrop, moveItemInArray } from \"@angular/cdk/drag-drop\";\nimport { Directive, Input, OnChanges, SimpleChanges } from \"@angular/core\";\n\nimport { EventCollectionService } from \"@bitwarden/common/abstractions/event/event-collection.service\";\nimport { EventType } from \"@bitwarden/common/enums\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\nimport { FieldType, CipherType } from \"@bitwarden/common/vault/enums\";\nimport { CipherView } from \"@bitwarden/common/vault/models/view/cipher.view\";\nimport { FieldView } from \"@bitwarden/common/vault/models/view/field.view\";\n\n@Directive()\nexport class AddEditCustomFieldsComponent implements OnChanges {\n @Input() cipher: CipherView;\n @Input() thisCipherType: CipherType;\n @Input() editMode: boolean;\n\n addFieldType: FieldType = FieldType.Text;\n addFieldTypeOptions: any[];\n addFieldLinkedTypeOption: any;\n linkedFieldOptions: any[] = [];\n\n cipherType = CipherType;\n fieldType = FieldType;\n eventType = EventType;\n\n constructor(\n private i18nService: I18nService,\n private eventCollectionService: EventCollectionService,\n ) {\n this.addFieldTypeOptions = [\n { name: i18nService.t(\"cfTypeText\"), value: FieldType.Text },\n { name: i18nService.t(\"cfTypeHidden\"), value: FieldType.Hidden },\n { name: i18nService.t(\"cfTypeBoolean\"), value: FieldType.Boolean },\n ];\n this.addFieldLinkedTypeOption = {\n name: this.i18nService.t(\"cfTypeLinked\"),\n value: FieldType.Linked,\n };\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes.thisCipherType != null) {\n this.setLinkedFieldOptions();\n\n if (!changes.thisCipherType.firstChange) {\n this.resetCipherLinkedFields();\n }\n }\n }\n\n addField() {\n if (this.cipher.fields == null) {\n this.cipher.fields = [];\n }\n\n const f = new FieldView();\n f.type = this.addFieldType;\n f.newField = true;\n\n if (f.type === FieldType.Linked) {\n f.linkedId = this.linkedFieldOptions[0].value;\n }\n\n this.cipher.fields.push(f);\n }\n\n removeField(field: FieldView) {\n const i = this.cipher.fields.indexOf(field);\n if (i > -1) {\n this.cipher.fields.splice(i, 1);\n }\n }\n\n toggleFieldValue(field: FieldView) {\n const f = field as any;\n f.showValue = !f.showValue;\n if (this.editMode && f.showValue) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.eventCollectionService.collect(\n EventType.Cipher_ClientToggledHiddenFieldVisible,\n this.cipher.id,\n );\n }\n }\n\n trackByFunction(index: number, item: any) {\n return index;\n }\n\n drop(event: CdkDragDrop) {\n moveItemInArray(this.cipher.fields, event.previousIndex, event.currentIndex);\n }\n\n private setLinkedFieldOptions() {\n if (this.cipher.linkedFieldOptions == null) {\n return;\n }\n\n const options: any = [];\n this.cipher.linkedFieldOptions.forEach((linkedFieldOption, id) =>\n options.push({ name: this.i18nService.t(linkedFieldOption.i18nKey), value: id }),\n );\n this.linkedFieldOptions = options.sort(Utils.getSortFunction(this.i18nService, \"name\"));\n }\n\n private resetCipherLinkedFields() {\n if (this.cipher.fields == null || this.cipher.fields.length === 0) {\n return;\n }\n\n // Delete any Linked custom fields if the item type does not support them\n if (this.cipher.linkedFieldOptions == null) {\n this.cipher.fields = this.cipher.fields.filter((f) => f.type !== FieldType.Linked);\n return;\n }\n\n this.cipher.fields\n .filter((f) => f.type === FieldType.Linked)\n .forEach((f) => (f.linkedId = this.linkedFieldOptions[0].value));\n }\n}\n","import { Directive, ElementRef, forwardRef, HostListener, Input, Renderer2 } from \"@angular/core\";\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from \"@angular/forms\";\n\n// ref: https://juristr.com/blog/2018/02/ng-true-value-directive/\n@Directive({\n selector: \"input[type=checkbox][appTrueFalseValue]\",\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => TrueFalseValueDirective),\n multi: true,\n },\n ],\n})\nexport class TrueFalseValueDirective implements ControlValueAccessor {\n @Input() trueValue: boolean | string = true;\n @Input() falseValue: boolean | string = false;\n\n constructor(\n private elementRef: ElementRef,\n private renderer: Renderer2,\n ) {}\n\n @HostListener(\"change\", [\"$event\"])\n onHostChange(ev: any) {\n this.propagateChange(ev.target.checked ? this.trueValue : this.falseValue);\n }\n\n writeValue(obj: any): void {\n if (obj === this.trueValue) {\n this.renderer.setProperty(this.elementRef.nativeElement, \"checked\", true);\n } else {\n this.renderer.setProperty(this.elementRef.nativeElement, \"checked\", false);\n }\n }\n\n registerOnChange(fn: any): void {\n this.propagateChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n /* nothing */\n }\n\n setDisabledState?(isDisabled: boolean): void {\n /* nothing */\n }\n\n private propagateChange = (_: any) => {\n /* nothing */\n };\n}\n","\n

    {{ \"customFields\" | i18n }}

    \n
    \n \n
    \n
    \n \n \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n \n
    \n \n \n \n
    \n
    \n \n
    \n \n
    \n \n \n \n \n \n \n \n
    \n
    \n \n
    \n \n \n \n
    \n
    \n \n \n
    \n \n \n \n \n \n \n
    \n
    \n
    \n \n \n \n {{ \"newCustomField\" | i18n }}\n \n
    \n
    \n \n \n
    \n
    \n
    \n","import { Component, Input } from \"@angular/core\";\n\nimport { AddEditCustomFieldsComponent as BaseAddEditCustomFieldsComponent } from \"@bitwarden/angular/vault/components/add-edit-custom-fields.component\";\nimport { EventCollectionService } from \"@bitwarden/common/abstractions/event/event-collection.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\n\n@Component({\n selector: \"app-vault-add-edit-custom-fields\",\n templateUrl: \"add-edit-custom-fields.component.html\",\n})\nexport class AddEditCustomFieldsComponent extends BaseAddEditCustomFieldsComponent {\n @Input() viewOnly: boolean;\n @Input() copy: (value: string, typeI18nKey: string, aType: string) => void;\n\n constructor(i18nService: I18nService, eventCollectionService: EventCollectionService) {\n super(i18nService, eventCollectionService);\n }\n}\n","import { DatePipe } from \"@angular/common\";\nimport { Directive, EventEmitter, Input, OnDestroy, OnInit, Output } from \"@angular/core\";\nimport { concatMap, Observable, Subject, takeUntil } from \"rxjs\";\n\nimport { AuditService } from \"@bitwarden/common/abstractions/audit.service\";\nimport { EventCollectionService } from \"@bitwarden/common/abstractions/event/event-collection.service\";\nimport {\n isMember,\n OrganizationService,\n} from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport { PolicyService } from \"@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction\";\nimport { OrganizationUserStatusType, PolicyType } from \"@bitwarden/common/admin-console/enums\";\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\nimport { EventType } from \"@bitwarden/common/enums\";\nimport { FeatureFlag } from \"@bitwarden/common/enums/feature-flag.enum\";\nimport { UriMatchStrategy } from \"@bitwarden/common/models/domain/domain-service\";\nimport { ConfigServiceAbstraction } from \"@bitwarden/common/platform/abstractions/config/config.service.abstraction\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\nimport { SendApiService } from \"@bitwarden/common/tools/send/services/send-api.service.abstraction\";\nimport { CipherService } from \"@bitwarden/common/vault/abstractions/cipher.service\";\nimport { CollectionService } from \"@bitwarden/common/vault/abstractions/collection.service\";\nimport { FolderService } from \"@bitwarden/common/vault/abstractions/folder/folder.service.abstraction\";\nimport { CipherType, SecureNoteType } from \"@bitwarden/common/vault/enums\";\nimport { CipherRepromptType } from \"@bitwarden/common/vault/enums/cipher-reprompt-type\";\nimport { Cipher } from \"@bitwarden/common/vault/models/domain/cipher\";\nimport { CardView } from \"@bitwarden/common/vault/models/view/card.view\";\nimport { CipherView } from \"@bitwarden/common/vault/models/view/cipher.view\";\nimport { CollectionView } from \"@bitwarden/common/vault/models/view/collection.view\";\nimport { FolderView } from \"@bitwarden/common/vault/models/view/folder.view\";\nimport { IdentityView } from \"@bitwarden/common/vault/models/view/identity.view\";\nimport { LoginUriView } from \"@bitwarden/common/vault/models/view/login-uri.view\";\nimport { LoginView } from \"@bitwarden/common/vault/models/view/login.view\";\nimport { SecureNoteView } from \"@bitwarden/common/vault/models/view/secure-note.view\";\nimport { DialogService } from \"@bitwarden/components\";\nimport { PasswordRepromptService } from \"@bitwarden/vault\";\n\n@Directive()\nexport class AddEditComponent implements OnInit, OnDestroy {\n @Input() cloneMode = false;\n @Input() folderId: string = null;\n @Input() cipherId: string;\n @Input() type: CipherType;\n @Input() collectionIds: string[];\n @Input() organizationId: string = null;\n @Output() onSavedCipher = new EventEmitter();\n @Output() onDeletedCipher = new EventEmitter();\n @Output() onRestoredCipher = new EventEmitter();\n @Output() onCancelled = new EventEmitter();\n @Output() onEditAttachments = new EventEmitter();\n @Output() onShareCipher = new EventEmitter();\n @Output() onEditCollections = new EventEmitter();\n @Output() onGeneratePassword = new EventEmitter();\n @Output() onGenerateUsername = new EventEmitter();\n\n editMode = false;\n cipher: CipherView;\n folders$: Observable;\n collections: CollectionView[] = [];\n title: string;\n formPromise: Promise;\n deletePromise: Promise;\n restorePromise: Promise;\n checkPasswordPromise: Promise;\n showPassword = false;\n showTotpSeed = false;\n showCardNumber = false;\n showCardCode = false;\n cipherType = CipherType;\n typeOptions: any[];\n cardBrandOptions: any[];\n cardExpMonthOptions: any[];\n identityTitleOptions: any[];\n uriMatchOptions: any[];\n ownershipOptions: any[] = [];\n autofillOnPageLoadOptions: any[];\n currentDate = new Date();\n allowPersonal = true;\n reprompt = false;\n canUseReprompt = true;\n organization: Organization;\n\n protected componentName = \"\";\n protected destroy$ = new Subject();\n protected writeableCollections: CollectionView[];\n private personalOwnershipPolicyAppliesToActiveUser: boolean;\n private previousCipherId: string;\n\n protected flexibleCollectionsV1Enabled = false;\n\n get fido2CredentialCreationDateValue(): string {\n const dateCreated = this.i18nService.t(\"dateCreated\");\n const creationDate = this.datePipe.transform(\n this.cipher?.login?.fido2Credentials?.[0]?.creationDate,\n \"short\",\n );\n return `${dateCreated} ${creationDate}`;\n }\n\n constructor(\n protected cipherService: CipherService,\n protected folderService: FolderService,\n protected i18nService: I18nService,\n protected platformUtilsService: PlatformUtilsService,\n protected auditService: AuditService,\n protected stateService: StateService,\n protected collectionService: CollectionService,\n protected messagingService: MessagingService,\n protected eventCollectionService: EventCollectionService,\n protected policyService: PolicyService,\n protected logService: LogService,\n protected passwordRepromptService: PasswordRepromptService,\n private organizationService: OrganizationService,\n protected sendApiService: SendApiService,\n protected dialogService: DialogService,\n protected win: Window,\n protected datePipe: DatePipe,\n protected configService: ConfigServiceAbstraction,\n ) {\n this.typeOptions = [\n { name: i18nService.t(\"typeLogin\"), value: CipherType.Login },\n { name: i18nService.t(\"typeCard\"), value: CipherType.Card },\n { name: i18nService.t(\"typeIdentity\"), value: CipherType.Identity },\n { name: i18nService.t(\"typeSecureNote\"), value: CipherType.SecureNote },\n ];\n this.cardBrandOptions = [\n { name: \"-- \" + i18nService.t(\"select\") + \" --\", value: null },\n { name: \"Visa\", value: \"Visa\" },\n { name: \"Mastercard\", value: \"Mastercard\" },\n { name: \"American Express\", value: \"Amex\" },\n { name: \"Discover\", value: \"Discover\" },\n { name: \"Diners Club\", value: \"Diners Club\" },\n { name: \"JCB\", value: \"JCB\" },\n { name: \"Maestro\", value: \"Maestro\" },\n { name: \"UnionPay\", value: \"UnionPay\" },\n { name: \"RuPay\", value: \"RuPay\" },\n { name: i18nService.t(\"other\"), value: \"Other\" },\n ];\n this.cardExpMonthOptions = [\n { name: \"-- \" + i18nService.t(\"select\") + \" --\", value: null },\n { name: \"01 - \" + i18nService.t(\"january\"), value: \"1\" },\n { name: \"02 - \" + i18nService.t(\"february\"), value: \"2\" },\n { name: \"03 - \" + i18nService.t(\"march\"), value: \"3\" },\n { name: \"04 - \" + i18nService.t(\"april\"), value: \"4\" },\n { name: \"05 - \" + i18nService.t(\"may\"), value: \"5\" },\n { name: \"06 - \" + i18nService.t(\"june\"), value: \"6\" },\n { name: \"07 - \" + i18nService.t(\"july\"), value: \"7\" },\n { name: \"08 - \" + i18nService.t(\"august\"), value: \"8\" },\n { name: \"09 - \" + i18nService.t(\"september\"), value: \"9\" },\n { name: \"10 - \" + i18nService.t(\"october\"), value: \"10\" },\n { name: \"11 - \" + i18nService.t(\"november\"), value: \"11\" },\n { name: \"12 - \" + i18nService.t(\"december\"), value: \"12\" },\n ];\n this.identityTitleOptions = [\n { name: \"-- \" + i18nService.t(\"select\") + \" --\", value: null },\n { name: i18nService.t(\"mr\"), value: i18nService.t(\"mr\") },\n { name: i18nService.t(\"mrs\"), value: i18nService.t(\"mrs\") },\n { name: i18nService.t(\"ms\"), value: i18nService.t(\"ms\") },\n { name: i18nService.t(\"mx\"), value: i18nService.t(\"mx\") },\n { name: i18nService.t(\"dr\"), value: i18nService.t(\"dr\") },\n ];\n this.uriMatchOptions = [\n { name: i18nService.t(\"defaultMatchDetection\"), value: null },\n { name: i18nService.t(\"baseDomain\"), value: UriMatchStrategy.Domain },\n { name: i18nService.t(\"host\"), value: UriMatchStrategy.Host },\n { name: i18nService.t(\"startsWith\"), value: UriMatchStrategy.StartsWith },\n { name: i18nService.t(\"regEx\"), value: UriMatchStrategy.RegularExpression },\n { name: i18nService.t(\"exact\"), value: UriMatchStrategy.Exact },\n { name: i18nService.t(\"never\"), value: UriMatchStrategy.Never },\n ];\n this.autofillOnPageLoadOptions = [\n { name: i18nService.t(\"autoFillOnPageLoadUseDefault\"), value: null },\n { name: i18nService.t(\"autoFillOnPageLoadYes\"), value: true },\n { name: i18nService.t(\"autoFillOnPageLoadNo\"), value: false },\n ];\n }\n\n async ngOnInit() {\n this.flexibleCollectionsV1Enabled = await this.configService.getFeatureFlag(\n FeatureFlag.FlexibleCollectionsV1,\n false,\n );\n this.writeableCollections = await this.loadCollections();\n this.canUseReprompt = await this.passwordRepromptService.enabled();\n\n this.policyService\n .policyAppliesToActiveUser$(PolicyType.PersonalOwnership)\n .pipe(\n concatMap(async (policyAppliesToActiveUser) => {\n this.personalOwnershipPolicyAppliesToActiveUser = policyAppliesToActiveUser;\n await this.init();\n }),\n takeUntil(this.destroy$),\n )\n .subscribe();\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n async init() {\n if (this.ownershipOptions.length) {\n this.ownershipOptions = [];\n }\n if (this.personalOwnershipPolicyAppliesToActiveUser) {\n this.allowPersonal = false;\n } else {\n const myEmail = await this.stateService.getEmail();\n this.ownershipOptions.push({ name: myEmail, value: null });\n }\n\n const orgs = await this.organizationService.getAll();\n orgs\n .filter(isMember)\n .sort(Utils.getSortFunction(this.i18nService, \"name\"))\n .forEach((o) => {\n if (o.enabled && o.status === OrganizationUserStatusType.Confirmed) {\n this.ownershipOptions.push({ name: o.name, value: o.id });\n }\n });\n if (!this.allowPersonal && this.organizationId == undefined) {\n this.organizationId = this.defaultOwnerId;\n }\n }\n\n async load() {\n this.editMode = this.cipherId != null;\n if (this.editMode) {\n this.editMode = true;\n if (this.cloneMode) {\n this.cloneMode = true;\n this.title = this.i18nService.t(\"addItem\");\n } else {\n this.title = this.i18nService.t(\"editItem\");\n }\n } else {\n this.title = this.i18nService.t(\"addItem\");\n }\n\n const loadedAddEditCipherInfo = await this.loadAddEditCipherInfo();\n\n if (this.cipher == null) {\n if (this.editMode) {\n const cipher = await this.loadCipher();\n this.cipher = await cipher.decrypt(\n await this.cipherService.getKeyForCipherKeyDecryption(cipher),\n );\n\n // Adjust Cipher Name if Cloning\n if (this.cloneMode) {\n this.cipher.name += \" - \" + this.i18nService.t(\"clone\");\n // If not allowing personal ownership, update cipher's org Id to prompt downstream changes\n if (this.cipher.organizationId == null && !this.allowPersonal) {\n this.cipher.organizationId = this.organizationId;\n }\n }\n } else {\n this.cipher = new CipherView();\n this.cipher.organizationId = this.organizationId == null ? null : this.organizationId;\n this.cipher.folderId = this.folderId;\n this.cipher.type = this.type == null ? CipherType.Login : this.type;\n this.cipher.login = new LoginView();\n this.cipher.login.uris = [new LoginUriView()];\n this.cipher.card = new CardView();\n this.cipher.identity = new IdentityView();\n this.cipher.secureNote = new SecureNoteView();\n this.cipher.secureNote.type = SecureNoteType.Generic;\n this.cipher.reprompt = CipherRepromptType.None;\n }\n }\n\n if (this.cipher != null && (!this.editMode || loadedAddEditCipherInfo || this.cloneMode)) {\n await this.organizationChanged();\n if (\n this.collectionIds != null &&\n this.collectionIds.length > 0 &&\n this.collections.length > 0\n ) {\n this.collections.forEach((c) => {\n if (this.collectionIds.indexOf(c.id) > -1) {\n (c as any).checked = true;\n }\n });\n }\n }\n\n // We don't want to copy passkeys when we clone a cipher\n if (this.cloneMode && this.cipher?.login?.hasFido2Credentials) {\n this.cipher.login.fido2Credentials = null;\n }\n\n this.folders$ = this.folderService.folderViews$;\n\n if (this.editMode && this.previousCipherId !== this.cipherId) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.eventCollectionService.collect(EventType.Cipher_ClientViewed, this.cipherId);\n }\n this.previousCipherId = this.cipherId;\n this.reprompt = this.cipher.reprompt !== CipherRepromptType.None;\n if (this.reprompt) {\n this.cipher.login.autofillOnPageLoad = this.autofillOnPageLoadOptions[2].value;\n }\n }\n\n async submit(): Promise {\n if (this.cipher.isDeleted) {\n return this.restore();\n }\n\n if (this.cipher.name == null || this.cipher.name === \"\") {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"nameRequired\"),\n );\n return false;\n }\n\n if (\n (!this.editMode || this.cloneMode) &&\n !this.allowPersonal &&\n this.cipher.organizationId == null\n ) {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"personalOwnershipSubmitError\"),\n );\n return false;\n }\n\n if (\n (!this.editMode || this.cloneMode) &&\n this.cipher.type === CipherType.Login &&\n this.cipher.login.uris != null &&\n this.cipher.login.uris.length === 1 &&\n (this.cipher.login.uris[0].uri == null || this.cipher.login.uris[0].uri === \"\")\n ) {\n this.cipher.login.uris = [];\n }\n\n // Allows saving of selected collections during \"Add\" and \"Clone\" flows\n if ((!this.editMode || this.cloneMode) && this.cipher.organizationId != null) {\n this.cipher.collectionIds =\n this.collections == null\n ? []\n : this.collections.filter((c) => (c as any).checked).map((c) => c.id);\n }\n\n // Clear current Cipher Id if exists to trigger \"Add\" cipher flow\n if (this.cloneMode) {\n this.cipher.id = null;\n }\n\n const cipher = await this.encryptCipher();\n try {\n this.formPromise = this.saveCipher(cipher);\n await this.formPromise;\n this.cipher.id = cipher.id;\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(this.editMode && !this.cloneMode ? \"editedItem\" : \"addedItem\"),\n );\n this.onSavedCipher.emit(this.cipher);\n this.messagingService.send(this.editMode && !this.cloneMode ? \"editedCipher\" : \"addedCipher\");\n return true;\n } catch (e) {\n this.logService.error(e);\n }\n\n return false;\n }\n\n addUri() {\n if (this.cipher.type !== CipherType.Login) {\n return;\n }\n\n if (this.cipher.login.uris == null) {\n this.cipher.login.uris = [];\n }\n\n this.cipher.login.uris.push(new LoginUriView());\n }\n\n removeUri(uri: LoginUriView) {\n if (this.cipher.type !== CipherType.Login || this.cipher.login.uris == null) {\n return;\n }\n\n const i = this.cipher.login.uris.indexOf(uri);\n if (i > -1) {\n this.cipher.login.uris.splice(i, 1);\n }\n }\n\n onCardNumberChange(): void {\n this.cipher.card.brand = CardView.getCardBrandByPatterns(this.cipher.card.number);\n }\n\n getCardExpMonthDisplay() {\n return this.cardExpMonthOptions.find((x) => x.value == this.cipher.card.expMonth)?.name;\n }\n\n trackByFunction(index: number, item: any) {\n return index;\n }\n\n cancel() {\n this.onCancelled.emit(this.cipher);\n }\n\n attachments() {\n this.onEditAttachments.emit(this.cipher);\n }\n\n share() {\n this.onShareCipher.emit(this.cipher);\n }\n\n editCollections() {\n this.onEditCollections.emit(this.cipher);\n }\n\n async delete(): Promise {\n const confirmed = await this.dialogService.openSimpleDialog({\n title: { key: \"deleteItem\" },\n content: {\n key: this.cipher.isDeleted ? \"permanentlyDeleteItemConfirmation\" : \"deleteItemConfirmation\",\n },\n type: \"warning\",\n });\n\n if (!confirmed) {\n return false;\n }\n\n try {\n this.deletePromise = this.deleteCipher();\n await this.deletePromise;\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(this.cipher.isDeleted ? \"permanentlyDeletedItem\" : \"deletedItem\"),\n );\n this.onDeletedCipher.emit(this.cipher);\n this.messagingService.send(\n this.cipher.isDeleted ? \"permanentlyDeletedCipher\" : \"deletedCipher\",\n );\n } catch (e) {\n this.logService.error(e);\n }\n\n return true;\n }\n\n async restore(): Promise {\n if (!this.cipher.isDeleted) {\n return false;\n }\n\n try {\n this.restorePromise = this.restoreCipher();\n await this.restorePromise;\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"restoredItem\"));\n this.onRestoredCipher.emit(this.cipher);\n this.messagingService.send(\"restoredCipher\");\n } catch (e) {\n this.logService.error(e);\n }\n\n return true;\n }\n\n async generateUsername(): Promise {\n if (this.cipher.login?.username?.length) {\n const confirmed = await this.dialogService.openSimpleDialog({\n title: { key: \"overwriteUsername\" },\n content: { key: \"overwriteUsernameConfirmation\" },\n type: \"warning\",\n });\n\n if (!confirmed) {\n return false;\n }\n }\n\n this.onGenerateUsername.emit();\n return true;\n }\n\n async generatePassword(): Promise {\n if (this.cipher.login?.password?.length) {\n const confirmed = await this.dialogService.openSimpleDialog({\n title: { key: \"overwritePassword\" },\n content: { key: \"overwritePasswordConfirmation\" },\n type: \"warning\",\n });\n\n if (!confirmed) {\n return false;\n }\n }\n\n this.onGeneratePassword.emit();\n return true;\n }\n\n togglePassword() {\n this.showPassword = !this.showPassword;\n\n if (this.editMode && this.showPassword) {\n document.getElementById(\"loginPassword\")?.focus();\n\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.eventCollectionService.collect(\n EventType.Cipher_ClientToggledPasswordVisible,\n this.cipherId,\n );\n }\n }\n\n toggleTotpSeed() {\n this.showTotpSeed = !this.showTotpSeed;\n\n if (this.editMode && this.showTotpSeed) {\n document.getElementById(\"loginTotp\")?.focus();\n\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.eventCollectionService.collect(\n EventType.Cipher_ClientToggledTOTPSeedVisible,\n this.cipherId,\n );\n }\n }\n\n async toggleCardNumber() {\n this.showCardNumber = !this.showCardNumber;\n if (this.showCardNumber) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.eventCollectionService.collect(\n EventType.Cipher_ClientToggledCardNumberVisible,\n this.cipherId,\n );\n }\n }\n\n toggleCardCode() {\n this.showCardCode = !this.showCardCode;\n document.getElementById(\"cardCode\").focus();\n if (this.editMode && this.showCardCode) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.eventCollectionService.collect(\n EventType.Cipher_ClientToggledCardCodeVisible,\n this.cipherId,\n );\n }\n }\n\n toggleUriOptions(uri: LoginUriView) {\n const u = uri as any;\n u.showOptions = u.showOptions == null && uri.match != null ? false : !u.showOptions;\n }\n\n loginUriMatchChanged(uri: LoginUriView) {\n const u = uri as any;\n u.showOptions = u.showOptions == null ? true : u.showOptions;\n }\n\n async organizationChanged() {\n if (this.writeableCollections != null) {\n this.writeableCollections.forEach((c) => ((c as any).checked = false));\n }\n if (this.cipher.organizationId != null) {\n this.collections = this.writeableCollections.filter(\n (c) => c.organizationId === this.cipher.organizationId,\n );\n const org = await this.organizationService.get(this.cipher.organizationId);\n if (org != null) {\n this.cipher.organizationUseTotp = org.useTotp;\n }\n } else {\n this.collections = [];\n }\n }\n\n async checkPassword() {\n if (this.checkPasswordPromise != null) {\n return;\n }\n\n if (\n this.cipher.login == null ||\n this.cipher.login.password == null ||\n this.cipher.login.password === \"\"\n ) {\n return;\n }\n\n this.checkPasswordPromise = this.auditService.passwordLeaked(this.cipher.login.password);\n const matches = await this.checkPasswordPromise;\n this.checkPasswordPromise = null;\n\n if (matches > 0) {\n this.platformUtilsService.showToast(\n \"warning\",\n null,\n this.i18nService.t(\"passwordExposed\", matches.toString()),\n );\n } else {\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"passwordSafe\"));\n }\n }\n\n repromptChanged() {\n this.reprompt = !this.reprompt;\n if (this.reprompt) {\n this.cipher.reprompt = CipherRepromptType.Password;\n this.cipher.login.autofillOnPageLoad = this.autofillOnPageLoadOptions[2].value;\n } else {\n this.cipher.reprompt = CipherRepromptType.None;\n this.cipher.login.autofillOnPageLoad = this.autofillOnPageLoadOptions[0].value;\n }\n }\n\n protected async loadCollections() {\n const allCollections = await this.collectionService.getAllDecrypted();\n return allCollections.filter((c) => !c.readOnly);\n }\n\n protected loadCipher() {\n return this.cipherService.get(this.cipherId);\n }\n\n protected encryptCipher() {\n return this.cipherService.encrypt(this.cipher);\n }\n\n protected saveCipher(cipher: Cipher) {\n const isNotClone = this.editMode && !this.cloneMode;\n let orgAdmin = this.organization?.isAdmin;\n\n if (this.flexibleCollectionsV1Enabled) {\n // Flexible Collections V1 restricts admins, check the organization setting via canEditAllCiphers\n orgAdmin = this.organization?.canEditAllCiphers(true);\n }\n\n return this.cipher.id == null\n ? this.cipherService.createWithServer(cipher, orgAdmin)\n : this.cipherService.updateWithServer(cipher, orgAdmin, isNotClone);\n }\n\n protected deleteCipher() {\n const asAdmin = this.organization?.canEditAnyCollection;\n return this.cipher.isDeleted\n ? this.cipherService.deleteWithServer(this.cipher.id, asAdmin)\n : this.cipherService.softDeleteWithServer(this.cipher.id, asAdmin);\n }\n\n protected restoreCipher() {\n const asAdmin = this.organization?.canEditAnyCollection;\n return this.cipherService.restoreWithServer(this.cipher.id, asAdmin);\n }\n\n get defaultOwnerId(): string | null {\n return this.ownershipOptions[0].value;\n }\n\n async loadAddEditCipherInfo(): Promise {\n const addEditCipherInfo: any = await this.stateService.getAddEditCipherInfo();\n const loadedSavedInfo = addEditCipherInfo != null;\n\n if (loadedSavedInfo) {\n this.cipher = addEditCipherInfo.cipher;\n this.collectionIds = addEditCipherInfo.collectionIds;\n\n if (!this.editMode && !this.allowPersonal && this.cipher.organizationId == null) {\n // This is a new cipher and personal ownership isn't allowed, so we need to set the default owner\n this.cipher.organizationId = this.defaultOwnerId;\n }\n }\n\n await this.stateService.setAddEditCipherInfo(null);\n\n return loadedSavedInfo;\n }\n\n async copy(value: string, typeI18nKey: string, aType: string): Promise {\n if (value == null) {\n return false;\n }\n\n const copyOptions = this.win != null ? { window: this.win } : null;\n this.platformUtilsService.copyToClipboard(value, copyOptions);\n this.platformUtilsService.showToast(\n \"info\",\n null,\n this.i18nService.t(\"valueCopied\", this.i18nService.t(typeI18nKey)),\n );\n\n if (typeI18nKey === \"password\") {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.eventCollectionService.collect(EventType.Cipher_ClientCopiedPassword, this.cipherId);\n } else if (typeI18nKey === \"securityCode\") {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.eventCollectionService.collect(EventType.Cipher_ClientCopiedCardCode, this.cipherId);\n } else if (aType === \"H_Field\") {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.eventCollectionService.collect(EventType.Cipher_ClientCopiedHiddenField, this.cipherId);\n }\n\n return true;\n }\n}\n","import { DatePipe } from \"@angular/common\";\nimport { Component, OnDestroy, OnInit } from \"@angular/core\";\nimport { firstValueFrom } from \"rxjs\";\n\nimport { AddEditComponent as BaseAddEditComponent } from \"@bitwarden/angular/vault/components/add-edit.component\";\nimport { AuditService } from \"@bitwarden/common/abstractions/audit.service\";\nimport { EventCollectionService } from \"@bitwarden/common/abstractions/event/event-collection.service\";\nimport { OrganizationService } from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport { PolicyService } from \"@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction\";\nimport { BillingAccountProfileStateService } from \"@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service\";\nimport { EventType, ProductType } from \"@bitwarden/common/enums\";\nimport { ConfigServiceAbstraction } from \"@bitwarden/common/platform/abstractions/config/config.service.abstraction\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { PasswordGenerationServiceAbstraction } from \"@bitwarden/common/tools/generator/password\";\nimport { SendApiService } from \"@bitwarden/common/tools/send/services/send-api.service.abstraction\";\nimport { CipherService } from \"@bitwarden/common/vault/abstractions/cipher.service\";\nimport { CollectionService } from \"@bitwarden/common/vault/abstractions/collection.service\";\nimport { FolderService } from \"@bitwarden/common/vault/abstractions/folder/folder.service.abstraction\";\nimport { TotpService } from \"@bitwarden/common/vault/abstractions/totp.service\";\nimport { CipherType } from \"@bitwarden/common/vault/enums\";\nimport { Launchable } from \"@bitwarden/common/vault/interfaces/launchable\";\nimport { DialogService } from \"@bitwarden/components\";\nimport { PasswordRepromptService } from \"@bitwarden/vault\";\n\n@Component({\n selector: \"app-vault-add-edit\",\n templateUrl: \"add-edit.component.html\",\n})\nexport class AddEditComponent extends BaseAddEditComponent implements OnInit, OnDestroy {\n canAccessPremium: boolean;\n totpCode: string;\n totpCodeFormatted: string;\n totpDash: number;\n totpSec: number;\n totpLow: boolean;\n showRevisionDate = false;\n hasPasswordHistory = false;\n viewingPasswordHistory = false;\n viewOnly = false;\n showPasswordCount = false;\n\n protected totpInterval: number;\n protected override componentName = \"app-vault-add-edit\";\n\n constructor(\n cipherService: CipherService,\n folderService: FolderService,\n i18nService: I18nService,\n platformUtilsService: PlatformUtilsService,\n auditService: AuditService,\n stateService: StateService,\n collectionService: CollectionService,\n protected totpService: TotpService,\n protected passwordGenerationService: PasswordGenerationServiceAbstraction,\n protected messagingService: MessagingService,\n eventCollectionService: EventCollectionService,\n protected policyService: PolicyService,\n organizationService: OrganizationService,\n logService: LogService,\n passwordRepromptService: PasswordRepromptService,\n sendApiService: SendApiService,\n dialogService: DialogService,\n datePipe: DatePipe,\n configService: ConfigServiceAbstraction,\n private billingAccountProfileStateService: BillingAccountProfileStateService,\n ) {\n super(\n cipherService,\n folderService,\n i18nService,\n platformUtilsService,\n auditService,\n stateService,\n collectionService,\n messagingService,\n eventCollectionService,\n policyService,\n logService,\n passwordRepromptService,\n organizationService,\n sendApiService,\n dialogService,\n window,\n datePipe,\n configService,\n );\n }\n\n async ngOnInit() {\n await super.ngOnInit();\n await this.load();\n // remove when all the title for all clients are updated to New Item\n if (this.cloneMode || !this.editMode) {\n this.title = this.i18nService.t(\"newItem\");\n }\n this.showRevisionDate = this.cipher.passwordRevisionDisplayDate != null;\n this.hasPasswordHistory = this.cipher.hasPasswordHistory;\n this.cleanUp();\n\n this.canAccessPremium = await firstValueFrom(\n this.billingAccountProfileStateService.hasPremiumFromAnySource$,\n );\n if (this.showTotp()) {\n await this.totpUpdateCode();\n const interval = this.totpService.getTimeInterval(this.cipher.login.totp);\n await this.totpTick(interval);\n\n this.totpInterval = window.setInterval(async () => {\n await this.totpTick(interval);\n }, 1000);\n }\n }\n\n ngOnDestroy() {\n super.ngOnDestroy();\n }\n\n toggleFavorite() {\n this.cipher.favorite = !this.cipher.favorite;\n }\n\n togglePassword() {\n super.togglePassword();\n\n // Hide password count when password is hidden to be safe\n if (!this.showPassword && this.showPasswordCount) {\n this.togglePasswordCount();\n }\n }\n\n togglePasswordCount() {\n this.showPasswordCount = !this.showPasswordCount;\n\n if (this.editMode && this.showPasswordCount) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.eventCollectionService.collect(\n EventType.Cipher_ClientToggledPasswordVisible,\n this.cipherId,\n );\n }\n }\n\n launch(uri: Launchable) {\n if (!uri.canLaunch) {\n return;\n }\n\n this.platformUtilsService.launchUri(uri.launchUri);\n }\n\n async copy(value: string, typeI18nKey: string, aType: string): Promise {\n if (value == null) {\n return false;\n }\n\n this.platformUtilsService.copyToClipboard(value, { window: window });\n this.platformUtilsService.showToast(\n \"info\",\n null,\n this.i18nService.t(\"valueCopied\", this.i18nService.t(typeI18nKey)),\n );\n\n if (this.editMode) {\n if (typeI18nKey === \"password\") {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.eventCollectionService.collect(EventType.Cipher_ClientCopiedPassword, this.cipherId);\n } else if (typeI18nKey === \"securityCode\") {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.eventCollectionService.collect(EventType.Cipher_ClientCopiedCardCode, this.cipherId);\n } else if (aType === \"H_Field\") {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.eventCollectionService.collect(\n EventType.Cipher_ClientCopiedHiddenField,\n this.cipherId,\n );\n }\n }\n\n return true;\n }\n\n async generatePassword(): Promise {\n const confirmed = await super.generatePassword();\n if (confirmed) {\n const options = (await this.passwordGenerationService.getOptions())?.[0] ?? {};\n this.cipher.login.password = await this.passwordGenerationService.generatePassword(options);\n }\n return confirmed;\n }\n\n premiumRequired() {\n if (!this.canAccessPremium) {\n this.messagingService.send(\"premiumRequired\");\n return;\n }\n }\n\n upgradeOrganization() {\n this.messagingService.send(\"upgradeOrganization\", {\n organizationId: this.cipher.organizationId,\n });\n }\n\n showGetPremium() {\n if (this.canAccessPremium) {\n return;\n }\n if (this.cipher.organizationUseTotp) {\n this.upgradeOrganization();\n } else {\n this.premiumRequired();\n }\n }\n\n viewHistory() {\n this.viewingPasswordHistory = !this.viewingPasswordHistory;\n }\n\n protected cleanUp() {\n if (this.totpInterval) {\n window.clearInterval(this.totpInterval);\n }\n }\n\n protected async totpUpdateCode() {\n if (\n this.cipher == null ||\n this.cipher.type !== CipherType.Login ||\n this.cipher.login.totp == null\n ) {\n if (this.totpInterval) {\n window.clearInterval(this.totpInterval);\n }\n return;\n }\n\n this.totpCode = await this.totpService.getCode(this.cipher.login.totp);\n if (this.totpCode != null) {\n if (this.totpCode.length > 4) {\n const half = Math.floor(this.totpCode.length / 2);\n this.totpCodeFormatted =\n this.totpCode.substring(0, half) + \" \" + this.totpCode.substring(half);\n } else {\n this.totpCodeFormatted = this.totpCode;\n }\n } else {\n this.totpCodeFormatted = null;\n if (this.totpInterval) {\n window.clearInterval(this.totpInterval);\n }\n }\n }\n\n protected allowOwnershipAssignment() {\n return (\n (!this.editMode || this.cloneMode) &&\n this.ownershipOptions != null &&\n (this.ownershipOptions.length > 1 || !this.allowPersonal)\n );\n }\n\n protected showTotp() {\n return (\n this.cipher.type === CipherType.Login &&\n this.cipher.login.totp &&\n this.organization?.planProductType != ProductType.Free &&\n (this.cipher.organizationUseTotp || this.canAccessPremium)\n );\n }\n\n private async totpTick(intervalSeconds: number) {\n const epoch = Math.round(new Date().getTime() / 1000.0);\n const mod = epoch % intervalSeconds;\n\n this.totpSec = intervalSeconds - mod;\n this.totpDash = +(Math.round(((78.6 / intervalSeconds) * mod + \"e+2\") as any) + \"e-2\");\n this.totpLow = this.totpSec <= 7;\n if (mod === 0) {\n await this.totpUpdateCode();\n }\n }\n}\n","import { Component } from \"@angular/core\";\n\nimport { AttachmentsComponent as BaseAttachmentsComponent } from \"@bitwarden/angular/vault/components/attachments.component\";\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { BillingAccountProfileStateService } from \"@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { FileDownloadService } from \"@bitwarden/common/platform/abstractions/file-download/file-download.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { CipherService } from \"@bitwarden/common/vault/abstractions/cipher.service\";\nimport { AttachmentView } from \"@bitwarden/common/vault/models/view/attachment.view\";\nimport { DialogService } from \"@bitwarden/components\";\n\n@Component({\n selector: \"app-vault-attachments\",\n templateUrl: \"attachments.component.html\",\n})\nexport class AttachmentsComponent extends BaseAttachmentsComponent {\n viewOnly = false;\n protected override componentName = \"app-vault-attachments\";\n\n constructor(\n cipherService: CipherService,\n i18nService: I18nService,\n cryptoService: CryptoService,\n stateService: StateService,\n platformUtilsService: PlatformUtilsService,\n apiService: ApiService,\n logService: LogService,\n fileDownloadService: FileDownloadService,\n dialogService: DialogService,\n billingAccountProfileStateService: BillingAccountProfileStateService,\n ) {\n super(\n cipherService,\n i18nService,\n cryptoService,\n platformUtilsService,\n apiService,\n window,\n logService,\n stateService,\n fileDownloadService,\n dialogService,\n billingAccountProfileStateService,\n );\n }\n\n protected async reupload(attachment: AttachmentView) {\n if (this.showFixOldAttachments(attachment)) {\n await this.reuploadCipherAttachment(attachment, false);\n }\n }\n\n protected showFixOldAttachments(attachment: AttachmentView) {\n return attachment.key == null && this.cipher.organizationId == null;\n }\n}\n","import { DialogConfig, DialogRef, DIALOG_DATA } from \"@angular/cdk/dialog\";\nimport { Component, Inject } from \"@angular/core\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { CipherService } from \"@bitwarden/common/vault/abstractions/cipher.service\";\nimport { CollectionService } from \"@bitwarden/common/vault/abstractions/collection.service\";\nimport { CipherBulkDeleteRequest } from \"@bitwarden/common/vault/models/request/cipher-bulk-delete.request\";\nimport { CollectionView } from \"@bitwarden/common/vault/models/view/collection.view\";\nimport { DialogService } from \"@bitwarden/components\";\n\nexport interface BulkDeleteDialogParams {\n cipherIds?: string[];\n permanent?: boolean;\n organization?: Organization;\n organizations?: Organization[];\n collections?: CollectionView[];\n}\n\nexport enum BulkDeleteDialogResult {\n Deleted = \"deleted\",\n Canceled = \"canceled\",\n}\n\n/**\n * Strongly typed helper to open a BulkDeleteDialog\n * @param dialogService Instance of the dialog service that will be used to open the dialog\n * @param config Configuration for the dialog\n */\nexport const openBulkDeleteDialog = (\n dialogService: DialogService,\n config: DialogConfig,\n) => {\n return dialogService.open(\n BulkDeleteDialogComponent,\n config,\n );\n};\n\n@Component({\n templateUrl: \"bulk-delete-dialog.component.html\",\n})\nexport class BulkDeleteDialogComponent {\n cipherIds: string[];\n permanent = false;\n organization: Organization;\n organizations: Organization[];\n collections: CollectionView[];\n\n constructor(\n @Inject(DIALOG_DATA) params: BulkDeleteDialogParams,\n private dialogRef: DialogRef,\n private cipherService: CipherService,\n private platformUtilsService: PlatformUtilsService,\n private i18nService: I18nService,\n private apiService: ApiService,\n private collectionService: CollectionService,\n ) {\n this.cipherIds = params.cipherIds ?? [];\n this.permanent = params.permanent;\n this.organization = params.organization;\n this.organizations = params.organizations;\n this.collections = params.collections;\n }\n\n protected async cancel() {\n this.close(BulkDeleteDialogResult.Canceled);\n }\n\n protected submit = async () => {\n const deletePromises: Promise[] = [];\n if (this.cipherIds.length) {\n if (!this.organization || !this.organization.canEditAnyCollection) {\n deletePromises.push(this.deleteCiphers());\n } else {\n deletePromises.push(this.deleteCiphersAdmin());\n }\n }\n\n if (this.collections.length) {\n deletePromises.push(this.deleteCollections());\n }\n\n await Promise.all(deletePromises);\n\n if (this.cipherIds.length) {\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(this.permanent ? \"permanentlyDeletedItems\" : \"deletedItems\"),\n );\n }\n if (this.collections.length) {\n await this.collectionService.delete(this.collections.map((c) => c.id));\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"deletedCollections\"),\n );\n }\n this.close(BulkDeleteDialogResult.Deleted);\n };\n\n private async deleteCiphers(): Promise {\n const asAdmin = this.organization?.canEditAnyCollection;\n if (this.permanent) {\n await this.cipherService.deleteManyWithServer(this.cipherIds, asAdmin);\n } else {\n await this.cipherService.softDeleteManyWithServer(this.cipherIds, asAdmin);\n }\n }\n\n private async deleteCiphersAdmin(): Promise {\n const deleteRequest = new CipherBulkDeleteRequest(this.cipherIds, this.organization.id);\n if (this.permanent) {\n return await this.apiService.deleteManyCiphersAdmin(deleteRequest);\n } else {\n return await this.apiService.putDeleteManyCiphersAdmin(deleteRequest);\n }\n }\n\n private async deleteCollections(): Promise {\n // From org vault\n if (this.organization) {\n if (this.collections.some((c) => !c.canDelete(this.organization))) {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"missingPermissions\"),\n );\n return;\n }\n return await this.apiService.deleteManyCollections(\n this.organization.id,\n this.collections.map((c) => c.id),\n );\n // From individual vault, so there can be multiple organizations\n } else if (this.organizations && this.collections) {\n const deletePromises: Promise[] = [];\n for (const organization of this.organizations) {\n const orgCollections = this.collections.filter((o) => o.organizationId === organization.id);\n if (orgCollections.some((c) => !c.canDelete(organization))) {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"missingPermissions\"),\n );\n return;\n }\n const orgCollectionIds = orgCollections.map((c) => c.id);\n deletePromises.push(\n this.apiService.deleteManyCollections(organization.id, orgCollectionIds),\n );\n }\n return await Promise.all(deletePromises);\n }\n }\n\n private close(result: BulkDeleteDialogResult) {\n this.dialogRef.close(result);\n }\n}\n","\n \n {{ (permanent ? \"permanentlyDeleteSelected\" : \"deleteSelected\") | i18n }}\n \n \n \n \n {{ \"deleteSelectedItemsDesc\" | i18n: cipherIds.length }}\n \n \n {{ \"deleteSelectedCollectionsDesc\" | i18n: collections.length }}\n \n {{ \"deleteSelectedConfirmation\" | i18n }}\n \n \n {{ \"permanentlyDeleteSelectedItemsDesc\" | i18n: cipherIds.length }}\n \n \n \n \n \n \n\n","import { Directive, EventEmitter, Input, OnInit, Output } from \"@angular/core\";\n\nimport { OrganizationService } from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { CipherService } from \"@bitwarden/common/vault/abstractions/cipher.service\";\nimport { CollectionService } from \"@bitwarden/common/vault/abstractions/collection.service\";\nimport { Cipher } from \"@bitwarden/common/vault/models/domain/cipher\";\nimport { CipherView } from \"@bitwarden/common/vault/models/view/cipher.view\";\nimport { CollectionView } from \"@bitwarden/common/vault/models/view/collection.view\";\n\n@Directive()\nexport class CollectionsComponent implements OnInit {\n @Input() cipherId: string;\n @Input() allowSelectNone = false;\n @Output() onSavedCollections = new EventEmitter();\n\n formPromise: Promise;\n cipher: CipherView;\n collectionIds: string[];\n collections: CollectionView[] = [];\n organization: Organization;\n flexibleCollectionsV1Enabled: boolean;\n\n protected cipherDomain: Cipher;\n\n constructor(\n protected collectionService: CollectionService,\n protected platformUtilsService: PlatformUtilsService,\n protected i18nService: I18nService,\n protected cipherService: CipherService,\n protected organizationService: OrganizationService,\n private logService: LogService,\n ) {}\n\n async ngOnInit() {\n await this.load();\n }\n\n async load() {\n this.cipherDomain = await this.loadCipher();\n this.collectionIds = this.loadCipherCollections();\n this.cipher = await this.cipherDomain.decrypt(\n await this.cipherService.getKeyForCipherKeyDecryption(this.cipherDomain),\n );\n this.collections = await this.loadCollections();\n\n this.collections.forEach((c) => ((c as any).checked = false));\n if (this.collectionIds != null) {\n this.collections.forEach((c) => {\n (c as any).checked = this.collectionIds != null && this.collectionIds.indexOf(c.id) > -1;\n });\n }\n\n if (this.organization == null) {\n this.organization = await this.organizationService.get(this.cipher.organizationId);\n }\n }\n\n async submit() {\n const selectedCollectionIds = this.collections\n .filter((c) => {\n if (this.organization.canEditAllCiphers(this.flexibleCollectionsV1Enabled)) {\n return !!(c as any).checked;\n } else {\n return !!(c as any).checked && c.readOnly == null;\n }\n })\n .map((c) => c.id);\n if (!this.allowSelectNone && selectedCollectionIds.length === 0) {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"selectOneCollection\"),\n );\n return;\n }\n this.cipherDomain.collectionIds = selectedCollectionIds;\n try {\n this.formPromise = this.saveCollections();\n await this.formPromise;\n this.onSavedCollections.emit();\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"editedItem\"));\n } catch (e) {\n this.logService.error(e);\n }\n }\n\n protected loadCipher() {\n return this.cipherService.get(this.cipherId);\n }\n\n protected loadCipherCollections() {\n return this.cipherDomain.collectionIds;\n }\n\n protected async loadCollections() {\n const allCollections = await this.collectionService.getAllDecrypted();\n return allCollections.filter(\n (c) => !c.readOnly && c.organizationId === this.cipher.organizationId,\n );\n }\n\n protected saveCollections() {\n return this.cipherService.saveCollectionsWithServer(this.cipherDomain);\n }\n}\n","
    \n
    \n
    \n
    \n

    \n {{ \"collections\" | i18n }}\n {{ cipher.name }}\n

    \n \n ×\n \n
    \n
    \n

    {{ \"collectionsDesc\" | i18n }}

    \n
    \n

    {{ \"collections\" | i18n }}

    \n
    \n \n \n
    \n
    \n
    \n {{ \"noCollectionsInList\" | i18n }}\n
    \n \n \n \n \n \n \n \n
    \n \n \n {{ c.name }}\n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n","import { Component, OnDestroy } from \"@angular/core\";\n\nimport { CollectionsComponent as BaseCollectionsComponent } from \"@bitwarden/angular/admin-console/components/collections.component\";\nimport { OrganizationService } from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { CipherService } from \"@bitwarden/common/vault/abstractions/cipher.service\";\nimport { CollectionService } from \"@bitwarden/common/vault/abstractions/collection.service\";\nimport { CollectionView } from \"@bitwarden/common/vault/models/view/collection.view\";\n\n@Component({\n selector: \"app-vault-collections\",\n templateUrl: \"collections.component.html\",\n})\nexport class CollectionsComponent extends BaseCollectionsComponent implements OnDestroy {\n constructor(\n collectionService: CollectionService,\n platformUtilsService: PlatformUtilsService,\n i18nService: I18nService,\n cipherService: CipherService,\n organizationSerivce: OrganizationService,\n logService: LogService,\n ) {\n super(\n collectionService,\n platformUtilsService,\n i18nService,\n cipherService,\n organizationSerivce,\n logService,\n );\n }\n\n ngOnDestroy() {\n this.selectAll(false);\n }\n\n check(c: CollectionView, select?: boolean) {\n if (!c.canEditItems(this.organization, this.flexibleCollectionsV1Enabled)) {\n return;\n }\n (c as any).checked = select == null ? !(c as any).checked : select;\n }\n\n selectAll(select: boolean) {\n this.collections.forEach((c) => this.check(c, select));\n }\n}\n","import { NgModule } from \"@angular/core\";\n\nimport { SharedModule } from \"../../../shared/shared.module\";\n\nimport { OrganizationNameBadgeComponent } from \"./organization-name-badge.component\";\n\n@NgModule({\n imports: [SharedModule],\n declarations: [OrganizationNameBadgeComponent],\n exports: [OrganizationNameBadgeComponent],\n})\nexport class OrganizationBadgeModule {}\n","import { Component, Input, OnChanges } from \"@angular/core\";\nimport { firstValueFrom } from \"rxjs\";\n\nimport { AvatarService } from \"@bitwarden/common/auth/abstractions/avatar.service\";\nimport { TokenService } from \"@bitwarden/common/auth/abstractions/token.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\n\nimport { Unassigned } from \"../vault-filter/shared/models/routed-vault-filter.model\";\n\n@Component({\n selector: \"app-org-badge\",\n templateUrl: \"organization-name-badge.component.html\",\n})\nexport class OrganizationNameBadgeComponent implements OnChanges {\n @Input() organizationId?: string;\n @Input() organizationName: string;\n @Input() disabled: boolean;\n\n // Need a separate variable or we get weird behavior when used as part of cdk virtual scrolling\n name: string;\n color: string;\n textColor: string;\n isMe: boolean;\n\n constructor(\n private i18nService: I18nService,\n private avatarService: AvatarService,\n private tokenService: TokenService,\n ) {}\n\n // ngOnChanges is required since this component might be reused as part of\n // cdk virtual scrolling\n async ngOnChanges() {\n this.isMe = this.organizationName == null || this.organizationName === \"\";\n\n if (this.isMe) {\n this.name = this.i18nService.t(\"me\");\n this.color = await firstValueFrom(this.avatarService.avatarColor$);\n if (this.color == null) {\n const userId = await this.tokenService.getUserId();\n if (userId != null) {\n this.color = Utils.stringToColor(userId);\n } else {\n const userName =\n (await this.tokenService.getName()) ?? (await this.tokenService.getEmail());\n this.color = Utils.stringToColor(userName.toUpperCase());\n }\n }\n } else {\n this.name = this.organizationName;\n this.color = Utils.stringToColor(this.organizationName.toUpperCase());\n }\n this.textColor = Utils.pickTextColorBasedOnBgColor(this.color, 135, true) + \"!important\";\n }\n\n get organizationIdLink() {\n return this.organizationId ?? Unassigned;\n }\n}\n","\n {{ name | ellipsis: 13 }}\n\n","import { Pipe, PipeTransform } from \"@angular/core\";\n\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\n\n@Pipe({\n name: \"orgNameFromId\",\n pure: true,\n})\nexport class GetOrgNameFromIdPipe implements PipeTransform {\n transform(value: string, organizations: Organization[]) {\n const orgName = organizations?.find((o) => o.id === value)?.name;\n return orgName;\n }\n}\n","import { NgModule } from \"@angular/core\";\n\nimport { GetCollectionNameFromIdPipe } from \"./get-collection-name.pipe\";\nimport { GetGroupNameFromIdPipe } from \"./get-group-name.pipe\";\nimport { GetOrgNameFromIdPipe } from \"./get-organization-name.pipe\";\n\n@NgModule({\n declarations: [GetOrgNameFromIdPipe, GetCollectionNameFromIdPipe, GetGroupNameFromIdPipe],\n exports: [GetOrgNameFromIdPipe, GetCollectionNameFromIdPipe, GetGroupNameFromIdPipe],\n})\nexport class PipesModule {}\n","import { DIALOG_DATA, DialogRef } from \"@angular/cdk/dialog\";\nimport { Component, Inject } from \"@angular/core\";\nimport { FormControl, FormGroup, Validators } from \"@angular/forms\";\n\nimport { OrganizationUserService } from \"@bitwarden/common/admin-console/abstractions/organization-user/organization-user.service\";\nimport { OrganizationUserResetPasswordEnrollmentRequest } from \"@bitwarden/common/admin-console/abstractions/organization-user/requests\";\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\nimport { UserVerificationService } from \"@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction\";\nimport { Verification } from \"@bitwarden/common/auth/types/verification\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { SyncService } from \"@bitwarden/common/vault/abstractions/sync/sync.service.abstraction\";\nimport { DialogService } from \"@bitwarden/components\";\n\nimport { OrganizationUserResetPasswordService } from \"../members/services/organization-user-reset-password/organization-user-reset-password.service\";\n\ninterface EnrollMasterPasswordResetData {\n organization: Organization;\n}\n\n@Component({\n selector: \"app-enroll-master-password-reset\",\n templateUrl: \"enroll-master-password-reset.component.html\",\n})\nexport class EnrollMasterPasswordReset {\n protected organization: Organization;\n\n protected formGroup = new FormGroup({\n verification: new FormControl(null, Validators.required),\n });\n\n constructor(\n private dialogRef: DialogRef,\n @Inject(DIALOG_DATA) protected data: EnrollMasterPasswordResetData,\n private resetPasswordService: OrganizationUserResetPasswordService,\n private userVerificationService: UserVerificationService,\n private platformUtilsService: PlatformUtilsService,\n private i18nService: I18nService,\n private syncService: SyncService,\n private logService: LogService,\n private organizationUserService: OrganizationUserService,\n ) {\n this.organization = data.organization;\n }\n\n submit = async () => {\n try {\n await this.userVerificationService\n .buildRequest(\n this.formGroup.value.verification,\n OrganizationUserResetPasswordEnrollmentRequest,\n )\n .then(async (request) => {\n // Create request and execute enrollment\n request.resetPasswordKey = await this.resetPasswordService.buildRecoveryKey(\n this.organization.id,\n );\n await this.organizationUserService.putOrganizationUserResetPasswordEnrollment(\n this.organization.id,\n this.organization.userId,\n request,\n );\n\n await this.syncService.fullSync(true);\n });\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"enrollPasswordResetSuccess\"),\n );\n this.dialogRef.close();\n } catch (e) {\n this.logService.error(e);\n }\n };\n\n static open(dialogService: DialogService, data: EnrollMasterPasswordResetData) {\n return dialogService.open(EnrollMasterPasswordReset, { data });\n }\n}\n","
    \n \n {{ \"enrollAccountRecovery\" | i18n }}\n
    \n \n {{ \"resetPasswordEnrollmentWarning\" | i18n }}\n \n \n
    \n \n \n \n \n
    \n
    \n","import { AfterContentInit, Directive, HostListener, Input } from \"@angular/core\";\n\nimport { SsoComponent } from \"@bitwarden/angular/auth/components/sso.component\";\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\n\n@Directive({\n selector: \"[app-link-sso]\",\n})\nexport class LinkSsoDirective extends SsoComponent implements AfterContentInit {\n @Input() organization: Organization;\n returnUri = \"/settings/organizations\";\n redirectUri = window.location.origin + \"/sso-connector.html\";\n clientId = \"web\";\n\n @HostListener(\"click\", [\"$event\"])\n async onClick($event: MouseEvent) {\n $event.preventDefault();\n await this.submit(this.returnUri, true);\n }\n\n async ngAfterContentInit() {\n this.identifier = this.organization.identifier;\n }\n}\n","\n \n \n \n \n {{ \"loading\" | i18n }}\n \n \n \n \n {{ \"enrollAccountRecovery\" | i18n }}\n \n \n \n {{ \"withdrawAccountRecovery\" | i18n }}\n \n \n \n \n {{ \"unlinkSso\" | i18n }}\n \n \n \n \n {{ \"linkSso\" | i18n }}\n \n \n \n \n \n \n\n","import { Component, Inject, OnDestroy, OnInit } from \"@angular/core\";\nimport { combineLatest, map, Observable, Subject, takeUntil } from \"rxjs\";\n\nimport { UserDecryptionOptionsServiceAbstraction } from \"@bitwarden/auth/common\";\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { OrganizationApiServiceAbstraction } from \"@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction\";\nimport { OrganizationUserService } from \"@bitwarden/common/admin-console/abstractions/organization-user/organization-user.service\";\nimport { OrganizationUserResetPasswordEnrollmentRequest } from \"@bitwarden/common/admin-console/abstractions/organization-user/requests\";\nimport { PolicyService } from \"@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction\";\nimport { PolicyType } from \"@bitwarden/common/admin-console/enums\";\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\nimport { Policy } from \"@bitwarden/common/admin-console/models/domain/policy\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { SyncService } from \"@bitwarden/common/vault/abstractions/sync/sync.service.abstraction\";\nimport { DialogService } from \"@bitwarden/components\";\n\nimport { EnrollMasterPasswordReset } from \"../../../../admin-console/organizations/users/enroll-master-password-reset.component\";\nimport { OptionsInput } from \"../shared/components/vault-filter-section.component\";\nimport { OrganizationFilter } from \"../shared/models/vault-filter.type\";\n\n@Component({\n selector: \"app-organization-options\",\n templateUrl: \"organization-options.component.html\",\n})\nexport class OrganizationOptionsComponent implements OnInit, OnDestroy {\n protected actionPromise: Promise;\n protected resetPasswordPolicy?: Policy | undefined;\n protected loaded = false;\n protected hideMenu = false;\n protected showLeaveOrgOption = false;\n protected organization: OrganizationFilter;\n\n private destroy$ = new Subject();\n\n constructor(\n @Inject(OptionsInput) protected organization$: Observable,\n private platformUtilsService: PlatformUtilsService,\n private i18nService: I18nService,\n private apiService: ApiService,\n private syncService: SyncService,\n private policyService: PolicyService,\n private logService: LogService,\n private organizationApiService: OrganizationApiServiceAbstraction,\n private organizationUserService: OrganizationUserService,\n private userDecryptionOptionsService: UserDecryptionOptionsServiceAbstraction,\n private dialogService: DialogService,\n ) {}\n\n async ngOnInit() {\n const resetPasswordPolicies$ = this.policyService.policies$.pipe(\n map((policies) => policies.filter((policy) => policy.type === PolicyType.ResetPassword)),\n );\n\n combineLatest([\n this.organization$,\n resetPasswordPolicies$,\n this.userDecryptionOptionsService.userDecryptionOptions$,\n ])\n .pipe(takeUntil(this.destroy$))\n .subscribe(([organization, resetPasswordPolicies, decryptionOptions]) => {\n this.organization = organization;\n this.resetPasswordPolicy = resetPasswordPolicies.find(\n (p) => p.organizationId === organization.id,\n );\n\n // A user can leave an organization if they are NOT using TDE and Key Connector, or they have a master password.\n this.showLeaveOrgOption =\n (decryptionOptions.trustedDeviceOption == undefined &&\n decryptionOptions.keyConnectorOption == undefined) ||\n decryptionOptions.hasMasterPassword;\n\n // Hide the 3 dot menu if the user has no available actions\n this.hideMenu =\n !this.showLeaveOrgOption &&\n !this.showSsoOptions(this.organization) &&\n !this.allowEnrollmentChanges(this.organization);\n\n this.loaded = true;\n });\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n allowEnrollmentChanges(org: OrganizationFilter): boolean {\n if (org?.usePolicies && org?.useResetPassword && org?.hasPublicAndPrivateKeys) {\n if (this.resetPasswordPolicy != undefined && this.resetPasswordPolicy.enabled) {\n return !(org?.resetPasswordEnrolled && this.resetPasswordPolicy.data.autoEnrollEnabled);\n }\n }\n\n return false;\n }\n\n showSsoOptions(org: OrganizationFilter) {\n return org?.useSso && org?.identifier;\n }\n\n async unlinkSso(org: Organization) {\n const confirmed = await this.dialogService.openSimpleDialog({\n title: org.name,\n content: { key: \"unlinkSsoConfirmation\" },\n type: \"warning\",\n });\n\n if (!confirmed) {\n return false;\n }\n\n try {\n this.actionPromise = this.apiService.deleteSsoUser(org.id).then(() => {\n return this.syncService.fullSync(true);\n });\n await this.actionPromise;\n this.platformUtilsService.showToast(\"success\", null, \"Unlinked SSO\");\n } catch (e) {\n this.logService.error(e);\n }\n }\n\n async leave(org: Organization) {\n const confirmed = await this.dialogService.openSimpleDialog({\n title: org.name,\n content: { key: \"leaveOrganizationConfirmation\" },\n type: \"warning\",\n });\n\n if (!confirmed) {\n return false;\n }\n\n try {\n this.actionPromise = this.organizationApiService.leave(org.id);\n await this.actionPromise;\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"leftOrganization\"));\n } catch (e) {\n this.logService.error(e);\n }\n }\n\n async toggleResetPasswordEnrollment(org: Organization) {\n if (!this.organization.resetPasswordEnrolled) {\n EnrollMasterPasswordReset.open(this.dialogService, { organization: org });\n } else {\n // Remove reset password\n const request = new OrganizationUserResetPasswordEnrollmentRequest();\n request.masterPasswordHash = \"ignored\";\n request.resetPasswordKey = null;\n this.actionPromise = this.organizationUserService.putOrganizationUserResetPasswordEnrollment(\n this.organization.id,\n this.organization.userId,\n request,\n );\n try {\n await this.actionPromise;\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"withdrawPasswordResetSuccess\"),\n );\n await this.syncService.fullSync(true);\n } catch (e) {\n this.logService.error(e);\n }\n }\n }\n}\n","
    \n
    \n \n
    \n
    \n
    \n {{ \"filters\" | i18n }}\n \n \n \n
    \n
    \n
    \n \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n","import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from \"@angular/core\";\nimport { firstValueFrom, Subject } from \"rxjs\";\n\nimport { PolicyService } from \"@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction\";\nimport { PolicyType } from \"@bitwarden/common/admin-console/enums\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { CipherType } from \"@bitwarden/common/vault/enums\";\nimport { TreeNode } from \"@bitwarden/common/vault/models/domain/tree-node\";\n\nimport { VaultFilterService } from \"../services/abstractions/vault-filter.service\";\nimport {\n VaultFilterList,\n VaultFilterSection,\n VaultFilterType,\n} from \"../shared/models/vault-filter-section.type\";\nimport { VaultFilter } from \"../shared/models/vault-filter.model\";\nimport {\n CipherStatus,\n CipherTypeFilter,\n CollectionFilter,\n FolderFilter,\n OrganizationFilter,\n} from \"../shared/models/vault-filter.type\";\n\nimport { OrganizationOptionsComponent } from \"./organization-options.component\";\n\n@Component({\n selector: \"app-vault-filter\",\n templateUrl: \"vault-filter.component.html\",\n})\nexport class VaultFilterComponent implements OnInit, OnDestroy {\n filters?: VaultFilterList;\n @Input() activeFilter: VaultFilter = new VaultFilter();\n @Output() onEditFolder = new EventEmitter();\n\n @Input() searchText = \"\";\n @Output() searchTextChanged = new EventEmitter();\n\n isLoaded = false;\n\n protected destroy$: Subject = new Subject();\n\n get filtersList() {\n return this.filters ? Object.values(this.filters) : [];\n }\n\n get searchPlaceholder() {\n if (this.activeFilter.isFavorites) {\n return \"searchFavorites\";\n }\n if (this.activeFilter.isDeleted) {\n return \"searchTrash\";\n }\n if (this.activeFilter.cipherType === CipherType.Login) {\n return \"searchLogin\";\n }\n if (this.activeFilter.cipherType === CipherType.Card) {\n return \"searchCard\";\n }\n if (this.activeFilter.cipherType === CipherType.Identity) {\n return \"searchIdentity\";\n }\n if (this.activeFilter.cipherType === CipherType.SecureNote) {\n return \"searchSecureNote\";\n }\n if (this.activeFilter.selectedFolderNode?.node) {\n return \"searchFolder\";\n }\n if (this.activeFilter.selectedCollectionNode?.node) {\n return \"searchCollection\";\n }\n if (this.activeFilter.organizationId === \"MyVault\") {\n return \"searchMyVault\";\n }\n if (this.activeFilter.organizationId) {\n return \"searchOrganization\";\n }\n\n return \"searchVault\";\n }\n\n constructor(\n protected vaultFilterService: VaultFilterService,\n protected policyService: PolicyService,\n protected i18nService: I18nService,\n protected platformUtilsService: PlatformUtilsService,\n ) {}\n\n async ngOnInit(): Promise {\n this.filters = await this.buildAllFilters();\n this.activeFilter.selectedCipherTypeNode =\n (await this.getDefaultFilter()) as TreeNode;\n this.isLoaded = true;\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n onSearchTextChanged(t: string) {\n this.searchText = t;\n this.searchTextChanged.emit(t);\n }\n\n applyOrganizationFilter = async (orgNode: TreeNode): Promise => {\n if (!orgNode?.node.enabled) {\n this.platformUtilsService.showToast(\n \"error\",\n null,\n this.i18nService.t(\"disabledOrganizationFilterError\"),\n );\n return;\n }\n const filter = this.activeFilter;\n if (orgNode?.node.id === \"AllVaults\") {\n filter.resetOrganization();\n } else {\n filter.selectedOrganizationNode = orgNode;\n }\n this.vaultFilterService.setOrganizationFilter(orgNode.node);\n await this.vaultFilterService.expandOrgFilter();\n };\n\n applyTypeFilter = async (filterNode: TreeNode): Promise => {\n const filter = this.activeFilter;\n filter.resetFilter();\n filter.selectedCipherTypeNode = filterNode;\n };\n\n applyFolderFilter = async (folderNode: TreeNode): Promise => {\n const filter = this.activeFilter;\n filter.resetFilter();\n filter.selectedFolderNode = folderNode;\n };\n\n applyCollectionFilter = async (collectionNode: TreeNode): Promise => {\n const filter = this.activeFilter;\n filter.resetFilter();\n filter.selectedCollectionNode = collectionNode;\n };\n\n editFolder = async (folder: FolderFilter): Promise => {\n this.onEditFolder.emit(folder);\n };\n\n async getDefaultFilter(): Promise> {\n return await firstValueFrom(this.filters?.typeFilter.data$);\n }\n\n async buildAllFilters(): Promise {\n const builderFilter = {} as VaultFilterList;\n builderFilter.organizationFilter = await this.addOrganizationFilter();\n builderFilter.typeFilter = await this.addTypeFilter();\n builderFilter.folderFilter = await this.addFolderFilter();\n builderFilter.collectionFilter = await this.addCollectionFilter();\n builderFilter.trashFilter = await this.addTrashFilter();\n return builderFilter;\n }\n\n protected async addOrganizationFilter(): Promise {\n const singleOrgPolicy = await this.policyService.policyAppliesToUser(PolicyType.SingleOrg);\n const personalVaultPolicy = await this.policyService.policyAppliesToUser(\n PolicyType.PersonalOwnership,\n );\n\n const addAction = !singleOrgPolicy\n ? { text: \"newOrganization\", route: \"/create-organization\" }\n : null;\n\n const orgFilterSection: VaultFilterSection = {\n data$: this.vaultFilterService.organizationTree$,\n header: {\n showHeader: !(singleOrgPolicy && personalVaultPolicy),\n isSelectable: true,\n },\n action: this.applyOrganizationFilter,\n options: { component: OrganizationOptionsComponent },\n add: addAction,\n divider: true,\n };\n\n return orgFilterSection;\n }\n\n protected async addTypeFilter(excludeTypes: CipherStatus[] = []): Promise {\n const allTypeFilters: CipherTypeFilter[] = [\n {\n id: \"favorites\",\n name: this.i18nService.t(\"favorites\"),\n type: \"favorites\",\n icon: \"bwi-star\",\n },\n {\n id: \"login\",\n name: this.i18nService.t(\"typeLogin\"),\n type: CipherType.Login,\n icon: \"bwi-globe\",\n },\n {\n id: \"card\",\n name: this.i18nService.t(\"typeCard\"),\n type: CipherType.Card,\n icon: \"bwi-credit-card\",\n },\n {\n id: \"identity\",\n name: this.i18nService.t(\"typeIdentity\"),\n type: CipherType.Identity,\n icon: \"bwi-id-card\",\n },\n {\n id: \"note\",\n name: this.i18nService.t(\"typeSecureNote\"),\n type: CipherType.SecureNote,\n icon: \"bwi-sticky-note\",\n },\n ];\n\n const typeFilterSection: VaultFilterSection = {\n data$: this.vaultFilterService.buildTypeTree(\n { id: \"AllItems\", name: \"allItems\", type: \"all\", icon: \"\" },\n allTypeFilters.filter((f) => !excludeTypes.includes(f.type)),\n ),\n header: {\n showHeader: true,\n isSelectable: true,\n },\n action: this.applyTypeFilter,\n };\n return typeFilterSection;\n }\n\n protected async addFolderFilter(): Promise {\n const folderFilterSection: VaultFilterSection = {\n data$: this.vaultFilterService.folderTree$,\n header: {\n showHeader: true,\n isSelectable: false,\n },\n action: this.applyFolderFilter,\n edit: {\n text: \"editFolder\",\n action: this.editFolder,\n },\n };\n return folderFilterSection;\n }\n\n protected async addCollectionFilter(): Promise {\n const collectionFilterSection: VaultFilterSection = {\n data$: this.vaultFilterService.collectionTree$,\n header: {\n showHeader: true,\n isSelectable: true,\n },\n action: this.applyCollectionFilter,\n };\n return collectionFilterSection;\n }\n\n protected async addTrashFilter(): Promise {\n const trashFilterSection: VaultFilterSection = {\n data$: this.vaultFilterService.buildTypeTree(\n {\n id: \"headTrash\",\n name: \"HeadTrash\",\n type: \"trash\",\n icon: \"bwi-trash\",\n },\n [\n {\n id: \"trash\",\n name: this.i18nService.t(\"trash\"),\n type: \"trash\",\n icon: \"bwi-trash\",\n },\n ],\n ),\n header: {\n showHeader: false,\n isSelectable: true,\n },\n action: this.applyTypeFilter,\n };\n return trashFilterSection;\n }\n}\n","import { Observable } from \"rxjs\";\n\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\nimport { CollectionView } from \"@bitwarden/common/src/vault/models/view/collection.view\";\nimport { FolderView } from \"@bitwarden/common/src/vault/models/view/folder.view\";\nimport { TreeNode } from \"@bitwarden/common/vault/models/domain/tree-node\";\n\nimport { CollectionAdminView } from \"../../../../core/views/collection-admin.view\";\nimport {\n CipherTypeFilter,\n CollectionFilter,\n FolderFilter,\n OrganizationFilter,\n} from \"../../shared/models/vault-filter.type\";\n\nexport abstract class VaultFilterService {\n collapsedFilterNodes$: Observable>;\n filteredFolders$: Observable;\n filteredCollections$: Observable;\n organizationTree$: Observable>;\n folderTree$: Observable>;\n collectionTree$: Observable>;\n cipherTypeTree$: Observable>;\n getCollectionNodeFromTree: (id: string) => Promise>;\n setCollapsedFilterNodes: (collapsedFilterNodes: Set) => Promise;\n expandOrgFilter: () => Promise;\n getOrganizationFilter: () => Observable;\n setOrganizationFilter: (organization: Organization) => void;\n buildTypeTree: (\n head: CipherTypeFilter,\n array: CipherTypeFilter[],\n ) => Observable>;\n // TODO: Remove this from org vault when collection admin service adopts state management\n reloadCollections?: (collections: CollectionAdminView[]) => void;\n}\n","import { CipherType } from \"@bitwarden/common/vault/enums\";\nimport { TreeNode } from \"@bitwarden/common/vault/models/domain/tree-node\";\n\nimport { RoutedVaultFilterBridgeService } from \"../../services/routed-vault-filter-bridge.service\";\n\nimport {\n All,\n isRoutedVaultFilterItemType,\n RoutedVaultFilterItemType,\n RoutedVaultFilterModel,\n Unassigned,\n} from \"./routed-vault-filter.model\";\nimport { VaultFilter, VaultFilterFunction } from \"./vault-filter.model\";\nimport {\n OrganizationFilter,\n CipherTypeFilter,\n FolderFilter,\n CollectionFilter,\n CipherStatus,\n} from \"./vault-filter.type\";\n\n/**\n * This file is part of a layer that is used to temporary bridge between URL filtering and the old state-in-code method.\n * This should be removed after we have refactored the {@link VaultItemsComponent} and introduced vertical navigation\n * (which will refactor the {@link VaultFilterComponent}).\n *\n * This model supplies legacy code with the old state-in-code models saved as tree nodes.\n * It can also receive requests to select a new tree node by using setters.\n * However instead of just replacing the tree node models, it requests a URL navigation,\n * thereby bridging between legacy and URL filtering.\n */\nexport class RoutedVaultFilterBridge implements VaultFilter {\n constructor(\n private routedFilter: RoutedVaultFilterModel,\n private legacyFilter: VaultFilter,\n private bridgeService: RoutedVaultFilterBridgeService,\n ) {}\n get collectionBreadcrumbs(): TreeNode[] {\n return this.legacyFilter.collectionBreadcrumbs;\n }\n get isCollectionSelected(): boolean {\n return this.legacyFilter.isCollectionSelected;\n }\n get isUnassignedCollectionSelected(): boolean {\n return this.legacyFilter.isUnassignedCollectionSelected;\n }\n get isMyVaultSelected(): boolean {\n return this.legacyFilter.isMyVaultSelected;\n }\n get selectedOrganizationNode(): TreeNode {\n return this.legacyFilter.selectedOrganizationNode;\n }\n set selectedOrganizationNode(value: TreeNode) {\n this.bridgeService.navigate({\n ...this.routedFilter,\n organizationId: value?.node.id === \"MyVault\" ? Unassigned : value?.node.id,\n folderId: undefined,\n collectionId: undefined,\n });\n }\n get selectedCipherTypeNode(): TreeNode {\n return this.legacyFilter.selectedCipherTypeNode;\n }\n set selectedCipherTypeNode(value: TreeNode) {\n let type: RoutedVaultFilterItemType | undefined;\n\n if (value?.node.id === \"AllItems\" && this.routedFilter.organizationIdParamType === \"path\") {\n type = \"all\";\n } else if (\n value?.node.id === \"AllItems\" &&\n this.routedFilter.organizationIdParamType === \"query\"\n ) {\n type = undefined;\n } else if (isRoutedVaultFilterItemType(value?.node.id)) {\n type = value?.node.id;\n }\n\n this.bridgeService.navigate({\n ...this.routedFilter,\n type,\n folderId: undefined,\n collectionId: undefined,\n });\n }\n get selectedFolderNode(): TreeNode {\n return this.legacyFilter.selectedFolderNode;\n }\n set selectedFolderNode(value: TreeNode) {\n const folderId = value != null && value.node.id === null ? Unassigned : value?.node.id;\n this.bridgeService.navigate({\n ...this.routedFilter,\n folderId,\n type: undefined,\n collectionId: undefined,\n });\n }\n get selectedCollectionNode(): TreeNode {\n return this.legacyFilter.selectedCollectionNode;\n }\n set selectedCollectionNode(value: TreeNode) {\n let collectionId: string | undefined;\n\n if (value != null && value.node.id === null) {\n collectionId = Unassigned;\n } else if (\n value?.node.id === \"AllCollections\" &&\n this.routedFilter.organizationIdParamType === \"path\"\n ) {\n collectionId = undefined;\n } else if (\n value?.node.id === \"AllCollections\" &&\n this.routedFilter.organizationIdParamType === \"query\"\n ) {\n collectionId = All;\n } else {\n collectionId = value?.node.id;\n }\n\n this.bridgeService.navigate({\n ...this.routedFilter,\n collectionId,\n type: undefined,\n folderId: undefined,\n });\n }\n get isFavorites(): boolean {\n return this.legacyFilter.isFavorites;\n }\n get isDeleted(): boolean {\n return this.legacyFilter.isDeleted;\n }\n get organizationId(): string {\n return this.legacyFilter.organizationId;\n }\n get cipherType(): CipherType {\n return this.legacyFilter.cipherType;\n }\n get cipherStatus(): CipherStatus {\n return this.legacyFilter.cipherStatus;\n }\n get cipherTypeId(): string {\n return this.legacyFilter.cipherTypeId;\n }\n get folderId(): string {\n return this.legacyFilter.folderId;\n }\n get collectionId(): string {\n return this.legacyFilter.collectionId;\n }\n resetFilter(): void {\n this.bridgeService.navigate({\n ...this.routedFilter,\n collectionId: undefined,\n folderId: undefined,\n organizationId:\n this.routedFilter.organizationIdParamType === \"path\"\n ? this.routedFilter.organizationId\n : undefined,\n type: undefined,\n });\n }\n resetOrganization(): void {\n this.bridgeService.navigate({ ...this.routedFilter, organizationId: undefined });\n }\n buildFilter(): VaultFilterFunction {\n return this.legacyFilter.buildFilter();\n }\n}\n","import { Injectable } from \"@angular/core\";\nimport { Router } from \"@angular/router\";\nimport { combineLatest, map, Observable } from \"rxjs\";\n\nimport { TreeNode } from \"@bitwarden/common/vault/models/domain/tree-node\";\nimport { ServiceUtils } from \"@bitwarden/common/vault/service-utils\";\n\nimport { RoutedVaultFilterBridge } from \"../shared/models/routed-vault-filter-bridge.model\";\nimport {\n RoutedVaultFilterModel,\n Unassigned,\n All,\n} from \"../shared/models/routed-vault-filter.model\";\nimport { VaultFilter } from \"../shared/models/vault-filter.model\";\nimport {\n CipherTypeFilter,\n CollectionFilter,\n FolderFilter,\n OrganizationFilter,\n} from \"../shared/models/vault-filter.type\";\n\nimport { VaultFilterService } from \"./abstractions/vault-filter.service\";\nimport { RoutedVaultFilterService } from \"./routed-vault-filter.service\";\n\n/**\n * This file is part of a layer that is used to temporary bridge between URL filtering and the old state-in-code method.\n * This should be removed after we have refactored the {@link VaultItemsComponent} and introduced vertical navigation\n * (which will refactor the {@link VaultFilterComponent}).\n *\n * This class listens to both the new {@link RoutedVaultFilterService} and the old {@link VaultFilterService}.\n * When a new filter is emitted the service uses the ids to find the corresponding tree nodes needed for\n * the old {@link VaultFilter} model. It then emits a bridge model that contains this information.\n */\n@Injectable()\nexport class RoutedVaultFilterBridgeService {\n readonly activeFilter$: Observable;\n\n constructor(\n private router: Router,\n private routedVaultFilterService: RoutedVaultFilterService,\n legacyVaultFilterService: VaultFilterService,\n ) {\n this.activeFilter$ = combineLatest([\n routedVaultFilterService.filter$,\n legacyVaultFilterService.collectionTree$,\n legacyVaultFilterService.folderTree$,\n legacyVaultFilterService.organizationTree$,\n legacyVaultFilterService.cipherTypeTree$,\n ]).pipe(\n map(([filter, collectionTree, folderTree, organizationTree, cipherTypeTree]) => {\n const legacyFilter = isAdminConsole(filter)\n ? createLegacyFilterForAdminConsole(filter, collectionTree, cipherTypeTree)\n : createLegacyFilterForEndUser(\n filter,\n collectionTree,\n folderTree,\n organizationTree,\n cipherTypeTree,\n );\n\n return new RoutedVaultFilterBridge(filter, legacyFilter, this);\n }),\n );\n }\n\n navigate(filter: RoutedVaultFilterModel) {\n const [commands, extras] = this.routedVaultFilterService.createRoute(filter);\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate(commands, extras);\n }\n}\n\n/**\n * Check if the filtering is being done as part of admin console.\n * Admin console can be identified by checking if the `organizationId`\n * is part of the path.\n *\n * @param filter Model to check if origin is admin console\n * @returns true if filtering being done as part of admin console\n */\nfunction isAdminConsole(filter: RoutedVaultFilterModel) {\n return filter.organizationIdParamType === \"path\";\n}\n\nfunction createLegacyFilterForAdminConsole(\n filter: RoutedVaultFilterModel,\n collectionTree: TreeNode,\n cipherTypeTree: TreeNode,\n): VaultFilter {\n const legacyFilter = new VaultFilter();\n\n if (filter.collectionId === undefined && filter.type === undefined) {\n legacyFilter.selectedCollectionNode = ServiceUtils.getTreeNodeObject(\n collectionTree,\n \"AllCollections\",\n );\n } else if (filter.collectionId !== undefined && filter.collectionId === Unassigned) {\n legacyFilter.selectedCollectionNode = ServiceUtils.getTreeNodeObject(collectionTree, null);\n } else if (filter.collectionId !== undefined) {\n legacyFilter.selectedCollectionNode = ServiceUtils.getTreeNodeObject(\n collectionTree,\n filter.collectionId,\n );\n }\n\n if (filter.collectionId === undefined && filter.type === All) {\n legacyFilter.selectedCipherTypeNode = ServiceUtils.getTreeNodeObject(\n cipherTypeTree,\n \"AllItems\",\n );\n } else if (filter.type !== undefined && filter.type === \"trash\") {\n legacyFilter.selectedCipherTypeNode = new TreeNode(\n { id: \"trash\", name: \"\", type: \"trash\", icon: \"\" },\n null,\n );\n } else if (filter.type !== undefined && filter.type !== \"trash\") {\n legacyFilter.selectedCipherTypeNode = ServiceUtils.getTreeNodeObject(\n cipherTypeTree,\n filter.type,\n );\n }\n\n return legacyFilter;\n}\n\nfunction createLegacyFilterForEndUser(\n filter: RoutedVaultFilterModel,\n collectionTree: TreeNode,\n folderTree: TreeNode,\n organizationTree: TreeNode,\n cipherTypeTree: TreeNode,\n): VaultFilter {\n const legacyFilter = new VaultFilter();\n\n if (filter.collectionId !== undefined && filter.collectionId === Unassigned) {\n legacyFilter.selectedCollectionNode = ServiceUtils.getTreeNodeObject(collectionTree, null);\n } else if (filter.collectionId !== undefined && filter.collectionId === All) {\n legacyFilter.selectedCollectionNode = ServiceUtils.getTreeNodeObject(\n collectionTree,\n \"AllCollections\",\n );\n } else if (filter.collectionId !== undefined) {\n legacyFilter.selectedCollectionNode = ServiceUtils.getTreeNodeObject(\n collectionTree,\n filter.collectionId,\n );\n }\n\n if (filter.folderId !== undefined && filter.folderId === Unassigned) {\n legacyFilter.selectedFolderNode = ServiceUtils.getTreeNodeObject(folderTree, null);\n } else if (filter.folderId !== undefined && filter.folderId !== Unassigned) {\n legacyFilter.selectedFolderNode = ServiceUtils.getTreeNodeObject(folderTree, filter.folderId);\n }\n\n if (filter.organizationId !== undefined && filter.organizationId === Unassigned) {\n legacyFilter.selectedOrganizationNode = ServiceUtils.getTreeNodeObject(\n organizationTree,\n \"MyVault\",\n );\n } else if (filter.organizationId !== undefined && filter.organizationId !== Unassigned) {\n legacyFilter.selectedOrganizationNode = ServiceUtils.getTreeNodeObject(\n organizationTree,\n filter.organizationId,\n );\n }\n\n if (filter.type === undefined) {\n legacyFilter.selectedCipherTypeNode = ServiceUtils.getTreeNodeObject(\n cipherTypeTree,\n \"AllItems\",\n );\n } else if (filter.type !== undefined && filter.type === \"trash\") {\n legacyFilter.selectedCipherTypeNode = new TreeNode(\n { id: \"trash\", name: \"\", type: \"trash\", icon: \"\" },\n null,\n );\n } else if (filter.type !== undefined && filter.type !== \"trash\") {\n legacyFilter.selectedCipherTypeNode = ServiceUtils.getTreeNodeObject(\n cipherTypeTree,\n filter.type,\n );\n }\n\n return legacyFilter;\n}\n","import { Injectable, OnDestroy } from \"@angular/core\";\nimport { ActivatedRoute, NavigationExtras } from \"@angular/router\";\nimport { combineLatest, map, Observable, Subject, takeUntil } from \"rxjs\";\n\nimport {\n isRoutedVaultFilterItemType,\n RoutedVaultFilterModel,\n} from \"../shared/models/routed-vault-filter.model\";\n\n/**\n * This service is an abstraction layer on top of ActivatedRoute that\n * encapsulates the logic of how filters are stored in the URL.\n *\n * The service builds and emits filter models based on URL params and\n * also contains a method for generating routes to corresponding to those params.\n */\n@Injectable()\nexport class RoutedVaultFilterService implements OnDestroy {\n private onDestroy = new Subject();\n\n /**\n * Filter values extracted from the URL.\n * To change the values use {@link RoutedVaultFilterService.createRoute}.\n */\n filter$: Observable;\n\n constructor(activatedRoute: ActivatedRoute) {\n this.filter$ = combineLatest([activatedRoute.paramMap, activatedRoute.queryParamMap]).pipe(\n map(([params, queryParams]) => {\n const unsafeType = queryParams.get(\"type\");\n const type = isRoutedVaultFilterItemType(unsafeType) ? unsafeType : undefined;\n\n return {\n collectionId: queryParams.get(\"collectionId\") ?? undefined,\n folderId: queryParams.get(\"folderId\") ?? undefined,\n organizationId:\n params.get(\"organizationId\") ?? queryParams.get(\"organizationId\") ?? undefined,\n organizationIdParamType:\n params.get(\"organizationId\") != undefined ? (\"path\" as const) : (\"query\" as const),\n type,\n };\n }),\n takeUntil(this.onDestroy),\n );\n }\n\n /**\n * Create a route that can be used to modify filters with Router or RouterLink.\n * This method is specifically built to leave other query parameters untouched,\n * meaning that navigation will only affect filters and not e.g. `cipherId`.\n * To subscribe to changes use {@link RoutedVaultFilterService.filter$}.\n *\n * Note:\n * This method currently only supports changing filters that are stored\n * in query parameters. This means that {@link RoutedVaultFilterModel.organizationId}\n * will be ignored if {@link RoutedVaultFilterModel.organizationIdParamType}\n * is set to `path`.\n *\n * @param filter Filter values that should be applied to the URL.\n * @returns route that can be used with Router or RouterLink\n */\n createRoute(filter: RoutedVaultFilterModel): [commands: any[], extras?: NavigationExtras] {\n const commands: string[] = [];\n const extras: NavigationExtras = {\n queryParams: {\n collectionId: filter.collectionId ?? null,\n folderId: filter.folderId ?? null,\n organizationId:\n filter.organizationIdParamType === \"path\" ? null : filter.organizationId ?? null,\n type: filter.type ?? null,\n },\n queryParamsHandling: \"merge\",\n };\n return [commands, extras];\n }\n\n ngOnDestroy(): void {\n this.onDestroy.next();\n this.onDestroy.complete();\n }\n}\n","import { KeyDefinition, VAULT_FILTER_DISK } from \"../../../platform/state\";\n\nexport const COLLAPSED_GROUPINGS = KeyDefinition.array(\n VAULT_FILTER_DISK,\n \"collapsedGroupings\",\n {\n deserializer: (obj) => obj,\n },\n);\n","import { Injectable } from \"@angular/core\";\nimport {\n BehaviorSubject,\n combineLatestWith,\n firstValueFrom,\n map,\n Observable,\n of,\n switchMap,\n} from \"rxjs\";\n\nimport { OrganizationService } from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport { PolicyService } from \"@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction\";\nimport { PolicyType } from \"@bitwarden/common/admin-console/enums\";\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { ActiveUserState, StateProvider } from \"@bitwarden/common/platform/state\";\nimport { CipherService } from \"@bitwarden/common/vault/abstractions/cipher.service\";\nimport { CollectionService } from \"@bitwarden/common/vault/abstractions/collection.service\";\nimport { FolderService } from \"@bitwarden/common/vault/abstractions/folder/folder.service.abstraction\";\nimport { CipherType } from \"@bitwarden/common/vault/enums\";\nimport { TreeNode } from \"@bitwarden/common/vault/models/domain/tree-node\";\nimport { CollectionView } from \"@bitwarden/common/vault/models/view/collection.view\";\nimport { FolderView } from \"@bitwarden/common/vault/models/view/folder.view\";\nimport { ServiceUtils } from \"@bitwarden/common/vault/service-utils\";\nimport { COLLAPSED_GROUPINGS } from \"@bitwarden/common/vault/services/key-state/collapsed-groupings.state\";\n\nimport { CollectionAdminView } from \"../../../core/views/collection-admin.view\";\nimport {\n CipherTypeFilter,\n CollectionFilter,\n FolderFilter,\n OrganizationFilter,\n} from \"../shared/models/vault-filter.type\";\n\nimport { VaultFilterService as VaultFilterServiceAbstraction } from \"./abstractions/vault-filter.service\";\n\nconst NestingDelimiter = \"/\";\n\n@Injectable()\nexport class VaultFilterService implements VaultFilterServiceAbstraction {\n organizationTree$: Observable> =\n this.organizationService.memberOrganizations$.pipe(\n switchMap((orgs) => this.buildOrganizationTree(orgs)),\n );\n\n protected _organizationFilter = new BehaviorSubject(null);\n\n filteredFolders$: Observable = this.folderService.folderViews$.pipe(\n combineLatestWith(this._organizationFilter),\n switchMap(([folders, org]) => {\n return this.filterFolders(folders, org);\n }),\n );\n folderTree$: Observable> = this.filteredFolders$.pipe(\n map((folders) => this.buildFolderTree(folders)),\n );\n\n filteredCollections$: Observable =\n this.collectionService.decryptedCollections$.pipe(\n combineLatestWith(this._organizationFilter),\n switchMap(([collections, org]) => {\n return this.filterCollections(collections, org);\n }),\n );\n\n collectionTree$: Observable> = this.filteredCollections$.pipe(\n map((collections) => this.buildCollectionTree(collections)),\n );\n\n cipherTypeTree$: Observable> = this.buildCipherTypeTree();\n\n private collapsedGroupingsState: ActiveUserState =\n this.stateProvider.getActive(COLLAPSED_GROUPINGS);\n\n readonly collapsedFilterNodes$: Observable> =\n this.collapsedGroupingsState.state$.pipe(map((c) => new Set(c)));\n\n constructor(\n protected organizationService: OrganizationService,\n protected folderService: FolderService,\n protected cipherService: CipherService,\n protected policyService: PolicyService,\n protected i18nService: I18nService,\n protected stateProvider: StateProvider,\n protected collectionService: CollectionService,\n ) {}\n\n async getCollectionNodeFromTree(id: string) {\n const collections = await firstValueFrom(this.collectionTree$);\n return ServiceUtils.getTreeNodeObject(collections, id) as TreeNode;\n }\n\n async setCollapsedFilterNodes(collapsedFilterNodes: Set): Promise {\n await this.collapsedGroupingsState.update(() => Array.from(collapsedFilterNodes));\n }\n\n protected async getCollapsedFilterNodes(): Promise> {\n return await firstValueFrom(this.collapsedFilterNodes$);\n }\n\n getOrganizationFilter() {\n return this._organizationFilter;\n }\n\n setOrganizationFilter(organization: Organization) {\n if (organization?.id != \"AllVaults\") {\n this._organizationFilter.next(organization);\n } else {\n this._organizationFilter.next(null);\n }\n }\n\n async expandOrgFilter() {\n const collapsedFilterNodes = await firstValueFrom(this.collapsedFilterNodes$);\n if (!collapsedFilterNodes.has(\"AllVaults\")) {\n return;\n }\n collapsedFilterNodes.delete(\"AllVaults\");\n await this.setCollapsedFilterNodes(collapsedFilterNodes);\n }\n\n protected async buildOrganizationTree(\n orgs?: Organization[],\n ): Promise> {\n const headNode = this.getOrganizationFilterHead();\n if (!(await this.policyService.policyAppliesToUser(PolicyType.PersonalOwnership))) {\n const myVaultNode = this.getOrganizationFilterMyVault();\n headNode.children.push(myVaultNode);\n }\n if (await this.policyService.policyAppliesToUser(PolicyType.SingleOrg)) {\n orgs = orgs.slice(0, 1);\n }\n if (orgs) {\n const orgNodes: TreeNode[] = [];\n orgs.forEach((org) => {\n const orgCopy = org as OrganizationFilter;\n orgCopy.icon = \"bwi-business\";\n const node = new TreeNode(orgCopy, headNode, orgCopy.name);\n orgNodes.push(node);\n });\n // Sort organization nodes, then add them to the list after 'My Vault' and 'All Vaults' if present\n orgNodes.sort((a, b) => a.node.name.localeCompare(b.node.name));\n headNode.children.push(...orgNodes);\n }\n return headNode;\n }\n\n protected getOrganizationFilterHead(): TreeNode {\n const head = new Organization() as OrganizationFilter;\n head.enabled = true;\n return new TreeNode(head, null, \"allVaults\", \"AllVaults\");\n }\n\n protected getOrganizationFilterMyVault(): TreeNode {\n const myVault = new Organization() as OrganizationFilter;\n myVault.id = \"MyVault\";\n myVault.icon = \"bwi-user\";\n myVault.enabled = true;\n myVault.hideOptions = true;\n return new TreeNode(myVault, null, this.i18nService.t(\"myVault\"));\n }\n\n buildTypeTree(\n head: CipherTypeFilter,\n array?: CipherTypeFilter[],\n ): Observable> {\n const headNode = new TreeNode(head, null);\n array?.forEach((filter) => {\n const node = new TreeNode(filter, headNode, filter.name);\n headNode.children.push(node);\n });\n return of(headNode);\n }\n\n protected async filterCollections(\n storedCollections: CollectionView[],\n org?: Organization,\n ): Promise {\n return org?.id != null\n ? storedCollections.filter((c) => c.organizationId === org.id)\n : storedCollections;\n }\n\n protected buildCollectionTree(collections?: CollectionView[]): TreeNode {\n const headNode = this.getCollectionFilterHead();\n if (!collections) {\n return headNode;\n }\n const nodes: TreeNode[] = [];\n collections\n .sort((a, b) => this.i18nService.collator.compare(a.name, b.name))\n .forEach((c) => {\n const collectionCopy = new CollectionView() as CollectionFilter;\n collectionCopy.id = c.id;\n collectionCopy.organizationId = c.organizationId;\n collectionCopy.icon = \"bwi-collection\";\n if (c instanceof CollectionAdminView) {\n collectionCopy.groups = c.groups;\n collectionCopy.assigned = c.assigned;\n }\n const parts =\n c.name != null ? c.name.replace(/^\\/+|\\/+$/g, \"\").split(NestingDelimiter) : [];\n ServiceUtils.nestedTraverse(nodes, 0, parts, collectionCopy, null, NestingDelimiter);\n });\n nodes.forEach((n) => {\n n.parent = headNode;\n headNode.children.push(n);\n });\n return headNode;\n }\n\n protected getCollectionFilterHead(): TreeNode {\n const head = new CollectionView() as CollectionFilter;\n return new TreeNode(head, null, \"collections\", \"AllCollections\");\n }\n\n protected async filterFolders(\n storedFolders: FolderView[],\n org?: Organization,\n ): Promise {\n // If no org or \"My Vault\" is selected, show all folders\n if (org?.id == null || org?.id == \"MyVault\") {\n return storedFolders;\n }\n\n // Otherwise, show only folders that have ciphers from the selected org and the \"no folder\" folder\n const ciphers = await this.cipherService.getAllDecrypted();\n const orgCiphers = ciphers.filter((c) => c.organizationId == org?.id);\n return storedFolders.filter(\n (f) => orgCiphers.some((oc) => oc.folderId == f.id) || f.id == null,\n );\n }\n\n protected buildFolderTree(folders?: FolderView[]): TreeNode {\n const headNode = this.getFolderFilterHead();\n if (!folders) {\n return headNode;\n }\n const nodes: TreeNode[] = [];\n folders.forEach((f) => {\n const folderCopy = new FolderView() as FolderFilter;\n folderCopy.id = f.id;\n folderCopy.revisionDate = f.revisionDate;\n folderCopy.icon = \"bwi-folder\";\n const parts = f.name != null ? f.name.replace(/^\\/+|\\/+$/g, \"\").split(NestingDelimiter) : [];\n ServiceUtils.nestedTraverse(nodes, 0, parts, folderCopy, null, NestingDelimiter);\n });\n\n nodes.forEach((n) => {\n n.parent = headNode;\n headNode.children.push(n);\n });\n return headNode;\n }\n\n protected getFolderFilterHead(): TreeNode {\n const head = new FolderView() as FolderFilter;\n return new TreeNode(head, null, \"folders\", \"AllFolders\");\n }\n\n protected buildCipherTypeTree(): Observable> {\n const allTypeFilters: CipherTypeFilter[] = [\n {\n id: \"favorites\",\n name: this.i18nService.t(\"favorites\"),\n type: \"favorites\",\n icon: \"bwi-star\",\n },\n {\n id: \"login\",\n name: this.i18nService.t(\"typeLogin\"),\n type: CipherType.Login,\n icon: \"bwi-globe\",\n },\n {\n id: \"card\",\n name: this.i18nService.t(\"typeCard\"),\n type: CipherType.Card,\n icon: \"bwi-credit-card\",\n },\n {\n id: \"identity\",\n name: this.i18nService.t(\"typeIdentity\"),\n type: CipherType.Identity,\n icon: \"bwi-id-card\",\n },\n {\n id: \"note\",\n name: this.i18nService.t(\"typeSecureNote\"),\n type: CipherType.SecureNote,\n icon: \"bwi-sticky-note\",\n },\n ];\n\n return this.buildTypeTree(\n { id: \"AllItems\", name: \"allItems\", type: \"all\", icon: \"\" },\n allTypeFilters,\n );\n }\n}\n","\n
    \n \n \n \n \n \n  {{ headerNode.node.name | i18n }}\n \n \n

    \n  {{ headerNode.node.name | i18n }}\n

    \n
    \n \n \n \n \n \n \n \n \n \n  {{ f.node.name }}\n \n \n \n \n \n \n \n \n
    \n \n \n \n \n \n \n \n \n \n
  • \n \n \n \n  {{ addInfo.text | i18n }}\n \n \n
  • \n \n
    \n\n","import { Component, InjectionToken, Injector, Input, OnDestroy, OnInit } from \"@angular/core\";\nimport { Observable, Subject, takeUntil } from \"rxjs\";\nimport { map } from \"rxjs/operators\";\n\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\nimport { ITreeNodeObject, TreeNode } from \"@bitwarden/common/vault/models/domain/tree-node\";\n\nimport { VaultFilterService } from \"../../services/abstractions/vault-filter.service\";\nimport { VaultFilterSection, VaultFilterType } from \"../models/vault-filter-section.type\";\nimport { VaultFilter } from \"../models/vault-filter.model\";\n\n@Component({\n selector: \"app-filter-section\",\n templateUrl: \"vault-filter-section.component.html\",\n})\nexport class VaultFilterSectionComponent implements OnInit, OnDestroy {\n private destroy$ = new Subject();\n protected flexibleCollectionsEnabled: boolean;\n\n @Input() activeFilter: VaultFilter;\n @Input() section: VaultFilterSection;\n\n data: TreeNode;\n collapsedFilterNodes: Set = new Set();\n\n private injectors = new Map();\n\n constructor(\n private vaultFilterService: VaultFilterService,\n private injector: Injector,\n ) {\n this.vaultFilterService.collapsedFilterNodes$\n .pipe(takeUntil(this.destroy$))\n .subscribe((nodes) => {\n this.collapsedFilterNodes = nodes;\n });\n }\n\n async ngOnInit() {\n this.section?.data$?.pipe(takeUntil(this.destroy$)).subscribe((data) => {\n this.data = data;\n });\n this.vaultFilterService\n .getOrganizationFilter()\n .pipe(takeUntil(this.destroy$))\n .subscribe((org) => {\n this.flexibleCollectionsEnabled = org != null ? org.flexibleCollections : false;\n });\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n get headerNode() {\n return this.data;\n }\n\n get headerInfo() {\n return this.section.header;\n }\n\n get filters() {\n return this.data?.children;\n }\n\n get isOrganizationFilter() {\n return this.data.node instanceof Organization;\n }\n\n get isAllVaultsSelected() {\n return this.isOrganizationFilter && !this.activeFilter.selectedOrganizationNode;\n }\n\n isNodeSelected(filterNode: TreeNode) {\n const { organizationId, cipherTypeId, folderId, collectionId, isCollectionSelected } =\n this.activeFilter;\n\n const collectionStatus = this.flexibleCollectionsEnabled\n ? filterNode?.node.id === \"AllCollections\" &&\n (isCollectionSelected || collectionId === \"AllCollections\")\n : collectionId === filterNode?.node.id;\n\n return (\n organizationId === filterNode?.node.id ||\n cipherTypeId === filterNode?.node.id ||\n folderId === filterNode?.node.id ||\n collectionStatus\n );\n }\n\n async onFilterSelect(filterNode: TreeNode) {\n await this.section?.action(filterNode);\n }\n\n get editInfo() {\n return this.section?.edit;\n }\n\n onEdit(filterNode: TreeNode) {\n this.section?.edit?.action(filterNode.node);\n }\n\n get addInfo() {\n return this.section.add;\n }\n\n get showAddLink() {\n return this.section.add && this.section.add.route;\n }\n\n async onAdd() {\n this.section?.add?.action();\n }\n\n get optionsInfo() {\n return this.section?.options;\n }\n\n get divider() {\n return this.section?.divider;\n }\n\n isCollapsed(node: ITreeNodeObject) {\n return this.collapsedFilterNodes.has(node.id);\n }\n\n async toggleCollapse(node: ITreeNodeObject) {\n if (this.collapsedFilterNodes.has(node.id)) {\n this.collapsedFilterNodes.delete(node.id);\n } else {\n this.collapsedFilterNodes.add(node.id);\n }\n await this.vaultFilterService.setCollapsedFilterNodes(this.collapsedFilterNodes);\n }\n\n // an injector is necessary to pass data into a dynamic component\n // here we are creating a new injector for each filter that has options\n createInjector(data: VaultFilterType) {\n let inject = this.injectors.get(data.id);\n\n if (!inject) {\n // Pass an observable to the component in order to update the component when the data changes\n // as data binding does not work with dynamic components in Angular 15 (inputs are supported starting Angular 16)\n const data$ = this.section.data$.pipe(\n map((sectionNode) => sectionNode?.children?.find((node) => node.node.id === data.id)?.node),\n );\n inject = Injector.create({\n providers: [{ provide: OptionsInput, useValue: data$ }],\n parent: this.injector,\n });\n this.injectors.set(data.id, inject);\n }\n return inject;\n }\n}\nexport const OptionsInput = new InjectionToken>(\"OptionsInput\");\n","import { CipherType } from \"@bitwarden/common/vault/enums\";\nimport { CipherView } from \"@bitwarden/common/vault/models/view/cipher.view\";\n\nimport { All, RoutedVaultFilterModel, Unassigned } from \"./routed-vault-filter.model\";\n\nexport type FilterFunction = (cipher: CipherView) => boolean;\n\nexport function createFilterFunction(filter: RoutedVaultFilterModel): FilterFunction {\n return (cipher) => {\n if (filter.type === \"favorites\" && !cipher.favorite) {\n return false;\n }\n if (filter.type === \"card\" && cipher.type !== CipherType.Card) {\n return false;\n }\n if (filter.type === \"identity\" && cipher.type !== CipherType.Identity) {\n return false;\n }\n if (filter.type === \"login\" && cipher.type !== CipherType.Login) {\n return false;\n }\n if (filter.type === \"note\" && cipher.type !== CipherType.SecureNote) {\n return false;\n }\n if (filter.type === \"trash\" && !cipher.isDeleted) {\n return false;\n }\n // Hide trash unless explicitly selected\n if (filter.type !== \"trash\" && cipher.isDeleted) {\n return false;\n }\n // No folder\n if (filter.folderId === Unassigned && cipher.folderId !== null) {\n return false;\n }\n // Folder\n if (\n filter.folderId !== undefined &&\n filter.folderId !== All &&\n filter.folderId !== Unassigned &&\n cipher.folderId !== filter.folderId\n ) {\n return false;\n }\n // All collections (top level)\n if (filter.collectionId === All) {\n return false;\n }\n // Unassigned\n if (\n filter.collectionId === Unassigned &&\n (cipher.organizationId == null ||\n (cipher.collectionIds != null && cipher.collectionIds.length > 0))\n ) {\n return false;\n }\n // Collection\n if (\n filter.collectionId !== undefined &&\n filter.collectionId !== All &&\n filter.collectionId !== Unassigned &&\n (cipher.collectionIds == null || !cipher.collectionIds.includes(filter.collectionId))\n ) {\n return false;\n }\n // My Vault\n if (filter.organizationId === Unassigned && cipher.organizationId != null) {\n return false;\n }\n // Organization\n else if (\n filter.organizationId !== undefined &&\n filter.organizationId !== Unassigned &&\n cipher.organizationId !== filter.organizationId\n ) {\n return false;\n }\n\n return true;\n };\n}\n","export const Unassigned = \"unassigned\";\n\nexport const All = \"all\";\n\n// TODO: Remove `All` when moving to vertical navigation.\nconst itemTypes = [\"favorites\", \"login\", \"card\", \"identity\", \"note\", \"trash\", All] as const;\n\nexport type RoutedVaultFilterItemType = (typeof itemTypes)[number];\n\nexport function isRoutedVaultFilterItemType(value: unknown): value is RoutedVaultFilterItemType {\n return itemTypes.includes(value as any);\n}\n\nexport interface RoutedVaultFilterModel {\n collectionId?: string;\n folderId?: string;\n organizationId?: string;\n type?: RoutedVaultFilterItemType;\n\n organizationIdParamType?: \"path\" | \"query\";\n}\n","import { CipherType } from \"@bitwarden/common/vault/enums\";\nimport { TreeNode } from \"@bitwarden/common/vault/models/domain/tree-node\";\nimport { CipherView } from \"@bitwarden/common/vault/models/view/cipher.view\";\n\nimport {\n CipherStatus,\n CipherTypeFilter,\n CollectionFilter,\n FolderFilter,\n OrganizationFilter,\n} from \"./vault-filter.type\";\n\nexport type VaultFilterFunction = (cipher: CipherView) => boolean;\n\n// TODO: Replace shared VaultFilter Model with this one and\n// refactor browser and desktop code to use this model.\nexport class VaultFilter {\n selectedOrganizationNode: TreeNode;\n selectedCipherTypeNode: TreeNode;\n selectedFolderNode: TreeNode;\n selectedCollectionNode: TreeNode;\n\n /**\n * A list of collection filters that form a chain from the organization root to currently selected collection.\n * To be used when rendering a breadcrumb UI for navigating the collection hierarchy.\n * Begins from the organization root and excludes the currently selected collection.\n */\n get collectionBreadcrumbs(): TreeNode[] {\n if (!this.isCollectionSelected) {\n return [];\n }\n\n const collections = [this.selectedCollectionNode];\n while (collections[collections.length - 1].parent != undefined) {\n collections.push(collections[collections.length - 1].parent);\n }\n\n return collections.slice(1).reverse();\n }\n\n /**\n * The vault is filtered by a specific collection\n */\n get isCollectionSelected(): boolean {\n return (\n this.selectedCollectionNode != null &&\n this.selectedCollectionNode.node.id !== \"AllCollections\"\n );\n }\n\n /**\n * The vault is filtered by the \"Unassigned\" collection\n */\n get isUnassignedCollectionSelected(): boolean {\n return this.selectedCollectionNode != null && this.selectedCollectionNode.node.id === null;\n }\n\n /**\n * The vault is filtered by the users individual vault\n */\n get isMyVaultSelected(): boolean {\n return this.selectedOrganizationNode?.node.id === \"MyVault\";\n }\n\n get isFavorites(): boolean {\n return this.selectedCipherTypeNode?.node.type === \"favorites\";\n }\n\n get isDeleted(): boolean {\n return this.selectedCipherTypeNode?.node.type === \"trash\" ? true : null;\n }\n\n get organizationId(): string {\n return this.selectedOrganizationNode?.node.id;\n }\n\n get cipherType(): CipherType {\n return this.selectedCipherTypeNode?.node.type in CipherType\n ? (this.selectedCipherTypeNode?.node.type as CipherType)\n : null;\n }\n\n get cipherStatus(): CipherStatus {\n return this.selectedCipherTypeNode?.node.type;\n }\n\n get cipherTypeId(): string {\n return this.selectedCipherTypeNode?.node.id;\n }\n\n get folderId(): string {\n return this.selectedFolderNode?.node.id;\n }\n\n get collectionId(): string {\n return this.selectedCollectionNode?.node.id;\n }\n\n constructor(init?: Partial) {\n Object.assign(this, init);\n }\n\n resetFilter() {\n this.selectedCipherTypeNode = null;\n this.selectedFolderNode = null;\n this.selectedCollectionNode = null;\n }\n\n resetOrganization() {\n this.selectedOrganizationNode = null;\n }\n\n buildFilter(): VaultFilterFunction {\n return (cipher) => {\n let cipherPassesFilter = true;\n if (this.isFavorites && cipherPassesFilter) {\n cipherPassesFilter = cipher.favorite;\n }\n if (this.isDeleted && cipherPassesFilter) {\n cipherPassesFilter = cipher.isDeleted;\n }\n if (this.cipherType && cipherPassesFilter) {\n cipherPassesFilter = cipher.type === this.cipherType;\n }\n if (this.selectedFolderNode) {\n // No folder\n if (this.folderId === null && cipherPassesFilter) {\n cipherPassesFilter = cipher.folderId === null;\n }\n // Folder\n if (this.folderId !== null && cipherPassesFilter) {\n cipherPassesFilter = cipher.folderId === this.folderId;\n }\n }\n if (this.selectedCollectionNode) {\n // All Collections\n if (this.collectionId === \"AllCollections\" && cipherPassesFilter) {\n cipherPassesFilter = false;\n }\n // Unassigned\n if (this.collectionId === null && cipherPassesFilter) {\n cipherPassesFilter =\n cipher.organizationId != null &&\n (cipher.collectionIds == null || cipher.collectionIds.length === 0);\n }\n // Collection\n if (\n this.collectionId !== null &&\n this.collectionId !== \"AllCollections\" &&\n cipherPassesFilter\n ) {\n cipherPassesFilter =\n cipher.collectionIds != null && cipher.collectionIds.includes(this.collectionId);\n }\n }\n if (this.selectedOrganizationNode) {\n // My Vault\n if (this.organizationId === \"MyVault\" && cipherPassesFilter) {\n cipherPassesFilter = cipher.organizationId === null;\n }\n // Organization\n else if (this.organizationId !== null && cipherPassesFilter) {\n cipherPassesFilter = cipher.organizationId === this.organizationId;\n }\n }\n return cipherPassesFilter;\n };\n }\n}\n","import { NgModule } from \"@angular/core\";\n\nimport { SearchModule } from \"@bitwarden/components\";\n\nimport { SharedModule } from \"../../../../shared\";\n\nimport { VaultFilterSectionComponent } from \"./components/vault-filter-section.component\";\n\n@NgModule({\n imports: [SharedModule, SearchModule],\n declarations: [VaultFilterSectionComponent],\n exports: [SharedModule, VaultFilterSectionComponent, SearchModule],\n})\nexport class VaultFilterSharedModule {}\n","import { NgModule } from \"@angular/core\";\n\nimport { SearchModule } from \"@bitwarden/components\";\n\nimport { VaultFilterSharedModule } from \"../../individual-vault/vault-filter/shared/vault-filter-shared.module\";\n\nimport { LinkSsoDirective } from \"./components/link-sso.directive\";\nimport { OrganizationOptionsComponent } from \"./components/organization-options.component\";\nimport { VaultFilterComponent } from \"./components/vault-filter.component\";\nimport { VaultFilterService as VaultFilterServiceAbstraction } from \"./services/abstractions/vault-filter.service\";\nimport { VaultFilterService } from \"./services/vault-filter.service\";\n\n@NgModule({\n imports: [VaultFilterSharedModule, SearchModule],\n declarations: [VaultFilterComponent, OrganizationOptionsComponent, LinkSsoDirective],\n exports: [VaultFilterComponent],\n providers: [\n {\n provide: VaultFilterServiceAbstraction,\n useClass: VaultFilterService,\n },\n ],\n})\nexport class VaultFilterModule {}\n","import { DatePipe } from \"@angular/common\";\nimport { Component } from \"@angular/core\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { AuditService } from \"@bitwarden/common/abstractions/audit.service\";\nimport { EventCollectionService } from \"@bitwarden/common/abstractions/event/event-collection.service\";\nimport { OrganizationService } from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport { PolicyService } from \"@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction\";\nimport { BillingAccountProfileStateService } from \"@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service\";\nimport { ConfigServiceAbstraction } from \"@bitwarden/common/platform/abstractions/config/config.service.abstraction\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { PasswordGenerationServiceAbstraction } from \"@bitwarden/common/tools/generator/password\";\nimport { SendApiService } from \"@bitwarden/common/tools/send/services/send-api.service.abstraction\";\nimport { CipherService } from \"@bitwarden/common/vault/abstractions/cipher.service\";\nimport { CollectionService } from \"@bitwarden/common/vault/abstractions/collection.service\";\nimport { FolderService } from \"@bitwarden/common/vault/abstractions/folder/folder.service.abstraction\";\nimport { TotpService } from \"@bitwarden/common/vault/abstractions/totp.service\";\nimport { CipherData } from \"@bitwarden/common/vault/models/data/cipher.data\";\nimport { Cipher } from \"@bitwarden/common/vault/models/domain/cipher\";\nimport { DialogService } from \"@bitwarden/components\";\nimport { PasswordRepromptService } from \"@bitwarden/vault\";\n\nimport { AddEditComponent as BaseAddEditComponent } from \"../individual-vault/add-edit.component\";\n\n@Component({\n selector: \"app-org-vault-add-edit\",\n templateUrl: \"../individual-vault/add-edit.component.html\",\n})\nexport class AddEditComponent extends BaseAddEditComponent {\n originalCipher: Cipher = null;\n protected override componentName = \"app-org-vault-add-edit\";\n\n constructor(\n cipherService: CipherService,\n folderService: FolderService,\n i18nService: I18nService,\n platformUtilsService: PlatformUtilsService,\n auditService: AuditService,\n stateService: StateService,\n collectionService: CollectionService,\n totpService: TotpService,\n passwordGenerationService: PasswordGenerationServiceAbstraction,\n private apiService: ApiService,\n messagingService: MessagingService,\n eventCollectionService: EventCollectionService,\n policyService: PolicyService,\n logService: LogService,\n passwordRepromptService: PasswordRepromptService,\n organizationService: OrganizationService,\n sendApiService: SendApiService,\n dialogService: DialogService,\n datePipe: DatePipe,\n configService: ConfigServiceAbstraction,\n billingAccountProfileStateService: BillingAccountProfileStateService,\n ) {\n super(\n cipherService,\n folderService,\n i18nService,\n platformUtilsService,\n auditService,\n stateService,\n collectionService,\n totpService,\n passwordGenerationService,\n messagingService,\n eventCollectionService,\n policyService,\n organizationService,\n logService,\n passwordRepromptService,\n sendApiService,\n dialogService,\n datePipe,\n configService,\n billingAccountProfileStateService,\n );\n }\n\n protected allowOwnershipAssignment() {\n if (\n this.ownershipOptions != null &&\n (this.ownershipOptions.length > 1 || !this.allowPersonal)\n ) {\n if (this.organization != null) {\n return (\n this.cloneMode && this.organization.canEditAllCiphers(this.flexibleCollectionsV1Enabled)\n );\n } else {\n return !this.editMode || this.cloneMode;\n }\n }\n return false;\n }\n\n protected loadCollections() {\n if (!this.organization.canEditAllCiphers(this.flexibleCollectionsV1Enabled)) {\n return super.loadCollections();\n }\n return Promise.resolve(this.collections);\n }\n\n protected async loadCipher() {\n if (!this.organization.canEditAllCiphers(this.flexibleCollectionsV1Enabled)) {\n return await super.loadCipher();\n }\n const response = await this.apiService.getCipherAdmin(this.cipherId);\n const data = new CipherData(response);\n\n data.edit = true;\n const cipher = new Cipher(data);\n this.originalCipher = cipher;\n return cipher;\n }\n\n protected encryptCipher() {\n if (!this.organization.canEditAllCiphers(this.flexibleCollectionsV1Enabled)) {\n return super.encryptCipher();\n }\n return this.cipherService.encrypt(this.cipher, null, null, this.originalCipher);\n }\n\n protected async deleteCipher() {\n if (!this.organization.canEditAllCiphers(this.flexibleCollectionsV1Enabled)) {\n return super.deleteCipher();\n }\n return this.cipher.isDeleted\n ? this.apiService.deleteCipherAdmin(this.cipherId)\n : this.apiService.putDeleteCipherAdmin(this.cipherId);\n }\n}\n","import { NgModule } from \"@angular/core\";\n\nimport { SharedModule } from \"../../../shared/shared.module\";\nimport { PipesModule } from \"../../individual-vault/pipes/pipes.module\";\n\nimport { CollectionNameBadgeComponent } from \"./collection-name.badge.component\";\n\n@NgModule({\n imports: [SharedModule, PipesModule],\n declarations: [CollectionNameBadgeComponent],\n exports: [CollectionNameBadgeComponent],\n})\nexport class CollectionBadgeModule {}\n","import { NgModule } from \"@angular/core\";\n\nimport { SharedModule } from \"../../../shared/shared.module\";\nimport { PipesModule } from \"../../individual-vault/pipes/pipes.module\";\n\nimport { GroupNameBadgeComponent } from \"./group-name-badge.component\";\n\n@NgModule({\n imports: [SharedModule, PipesModule],\n declarations: [GroupNameBadgeComponent],\n exports: [GroupNameBadgeComponent],\n})\nexport class GroupBadgeModule {}\n","import { Component, Input } from \"@angular/core\";\nimport { Router } from \"@angular/router\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { UserVerificationService } from \"@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction\";\nimport { Verification } from \"@bitwarden/common/auth/types/verification\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { SyncService } from \"@bitwarden/common/vault/abstractions/sync/sync.service.abstraction\";\n\n@Component({\n selector: \"app-purge-vault\",\n templateUrl: \"purge-vault.component.html\",\n})\nexport class PurgeVaultComponent {\n @Input() organizationId?: string = null;\n\n masterPassword: Verification;\n formPromise: Promise;\n\n constructor(\n private apiService: ApiService,\n private i18nService: I18nService,\n private platformUtilsService: PlatformUtilsService,\n private userVerificationService: UserVerificationService,\n private router: Router,\n private logService: LogService,\n private syncService: SyncService,\n ) {}\n\n async submit() {\n try {\n this.formPromise = this.userVerificationService\n .buildRequest(this.masterPassword)\n .then((request) => this.apiService.postPurgeCiphers(request, this.organizationId));\n await this.formPromise;\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"vaultPurged\"));\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.syncService.fullSync(true);\n if (this.organizationId != null) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"organizations\", this.organizationId, \"vault\"]);\n } else {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"vault\"]);\n }\n } catch (e) {\n this.logService.error(e);\n }\n }\n}\n","
    \n
    \n \n
    \n

    {{ \"purgeVault\" | i18n }}

    \n \n ×\n \n
    \n
    \n

    {{ (organizationId ? \"purgeOrgVaultDesc\" : \"purgeVaultDesc\") | i18n }}

    \n {{ \"purgeVaultWarning\" | i18n }}\n \n \n
    \n
    \n \n \n
    \n \n
    \n
    \n","import { TreeNode } from \"@bitwarden/common/vault/models/domain/tree-node\";\nimport {\n CollectionView,\n NestingDelimiter,\n} from \"@bitwarden/common/vault/models/view/collection.view\";\nimport { ServiceUtils } from \"@bitwarden/common/vault/service-utils\";\n\nimport { CollectionAdminView } from \"../../vault/core/views/collection-admin.view\";\n\nexport function getNestedCollectionTree(\n collections: CollectionAdminView[],\n): TreeNode[];\nexport function getNestedCollectionTree(collections: CollectionView[]): TreeNode[];\nexport function getNestedCollectionTree(\n collections: (CollectionView | CollectionAdminView)[],\n): TreeNode[] {\n // Collections need to be cloned because ServiceUtils.nestedTraverse actively\n // modifies the names of collections.\n // These changes risk affecting collections store in StateService.\n const clonedCollections = collections\n .sort((a, b) => a.name.localeCompare(b.name))\n .map(cloneCollection);\n\n const nodes: TreeNode[] = [];\n clonedCollections.forEach((collection) => {\n const parts =\n collection.name != null\n ? collection.name.replace(/^\\/+|\\/+$/g, \"\").split(NestingDelimiter)\n : [];\n ServiceUtils.nestedTraverse(nodes, 0, parts, collection, null, NestingDelimiter);\n });\n return nodes;\n}\n\nfunction cloneCollection(collection: CollectionView): CollectionView;\nfunction cloneCollection(collection: CollectionAdminView): CollectionAdminView;\nfunction cloneCollection(\n collection: CollectionView | CollectionAdminView,\n): CollectionView | CollectionAdminView {\n let cloned;\n\n if (collection instanceof CollectionAdminView) {\n cloned = new CollectionAdminView();\n cloned.groups = [...collection.groups];\n cloned.users = [...collection.users];\n cloned.assigned = collection.assigned;\n } else {\n cloned = new CollectionView();\n }\n\n cloned.id = collection.id;\n cloned.externalId = collection.externalId;\n cloned.hidePasswords = collection.hidePasswords;\n cloned.name = collection.name;\n cloned.organizationId = collection.organizationId;\n cloned.readOnly = collection.readOnly;\n cloned.manage = collection.manage;\n return cloned;\n}\n","import {\n flagEnabled as baseFlagEnabled,\n devFlagEnabled as baseDevFlagEnabled,\n devFlagValue as baseDevFlagValue,\n SharedFlags,\n SharedDevFlags,\n} from \"@bitwarden/common/platform/misc/flags\";\n\n// required to avoid linting errors when there are no flags\n/* eslint-disable-next-line @typescript-eslint/ban-types */\nexport type Flags = {\n secretsManager?: boolean;\n showPasswordless?: boolean;\n} & SharedFlags;\n\n// required to avoid linting errors when there are no flags\n/* eslint-disable-next-line @typescript-eslint/ban-types */\nexport type DevFlags = {} & SharedDevFlags;\n\nexport function flagEnabled(flag: keyof Flags): boolean {\n return baseFlagEnabled(flag);\n}\n\nexport function devFlagEnabled(flag: keyof DevFlags) {\n return baseDevFlagEnabled(flag);\n}\n\nexport function devFlagValue(flag: keyof DevFlags) {\n return baseDevFlagValue(flag);\n}\n","import { ScrollingModule } from \"@angular/cdk/scrolling\";\nimport { NgModule } from \"@angular/core\";\n\nimport { UserVerificationModule } from \"../../../auth/shared/components/user-verification\";\nimport { LooseComponentsModule, SharedModule } from \"../../../shared\";\n\nimport { EnrollMasterPasswordReset } from \"./enroll-master-password-reset.component\";\n\n@NgModule({\n imports: [SharedModule, ScrollingModule, LooseComponentsModule, UserVerificationModule],\n declarations: [EnrollMasterPasswordReset],\n exports: [EnrollMasterPasswordReset],\n})\nexport class OrganizationUserModule {}\n","import { NgModule } from \"@angular/core\";\nimport { FormsModule, ReactiveFormsModule } from \"@angular/forms\";\n\nimport { CheckboxModule } from \"@bitwarden/components\";\n\nimport { SharedModule } from \"../../../shared/shared.module\";\nimport { UserVerificationModule } from \"../../shared/components/user-verification\";\n\nimport { CreateCredentialDialogComponent } from \"./create-credential-dialog/create-credential-dialog.component\";\nimport { DeleteCredentialDialogComponent } from \"./delete-credential-dialog/delete-credential-dialog.component\";\nimport { EnableEncryptionDialogComponent } from \"./enable-encryption-dialog/enable-encryption-dialog.component\";\nimport { WebauthnLoginSettingsComponent } from \"./webauthn-login-settings.component\";\n\n@NgModule({\n imports: [SharedModule, FormsModule, ReactiveFormsModule, UserVerificationModule, CheckboxModule],\n declarations: [\n WebauthnLoginSettingsComponent,\n CreateCredentialDialogComponent,\n DeleteCredentialDialogComponent,\n EnableEncryptionDialogComponent,\n ],\n exports: [WebauthnLoginSettingsComponent],\n})\nexport class WebauthnLoginSettingsModule {}\n","import { NgModule } from \"@angular/core\";\n\nimport { PasswordCalloutComponent } from \"@bitwarden/auth/angular\";\n\nimport { SharedModule } from \"../../shared\";\nimport { EmergencyAccessModule } from \"../emergency-access\";\nimport { UserKeyRotationModule } from \"../key-rotation/user-key-rotation.module\";\n\nimport { ChangePasswordComponent } from \"./change-password.component\";\nimport { WebauthnLoginSettingsModule } from \"./webauthn-login-settings\";\n\n@NgModule({\n imports: [\n SharedModule,\n WebauthnLoginSettingsModule,\n EmergencyAccessModule,\n PasswordCalloutComponent,\n UserKeyRotationModule,\n ],\n declarations: [ChangePasswordComponent],\n providers: [],\n exports: [ChangePasswordComponent],\n})\nexport class AuthSettingsModule {}\n","import { NgModule } from \"@angular/core\";\n\nimport { AuthSettingsModule } from \"./settings/settings.module\";\n\n@NgModule({\n imports: [AuthSettingsModule],\n declarations: [],\n providers: [],\n exports: [AuthSettingsModule],\n})\nexport class AuthModule {}\n","import { NgModule } from \"@angular/core\";\n\nimport { CheckboxModule } from \"@bitwarden/components\";\n\nimport { SharedModule } from \"../../../app/shared\";\n\nimport { LoginDecryptionOptionsComponent } from \"./login-decryption-options/login-decryption-options.component\";\nimport { LoginViaAuthRequestComponent } from \"./login-via-auth-request.component\";\nimport { LoginViaWebAuthnComponent } from \"./login-via-webauthn/login-via-webauthn.component\";\nimport { LoginComponent } from \"./login.component\";\n\n@NgModule({\n imports: [SharedModule, CheckboxModule],\n declarations: [\n LoginComponent,\n LoginViaAuthRequestComponent,\n LoginDecryptionOptionsComponent,\n LoginViaWebAuthnComponent,\n ],\n exports: [\n LoginComponent,\n LoginViaAuthRequestComponent,\n LoginDecryptionOptionsComponent,\n LoginViaWebAuthnComponent,\n ],\n})\nexport class LoginModule {}\n","import { NgModule } from \"@angular/core\";\n\nimport { SharedModule } from \"../../../shared\";\n\nimport { VerticalStepContentComponent } from \"./vertical-step-content.component\";\nimport { VerticalStep } from \"./vertical-step.component\";\nimport { VerticalStepperComponent } from \"./vertical-stepper.component\";\n\n@NgModule({\n imports: [SharedModule],\n declarations: [VerticalStepperComponent, VerticalStep, VerticalStepContentComponent],\n exports: [VerticalStepperComponent, VerticalStep],\n})\nexport class VerticalStepperModule {}\n","import { CdkStepperModule } from \"@angular/cdk/stepper\";\nimport { TitleCasePipe } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\n\nimport { FormFieldModule } from \"@bitwarden/components\";\n\nimport { OrganizationCreateModule } from \"../../admin-console/organizations/create/organization-create.module\";\nimport { RegisterFormModule } from \"../../auth/register-form/register-form.module\";\nimport { SecretsManagerTrialFreeStepperComponent } from \"../../auth/trial-initiation/secrets-manager/secrets-manager-trial-free-stepper.component\";\nimport { SecretsManagerTrialPaidStepperComponent } from \"../../auth/trial-initiation/secrets-manager/secrets-manager-trial-paid-stepper.component\";\nimport { SecretsManagerTrialComponent } from \"../../auth/trial-initiation/secrets-manager/secrets-manager-trial.component\";\nimport { PaymentComponent, TaxInfoComponent } from \"../../billing\";\nimport { TrialBillingStepComponent } from \"../../billing/accounts/trial-initiation/trial-billing-step.component\";\nimport { EnvironmentSelectorModule } from \"../../components/environment-selector/environment-selector.module\";\nimport { SharedModule } from \"../../shared\";\n\nimport { ConfirmationDetailsComponent } from \"./confirmation-details.component\";\nimport { AbmEnterpriseContentComponent } from \"./content/abm-enterprise-content.component\";\nimport { AbmTeamsContentComponent } from \"./content/abm-teams-content.component\";\nimport { CnetEnterpriseContentComponent } from \"./content/cnet-enterprise-content.component\";\nimport { CnetIndividualContentComponent } from \"./content/cnet-individual-content.component\";\nimport { CnetTeamsContentComponent } from \"./content/cnet-teams-content.component\";\nimport { DefaultContentComponent } from \"./content/default-content.component\";\nimport { EnterpriseContentComponent } from \"./content/enterprise-content.component\";\nimport { Enterprise1ContentComponent } from \"./content/enterprise1-content.component\";\nimport { Enterprise2ContentComponent } from \"./content/enterprise2-content.component\";\nimport { LogoCnet5StarsComponent } from \"./content/logo-cnet-5-stars.component\";\nimport { LogoCnetComponent } from \"./content/logo-cnet.component\";\nimport { LogoForbesComponent } from \"./content/logo-forbes.component\";\nimport { LogoUSNewsComponent } from \"./content/logo-us-news.component\";\nimport { ReviewBlurbComponent } from \"./content/review-blurb.component\";\nimport { ReviewLogoComponent } from \"./content/review-logo.component\";\nimport { SecretsManagerContentComponent } from \"./content/secrets-manager-content.component\";\nimport { TeamsContentComponent } from \"./content/teams-content.component\";\nimport { Teams1ContentComponent } from \"./content/teams1-content.component\";\nimport { Teams2ContentComponent } from \"./content/teams2-content.component\";\nimport { Teams3ContentComponent } from \"./content/teams3-content.component\";\nimport { TrialInitiationComponent } from \"./trial-initiation.component\";\nimport { VerticalStepperModule } from \"./vertical-stepper/vertical-stepper.module\";\n\n@NgModule({\n imports: [\n SharedModule,\n CdkStepperModule,\n VerticalStepperModule,\n FormFieldModule,\n RegisterFormModule,\n OrganizationCreateModule,\n EnvironmentSelectorModule,\n PaymentComponent,\n TaxInfoComponent,\n TrialBillingStepComponent,\n ],\n declarations: [\n TrialInitiationComponent,\n EnterpriseContentComponent,\n TeamsContentComponent,\n ConfirmationDetailsComponent,\n DefaultContentComponent,\n EnterpriseContentComponent,\n Enterprise1ContentComponent,\n Enterprise2ContentComponent,\n TeamsContentComponent,\n Teams1ContentComponent,\n Teams2ContentComponent,\n Teams3ContentComponent,\n CnetEnterpriseContentComponent,\n CnetIndividualContentComponent,\n CnetTeamsContentComponent,\n AbmEnterpriseContentComponent,\n AbmTeamsContentComponent,\n LogoCnet5StarsComponent,\n LogoCnetComponent,\n LogoForbesComponent,\n LogoUSNewsComponent,\n ReviewLogoComponent,\n SecretsManagerContentComponent,\n ReviewBlurbComponent,\n SecretsManagerTrialComponent,\n SecretsManagerTrialFreeStepperComponent,\n SecretsManagerTrialPaidStepperComponent,\n ],\n exports: [TrialInitiationComponent],\n providers: [TitleCasePipe],\n})\nexport class TrialInitiationModule {}\n","import { NgModule } from \"@angular/core\";\n\nimport { OrganizationUserModule } from \"./admin-console/organizations/users/organization-user.module\";\nimport { AuthModule } from \"./auth\";\nimport { LoginModule } from \"./auth/login/login.module\";\nimport { TrialInitiationModule } from \"./auth/trial-initiation/trial-initiation.module\";\nimport { LooseComponentsModule, SharedModule } from \"./shared\";\nimport { AccessComponent } from \"./tools/send/access.component\";\nimport { OrganizationBadgeModule } from \"./vault/individual-vault/organization-badge/organization-badge.module\";\nimport { VaultFilterModule } from \"./vault/individual-vault/vault-filter/vault-filter.module\";\n\n@NgModule({\n imports: [\n SharedModule,\n LooseComponentsModule,\n TrialInitiationModule,\n VaultFilterModule,\n OrganizationBadgeModule,\n OrganizationUserModule,\n LoginModule,\n AuthModule,\n AccessComponent,\n ],\n exports: [\n SharedModule,\n LooseComponentsModule,\n TrialInitiationModule,\n VaultFilterModule,\n OrganizationBadgeModule,\n LoginModule,\n AccessComponent,\n ],\n bootstrap: [],\n})\nexport class OssModule {}\n","import { NgModule } from \"@angular/core\";\nimport { RouterModule, Routes } from \"@angular/router\";\n\nconst routes: Routes = [{ path: \"**\", redirectTo: \"\" }];\n\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule],\n})\nexport class WildcardRoutingModule {}\n","import { View } from \"@bitwarden/common/models/view/view\";\n\nimport { PendingOrganizationAuthRequestResponse } from \"../services/auth-requests\";\n\nexport class PendingAuthRequestView implements View {\n id: string;\n userId: string;\n organizationUserId: string;\n email: string;\n publicKey: string;\n requestDeviceIdentifier: string;\n requestDeviceType: string;\n requestIpAddress: string;\n creationDate: Date;\n\n static fromResponse(response: PendingOrganizationAuthRequestResponse): PendingAuthRequestView {\n const view = Object.assign(new PendingAuthRequestView(), response) as PendingAuthRequestView;\n\n view.creationDate = new Date(response.creationDate);\n\n return view;\n }\n}\n","export class AdminAuthRequestUpdateRequest {\n /**\n *\n * @param requestApproved - Whether the request was approved/denied. If true, the key must be provided.\n * @param encryptedUserKey The user key that has been encrypted with a device public key if the request was approved.\n */\n constructor(\n public requestApproved: boolean,\n public encryptedUserKey?: string,\n ) {}\n}\n","export class BulkDenyAuthRequestsRequest {\n private ids: string[];\n constructor(authRequestIds: string[]) {\n this.ids = authRequestIds;\n }\n}\n","import { BaseResponse } from \"@bitwarden/common/models/response/base.response\";\n\nexport class PendingOrganizationAuthRequestResponse extends BaseResponse {\n id: string;\n userId: string;\n organizationUserId: string;\n email: string;\n publicKey: string;\n requestDeviceIdentifier: string;\n requestDeviceType: string;\n requestIpAddress: string;\n creationDate: string;\n\n constructor(response: any) {\n super(response);\n this.id = this.getResponseProperty(\"Id\");\n this.userId = this.getResponseProperty(\"UserId\");\n this.organizationUserId = this.getResponseProperty(\"OrganizationUserId\");\n this.email = this.getResponseProperty(\"Email\");\n this.publicKey = this.getResponseProperty(\"PublicKey\");\n this.requestDeviceIdentifier = this.getResponseProperty(\"RequestDeviceIdentifier\");\n this.requestDeviceType = this.getResponseProperty(\"RequestDeviceType\");\n this.requestIpAddress = this.getResponseProperty(\"RequestIpAddress\");\n this.creationDate = this.getResponseProperty(\"CreationDate\");\n }\n}\n","import { Injectable } from \"@angular/core\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { ListResponse } from \"@bitwarden/common/models/response/list.response\";\nimport { EncString } from \"@bitwarden/common/platform/models/domain/enc-string\";\n\nimport { PendingAuthRequestView } from \"../../views/pending-auth-request.view\";\n\nimport { AdminAuthRequestUpdateRequest } from \"./admin-auth-request-update.request\";\nimport { BulkDenyAuthRequestsRequest } from \"./bulk-deny-auth-requests.request\";\nimport { PendingOrganizationAuthRequestResponse } from \"./pending-organization-auth-request.response\";\n\n@Injectable()\nexport class OrganizationAuthRequestService {\n constructor(private apiService: ApiService) {}\n\n async listPendingRequests(organizationId: string): Promise {\n const r = await this.apiService.send(\n \"GET\",\n `/organizations/${organizationId}/auth-requests`,\n null,\n true,\n true,\n );\n\n const listResponse = new ListResponse(r, PendingOrganizationAuthRequestResponse);\n\n return listResponse.data.map((ar) => PendingAuthRequestView.fromResponse(ar));\n }\n\n async denyPendingRequests(organizationId: string, ...requestIds: string[]): Promise {\n await this.apiService.send(\n \"POST\",\n `/organizations/${organizationId}/auth-requests/deny`,\n new BulkDenyAuthRequestsRequest(requestIds),\n true,\n false,\n );\n }\n\n async approvePendingRequest(\n organizationId: string,\n requestId: string,\n encryptedKey: EncString,\n ): Promise {\n await this.apiService.send(\n \"POST\",\n `/organizations/${organizationId}/auth-requests/${requestId}`,\n new AdminAuthRequestUpdateRequest(true, encryptedKey.encryptedString),\n true,\n false,\n );\n }\n}\n","import { NgModule } from \"@angular/core\";\n\nimport { OrganizationAuthRequestService } from \"./services/auth-requests\";\n\n@NgModule({\n providers: [OrganizationAuthRequestService],\n})\nexport class CoreOrganizationModule {}\n","import { SsoConfigApi } from \"../api/sso-config.api\";\n\nexport class OrganizationSsoRequest {\n enabled = false;\n identifier: string;\n data: SsoConfigApi;\n}\n","import { View } from \"../../../models/view/view\";\nimport {\n MemberDecryptionType,\n OpenIdConnectRedirectBehavior,\n Saml2BindingType,\n Saml2NameIdFormat,\n Saml2SigningBehavior,\n SsoType,\n} from \"../../enums/sso\";\nimport { OrganizationSsoResponse } from \"../response/organization-sso.response\";\n\nexport class SsoConfigView extends View {\n enabled: boolean;\n ssoIdentifier: string;\n\n configType: SsoType;\n\n memberDecryptionType: MemberDecryptionType;\n keyConnectorUrl: string;\n\n openId: {\n authority: string;\n clientId: string;\n clientSecret: string;\n metadataAddress: string;\n redirectBehavior: OpenIdConnectRedirectBehavior;\n getClaimsFromUserInfoEndpoint: boolean;\n additionalScopes: string;\n additionalUserIdClaimTypes: string;\n additionalEmailClaimTypes: string;\n additionalNameClaimTypes: string;\n acrValues: string;\n expectedReturnAcrValue: string;\n };\n\n saml: {\n spUniqueEntityId: boolean;\n spNameIdFormat: Saml2NameIdFormat;\n spOutboundSigningAlgorithm: string;\n spSigningBehavior: Saml2SigningBehavior;\n spMinIncomingSigningAlgorithm: string;\n spWantAssertionsSigned: boolean;\n spValidateCertificates: boolean;\n\n idpEntityId: string;\n idpBindingType: Saml2BindingType;\n idpSingleSignOnServiceUrl: string;\n idpSingleLogoutServiceUrl: string;\n idpX509PublicCert: string;\n idpOutboundSigningAlgorithm: string;\n idpAllowUnsolicitedAuthnResponse: boolean;\n idpAllowOutboundLogoutRequests: boolean;\n idpWantAuthnRequestsSigned: boolean;\n };\n\n constructor(orgSsoResponse: OrganizationSsoResponse) {\n super();\n\n if (orgSsoResponse == null) {\n return;\n }\n\n this.enabled = orgSsoResponse.enabled;\n this.ssoIdentifier = orgSsoResponse.identifier;\n\n if (orgSsoResponse.data == null) {\n return;\n }\n\n this.configType = orgSsoResponse.data.configType;\n this.memberDecryptionType = orgSsoResponse.data.memberDecryptionType;\n\n this.keyConnectorUrl = orgSsoResponse.data.keyConnectorUrl;\n\n if (this.configType === SsoType.OpenIdConnect) {\n this.openId = {\n authority: orgSsoResponse.data.authority,\n clientId: orgSsoResponse.data.clientId,\n clientSecret: orgSsoResponse.data.clientSecret,\n metadataAddress: orgSsoResponse.data.metadataAddress,\n redirectBehavior: orgSsoResponse.data.redirectBehavior,\n getClaimsFromUserInfoEndpoint: orgSsoResponse.data.getClaimsFromUserInfoEndpoint,\n additionalScopes: orgSsoResponse.data.additionalScopes,\n additionalUserIdClaimTypes: orgSsoResponse.data.additionalUserIdClaimTypes,\n additionalEmailClaimTypes: orgSsoResponse.data.additionalEmailClaimTypes,\n additionalNameClaimTypes: orgSsoResponse.data.additionalNameClaimTypes,\n acrValues: orgSsoResponse.data.acrValues,\n expectedReturnAcrValue: orgSsoResponse.data.expectedReturnAcrValue,\n };\n } else if (this.configType === SsoType.Saml2) {\n this.saml = {\n spUniqueEntityId: orgSsoResponse.data.spUniqueEntityId,\n spNameIdFormat: orgSsoResponse.data.spNameIdFormat,\n spOutboundSigningAlgorithm: orgSsoResponse.data.spOutboundSigningAlgorithm,\n spSigningBehavior: orgSsoResponse.data.spSigningBehavior,\n spMinIncomingSigningAlgorithm: orgSsoResponse.data.spMinIncomingSigningAlgorithm,\n spWantAssertionsSigned: orgSsoResponse.data.spWantAssertionsSigned,\n spValidateCertificates: orgSsoResponse.data.spValidateCertificates,\n\n idpEntityId: orgSsoResponse.data.idpEntityId,\n idpBindingType: orgSsoResponse.data.idpBindingType,\n idpSingleSignOnServiceUrl: orgSsoResponse.data.idpSingleSignOnServiceUrl,\n idpSingleLogoutServiceUrl: orgSsoResponse.data.idpSingleLogoutServiceUrl,\n idpX509PublicCert: orgSsoResponse.data.idpX509PublicCert,\n idpOutboundSigningAlgorithm: orgSsoResponse.data.idpOutboundSigningAlgorithm,\n idpAllowUnsolicitedAuthnResponse: orgSsoResponse.data.idpAllowUnsolicitedAuthnResponse,\n idpWantAuthnRequestsSigned: orgSsoResponse.data.idpWantAuthnRequestsSigned,\n\n // Value is inverted in the view model (allow instead of disable)\n idpAllowOutboundLogoutRequests:\n orgSsoResponse.data.idpDisableOutboundLogoutRequests == null\n ? null\n : !orgSsoResponse.data.idpDisableOutboundLogoutRequests,\n };\n }\n }\n}\n","import { Directive, ElementRef, HostListener } from \"@angular/core\";\n\n@Directive({\n selector: \"input[appInputStripSpaces]\",\n})\nexport class InputStripSpacesDirective {\n constructor(private el: ElementRef) {}\n\n @HostListener(\"input\") onInput() {\n this.el.nativeElement.value = this.el.nativeElement.value.replace(/ /g, \"\");\n }\n}\n","import { Directive, HostListener, Input } from \"@angular/core\";\n\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\n\n@Directive({\n selector: \"[appLaunchClick]\",\n})\nexport class LaunchClickDirective {\n constructor(private platformUtilsService: PlatformUtilsService) {}\n\n @Input(\"appLaunchClick\") uriToLaunch = \"\";\n\n @HostListener(\"click\") onClick() {\n if (!Utils.isNullOrWhitespace(this.uriToLaunch)) {\n this.platformUtilsService.launchUri(this.uriToLaunch);\n }\n }\n}\n","\n\n\n \n {{ \"loading\" | i18n }}\n\n\n
    \n

    \n {{ \"ssoPolicyHelpStart\" | i18n }}\n {{ \"ssoPolicyHelpAnchor\" | i18n }}\n {{ \"ssoPolicyHelpEnd\" | i18n }}\n
    \n

    \n\n \n \n \n {{ \"allowSso\" | i18n }}\n \n {{ \"allowSsoDesc\" | i18n }}\n \n\n \n {{ \"ssoIdentifier\" | i18n }}\n \n \n {{ \"ssoIdentifierHintPartOne\" | i18n }}\n {{ \"domainVerification\" | i18n }}\n \n \n\n
    \n\n \n {{ \"memberDecryptionOption\" | i18n }}\n\n \n {{ \"masterPass\" | i18n }}\n \n\n \n \n {{ \"keyConnector\" | i18n }}\n \n \n \n \n \n {{ \"memberDecryptionKeyConnectorDescStart\" | i18n }}\n {{ \"memberDecryptionKeyConnectorDescLink\" | i18n }}\n {{ \"memberDecryptionKeyConnectorDescEnd\" | i18n }}\n \n \n\n \n \n {{ \"trustedDevices\" | i18n }}\n \n \n {{ \"memberDecryptionOptionTdeDescriptionPartOne\" | i18n }}\n {{ \"memberDecryptionOptionTdeDescriptionLinkOne\" | i18n }}\n {{ \"memberDecryptionOptionTdeDescriptionPartTwo\" | i18n }}\n {{ \"memberDecryptionOptionTdeDescriptionLinkTwo\" | i18n }}\n {{ \"memberDecryptionOptionTdeDescriptionPartThree\" | i18n }}\n {{\n \"memberDecryptionOptionTdeDescriptionLinkThree\" | i18n\n }}\n {{ \"memberDecryptionOptionTdeDescriptionPartFour\" | i18n }}\n \n \n \n\n \n \n \n {{ \"keyConnectorWarning\" | i18n }}\n \n\n \n {{ \"keyConnectorUrl\" | i18n }}\n \n \n \n \n {{ \"keyConnectorTest\" | i18n }}\n \n \n \n \n \n {{ \"keyConnectorTestSuccess\" | i18n }}\n \n \n \n
    \n\n
    \n\n \n {{ \"type\" | i18n }}\n \n \n \n\n \n \n
    \n

    {{ \"openIdConnectConfig\" | i18n }}

    \n\n \n {{ \"callbackPath\" | i18n }}\n \n \n \n\n \n {{ \"signedOutCallbackPath\" | i18n }}\n \n \n \n\n \n {{ \"authority\" | i18n }}\n \n \n\n \n {{ \"clientId\" | i18n }}\n \n \n\n \n {{ \"clientSecret\" | i18n }}\n \n \n\n \n {{ \"metadataAddress\" | i18n }}\n \n {{ \"openIdAuthorityRequired\" | i18n }}\n \n\n \n {{ \"oidcRedirectBehavior\" | i18n }}\n \n \n\n \n {{ \"getClaimsFromUserInfoEndpoint\" | i18n }}\n \n \n\n \n \n

    \n {{ \"openIdOptionalCustomizations\" | i18n }}\n

    \n \n \n \n
    \n
    \n \n {{ \"additionalScopes\" | i18n }}\n \n {{ \"separateMultipleWithComma\" | i18n }}\n \n\n \n {{ \"additionalUserIdClaimTypes\" | i18n }}\n \n {{ \"separateMultipleWithComma\" | i18n }}\n \n\n \n {{ \"additionalEmailClaimTypes\" | i18n }}\n \n {{ \"separateMultipleWithComma\" | i18n }}\n \n\n \n {{ \"additionalNameClaimTypes\" | i18n }}\n \n {{ \"separateMultipleWithComma\" | i18n }}\n \n\n \n {{ \"acrValues\" | i18n }}\n \n acr_values\n \n\n \n {{ \"expectedReturnAcrValue\" | i18n }}\n \n acr_validaton\n \n
    \n \n \n\n \n
    \n \n
    \n

    {{ \"samlSpConfig\" | i18n }}

    \n\n \n {{ \"spUniqueEntityId\" | i18n }}\n \n {{ \"spUniqueEntityIdDesc\" | i18n }}\n \n\n \n {{ \"spEntityId\" | i18n }}\n \n \n \n\n \n {{ \"spEntityId\" | i18n }}\n \n \n \n\n \n {{ \"spMetadataUrl\" | i18n }}\n \n \n \n \n \n \n\n \n {{ \"spAcsUrl\" | i18n }}\n \n \n \n\n \n {{ \"spNameIdFormat\" | i18n }}\n \n \n\n \n {{ \"spOutboundSigningAlgorithm\" | i18n }}\n \n \n\n \n {{ \"spSigningBehavior\" | i18n }}\n \n \n\n \n {{ \"spMinIncomingSigningAlgorithm\" | i18n }}\n \n \n\n \n {{ \"spWantAssertionsSigned\" | i18n }}\n \n \n\n \n {{ \"spValidateCertificates\" | i18n }}\n \n \n
    \n\n \n
    \n

    {{ \"samlIdpConfig\" | i18n }}

    \n\n \n {{ \"idpEntityId\" | i18n }}\n \n \n\n \n {{ \"idpBindingType\" | i18n }}\n \n \n\n \n {{ \"idpSingleSignOnServiceUrl\" | i18n }}\n \n {{ \"idpSingleSignOnServiceUrlRequired\" | i18n }}\n \n\n \n {{ \"idpSingleLogoutServiceUrl\" | i18n }}\n \n \n\n \n {{ \"idpX509PublicCert\" | i18n }}\n \n \n\n \n {{ \"idpOutboundSigningAlgorithm\" | i18n }}\n \n \n\n \n \n\n \n {{ \"idpAllowOutboundLogoutRequests\" | i18n }}\n \n \n\n \n {{ \"idpSignAuthenticationRequests\" | i18n }}\n \n \n
    \n
    \n\n \n \n\n","import { Component, OnDestroy, OnInit } from \"@angular/core\";\nimport {\n AbstractControl,\n FormBuilder,\n FormControl,\n UntypedFormGroup,\n Validators,\n} from \"@angular/forms\";\nimport { ActivatedRoute } from \"@angular/router\";\nimport { concatMap, Subject, takeUntil } from \"rxjs\";\n\nimport { ControlsOf } from \"@bitwarden/angular/types/controls-of\";\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { OrganizationApiServiceAbstraction } from \"@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction\";\nimport { OrganizationService } from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\nimport {\n MemberDecryptionType,\n OpenIdConnectRedirectBehavior,\n Saml2BindingType,\n Saml2NameIdFormat,\n Saml2SigningBehavior,\n SsoType,\n} from \"@bitwarden/common/auth/enums/sso\";\nimport { SsoConfigApi } from \"@bitwarden/common/auth/models/api/sso-config.api\";\nimport { OrganizationSsoRequest } from \"@bitwarden/common/auth/models/request/organization-sso.request\";\nimport { OrganizationSsoResponse } from \"@bitwarden/common/auth/models/response/organization-sso.response\";\nimport { SsoConfigView } from \"@bitwarden/common/auth/models/view/sso-config.view\";\nimport { ConfigServiceAbstraction } from \"@bitwarden/common/platform/abstractions/config/config.service.abstraction\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\n\nimport { ssoTypeValidator } from \"./sso-type.validator\";\n\ninterface SelectOptions {\n name: string;\n value: any;\n disabled?: boolean;\n}\n\nconst defaultSigningAlgorithm = \"http://www.w3.org/2001/04/xmldsig-more#rsa-sha256\";\n\n@Component({\n selector: \"app-org-manage-sso\",\n templateUrl: \"sso.component.html\",\n})\nexport class SsoComponent implements OnInit, OnDestroy {\n readonly ssoType = SsoType;\n readonly memberDecryptionType = MemberDecryptionType;\n\n readonly ssoTypeOptions: SelectOptions[] = [\n { name: this.i18nService.t(\"selectType\"), value: SsoType.None, disabled: true },\n { name: \"OpenID Connect\", value: SsoType.OpenIdConnect },\n { name: \"SAML 2.0\", value: SsoType.Saml2 },\n ];\n\n readonly samlSigningAlgorithms = [\n \"http://www.w3.org/2001/04/xmldsig-more#rsa-sha256\",\n \"http://www.w3.org/2000/09/xmldsig#rsa-sha384\",\n \"http://www.w3.org/2000/09/xmldsig#rsa-sha512\",\n ];\n\n readonly saml2SigningBehaviourOptions: SelectOptions[] = [\n {\n name: \"If IdP Wants Authn Requests Signed\",\n value: Saml2SigningBehavior.IfIdpWantAuthnRequestsSigned,\n },\n { name: \"Always\", value: Saml2SigningBehavior.Always },\n { name: \"Never\", value: Saml2SigningBehavior.Never },\n ];\n readonly saml2BindingTypeOptions: SelectOptions[] = [\n { name: \"Redirect\", value: Saml2BindingType.HttpRedirect },\n { name: \"HTTP POST\", value: Saml2BindingType.HttpPost },\n ];\n readonly saml2NameIdFormatOptions: SelectOptions[] = [\n { name: \"Not Configured\", value: Saml2NameIdFormat.NotConfigured },\n { name: \"Unspecified\", value: Saml2NameIdFormat.Unspecified },\n { name: \"Email Address\", value: Saml2NameIdFormat.EmailAddress },\n { name: \"X.509 Subject Name\", value: Saml2NameIdFormat.X509SubjectName },\n { name: \"Windows Domain Qualified Name\", value: Saml2NameIdFormat.WindowsDomainQualifiedName },\n { name: \"Kerberos Principal Name\", value: Saml2NameIdFormat.KerberosPrincipalName },\n { name: \"Entity Identifier\", value: Saml2NameIdFormat.EntityIdentifier },\n { name: \"Persistent\", value: Saml2NameIdFormat.Persistent },\n { name: \"Transient\", value: Saml2NameIdFormat.Transient },\n ];\n\n readonly connectRedirectOptions: SelectOptions[] = [\n { name: \"Redirect GET\", value: OpenIdConnectRedirectBehavior.RedirectGet },\n { name: \"Form POST\", value: OpenIdConnectRedirectBehavior.FormPost },\n ];\n\n private destroy$ = new Subject();\n showTdeOptions = false;\n showKeyConnectorOptions = false;\n\n showOpenIdCustomizations = false;\n\n loading = true;\n haveTestedKeyConnector = false;\n organizationId: string;\n organization: Organization;\n\n callbackPath: string;\n signedOutCallbackPath: string;\n spEntityId: string;\n spEntityIdStatic: string;\n spMetadataUrl: string;\n spAcsUrl: string;\n\n protected openIdForm = this.formBuilder.group>(\n {\n authority: new FormControl(\"\", Validators.required),\n clientId: new FormControl(\"\", Validators.required),\n clientSecret: new FormControl(\"\", Validators.required),\n metadataAddress: new FormControl(),\n redirectBehavior: new FormControl(\n OpenIdConnectRedirectBehavior.RedirectGet,\n Validators.required,\n ),\n getClaimsFromUserInfoEndpoint: new FormControl(),\n additionalScopes: new FormControl(),\n additionalUserIdClaimTypes: new FormControl(),\n additionalEmailClaimTypes: new FormControl(),\n additionalNameClaimTypes: new FormControl(),\n acrValues: new FormControl(),\n expectedReturnAcrValue: new FormControl(),\n },\n {\n updateOn: \"blur\",\n },\n );\n\n protected samlForm = this.formBuilder.group>(\n {\n spUniqueEntityId: new FormControl(true, { updateOn: \"change\" }),\n spNameIdFormat: new FormControl(Saml2NameIdFormat.NotConfigured),\n spOutboundSigningAlgorithm: new FormControl(defaultSigningAlgorithm),\n spSigningBehavior: new FormControl(Saml2SigningBehavior.IfIdpWantAuthnRequestsSigned),\n spMinIncomingSigningAlgorithm: new FormControl(defaultSigningAlgorithm),\n spWantAssertionsSigned: new FormControl(),\n spValidateCertificates: new FormControl(),\n\n idpEntityId: new FormControl(\"\", Validators.required),\n idpBindingType: new FormControl(Saml2BindingType.HttpRedirect),\n idpSingleSignOnServiceUrl: new FormControl(),\n idpSingleLogoutServiceUrl: new FormControl(),\n idpX509PublicCert: new FormControl(\"\", Validators.required),\n idpOutboundSigningAlgorithm: new FormControl(defaultSigningAlgorithm),\n idpAllowUnsolicitedAuthnResponse: new FormControl(),\n idpAllowOutboundLogoutRequests: new FormControl(true),\n idpWantAuthnRequestsSigned: new FormControl(),\n },\n {\n updateOn: \"blur\",\n },\n );\n\n protected ssoConfigForm = this.formBuilder.group>({\n configType: new FormControl(SsoType.None),\n memberDecryptionType: new FormControl(MemberDecryptionType.MasterPassword),\n keyConnectorUrl: new FormControl(\"\"),\n openId: this.openIdForm,\n saml: this.samlForm,\n enabled: new FormControl(false),\n ssoIdentifier: new FormControl(\"\", {\n validators: [Validators.maxLength(50), Validators.required],\n }),\n });\n\n get enabledCtrl() {\n return this.ssoConfigForm?.controls?.enabled as FormControl;\n }\n get ssoIdentifierCtrl() {\n return this.ssoConfigForm?.controls?.ssoIdentifier as FormControl;\n }\n get configTypeCtrl() {\n return this.ssoConfigForm?.controls?.configType as FormControl;\n }\n\n constructor(\n private formBuilder: FormBuilder,\n private route: ActivatedRoute,\n private apiService: ApiService,\n private platformUtilsService: PlatformUtilsService,\n private i18nService: I18nService,\n private organizationService: OrganizationService,\n private organizationApiService: OrganizationApiServiceAbstraction,\n private configService: ConfigServiceAbstraction,\n ) {}\n\n async ngOnInit() {\n this.enabledCtrl.valueChanges.pipe(takeUntil(this.destroy$)).subscribe((enabled) => {\n if (enabled) {\n this.ssoIdentifierCtrl.setValidators([Validators.maxLength(50), Validators.required]);\n this.configTypeCtrl.setValidators([\n ssoTypeValidator(this.i18nService.t(\"selectionIsRequired\")),\n ]);\n } else {\n this.ssoIdentifierCtrl.setValidators([]);\n this.configTypeCtrl.setValidators([]);\n }\n\n this.ssoIdentifierCtrl.updateValueAndValidity();\n this.configTypeCtrl.updateValueAndValidity();\n });\n\n this.ssoConfigForm\n .get(\"configType\")\n .valueChanges.pipe(takeUntil(this.destroy$))\n .subscribe((newType: SsoType) => {\n if (newType === SsoType.OpenIdConnect) {\n this.openIdForm.enable();\n this.samlForm.disable();\n } else if (newType === SsoType.Saml2) {\n this.openIdForm.disable();\n this.samlForm.enable();\n } else {\n this.openIdForm.disable();\n this.samlForm.disable();\n }\n });\n\n this.samlForm\n .get(\"spSigningBehavior\")\n .valueChanges.pipe(takeUntil(this.destroy$))\n .subscribe(() => this.samlForm.get(\"idpX509PublicCert\").updateValueAndValidity());\n\n this.route.params\n .pipe(\n concatMap(async (params) => {\n this.organizationId = params.organizationId;\n await this.load();\n }),\n takeUntil(this.destroy$),\n )\n .subscribe();\n\n this.showKeyConnectorOptions = this.platformUtilsService.isSelfHost();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n async load() {\n this.organization = await this.organizationService.get(this.organizationId);\n const ssoSettings = await this.organizationApiService.getSso(this.organizationId);\n this.populateForm(ssoSettings);\n\n this.callbackPath = ssoSettings.urls.callbackPath;\n this.signedOutCallbackPath = ssoSettings.urls.signedOutCallbackPath;\n this.spEntityId = ssoSettings.urls.spEntityId;\n this.spEntityIdStatic = ssoSettings.urls.spEntityIdStatic;\n this.spMetadataUrl = ssoSettings.urls.spMetadataUrl;\n this.spAcsUrl = ssoSettings.urls.spAcsUrl;\n\n this.loading = false;\n }\n\n submit = async () => {\n this.updateFormValidationState(this.ssoConfigForm);\n\n if (this.ssoConfigForm.value.memberDecryptionType === MemberDecryptionType.KeyConnector) {\n this.haveTestedKeyConnector = false;\n await this.validateKeyConnectorUrl();\n }\n\n if (!this.ssoConfigForm.valid) {\n this.readOutErrors();\n return;\n }\n const request = new OrganizationSsoRequest();\n request.enabled = this.enabledCtrl.value;\n // Return null instead of empty string to avoid duplicate id errors in database\n request.identifier = this.ssoIdentifierCtrl.value === \"\" ? null : this.ssoIdentifierCtrl.value;\n request.data = SsoConfigApi.fromView(this.ssoConfigForm.getRawValue());\n\n const response = await this.organizationApiService.updateSso(this.organizationId, request);\n this.populateForm(response);\n\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"ssoSettingsSaved\"));\n };\n\n async validateKeyConnectorUrl() {\n if (this.haveTestedKeyConnector) {\n return;\n }\n\n this.keyConnectorUrl.markAsPending();\n\n try {\n await this.apiService.getKeyConnectorAlive(this.keyConnectorUrl.value);\n this.keyConnectorUrl.updateValueAndValidity();\n } catch {\n this.keyConnectorUrl.setErrors({\n invalidUrl: { message: this.i18nService.t(\"keyConnectorTestFail\") },\n });\n }\n\n this.haveTestedKeyConnector = true;\n }\n\n toggleOpenIdCustomizations() {\n this.showOpenIdCustomizations = !this.showOpenIdCustomizations;\n }\n\n getErrorCount(form: UntypedFormGroup): number {\n return Object.values(form.controls).reduce((acc: number, control: AbstractControl) => {\n if (control instanceof UntypedFormGroup) {\n return acc + this.getErrorCount(control);\n }\n\n if (control.errors == null) {\n return acc;\n }\n return acc + Object.keys(control.errors).length;\n }, 0);\n }\n\n get enableTestKeyConnector() {\n return (\n this.ssoConfigForm.value?.memberDecryptionType === MemberDecryptionType.KeyConnector &&\n !Utils.isNullOrWhitespace(this.keyConnectorUrl?.value)\n );\n }\n\n get keyConnectorUrl() {\n return this.ssoConfigForm.get(\"keyConnectorUrl\");\n }\n\n get samlSigningAlgorithmOptions(): SelectOptions[] {\n return this.samlSigningAlgorithms.map((algorithm) => ({ name: algorithm, value: algorithm }));\n }\n\n /**\n * Shows any validation errors for the form by marking all controls as dirty and touched.\n * If nested form groups are found, they are also updated.\n * @param form - the form to show validation errors for\n */\n private updateFormValidationState(form: UntypedFormGroup) {\n Object.values(form.controls).forEach((control: AbstractControl) => {\n if (control.disabled) {\n return;\n }\n\n if (control instanceof UntypedFormGroup) {\n this.updateFormValidationState(control);\n } else {\n control.markAsDirty();\n control.markAsTouched();\n control.updateValueAndValidity();\n }\n });\n }\n\n private populateForm(orgSsoResponse: OrganizationSsoResponse) {\n const ssoConfigView = new SsoConfigView(orgSsoResponse);\n this.ssoConfigForm.patchValue(ssoConfigView);\n }\n\n private readOutErrors() {\n const errorText = this.i18nService.t(\"error\");\n const errorCount = this.getErrorCount(this.ssoConfigForm);\n const errorCountText = this.i18nService.t(\n errorCount === 1 ? \"formErrorSummarySingle\" : \"formErrorSummaryPlural\",\n errorCount.toString(),\n );\n\n const div = document.createElement(\"div\");\n div.className = \"sr-only\";\n div.id = \"srErrorCount\";\n div.setAttribute(\"aria-live\", \"polite\");\n div.innerText = errorText + \": \" + errorCountText;\n\n const existing = document.getElementById(\"srErrorCount\");\n if (existing != null) {\n existing.remove();\n }\n\n document.body.append(div);\n }\n}\n","import { AbstractControl, ValidationErrors, ValidatorFn } from \"@angular/forms\";\n\nimport { SsoType } from \"@bitwarden/common/auth/enums/sso\";\n\nexport function ssoTypeValidator(errorMessage: string): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n const value = control.value;\n\n if (value === SsoType.None) {\n return {\n validSsoTypeRequired: {\n message: errorMessage,\n },\n };\n }\n\n return null;\n };\n}\n","import { svgIcon } from \"@bitwarden/components\";\n\nexport const Devices = svgIcon`\n\n \n \n \n \n \n \n \n \n \n \n \n\n`;\n","\n \n \n {{ \"loading\" | i18n }}\n \n\n\n

    \n {{ \"deviceApprovalsDesc\" | i18n }}\n

    \n\n\n \n \n {{ \"member\" | i18n }}\n {{ \"deviceInfo\" | i18n }}\n {{ \"time\" | i18n }}\n \n \n \n \n \n \n {{ \"denyAllRequests\" | i18n }}\n \n \n \n \n \n \n \n \n \n
    {{ r.email }}
    \n {{ r.publicKey | fingerprint: r.email | async }}\n \n \n
    {{ r.requestDeviceType }}
    \n
    {{ r.requestIpAddress }}
    \n \n \n {{ r.creationDate | date: \"medium\" }}\n \n \n \n \n \n \n {{ \"approveRequest\" | i18n }}\n \n \n \n \n {{ \"denyRequest\" | i18n }}\n \n \n \n \n \n
    \n
    \n\n\n {{ \"noDeviceRequests\" | i18n }}\n {{ \"noDeviceRequestsDesc\" | i18n }}\n\n","import { Component, OnDestroy, OnInit } from \"@angular/core\";\nimport { ActivatedRoute } from \"@angular/router\";\nimport { BehaviorSubject, Subject, switchMap, takeUntil, tap } from \"rxjs\";\n\nimport { OrganizationUserService } from \"@bitwarden/common/admin-console/abstractions/organization-user/organization-user.service\";\nimport { OrganizationUserResetPasswordDetailsResponse } from \"@bitwarden/common/admin-console/abstractions/organization-user/responses\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { ValidationService } from \"@bitwarden/common/platform/abstractions/validation.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\nimport { EncString } from \"@bitwarden/common/platform/models/domain/enc-string\";\nimport { SymmetricCryptoKey } from \"@bitwarden/common/platform/models/domain/symmetric-crypto-key\";\nimport { TableDataSource } from \"@bitwarden/components\";\nimport { Devices } from \"@bitwarden/web-vault/app/admin-console/icons\";\n\nimport { OrganizationAuthRequestService } from \"../../core/services/auth-requests\";\nimport { PendingAuthRequestView } from \"../../core/views/pending-auth-request.view\";\n\n@Component({\n selector: \"app-org-device-approvals\",\n templateUrl: \"./device-approvals.component.html\",\n})\nexport class DeviceApprovalsComponent implements OnInit, OnDestroy {\n tableDataSource = new TableDataSource();\n organizationId: string;\n loading = true;\n actionInProgress = false;\n\n protected readonly Devices = Devices;\n\n private destroy$ = new Subject();\n private refresh$ = new BehaviorSubject(null);\n\n constructor(\n private organizationAuthRequestService: OrganizationAuthRequestService,\n private organizationUserService: OrganizationUserService,\n private cryptoService: CryptoService,\n private route: ActivatedRoute,\n private platformUtilsService: PlatformUtilsService,\n private i18nService: I18nService,\n private logService: LogService,\n private validationService: ValidationService,\n ) {}\n\n async ngOnInit() {\n this.route.params\n .pipe(\n tap((params) => (this.organizationId = params.organizationId)),\n switchMap(() =>\n this.refresh$.pipe(\n tap(() => (this.loading = true)),\n switchMap(() =>\n this.organizationAuthRequestService.listPendingRequests(this.organizationId),\n ),\n ),\n ),\n takeUntil(this.destroy$),\n )\n .subscribe((r) => {\n this.tableDataSource.data = r;\n this.loading = false;\n });\n }\n\n /**\n * Creates a copy of the user key that has been encrypted with the provided device's public key.\n * @param devicePublicKey\n * @param resetPasswordDetails\n * @private\n */\n private async getEncryptedUserKey(\n devicePublicKey: string,\n resetPasswordDetails: OrganizationUserResetPasswordDetailsResponse,\n ): Promise {\n const encryptedUserKey = resetPasswordDetails.resetPasswordKey;\n const encryptedOrgPrivateKey = resetPasswordDetails.encryptedPrivateKey;\n const devicePubKey = Utils.fromB64ToArray(devicePublicKey);\n\n // Decrypt Organization's encrypted Private Key with org key\n const orgSymKey = await this.cryptoService.getOrgKey(this.organizationId);\n const decOrgPrivateKey = await this.cryptoService.decryptToBytes(\n new EncString(encryptedOrgPrivateKey),\n orgSymKey,\n );\n\n // Decrypt user key with decrypted org private key\n const decValue = await this.cryptoService.rsaDecrypt(encryptedUserKey, decOrgPrivateKey);\n const userKey = new SymmetricCryptoKey(decValue);\n\n // Re-encrypt user Key with the Device Public Key\n return await this.cryptoService.rsaEncrypt(userKey.key, devicePubKey);\n }\n\n async approveRequest(authRequest: PendingAuthRequestView) {\n await this.performAsyncAction(async () => {\n const details = await this.organizationUserService.getOrganizationUserResetPasswordDetails(\n this.organizationId,\n authRequest.organizationUserId,\n );\n\n // The user must be enrolled in account recovery (password reset) in order for the request to be approved.\n if (details == null || details.resetPasswordKey == null) {\n this.platformUtilsService.showToast(\n \"error\",\n null,\n this.i18nService.t(\"resetPasswordDetailsError\"),\n );\n return;\n }\n\n const encryptedKey = await this.getEncryptedUserKey(authRequest.publicKey, details);\n\n await this.organizationAuthRequestService.approvePendingRequest(\n this.organizationId,\n authRequest.id,\n encryptedKey,\n );\n\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"loginRequestApproved\"),\n );\n });\n }\n\n async denyRequest(requestId: string) {\n await this.performAsyncAction(async () => {\n await this.organizationAuthRequestService.denyPendingRequests(this.organizationId, requestId);\n this.platformUtilsService.showToast(\"error\", null, this.i18nService.t(\"loginRequestDenied\"));\n });\n }\n\n async denyAllRequests() {\n if (this.tableDataSource.data.length === 0) {\n return;\n }\n\n await this.performAsyncAction(async () => {\n await this.organizationAuthRequestService.denyPendingRequests(\n this.organizationId,\n ...this.tableDataSource.data.map((r) => r.id),\n );\n this.platformUtilsService.showToast(\n \"error\",\n null,\n this.i18nService.t(\"allLoginRequestsDenied\"),\n );\n });\n }\n\n private async performAsyncAction(action: () => Promise) {\n if (this.actionInProgress) {\n return;\n }\n this.actionInProgress = true;\n try {\n await action();\n this.refresh$.next();\n } catch (err: unknown) {\n this.logService.error(err.toString());\n this.validationService.showError(err);\n } finally {\n this.actionInProgress = false;\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n}\n","export class OrganizationDomainRequest {\n txt: string;\n domainName: string;\n\n constructor(txt: string, domainName: string) {\n this.txt = txt;\n this.domainName = domainName;\n }\n}\n","import { AbstractControl, ValidationErrors, ValidatorFn } from \"@angular/forms\";\nexport function uniqueInArrayValidator(values: Array, errorMessage: string): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n const value = control.value;\n\n if (!value) {\n return null;\n }\n\n const lowerTrimmedValue = value.toLowerCase().trim();\n\n // check if the entered value is unique\n if (values.some((val) => val.toLowerCase().trim() === lowerTrimmedValue)) {\n return {\n nonUniqueValue: {\n message: errorMessage,\n },\n };\n }\n\n return null;\n };\n}\n","\n \n \n {{ \"newDomain\" | i18n }}\n {{ \"verifyDomain\" | i18n }}\n\n {{\n data.orgDomain.domainName\n }}\n\n {{\n \"domainStatusUnverified\" | i18n\n }}\n {{\n \"domainStatusVerified\" | i18n\n }}\n \n
    \n \n {{ \"domainName\" | i18n }}\n \n {{ \"domainNameInputHint\" | i18n }}\n \n\n \n {{ \"dnsTxtRecord\" | i18n }}\n \n {{ \"dnsTxtRecordInputHint\" | i18n }}\n \n \n \n \n\n \n {{ \"automaticDomainVerificationProcess\" | i18n }}\n \n
    \n \n \n \n\n \n \n
    \n\n","import { DialogRef, DIALOG_DATA } from \"@angular/cdk/dialog\";\nimport { Component, Inject, OnDestroy, OnInit } from \"@angular/core\";\nimport { FormBuilder, FormControl, FormGroup, ValidatorFn, Validators } from \"@angular/forms\";\nimport { Subject, takeUntil } from \"rxjs\";\n\nimport { OrgDomainApiServiceAbstraction } from \"@bitwarden/common/admin-console/abstractions/organization-domain/org-domain-api.service.abstraction\";\nimport { OrgDomainServiceAbstraction } from \"@bitwarden/common/admin-console/abstractions/organization-domain/org-domain.service.abstraction\";\nimport { OrganizationDomainResponse } from \"@bitwarden/common/admin-console/abstractions/organization-domain/responses/organization-domain.response\";\nimport { OrganizationDomainRequest } from \"@bitwarden/common/admin-console/services/organization-domain/requests/organization-domain.request\";\nimport { HttpStatusCode } from \"@bitwarden/common/enums\";\nimport { ErrorResponse } from \"@bitwarden/common/models/response/error.response\";\nimport { CryptoFunctionService as CryptoFunctionServiceAbstraction } from \"@bitwarden/common/platform/abstractions/crypto-function.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { ValidationService } from \"@bitwarden/common/platform/abstractions/validation.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\nimport { DialogService } from \"@bitwarden/components\";\n\nimport { domainNameValidator } from \"./validators/domain-name.validator\";\nimport { uniqueInArrayValidator } from \"./validators/unique-in-array.validator\";\nexport interface DomainAddEditDialogData {\n organizationId: string;\n orgDomain: OrganizationDomainResponse;\n existingDomainNames: Array;\n}\n\n@Component({\n templateUrl: \"domain-add-edit-dialog.component.html\",\n})\nexport class DomainAddEditDialogComponent implements OnInit, OnDestroy {\n private componentDestroyed$: Subject = new Subject();\n\n domainForm: FormGroup = this.formBuilder.group({\n domainName: [\n \"\",\n [\n Validators.required,\n domainNameValidator(this.i18nService.t(\"invalidDomainNameMessage\")),\n uniqueInArrayValidator(\n this.data.existingDomainNames,\n this.i18nService.t(\"duplicateDomainError\"),\n ),\n ],\n ],\n txt: [{ value: null, disabled: true }],\n });\n\n get domainNameCtrl(): FormControl {\n return this.domainForm.controls.domainName as FormControl;\n }\n get txtCtrl(): FormControl {\n return this.domainForm.controls.txt as FormControl;\n }\n\n rejectedDomainNameValidator: ValidatorFn = null;\n\n rejectedDomainNames: Array = [];\n\n constructor(\n public dialogRef: DialogRef,\n @Inject(DIALOG_DATA) public data: DomainAddEditDialogData,\n private formBuilder: FormBuilder,\n private cryptoFunctionService: CryptoFunctionServiceAbstraction,\n private platformUtilsService: PlatformUtilsService,\n private i18nService: I18nService,\n private orgDomainApiService: OrgDomainApiServiceAbstraction,\n private orgDomainService: OrgDomainServiceAbstraction,\n private validationService: ValidationService,\n private dialogService: DialogService,\n ) {}\n\n // Angular Method Implementations\n\n async ngOnInit(): Promise {\n // If we have data.orgDomain, then editing, otherwise creating new domain\n await this.populateForm();\n }\n\n ngOnDestroy(): void {\n this.componentDestroyed$.next();\n this.componentDestroyed$.complete();\n }\n\n // End Angular Method Implementations\n\n // Form methods\n\n async populateForm(): Promise {\n if (this.data.orgDomain) {\n // Edit\n this.domainForm.patchValue(this.data.orgDomain);\n this.domainForm.disable();\n } else {\n // Add\n\n // Figuring out the proper length of our DNS TXT Record value was fun.\n // DNS-Based Service Discovery RFC: https://www.ietf.org/rfc/rfc6763.txt; see section 6.1\n // Google uses 43 chars for their TXT record value: https://support.google.com/a/answer/2716802\n // So, chose a magic # of 33 bytes to achieve at least that once converted to base 64 (47 char length).\n const generatedTxt = `bw=${Utils.fromBufferToB64(\n await this.cryptoFunctionService.randomBytes(33),\n )}`;\n this.txtCtrl.setValue(generatedTxt);\n }\n\n this.setupFormListeners();\n }\n\n setupFormListeners(): void {\n // suppresses touched state on change for reactive form controls\n // Manually set touched to show validation errors as the user stypes\n this.domainForm.valueChanges.pipe(takeUntil(this.componentDestroyed$)).subscribe(() => {\n this.domainForm.markAllAsTouched();\n });\n }\n\n copyDnsTxt(): void {\n this.orgDomainService.copyDnsTxt(this.txtCtrl.value);\n }\n\n // End Form methods\n\n // Async Form Actions\n saveDomain = async (): Promise => {\n if (this.domainForm.invalid) {\n this.platformUtilsService.showToast(\"error\", null, this.i18nService.t(\"domainFormInvalid\"));\n return;\n }\n\n this.domainNameCtrl.disable();\n\n const request: OrganizationDomainRequest = new OrganizationDomainRequest(\n this.txtCtrl.value,\n this.domainNameCtrl.value,\n );\n\n try {\n this.data.orgDomain = await this.orgDomainApiService.post(this.data.organizationId, request);\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"domainSaved\"));\n await this.verifyDomain();\n } catch (e) {\n this.handleDomainSaveError(e);\n }\n };\n\n private handleDomainSaveError(e: any): void {\n if (e instanceof ErrorResponse) {\n const errorResponse: ErrorResponse = e as ErrorResponse;\n switch (errorResponse.statusCode) {\n case HttpStatusCode.Conflict:\n if (errorResponse.message.includes(\"The domain is not available to be claimed\")) {\n // If user has attempted to claim a different rejected domain first:\n if (this.rejectedDomainNameValidator) {\n // Remove the validator:\n this.domainNameCtrl.removeValidators(this.rejectedDomainNameValidator);\n this.domainNameCtrl.updateValueAndValidity();\n }\n\n // Update rejected domain names and add new unique in validator\n // which will prevent future known bad domain name submissions.\n this.rejectedDomainNames.push(this.domainNameCtrl.value);\n\n this.rejectedDomainNameValidator = uniqueInArrayValidator(\n this.rejectedDomainNames,\n this.i18nService.t(\"domainNotAvailable\", this.domainNameCtrl.value),\n );\n\n this.domainNameCtrl.addValidators(this.rejectedDomainNameValidator);\n this.domainNameCtrl.updateValueAndValidity();\n\n // Give them another chance to enter a new domain name:\n this.domainForm.enable();\n } else {\n this.validationService.showError(errorResponse);\n }\n\n break;\n\n default:\n this.validationService.showError(errorResponse);\n break;\n }\n } else {\n this.validationService.showError(e);\n }\n }\n\n verifyDomain = async (): Promise => {\n if (this.domainForm.invalid) {\n // Note: shouldn't be possible, but going to leave this to be safe.\n this.platformUtilsService.showToast(\"error\", null, this.i18nService.t(\"domainFormInvalid\"));\n return;\n }\n\n try {\n this.data.orgDomain = await this.orgDomainApiService.verify(\n this.data.organizationId,\n this.data.orgDomain.id,\n );\n\n if (this.data.orgDomain.verifiedDate) {\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"domainVerified\"));\n this.dialogRef.close();\n } else {\n this.domainNameCtrl.setErrors({\n errorPassthrough: {\n message: this.i18nService.t(\"domainNotVerified\", this.domainNameCtrl.value),\n },\n });\n // For the case where user opens dialog and reverifies when domain name formControl disabled.\n // The input directive only shows error if touched, so must manually mark as touched.\n this.domainNameCtrl.markAsTouched();\n // Update this item so the last checked date gets updated.\n await this.updateOrgDomain();\n }\n } catch (e) {\n this.handleVerifyDomainError(e, this.domainNameCtrl.value);\n // Update this item so the last checked date gets updated.\n await this.updateOrgDomain();\n }\n };\n\n private handleVerifyDomainError(e: any, domainName: string): void {\n if (e instanceof ErrorResponse) {\n const errorResponse: ErrorResponse = e as ErrorResponse;\n switch (errorResponse.statusCode) {\n case HttpStatusCode.Conflict:\n if (errorResponse.message.includes(\"The domain is not available to be claimed\")) {\n this.domainNameCtrl.setErrors({\n errorPassthrough: {\n message: this.i18nService.t(\"domainNotAvailable\", domainName),\n },\n });\n }\n break;\n\n default:\n this.validationService.showError(errorResponse);\n break;\n }\n }\n }\n\n private async updateOrgDomain() {\n // Update this item so the last checked date gets updated.\n await this.orgDomainApiService.getByOrgIdAndOrgDomainId(\n this.data.organizationId,\n this.data.orgDomain.id,\n );\n }\n\n deleteDomain = async (): Promise => {\n const confirmed = await this.dialogService.openSimpleDialog({\n title: { key: \"removeDomain\" },\n content: { key: \"removeDomainWarning\" },\n type: \"warning\",\n });\n\n if (!confirmed) {\n return;\n }\n\n await this.orgDomainApiService.delete(this.data.organizationId, this.data.orgDomain.id);\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"domainRemoved\"));\n\n this.dialogRef.close();\n };\n\n // End Async Form Actions\n}\n","import { AbstractControl, ValidationErrors, ValidatorFn } from \"@angular/forms\";\n\nexport function domainNameValidator(errorMessage: string): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n const value = control.value;\n\n if (!value) {\n return null;\n }\n\n // Domain labels (sections) are only allowed to be 63 chars in length max\n // 1st and last chars cannot be hyphens per RFC 3696 (https://www.rfc-editor.org/rfc/rfc3696#section-2)\n // We do not want any prefixes per industry standards.\n\n // Must support top-level domains and any number of subdomains.\n // / # start regex\n // ^ # start of string\n // (?!(http(s)?:\\/\\/|www\\.)) # negative lookahead to check if input doesn't match \"http://\", \"https://\" or \"www.\"\n // [a-zA-Z0-9] # first character must be a letter or a number\n // [a-zA-Z0-9-]{0,61} # domain name can have 0 to 61 characters that are letters, numbers, or hyphens\n // [a-zA-Z0-9] # domain name must end with a letter or a number\n // (?: # start of non-capturing group (subdomain sections are optional)\n // \\. # subdomain must have a period\n // [a-zA-Z0-9] # first character of subdomain must be a letter or a number\n // [a-zA-Z0-9-]{0,61} # subdomain can have 0 to 61 characters that are letters, numbers, or hyphens\n // [a-zA-Z0-9] # subdomain must end with a letter or a number\n // )* # end of non-capturing group (subdomain sections are optional)\n // \\. # domain name must have a period\n // [a-zA-Z]{2,} # domain name must have at least two letters (the domain extension)\n // $/ # end of string\n\n const validDomainNameRegex =\n /^(?!(http(s)?:\\/\\/|www\\.))[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9](?:\\.[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9])*\\.[a-zA-Z]{2,}$/;\n\n const invalid = !validDomainNameRegex.test(control.value);\n\n if (invalid) {\n return {\n invalidDomainName: {\n message: errorMessage,\n },\n };\n }\n\n return null;\n };\n}\n","\n \n\n\n\n \n {{ \"loading\" | i18n }}\n\n\n\n \n
    \n \n \n \n {{ \"name\" | i18n }}\n {{ \"status\" | i18n }}\n {{ \"lastChecked\" | i18n }}\n {{ \"options\" | i18n }}\n \n \n \n \n \n \n {{ orgDomain.domainName }}\n \n \n \n {{\n \"domainStatusUnverified\" | i18n\n }}\n {{\n \"domainStatusVerified\" | i18n\n }}\n \n \n {{ orgDomain.lastCheckedDate | date: \"medium\" }}\n \n\n \n \n \n \n \n \n \n \n {{ \"verifyDomain\" | i18n }}\n \n \n \n \n \n \n \n
    \n\n \n \"\"\n\n
    \n {{ \"noDomains\" | i18n }}\n
    \n\n
    \n \n {{ \"noDomainsSubText\" | i18n }}\n \n
    \n\n \n \n
    \n
    \n","import { Component, OnDestroy, OnInit } from \"@angular/core\";\nimport { ActivatedRoute, Params } from \"@angular/router\";\nimport { concatMap, Observable, Subject, take, takeUntil } from \"rxjs\";\n\nimport { OrgDomainApiServiceAbstraction } from \"@bitwarden/common/admin-console/abstractions/organization-domain/org-domain-api.service.abstraction\";\nimport { OrgDomainServiceAbstraction } from \"@bitwarden/common/admin-console/abstractions/organization-domain/org-domain.service.abstraction\";\nimport { OrganizationDomainResponse } from \"@bitwarden/common/admin-console/abstractions/organization-domain/responses/organization-domain.response\";\nimport { HttpStatusCode } from \"@bitwarden/common/enums\";\nimport { ErrorResponse } from \"@bitwarden/common/models/response/error.response\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { ValidationService } from \"@bitwarden/common/platform/abstractions/validation.service\";\nimport { DialogService } from \"@bitwarden/components\";\n\nimport {\n DomainAddEditDialogComponent,\n DomainAddEditDialogData,\n} from \"./domain-add-edit-dialog/domain-add-edit-dialog.component\";\n\n@Component({\n selector: \"app-org-manage-domain-verification\",\n templateUrl: \"domain-verification.component.html\",\n})\nexport class DomainVerificationComponent implements OnInit, OnDestroy {\n private componentDestroyed$ = new Subject();\n\n loading = true;\n\n organizationId: string;\n orgDomains$: Observable;\n\n constructor(\n private route: ActivatedRoute,\n private platformUtilsService: PlatformUtilsService,\n private i18nService: I18nService,\n private orgDomainApiService: OrgDomainApiServiceAbstraction,\n private orgDomainService: OrgDomainServiceAbstraction,\n private dialogService: DialogService,\n private validationService: ValidationService,\n ) {}\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n async ngOnInit() {\n this.orgDomains$ = this.orgDomainService.orgDomains$;\n\n // Note: going to use concatMap as async subscribe blocks don't work as you expect and\n // as such, ESLint rejects it\n // ex: https://stackoverflow.com/a/71056380\n this.route.params\n .pipe(\n concatMap(async (params: Params) => {\n this.organizationId = params.organizationId;\n await this.load();\n }),\n takeUntil(this.componentDestroyed$),\n )\n .subscribe();\n }\n\n async load() {\n await this.orgDomainApiService.getAllByOrgId(this.organizationId);\n\n this.loading = false;\n }\n\n addDomain() {\n const domainAddEditDialogData: DomainAddEditDialogData = {\n organizationId: this.organizationId,\n orgDomain: null,\n existingDomainNames: this.getExistingDomainNames(),\n };\n\n this.dialogService.open(DomainAddEditDialogComponent, {\n data: domainAddEditDialogData,\n });\n }\n\n editDomain(orgDomain: OrganizationDomainResponse) {\n const domainAddEditDialogData: DomainAddEditDialogData = {\n organizationId: this.organizationId,\n orgDomain: orgDomain,\n existingDomainNames: this.getExistingDomainNames(),\n };\n\n this.dialogService.open(DomainAddEditDialogComponent, {\n data: domainAddEditDialogData,\n });\n }\n\n private getExistingDomainNames(): Array {\n let existingDomainNames: string[];\n // eslint-disable-next-line rxjs-angular/prefer-takeuntil\n this.orgDomains$.pipe(take(1)).subscribe((orgDomains: Array) => {\n existingDomainNames = orgDomains.map((o) => o.domainName);\n });\n return existingDomainNames;\n }\n\n // Options\n\n copyDnsTxt(dnsTxt: string): void {\n this.orgDomainService.copyDnsTxt(dnsTxt);\n }\n\n async verifyDomain(orgDomainId: string, domainName: string): Promise {\n try {\n const orgDomain: OrganizationDomainResponse = await this.orgDomainApiService.verify(\n this.organizationId,\n orgDomainId,\n );\n\n if (orgDomain.verifiedDate) {\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"domainVerified\"));\n } else {\n this.platformUtilsService.showToast(\n \"error\",\n null,\n this.i18nService.t(\"domainNotVerified\", domainName),\n );\n // Update this item so the last checked date gets updated.\n await this.updateOrgDomain(orgDomainId);\n }\n } catch (e) {\n this.handleVerifyDomainError(e, domainName);\n // Update this item so the last checked date gets updated.\n await this.updateOrgDomain(orgDomainId);\n }\n }\n\n private async updateOrgDomain(orgDomainId: string) {\n // Update this item so the last checked date gets updated.\n await this.orgDomainApiService.getByOrgIdAndOrgDomainId(this.organizationId, orgDomainId);\n }\n\n private handleVerifyDomainError(e: any, domainName: string): void {\n if (e instanceof ErrorResponse) {\n const errorResponse: ErrorResponse = e as ErrorResponse;\n switch (errorResponse.statusCode) {\n case HttpStatusCode.Conflict:\n if (errorResponse.message.includes(\"The domain is not available to be claimed\")) {\n this.platformUtilsService.showToast(\n \"error\",\n null,\n this.i18nService.t(\"domainNotAvailable\", domainName),\n );\n }\n break;\n\n default:\n this.validationService.showError(errorResponse);\n break;\n }\n }\n }\n\n async deleteDomain(orgDomainId: string): Promise {\n const confirmed = await this.dialogService.openSimpleDialog({\n title: { key: \"removeDomain\" },\n content: { key: \"removeDomainWarning\" },\n type: \"warning\",\n });\n\n if (!confirmed) {\n return;\n }\n\n await this.orgDomainApiService.delete(this.organizationId, orgDomainId);\n\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"domainRemoved\"));\n }\n\n ngOnDestroy(): void {\n this.componentDestroyed$.next();\n this.componentDestroyed$.complete();\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\nimport { ScimProviderType } from \"../../enums\";\n\nexport class ScimConfigApi extends BaseResponse {\n enabled: boolean;\n scimProvider: ScimProviderType;\n\n constructor(data: any) {\n super(data);\n if (data == null) {\n return;\n }\n this.enabled = this.getResponseProperty(\"Enabled\");\n this.scimProvider = this.getResponseProperty(\"ScimProvider\");\n }\n}\n","import { ScimProviderType } from \"../../enums\";\n\nexport class ScimConfigRequest {\n constructor(\n private enabled: boolean,\n private scimProvider: ScimProviderType = null,\n ) {}\n}\n","\n\n

    {{ \"scimDescription\" | i18n }}

    \n\n
    \n \n {{ \"loading\" | i18n }}\n
    \n\n
    \n
    \n \n \n
    \n {{ \"scimEnabledCheckboxDescHelpText\" | i18n }}\n
    \n
    \n
    \n\n \n {{ \"scimUrl\" | i18n }}\n \n \n \n\n \n {{ \"scimApiKey\" | i18n }}\n \n \n \n \n \n \n \n \n \n {{ \"scimApiKeyHelperText\" | i18n }}\n \n\n \n {{ \"save\" | i18n }}\n \n\n","import { Component, OnInit } from \"@angular/core\";\nimport { UntypedFormBuilder, FormControl } from \"@angular/forms\";\nimport { ActivatedRoute } from \"@angular/router\";\nimport { firstValueFrom } from \"rxjs\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { OrganizationApiServiceAbstraction } from \"@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction\";\nimport {\n OrganizationApiKeyType,\n OrganizationConnectionType,\n} from \"@bitwarden/common/admin-console/enums\";\nimport { ScimConfigApi } from \"@bitwarden/common/admin-console/models/api/scim-config.api\";\nimport { OrganizationApiKeyRequest } from \"@bitwarden/common/admin-console/models/request/organization-api-key.request\";\nimport { OrganizationConnectionRequest } from \"@bitwarden/common/admin-console/models/request/organization-connection.request\";\nimport { ScimConfigRequest } from \"@bitwarden/common/admin-console/models/request/scim-config.request\";\nimport { OrganizationConnectionResponse } from \"@bitwarden/common/admin-console/models/response/organization-connection.response\";\nimport { ApiKeyResponse } from \"@bitwarden/common/auth/models/response/api-key.response\";\nimport { EnvironmentService } from \"@bitwarden/common/platform/abstractions/environment.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { DialogService } from \"@bitwarden/components\";\n\n@Component({\n selector: \"app-org-manage-scim\",\n templateUrl: \"scim.component.html\",\n})\n// eslint-disable-next-line rxjs-angular/prefer-takeuntil\nexport class ScimComponent implements OnInit {\n loading = true;\n organizationId: string;\n existingConnectionId: string;\n formPromise: Promise>;\n rotatePromise: Promise;\n enabled = new FormControl(false);\n showScimSettings = false;\n showScimKey = false;\n\n formData = this.formBuilder.group({\n endpointUrl: new FormControl({ value: \"\", disabled: true }),\n clientSecret: new FormControl({ value: \"\", disabled: true }),\n });\n\n constructor(\n private formBuilder: UntypedFormBuilder,\n private route: ActivatedRoute,\n private apiService: ApiService,\n private platformUtilsService: PlatformUtilsService,\n private i18nService: I18nService,\n private environmentService: EnvironmentService,\n private organizationApiService: OrganizationApiServiceAbstraction,\n private dialogService: DialogService,\n ) {}\n\n async ngOnInit() {\n // eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe\n this.route.parent.parent.params.subscribe(async (params) => {\n this.organizationId = params.organizationId;\n await this.load();\n });\n }\n\n async load() {\n const connection = await this.apiService.getOrganizationConnection(\n this.organizationId,\n OrganizationConnectionType.Scim,\n ScimConfigApi,\n );\n await this.setConnectionFormValues(connection);\n }\n\n async loadApiKey() {\n const apiKeyRequest = new OrganizationApiKeyRequest();\n apiKeyRequest.type = OrganizationApiKeyType.Scim;\n apiKeyRequest.masterPasswordHash = \"N/A\";\n const apiKeyResponse = await this.organizationApiService.getOrCreateApiKey(\n this.organizationId,\n apiKeyRequest,\n );\n this.formData.setValue({\n endpointUrl: await this.getScimEndpointUrl(),\n clientSecret: apiKeyResponse.apiKey,\n });\n }\n\n async copyScimUrl() {\n this.platformUtilsService.copyToClipboard(await this.getScimEndpointUrl());\n }\n\n async rotateScimKey() {\n const confirmed = await this.dialogService.openSimpleDialog({\n title: { key: \"rotateScimKey\" },\n content: { key: \"rotateScimKeyWarning\" },\n acceptButtonText: { key: \"rotateKey\" },\n type: \"warning\",\n });\n\n if (!confirmed) {\n return false;\n }\n\n const request = new OrganizationApiKeyRequest();\n request.type = OrganizationApiKeyType.Scim;\n request.masterPasswordHash = \"N/A\";\n\n this.rotatePromise = this.organizationApiService.rotateApiKey(this.organizationId, request);\n\n try {\n const response = await this.rotatePromise;\n this.formData.setValue({\n endpointUrl: await this.getScimEndpointUrl(),\n clientSecret: response.apiKey,\n });\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"scimApiKeyRotated\"));\n } catch {\n // Logged by appApiAction, do nothing\n }\n\n this.rotatePromise = null;\n }\n\n async copyScimKey() {\n this.platformUtilsService.copyToClipboard(this.formData.get(\"clientSecret\").value);\n }\n\n async submit() {\n try {\n const request = new OrganizationConnectionRequest(\n this.organizationId,\n OrganizationConnectionType.Scim,\n true,\n new ScimConfigRequest(this.enabled.value),\n );\n if (this.existingConnectionId == null) {\n this.formPromise = this.apiService.createOrganizationConnection(request, ScimConfigApi);\n } else {\n this.formPromise = this.apiService.updateOrganizationConnection(\n request,\n ScimConfigApi,\n this.existingConnectionId,\n );\n }\n const response = (await this.formPromise) as OrganizationConnectionResponse;\n await this.setConnectionFormValues(response);\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"scimSettingsSaved\"));\n } catch (e) {\n // Logged by appApiAction, do nothing\n }\n\n this.formPromise = null;\n }\n\n async getScimEndpointUrl() {\n const env = await firstValueFrom(this.environmentService.environment$);\n return env.getScimUrl() + \"/\" + this.organizationId;\n }\n\n toggleScimKey() {\n this.showScimKey = !this.showScimKey;\n document.getElementById(\"clientSecret\").focus();\n }\n\n private async setConnectionFormValues(connection: OrganizationConnectionResponse) {\n this.existingConnectionId = connection?.id;\n if (connection !== null && connection.config?.enabled) {\n this.showScimSettings = true;\n this.enabled.setValue(true);\n this.formData.setValue({\n endpointUrl: await this.getScimEndpointUrl(),\n clientSecret: \"\",\n });\n await this.loadApiKey();\n } else {\n this.showScimSettings = false;\n this.enabled.setValue(false);\n }\n this.loading = false;\n }\n}\n","import { NgModule } from \"@angular/core\";\nimport { RouterModule, Routes } from \"@angular/router\";\n\nimport { AuthGuard } from \"@bitwarden/angular/auth/guards\";\nimport { canAccessSettingsTab } from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\nimport { OrganizationPermissionsGuard } from \"@bitwarden/web-vault/app/admin-console/organizations/guards/org-permissions.guard\";\nimport { OrganizationLayoutComponent } from \"@bitwarden/web-vault/app/admin-console/organizations/layouts/organization-layout.component\";\n\nimport { SsoComponent } from \"../../auth/sso/sso.component\";\n\nimport { DeviceApprovalsComponent } from \"./manage/device-approvals/device-approvals.component\";\nimport { DomainVerificationComponent } from \"./manage/domain-verification/domain-verification.component\";\nimport { ScimComponent } from \"./manage/scim.component\";\n\nconst routes: Routes = [\n {\n path: \"organizations/:organizationId\",\n component: OrganizationLayoutComponent,\n canActivate: [AuthGuard, OrganizationPermissionsGuard],\n children: [\n {\n path: \"settings\",\n canActivate: [OrganizationPermissionsGuard],\n data: {\n organizationPermissions: canAccessSettingsTab,\n },\n children: [\n {\n path: \"domain-verification\",\n component: DomainVerificationComponent,\n canActivate: [OrganizationPermissionsGuard],\n data: {\n titleId: \"domainVerification\",\n organizationPermissions: (org: Organization) => org.canManageDomainVerification,\n },\n },\n {\n path: \"sso\",\n component: SsoComponent,\n canActivate: [OrganizationPermissionsGuard],\n data: {\n titleId: \"singleSignOn\",\n organizationPermissions: (org: Organization) => org.canManageSso,\n },\n },\n {\n path: \"scim\",\n component: ScimComponent,\n canActivate: [OrganizationPermissionsGuard],\n data: {\n titleId: \"scim\",\n organizationPermissions: (org: Organization) => org.canManageScim,\n },\n },\n {\n path: \"device-approvals\",\n component: DeviceApprovalsComponent,\n canActivate: [OrganizationPermissionsGuard],\n data: {\n organizationPermissions: (org: Organization) => org.canManageDeviceApprovals,\n titleId: \"deviceApprovals\",\n },\n },\n ],\n },\n ],\n },\n];\n\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule],\n})\nexport class OrganizationsRoutingModule {}\n","import { NgModule } from \"@angular/core\";\n\nimport { NoItemsModule } from \"@bitwarden/components\";\nimport { LooseComponentsModule } from \"@bitwarden/web-vault/app/shared\";\nimport { SharedModule } from \"@bitwarden/web-vault/app/shared/shared.module\";\n\nimport { SsoComponent } from \"../../auth/sso/sso.component\";\n\nimport { CoreOrganizationModule } from \"./core\";\nimport { DeviceApprovalsComponent } from \"./manage/device-approvals/device-approvals.component\";\nimport { DomainAddEditDialogComponent } from \"./manage/domain-verification/domain-add-edit-dialog/domain-add-edit-dialog.component\";\nimport { DomainVerificationComponent } from \"./manage/domain-verification/domain-verification.component\";\nimport { ScimComponent } from \"./manage/scim.component\";\nimport { OrganizationsRoutingModule } from \"./organizations-routing.module\";\n\n@NgModule({\n imports: [\n SharedModule,\n CoreOrganizationModule,\n OrganizationsRoutingModule,\n NoItemsModule,\n LooseComponentsModule,\n ],\n declarations: [\n SsoComponent,\n ScimComponent,\n DomainVerificationComponent,\n DomainAddEditDialogComponent,\n DeviceApprovalsComponent,\n ],\n})\nexport class OrganizationsModule {}\n","import { Injectable } from \"@angular/core\";\nimport { ActivatedRouteSnapshot, CanActivate, Router } from \"@angular/router\";\n\nimport { ProviderService } from \"@bitwarden/common/admin-console/abstractions/provider.service\";\nimport { Provider } from \"@bitwarden/common/admin-console/models/domain/provider\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\n\n@Injectable()\nexport class ProviderPermissionsGuard implements CanActivate {\n constructor(\n private providerService: ProviderService,\n private router: Router,\n private platformUtilsService: PlatformUtilsService,\n private i18nService: I18nService,\n ) {}\n\n async canActivate(route: ActivatedRouteSnapshot) {\n const provider = await this.providerService.get(route.params.providerId);\n if (provider == null) {\n return this.router.createUrlTree([\"/\"]);\n }\n\n if (!provider.isProviderAdmin && !provider.enabled) {\n this.platformUtilsService.showToast(\"error\", null, this.i18nService.t(\"providerIsDisabled\"));\n return this.router.createUrlTree([\"/\"]);\n }\n\n const permissionsCallback: (provider: Provider) => boolean = route.data?.providerPermissions;\n const hasSpecifiedPermissions = permissionsCallback == null || permissionsCallback(provider);\n\n if (!hasSpecifiedPermissions) {\n this.platformUtilsService.showToast(\"error\", null, this.i18nService.t(\"accessDenied\"));\n return this.router.createUrlTree([\"/providers\", provider.id]);\n }\n\n return true;\n }\n}\n","import { svgIcon } from \"@bitwarden/components\";\n\nexport const ProviderPortalLogo = svgIcon`\n\n`;\n","\n \n \n \n\n","import { CommonModule } from \"@angular/common\";\nimport { Component } from \"@angular/core\";\nimport { ActivatedRoute, RouterModule } from \"@angular/router\";\n\nimport { JslibModule } from \"@bitwarden/angular/jslib.module\";\nimport { ProviderService } from \"@bitwarden/common/admin-console/abstractions/provider.service\";\nimport { Provider } from \"@bitwarden/common/admin-console/models/domain/provider\";\nimport { FeatureFlag } from \"@bitwarden/common/enums/feature-flag.enum\";\nimport { ConfigServiceAbstraction as ConfigService } from \"@bitwarden/common/platform/abstractions/config/config.service.abstraction\";\nimport { IconModule, LayoutComponent, NavigationModule } from \"@bitwarden/components\";\nimport { ProviderPortalLogo } from \"@bitwarden/web-vault/app/admin-console/icons/provider-portal-logo\";\nimport { PaymentMethodWarningsModule } from \"@bitwarden/web-vault/app/billing/shared\";\n\n@Component({\n selector: \"providers-layout\",\n templateUrl: \"providers-layout.component.html\",\n standalone: true,\n imports: [\n CommonModule,\n RouterModule,\n JslibModule,\n LayoutComponent,\n IconModule,\n NavigationModule,\n PaymentMethodWarningsModule,\n ],\n})\n// eslint-disable-next-line rxjs-angular/prefer-takeuntil\nexport class ProvidersLayoutComponent {\n protected readonly logo = ProviderPortalLogo;\n\n provider: Provider;\n private providerId: string;\n\n protected showPaymentMethodWarningBanners$ = this.configService.getFeatureFlag$(\n FeatureFlag.ShowPaymentMethodWarningBanners,\n false,\n );\n\n constructor(\n private route: ActivatedRoute,\n private providerService: ProviderService,\n private configService: ConfigService,\n ) {}\n\n ngOnInit() {\n document.body.classList.remove(\"layout_frontend\");\n // eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe\n this.route.params.subscribe(async (params) => {\n this.providerId = params.providerId;\n await this.load();\n });\n }\n\n async load() {\n this.provider = await this.providerService.get(this.providerId);\n }\n\n get showMenuBar() {\n return this.showManageTab || this.showSettingsTab;\n }\n\n get showManageTab() {\n return this.provider.canManageUsers || this.provider.canAccessEventLogs;\n }\n\n get showSettingsTab() {\n return this.provider.isProviderAdmin;\n }\n\n get manageRoute(): string {\n switch (true) {\n case this.provider.canManageUsers:\n return \"manage/people\";\n case this.provider.canAccessEventLogs:\n return \"manage/events\";\n }\n }\n}\n","\n\n\n

    \n \n {{ \"loading\" | i18n }}\n

    \n \n \n \n \n \n \n \n \n
    \n \n \n {{ p.name }}\n \n \n {{ \"providerIsDisabled\" | i18n }}\n \n
    \n
    \n
    \n","import { Component, OnInit } from \"@angular/core\";\n\nimport { ProviderService } from \"@bitwarden/common/admin-console/abstractions/provider.service\";\nimport { Provider } from \"@bitwarden/common/admin-console/models/domain/provider\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\n\n@Component({\n selector: \"app-providers\",\n templateUrl: \"providers.component.html\",\n})\nexport class ProvidersComponent implements OnInit {\n providers: Provider[];\n loaded = false;\n actionPromise: Promise;\n\n constructor(\n private providerService: ProviderService,\n private i18nService: I18nService,\n ) {}\n\n async ngOnInit() {\n document.body.classList.remove(\"layout_frontend\");\n await this.load();\n }\n\n async load() {\n const providers = await this.providerService.getAll();\n providers.sort(Utils.getSortFunction(this.i18nService, \"name\"));\n this.providers = providers;\n this.loaded = true;\n }\n}\n","export class ProviderAddOrganizationRequest {\n organizationId: string;\n key: string;\n}\n","import { Injectable } from \"@angular/core\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { ProviderAddOrganizationRequest } from \"@bitwarden/common/admin-console/models/request/provider/provider-add-organization.request\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { SyncService } from \"@bitwarden/common/vault/abstractions/sync/sync.service.abstraction\";\n\n@Injectable()\nexport class WebProviderService {\n constructor(\n private cryptoService: CryptoService,\n private syncService: SyncService,\n private apiService: ApiService,\n ) {}\n\n async addOrganizationToProvider(providerId: string, organizationId: string) {\n const orgKey = await this.cryptoService.getOrgKey(organizationId);\n const providerKey = await this.cryptoService.getProviderKey(providerId);\n\n const encryptedOrgKey = await this.cryptoService.encrypt(orgKey.key, providerKey);\n\n const request = new ProviderAddOrganizationRequest();\n request.organizationId = organizationId;\n request.key = encryptedOrgKey.encryptedString;\n\n const response = await this.apiService.postProviderAddOrganization(providerId, request);\n await this.syncService.fullSync(true);\n return response;\n }\n\n async detachOrganization(providerId: string, organizationId: string): Promise {\n await this.apiService.deleteProviderOrganization(providerId, organizationId);\n await this.syncService.fullSync(true);\n }\n}\n","\n {{ \"addExistingOrganization\" | i18n }}\n \n \n \n \n \n \n \n \n {{ o.name }}\n \n \n \n \n \n \n \n \n \n \n \n\n","import { DIALOG_DATA, DialogRef } from \"@angular/cdk/dialog\";\nimport { Component, Inject, OnInit } from \"@angular/core\";\n\nimport { ProviderService } from \"@bitwarden/common/admin-console/abstractions/provider.service\";\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\nimport { Provider } from \"@bitwarden/common/admin-console/models/domain/provider\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { ValidationService } from \"@bitwarden/common/platform/abstractions/validation.service\";\nimport { DialogService } from \"@bitwarden/components\";\n\nimport { WebProviderService } from \"../services/web-provider.service\";\n\ninterface AddOrganizationDialogData {\n providerId: string;\n organizations: Organization[];\n}\n\n@Component({\n templateUrl: \"add-organization.component.html\",\n})\nexport class AddOrganizationComponent implements OnInit {\n protected provider: Provider;\n protected loading = true;\n\n constructor(\n private dialogRef: DialogRef,\n @Inject(DIALOG_DATA) protected data: AddOrganizationDialogData,\n private providerService: ProviderService,\n private webProviderService: WebProviderService,\n private i18nService: I18nService,\n private platformUtilsService: PlatformUtilsService,\n private validationService: ValidationService,\n private dialogService: DialogService,\n ) {}\n\n async ngOnInit() {\n await this.load();\n }\n\n async load() {\n if (this.data.providerId == null) {\n return;\n }\n\n this.provider = await this.providerService.get(this.data.providerId);\n\n this.loading = false;\n }\n\n add(organization: Organization) {\n return async () => {\n const confirmed = await this.dialogService.openSimpleDialog({\n title: organization.name,\n content: {\n key: \"addOrganizationConfirmation\",\n placeholders: [organization.name, this.provider.name],\n },\n type: \"warning\",\n });\n\n if (!confirmed) {\n return false;\n }\n\n try {\n await this.webProviderService.addOrganizationToProvider(\n this.data.providerId,\n organization.id,\n );\n } catch (e) {\n this.validationService.showError(e);\n return;\n }\n\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"organizationJoinedProvider\"),\n );\n\n this.dialogRef.close(true);\n };\n }\n\n static open(dialogService: DialogService, data: AddOrganizationDialogData) {\n return dialogService.open(AddOrganizationComponent, {\n data,\n });\n }\n}\n","\n \n \n \n {{ \"newClient\" | i18n }}\n \n \n \n {{ \"addExistingOrganization\" | i18n }}\n \n\n\n\n \n {{ \"loading\" | i18n }}\n\n\n\n

    {{ \"noClientsInList\" | i18n }}

    \n \n \n \n \n {{ \"name\" | i18n }}\n {{ \"numberOfUsers\" | i18n }}\n {{ \"billingPlan\" | i18n }}\n \n \n \n \n \n \n \n \n \n {{ o.organizationName }}\n \n \n {{ o.userCount }}\n / {{ o.seats }}\n \n \n {{ o.plan }}\n \n \n \n \n \n \n \n \n\n","import { Component, OnInit } from \"@angular/core\";\nimport { ActivatedRoute } from \"@angular/router\";\nimport { firstValueFrom } from \"rxjs\";\nimport { first } from \"rxjs/operators\";\n\nimport { ModalService } from \"@bitwarden/angular/services/modal.service\";\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { SearchService } from \"@bitwarden/common/abstractions/search.service\";\nimport { OrganizationApiServiceAbstraction } from \"@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction\";\nimport { OrganizationService } from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport { ProviderService } from \"@bitwarden/common/admin-console/abstractions/provider.service\";\nimport { ProviderUserType } from \"@bitwarden/common/admin-console/enums\";\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\nimport { ProviderOrganizationOrganizationDetailsResponse } from \"@bitwarden/common/admin-console/models/response/provider/provider-organization.response\";\nimport { PlanType } from \"@bitwarden/common/billing/enums\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { ValidationService } from \"@bitwarden/common/platform/abstractions/validation.service\";\nimport { DialogService } from \"@bitwarden/components\";\n\nimport { WebProviderService } from \"../services/web-provider.service\";\n\nimport { AddOrganizationComponent } from \"./add-organization.component\";\n\nconst DisallowedPlanTypes = [\n PlanType.Free,\n PlanType.FamiliesAnnually2019,\n PlanType.FamiliesAnnually,\n PlanType.TeamsStarter,\n];\n\n@Component({\n templateUrl: \"clients.component.html\",\n})\n// eslint-disable-next-line rxjs-angular/prefer-takeuntil\nexport class ClientsComponent implements OnInit {\n providerId: string;\n searchText: string;\n addableOrganizations: Organization[];\n loading = true;\n manageOrganizations = false;\n showAddExisting = false;\n\n clients: ProviderOrganizationOrganizationDetailsResponse[];\n pagedClients: ProviderOrganizationOrganizationDetailsResponse[];\n\n protected didScroll = false;\n protected pageSize = 100;\n protected actionPromise: Promise;\n private pagedClientsCount = 0;\n\n constructor(\n private route: ActivatedRoute,\n private providerService: ProviderService,\n private apiService: ApiService,\n private searchService: SearchService,\n private platformUtilsService: PlatformUtilsService,\n private i18nService: I18nService,\n private validationService: ValidationService,\n private webProviderService: WebProviderService,\n private logService: LogService,\n private modalService: ModalService,\n private organizationService: OrganizationService,\n private organizationApiService: OrganizationApiServiceAbstraction,\n private dialogService: DialogService,\n ) {}\n\n async ngOnInit() {\n // eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe\n this.route.parent.params.subscribe(async (params) => {\n this.providerId = params.providerId;\n\n await this.load();\n\n /* eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe, rxjs/no-nested-subscribe */\n this.route.queryParams.pipe(first()).subscribe(async (qParams) => {\n this.searchText = qParams.search;\n });\n });\n }\n\n async load() {\n const response = await this.apiService.getProviderClients(this.providerId);\n this.clients = response.data != null && response.data.length > 0 ? response.data : [];\n this.manageOrganizations =\n (await this.providerService.get(this.providerId)).type === ProviderUserType.ProviderAdmin;\n const candidateOrgs = (await this.organizationService.getAll()).filter(\n (o) => o.isOwner && o.providerId == null,\n );\n const allowedOrgsIds = await Promise.all(\n candidateOrgs.map((o) => this.organizationApiService.get(o.id)),\n ).then((orgs) =>\n orgs.filter((o) => !DisallowedPlanTypes.includes(o.planType)).map((o) => o.id),\n );\n this.addableOrganizations = candidateOrgs.filter((o) => allowedOrgsIds.includes(o.id));\n\n this.showAddExisting = this.addableOrganizations.length !== 0;\n this.loading = false;\n }\n\n isPaging() {\n const searching = this.isSearching();\n if (searching && this.didScroll) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.resetPaging();\n }\n return !searching && this.clients && this.clients.length > this.pageSize;\n }\n\n isSearching() {\n return this.searchService.isSearchable(this.searchText);\n }\n\n async resetPaging() {\n this.pagedClients = [];\n this.loadMore();\n }\n\n loadMore() {\n if (!this.clients || this.clients.length <= this.pageSize) {\n return;\n }\n const pagedLength = this.pagedClients.length;\n let pagedSize = this.pageSize;\n if (pagedLength === 0 && this.pagedClientsCount > this.pageSize) {\n pagedSize = this.pagedClientsCount;\n }\n if (this.clients.length > pagedLength) {\n this.pagedClients = this.pagedClients.concat(\n this.clients.slice(pagedLength, pagedLength + pagedSize),\n );\n }\n this.pagedClientsCount = this.pagedClients.length;\n this.didScroll = this.pagedClients.length > this.pageSize;\n }\n\n async addExistingOrganization() {\n const dialogRef = AddOrganizationComponent.open(this.dialogService, {\n providerId: this.providerId,\n organizations: this.addableOrganizations,\n });\n\n if (await firstValueFrom(dialogRef.closed)) {\n await this.load();\n }\n }\n\n async remove(organization: ProviderOrganizationOrganizationDetailsResponse) {\n const confirmed = await this.dialogService.openSimpleDialog({\n title: organization.organizationName,\n content: { key: \"detachOrganizationConfirmation\" },\n type: \"warning\",\n });\n\n if (!confirmed) {\n return false;\n }\n\n this.actionPromise = this.webProviderService.detachOrganization(\n this.providerId,\n organization.id,\n );\n try {\n await this.actionPromise;\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"detachedOrganization\", organization.organizationName),\n );\n await this.load();\n } catch (e) {\n this.validationService.showError(e);\n }\n this.actionPromise = null;\n }\n}\n","import { Component, OnInit, ViewChild } from \"@angular/core\";\nimport { ActivatedRoute } from \"@angular/router\";\n\nimport { OrganizationPlansComponent } from \"@bitwarden/web-vault/app/billing\";\n\n@Component({\n selector: \"app-create-organization\",\n templateUrl: \"create-organization.component.html\",\n})\n// eslint-disable-next-line rxjs-angular/prefer-takeuntil\nexport class CreateOrganizationComponent implements OnInit {\n @ViewChild(OrganizationPlansComponent, { static: true })\n orgPlansComponent: OrganizationPlansComponent;\n\n providerId: string;\n\n constructor(private route: ActivatedRoute) {}\n\n ngOnInit() {\n // eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe\n this.route.parent.params.subscribe(async (params) => {\n this.providerId = params.providerId;\n });\n }\n}\n","\n

    {{ \"newClientOrganizationDesc\" | i18n }}

    \n\n","export class ProviderUserAcceptRequest {\n token: string;\n}\n","
    \n
    \n \"Bitwarden\"\n

    \n \n {{ \"loading\" | i18n }}\n

    \n
    \n
    \n
    \n
    \n
    \n

    {{ \"joinProvider\" | i18n }}

    \n
    \n
    \n

    \n {{ providerName }}\n {{ email }}\n

    \n

    {{ \"joinProviderDesc\" | i18n }}

    \n
    \n
    \n \n {{ \"logIn\" | i18n }}\n \n \n {{ \"createAccount\" | i18n }}\n \n
    \n
    \n
    \n
    \n
    \n
    \n","import { Component } from \"@angular/core\";\nimport { ActivatedRoute, Params, Router } from \"@angular/router\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { ProviderUserAcceptRequest } from \"@bitwarden/common/admin-console/models/request/provider/provider-user-accept.request\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { BaseAcceptComponent } from \"@bitwarden/web-vault/app/common/base.accept.component\";\n\n@Component({\n selector: \"app-accept-provider\",\n templateUrl: \"accept-provider.component.html\",\n})\nexport class AcceptProviderComponent extends BaseAcceptComponent {\n providerName: string;\n\n failedMessage = \"providerInviteAcceptFailed\";\n\n requiredParameters = [\"providerId\", \"providerUserId\", \"token\"];\n\n constructor(\n router: Router,\n i18nService: I18nService,\n route: ActivatedRoute,\n stateService: StateService,\n private apiService: ApiService,\n platformUtilService: PlatformUtilsService,\n ) {\n super(router, platformUtilService, i18nService, route, stateService);\n }\n\n async authedHandler(qParams: Params) {\n const request = new ProviderUserAcceptRequest();\n request.token = qParams.token;\n\n await this.apiService.postProviderUserAccept(\n qParams.providerId,\n qParams.providerUserId,\n request,\n );\n this.platformUtilService.showToast(\n \"success\",\n this.i18nService.t(\"inviteAccepted\"),\n this.i18nService.t(\"providerInviteAcceptedDesc\"),\n { timeout: 10000 },\n );\n this.router.navigate([\"/vault\"]);\n }\n\n async unauthedHandler(qParams: Params) {\n this.providerName = qParams.providerName;\n }\n}\n","\n\n
    \n
    \n \n \n -\n \n \n
    \n
    \n \n \n {{ \"refresh\" | i18n }}\n \n \n
    \n \n \n {{ \"export\" | i18n }}\n \n \n
    \n\n\n \n {{ \"loading\" | i18n }}\n\n\n

    {{ \"noEventsInList\" | i18n }}

    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    {{ \"timestamp\" | i18n }}\n {{ \"device\" | i18n }}\n {{ \"user\" | i18n }}{{ \"event\" | i18n }}
    {{ e.date | date: \"medium\" }}\n \n {{ e.appName }}, {{ e.ip }}\n \n {{ e.userName }}\n
    \n \n \n {{ \"loadMore\" | i18n }}\n \n
    \n","import { Component, OnInit } from \"@angular/core\";\nimport { ActivatedRoute, Router } from \"@angular/router\";\n\nimport { UserNamePipe } from \"@bitwarden/angular/pipes/user-name.pipe\";\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { ProviderService } from \"@bitwarden/common/admin-console/abstractions/provider.service\";\nimport { EventResponse } from \"@bitwarden/common/models/response/event.response\";\nimport { FileDownloadService } from \"@bitwarden/common/platform/abstractions/file-download/file-download.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { BaseEventsComponent } from \"@bitwarden/web-vault/app/admin-console/common/base.events.component\";\nimport { EventService } from \"@bitwarden/web-vault/app/core\";\nimport { EventExportService } from \"@bitwarden/web-vault/app/tools/event-export\";\n\n@Component({\n selector: \"provider-events\",\n templateUrl: \"events.component.html\",\n})\n// eslint-disable-next-line rxjs-angular/prefer-takeuntil\nexport class EventsComponent extends BaseEventsComponent implements OnInit {\n exportFileName = \"provider-events\";\n providerId: string;\n\n private providerUsersUserIdMap = new Map();\n private providerUsersIdMap = new Map();\n\n constructor(\n private apiService: ApiService,\n private route: ActivatedRoute,\n eventService: EventService,\n i18nService: I18nService,\n private providerService: ProviderService,\n exportService: EventExportService,\n platformUtilsService: PlatformUtilsService,\n private router: Router,\n logService: LogService,\n private userNamePipe: UserNamePipe,\n fileDownloadService: FileDownloadService,\n ) {\n super(\n eventService,\n i18nService,\n exportService,\n platformUtilsService,\n logService,\n fileDownloadService,\n );\n }\n\n async ngOnInit() {\n // eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe\n this.route.parent.parent.params.subscribe(async (params) => {\n this.providerId = params.providerId;\n const provider = await this.providerService.get(this.providerId);\n if (provider == null || !provider.useEvents) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/providers\", this.providerId]);\n return;\n }\n await this.load();\n });\n }\n\n async load() {\n const response = await this.apiService.getProviderUsers(this.providerId);\n response.data.forEach((u) => {\n const name = this.userNamePipe.transform(u);\n this.providerUsersIdMap.set(u.id, { name: name, email: u.email });\n this.providerUsersUserIdMap.set(u.userId, { name: name, email: u.email });\n });\n await this.loadEvents(true);\n this.loaded = true;\n }\n\n protected requestEvents(startDate: string, endDate: string, continuationToken: string) {\n return this.apiService.getEventsProvider(\n this.providerId,\n startDate,\n endDate,\n continuationToken,\n );\n }\n\n protected getUserName(r: EventResponse, userId: string) {\n if (r.installationId != null) {\n return `Installation: ${r.installationId}`;\n }\n\n if (userId != null && this.providerUsersUserIdMap.has(userId)) {\n return this.providerUsersUserIdMap.get(userId);\n }\n\n return null;\n }\n}\n","export class ProviderUserBulkRequest {\n ids: string[];\n\n constructor(ids: string[]) {\n this.ids = ids == null ? [] : ids;\n }\n}\n","export class ProviderUserConfirmRequest {\n key: string;\n}\n","type ProviderUserBulkRequestEntry = {\n id: string;\n key: string;\n};\n\nexport class ProviderUserBulkConfirmRequest {\n keys: ProviderUserBulkRequestEntry[];\n\n constructor(keys: ProviderUserBulkRequestEntry[]) {\n this.keys = keys;\n }\n}\n","import { Component, Input } from \"@angular/core\";\n\nimport { ProviderUserStatusType } from \"@bitwarden/common/admin-console/enums\";\nimport { ProviderUserBulkConfirmRequest } from \"@bitwarden/common/admin-console/models/request/provider/provider-user-bulk-confirm.request\";\nimport { ProviderUserBulkRequest } from \"@bitwarden/common/admin-console/models/request/provider/provider-user-bulk.request\";\nimport { SymmetricCryptoKey } from \"@bitwarden/common/platform/models/domain/symmetric-crypto-key\";\nimport { BulkConfirmComponent as OrganizationBulkConfirmComponent } from \"@bitwarden/web-vault/app/admin-console/organizations/members/components/bulk/bulk-confirm.component\";\nimport { BulkUserDetails } from \"@bitwarden/web-vault/app/admin-console/organizations/members/components/bulk/bulk-status.component\";\n\n@Component({\n templateUrl:\n \"../../../../../../../../apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-confirm.component.html\",\n})\nexport class BulkConfirmComponent extends OrganizationBulkConfirmComponent {\n @Input() providerId: string;\n\n protected override isAccepted(user: BulkUserDetails) {\n return user.status === ProviderUserStatusType.Accepted;\n }\n\n protected override async getPublicKeys() {\n const request = new ProviderUserBulkRequest(this.filteredUsers.map((user) => user.id));\n return await this.apiService.postProviderUsersPublicKey(this.providerId, request);\n }\n\n protected override getCryptoKey(): Promise {\n return this.cryptoService.getProviderKey(this.providerId);\n }\n\n protected override async postConfirmRequest(userIdsWithKeys: any[]) {\n const request = new ProviderUserBulkConfirmRequest(userIdsWithKeys);\n return await this.apiService.postProviderUserBulkConfirm(this.providerId, request);\n }\n}\n","import { Component, Input } from \"@angular/core\";\n\nimport { ProviderUserBulkRequest } from \"@bitwarden/common/admin-console/models/request/provider/provider-user-bulk.request\";\nimport { BulkRemoveComponent as OrganizationBulkRemoveComponent } from \"@bitwarden/web-vault/app/admin-console/organizations/members/components/bulk/bulk-remove.component\";\n\n@Component({\n templateUrl:\n \"../../../../../../../../apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-remove.component.html\",\n})\nexport class BulkRemoveComponent extends OrganizationBulkRemoveComponent {\n @Input() providerId: string;\n\n async deleteUsers() {\n const request = new ProviderUserBulkRequest(this.users.map((user) => user.id));\n return await this.apiService.deleteManyProviderUsers(this.providerId, request);\n }\n\n protected get removeUsersWarning() {\n return this.i18nService.t(\"removeUsersWarning\");\n }\n}\n","import { ProviderUserType } from \"../../../enums\";\n\nexport class ProviderUserInviteRequest {\n emails: string[] = [];\n type: ProviderUserType;\n}\n","import { ProviderUserType } from \"../../../enums\";\n\nexport class ProviderUserUpdateRequest {\n type: ProviderUserType;\n}\n","
    \n
    \n \n
    \n

    \n {{ title }}\n {{ name }}\n

    \n \n ×\n \n
    \n
    \n \n {{ \"loading\" | i18n }}\n
    \n
    \n \n

    {{ \"providerInviteUserDesc\" | i18n }}

    \n
    \n \n \n {{ \"inviteMultipleEmailDesc\" | i18n: \"20\" }}\n
    \n
    \n

    \n {{ \"userType\" | i18n }}\n \n \n \n

    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n
    \n \n \n
    \n \n \n \n \n
    \n
    \n \n
    \n
    \n","import { Component, EventEmitter, Input, OnInit, Output } from \"@angular/core\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { ProviderUserType } from \"@bitwarden/common/admin-console/enums\";\nimport { PermissionsApi } from \"@bitwarden/common/admin-console/models/api/permissions.api\";\nimport { ProviderUserInviteRequest } from \"@bitwarden/common/admin-console/models/request/provider/provider-user-invite.request\";\nimport { ProviderUserUpdateRequest } from \"@bitwarden/common/admin-console/models/request/provider/provider-user-update.request\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { DialogService } from \"@bitwarden/components\";\n\n@Component({\n selector: \"provider-user-add-edit\",\n templateUrl: \"user-add-edit.component.html\",\n})\nexport class UserAddEditComponent implements OnInit {\n @Input() name: string;\n @Input() providerUserId: string;\n @Input() providerId: string;\n @Output() onSavedUser = new EventEmitter();\n @Output() onDeletedUser = new EventEmitter();\n\n loading = true;\n editMode = false;\n title: string;\n emails: string;\n type: ProviderUserType = ProviderUserType.ServiceUser;\n permissions = new PermissionsApi();\n showCustom = false;\n access: \"all\" | \"selected\" = \"selected\";\n formPromise: Promise;\n deletePromise: Promise;\n userType = ProviderUserType;\n\n constructor(\n private apiService: ApiService,\n private i18nService: I18nService,\n private platformUtilsService: PlatformUtilsService,\n private logService: LogService,\n private dialogService: DialogService,\n ) {}\n\n async ngOnInit() {\n this.editMode = this.loading = this.providerUserId != null;\n\n if (this.editMode) {\n this.editMode = true;\n this.title = this.i18nService.t(\"editUser\");\n try {\n const user = await this.apiService.getProviderUser(this.providerId, this.providerUserId);\n this.type = user.type;\n } catch (e) {\n this.logService.error(e);\n }\n } else {\n this.title = this.i18nService.t(\"inviteUser\");\n }\n\n this.loading = false;\n }\n\n async submit() {\n try {\n if (this.editMode) {\n const request = new ProviderUserUpdateRequest();\n request.type = this.type;\n this.formPromise = this.apiService.putProviderUser(\n this.providerId,\n this.providerUserId,\n request,\n );\n } else {\n const request = new ProviderUserInviteRequest();\n request.emails = this.emails.trim().split(/\\s*,\\s*/);\n request.type = this.type;\n this.formPromise = this.apiService.postProviderUserInvite(this.providerId, request);\n }\n await this.formPromise;\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(this.editMode ? \"editedUserId\" : \"invitedUsers\", this.name),\n );\n this.onSavedUser.emit();\n } catch (e) {\n this.logService.error(e);\n }\n }\n\n async delete() {\n if (!this.editMode) {\n return;\n }\n\n const confirmed = await this.dialogService.openSimpleDialog({\n title: this.name,\n content: { key: \"removeUserConfirmation\" },\n type: \"warning\",\n });\n\n if (!confirmed) {\n return false;\n }\n\n try {\n this.deletePromise = this.apiService.deleteProviderUser(this.providerId, this.providerUserId);\n await this.deletePromise;\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"removedUserId\", this.name),\n );\n this.onDeletedUser.emit();\n } catch (e) {\n this.logService.error(e);\n }\n }\n}\n","\n \n \n\n\n
    \n \n \n {{ \"all\" | i18n }}\n {{ allCount }}\n \n\n \n {{ \"invited\" | i18n }}\n {{ invitedCount }}\n \n\n \n {{ \"accepted\" | i18n }}\n {{ acceptedCount }}\n \n \n\n
    \n \n \n \n
    \n \n \n \n {{ \"confirmSelected\" | i18n }}\n \n \n
    \n \n \n
    \n
    \n
    \n\n\n \n {{ \"loading\" | i18n }}\n\n\n

    {{ \"noUsersInList\" | i18n }}

    \n \n \n {{ \"providerUsersNeedConfirmed\" | i18n }}\n \n \n \n \n \n \n \n \n \n \n \n {{ u.email }}\n {{\n \"invited\" | i18n\n }}\n {{\n \"accepted\" | i18n\n }}\n {{ u.name }}\n \n \n \n \n {{ \"userUsingTwoStep\" | i18n }}\n \n \n \n {{ \"providerAdmin\" | i18n }}\n {{ \"serviceUser\" | i18n }}\n \n \n
    \n \n \n \n
    \n \n \n {{ \"resendInvitation\" | i18n }}\n \n \n \n {{ \"confirm\" | i18n }}\n \n \n \n {{ \"eventLogs\" | i18n }}\n \n \n \n {{ \"remove\" | i18n }}\n \n
    \n
    \n \n \n \n \n
    \n\n\n\n\n\n\n","import { Component, OnInit, ViewChild, ViewContainerRef } from \"@angular/core\";\nimport { ActivatedRoute, Router } from \"@angular/router\";\nimport { first } from \"rxjs/operators\";\n\nimport { SearchPipe } from \"@bitwarden/angular/pipes/search.pipe\";\nimport { UserNamePipe } from \"@bitwarden/angular/pipes/user-name.pipe\";\nimport { ModalService } from \"@bitwarden/angular/services/modal.service\";\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { SearchService } from \"@bitwarden/common/abstractions/search.service\";\nimport { OrganizationManagementPreferencesService } from \"@bitwarden/common/admin-console/abstractions/organization-management-preferences/organization-management-preferences.service\";\nimport { ProviderService } from \"@bitwarden/common/admin-console/abstractions/provider.service\";\nimport { ProviderUserStatusType, ProviderUserType } from \"@bitwarden/common/admin-console/enums\";\nimport { ProviderUserBulkRequest } from \"@bitwarden/common/admin-console/models/request/provider/provider-user-bulk.request\";\nimport { ProviderUserConfirmRequest } from \"@bitwarden/common/admin-console/models/request/provider/provider-user-confirm.request\";\nimport { ProviderUserBulkResponse } from \"@bitwarden/common/admin-console/models/response/provider/provider-user-bulk.response\";\nimport { ProviderUserUserDetailsResponse } from \"@bitwarden/common/admin-console/models/response/provider/provider-user.response\";\nimport { ListResponse } from \"@bitwarden/common/models/response/list.response\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { ValidationService } from \"@bitwarden/common/platform/abstractions/validation.service\";\nimport { DialogService } from \"@bitwarden/components\";\nimport { BasePeopleComponent } from \"@bitwarden/web-vault/app/admin-console/common/base.people.component\";\nimport { openEntityEventsDialog } from \"@bitwarden/web-vault/app/admin-console/organizations/manage/entity-events.component\";\nimport { BulkStatusComponent } from \"@bitwarden/web-vault/app/admin-console/organizations/members/components/bulk/bulk-status.component\";\n\nimport { BulkConfirmComponent } from \"./bulk/bulk-confirm.component\";\nimport { BulkRemoveComponent } from \"./bulk/bulk-remove.component\";\nimport { UserAddEditComponent } from \"./user-add-edit.component\";\n\n@Component({\n selector: \"provider-people\",\n templateUrl: \"people.component.html\",\n})\n// eslint-disable-next-line rxjs-angular/prefer-takeuntil\nexport class PeopleComponent\n extends BasePeopleComponent\n implements OnInit\n{\n @ViewChild(\"addEdit\", { read: ViewContainerRef, static: true }) addEditModalRef: ViewContainerRef;\n @ViewChild(\"groupsTemplate\", { read: ViewContainerRef, static: true })\n groupsModalRef: ViewContainerRef;\n @ViewChild(\"bulkStatusTemplate\", { read: ViewContainerRef, static: true })\n bulkStatusModalRef: ViewContainerRef;\n @ViewChild(\"bulkConfirmTemplate\", { read: ViewContainerRef, static: true })\n bulkConfirmModalRef: ViewContainerRef;\n @ViewChild(\"bulkRemoveTemplate\", { read: ViewContainerRef, static: true })\n bulkRemoveModalRef: ViewContainerRef;\n\n userType = ProviderUserType;\n userStatusType = ProviderUserStatusType;\n status: ProviderUserStatusType = null;\n providerId: string;\n accessEvents = false;\n\n constructor(\n apiService: ApiService,\n private route: ActivatedRoute,\n i18nService: I18nService,\n modalService: ModalService,\n platformUtilsService: PlatformUtilsService,\n cryptoService: CryptoService,\n private router: Router,\n searchService: SearchService,\n validationService: ValidationService,\n logService: LogService,\n searchPipe: SearchPipe,\n userNamePipe: UserNamePipe,\n private providerService: ProviderService,\n dialogService: DialogService,\n organizationManagementPreferencesService: OrganizationManagementPreferencesService,\n ) {\n super(\n apiService,\n searchService,\n i18nService,\n platformUtilsService,\n cryptoService,\n validationService,\n modalService,\n logService,\n searchPipe,\n userNamePipe,\n dialogService,\n organizationManagementPreferencesService,\n );\n }\n\n ngOnInit() {\n // eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe\n this.route.parent.params.subscribe(async (params) => {\n this.providerId = params.providerId;\n const provider = await this.providerService.get(this.providerId);\n\n if (!provider.canManageUsers) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"../\"], { relativeTo: this.route });\n return;\n }\n\n this.accessEvents = provider.useEvents;\n\n await this.load();\n\n /* eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe, rxjs/no-nested-subscribe */\n this.route.queryParams.pipe(first()).subscribe(async (qParams) => {\n this.searchText = qParams.search;\n if (qParams.viewEvents != null) {\n const user = this.users.filter((u) => u.id === qParams.viewEvents);\n if (user.length > 0 && user[0].status === ProviderUserStatusType.Confirmed) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.events(user[0]);\n }\n }\n });\n });\n }\n\n getUsers(): Promise> {\n return this.apiService.getProviderUsers(this.providerId);\n }\n\n deleteUser(id: string): Promise {\n return this.apiService.deleteProviderUser(this.providerId, id);\n }\n\n revokeUser(id: string): Promise {\n // Not implemented.\n return null;\n }\n\n restoreUser(id: string): Promise {\n // Not implemented.\n return null;\n }\n\n reinviteUser(id: string): Promise {\n return this.apiService.postProviderUserReinvite(this.providerId, id);\n }\n\n async confirmUser(user: ProviderUserUserDetailsResponse, publicKey: Uint8Array): Promise {\n const providerKey = await this.cryptoService.getProviderKey(this.providerId);\n const key = await this.cryptoService.rsaEncrypt(providerKey.key, publicKey);\n const request = new ProviderUserConfirmRequest();\n request.key = key.encryptedString;\n await this.apiService.postProviderUserConfirm(this.providerId, user.id, request);\n }\n\n async edit(user: ProviderUserUserDetailsResponse) {\n const [modal] = await this.modalService.openViewRef(\n UserAddEditComponent,\n this.addEditModalRef,\n (comp) => {\n comp.name = this.userNamePipe.transform(user);\n comp.providerId = this.providerId;\n comp.providerUserId = user != null ? user.id : null;\n comp.onSavedUser.subscribe(() => {\n modal.close();\n this.load();\n });\n comp.onDeletedUser.subscribe(() => {\n modal.close();\n this.removeUser(user);\n });\n },\n );\n }\n\n async events(user: ProviderUserUserDetailsResponse) {\n await openEntityEventsDialog(this.dialogService, {\n data: {\n name: this.userNamePipe.transform(user),\n providerId: this.providerId,\n entityId: user.id,\n showUser: false,\n entity: \"user\",\n },\n });\n }\n\n async bulkRemove() {\n if (this.actionPromise != null) {\n return;\n }\n\n const [modal] = await this.modalService.openViewRef(\n BulkRemoveComponent,\n this.bulkRemoveModalRef,\n (comp) => {\n comp.providerId = this.providerId;\n comp.users = this.getCheckedUsers();\n },\n );\n\n await modal.onClosedPromise();\n await this.load();\n }\n\n async bulkReinvite() {\n if (this.actionPromise != null) {\n return;\n }\n\n const users = this.getCheckedUsers();\n const filteredUsers = users.filter((u) => u.status === ProviderUserStatusType.Invited);\n\n if (filteredUsers.length <= 0) {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"noSelectedUsersApplicable\"),\n );\n return;\n }\n\n try {\n const request = new ProviderUserBulkRequest(filteredUsers.map((user) => user.id));\n const response = this.apiService.postManyProviderUserReinvite(this.providerId, request);\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.showBulkStatus(\n users,\n filteredUsers,\n response,\n this.i18nService.t(\"bulkReinviteMessage\"),\n );\n } catch (e) {\n this.validationService.showError(e);\n }\n this.actionPromise = null;\n }\n\n async bulkConfirm() {\n if (this.actionPromise != null) {\n return;\n }\n\n const [modal] = await this.modalService.openViewRef(\n BulkConfirmComponent,\n this.bulkConfirmModalRef,\n (comp) => {\n comp.providerId = this.providerId;\n comp.users = this.getCheckedUsers();\n },\n );\n\n await modal.onClosedPromise();\n await this.load();\n }\n\n private async showBulkStatus(\n users: ProviderUserUserDetailsResponse[],\n filteredUsers: ProviderUserUserDetailsResponse[],\n request: Promise>,\n successfullMessage: string,\n ) {\n const [modal, childComponent] = await this.modalService.openViewRef(\n BulkStatusComponent,\n this.bulkStatusModalRef,\n (comp) => {\n comp.loading = true;\n },\n );\n\n // Workaround to handle closing the modal shortly after it has been opened\n let close = false;\n modal.onShown.subscribe(() => {\n if (close) {\n modal.close();\n }\n });\n\n try {\n const response = await request;\n\n if (modal) {\n const keyedErrors: any = response.data\n .filter((r) => r.error !== \"\")\n .reduce((a, x) => ({ ...a, [x.id]: x.error }), {});\n const keyedFilteredUsers: any = filteredUsers.reduce((a, x) => ({ ...a, [x.id]: x }), {});\n\n childComponent.users = users.map((user) => {\n let message = keyedErrors[user.id] ?? successfullMessage;\n // eslint-disable-next-line\n if (!keyedFilteredUsers.hasOwnProperty(user.id)) {\n message = this.i18nService.t(\"bulkFilteredMessage\");\n }\n\n return {\n user: user,\n error: keyedErrors.hasOwnProperty(user.id), // eslint-disable-line\n message: message,\n };\n });\n childComponent.loading = false;\n }\n } catch {\n close = true;\n modal.close();\n }\n }\n}\n","export class ProviderUpdateRequest {\n name: string;\n businessName: string;\n billingEmail: string;\n}\n","\n\n
    \n \n {{ \"loading\" | i18n }}\n
    \n\n
    \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n
    \n \n
    \n
    \n \n\n","import { Component } from \"@angular/core\";\nimport { ActivatedRoute } from \"@angular/router\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { ProviderUpdateRequest } from \"@bitwarden/common/admin-console/models/request/provider/provider-update.request\";\nimport { ProviderResponse } from \"@bitwarden/common/admin-console/models/response/provider/provider.response\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { SyncService } from \"@bitwarden/common/vault/abstractions/sync/sync.service.abstraction\";\n\n@Component({\n selector: \"provider-account\",\n templateUrl: \"account.component.html\",\n})\n// eslint-disable-next-line rxjs-angular/prefer-takeuntil\nexport class AccountComponent {\n selfHosted = false;\n loading = true;\n provider: ProviderResponse;\n formPromise: Promise;\n taxFormPromise: Promise;\n\n private providerId: string;\n\n constructor(\n private apiService: ApiService,\n private i18nService: I18nService,\n private route: ActivatedRoute,\n private syncService: SyncService,\n private platformUtilsService: PlatformUtilsService,\n private logService: LogService,\n ) {}\n\n async ngOnInit() {\n this.selfHosted = this.platformUtilsService.isSelfHost();\n // eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe\n this.route.parent.parent.params.subscribe(async (params) => {\n this.providerId = params.providerId;\n try {\n this.provider = await this.apiService.getProvider(this.providerId);\n } catch (e) {\n this.logService.error(`Handled exception: ${e}`);\n }\n });\n this.loading = false;\n }\n\n async submit() {\n try {\n const request = new ProviderUpdateRequest();\n request.name = this.provider.name;\n request.businessName = this.provider.businessName;\n request.billingEmail = this.provider.billingEmail;\n\n this.formPromise = this.apiService.putProvider(this.providerId, request).then(() => {\n return this.syncService.fullSync(true);\n });\n await this.formPromise;\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"providerUpdated\"));\n } catch (e) {\n this.logService.error(`Handled exception: ${e}`);\n }\n }\n}\n","
    \n
    \n \"Bitwarden\"\n

    \n \n {{ \"loading\" | i18n }}\n

    \n
    \n
    \n
    \n
    \n
    \n

    {{ \"setupProvider\" | i18n }}

    \n
    \n
    \n

    {{ \"setupProviderLoginDesc\" | i18n }}

    \n
    \n
    \n \n {{ \"logIn\" | i18n }}\n \n
    \n
    \n
    \n
    \n
    \n
    \n","import { Component } from \"@angular/core\";\nimport { Params } from \"@angular/router\";\n\nimport { BaseAcceptComponent } from \"@bitwarden/web-vault/app/common/base.accept.component\";\n\n@Component({\n selector: \"app-setup-provider\",\n templateUrl: \"setup-provider.component.html\",\n})\nexport class SetupProviderComponent extends BaseAcceptComponent {\n failedShortMessage = \"inviteAcceptFailedShort\";\n failedMessage = \"inviteAcceptFailed\";\n\n requiredParameters = [\"providerId\", \"email\", \"token\"];\n\n async authedHandler(qParams: Params) {\n this.router.navigate([\"/providers/setup\"], { queryParams: qParams });\n }\n\n async unauthedHandler(qParams: Params) {\n // Empty\n }\n}\n","export class ProviderSetupRequest {\n name: string;\n businessName: string;\n billingEmail: string;\n token: string;\n key: string;\n}\n","\n
    \n
    \n

    {{ \"setupProvider\" | i18n }}

    \n
    \n

    {{ \"setupProviderDesc\" | i18n }}

    \n\n
    \n

    {{ \"generalInformation\" | i18n }}

    \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n\n
    \n \n
    \n
    \n
    \n","import { Component, OnInit } from \"@angular/core\";\nimport { ActivatedRoute, Router } from \"@angular/router\";\nimport { first } from \"rxjs/operators\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { ProviderSetupRequest } from \"@bitwarden/common/admin-console/models/request/provider/provider-setup.request\";\nimport { FeatureFlag } from \"@bitwarden/common/enums/feature-flag.enum\";\nimport { ConfigServiceAbstraction as ConfigService } from \"@bitwarden/common/platform/abstractions/config/config.service.abstraction\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { ValidationService } from \"@bitwarden/common/platform/abstractions/validation.service\";\nimport { ProviderKey } from \"@bitwarden/common/types/key\";\nimport { SyncService } from \"@bitwarden/common/vault/abstractions/sync/sync.service.abstraction\";\n\n@Component({\n selector: \"provider-setup\",\n templateUrl: \"setup.component.html\",\n})\n// eslint-disable-next-line rxjs-angular/prefer-takeuntil\nexport class SetupComponent implements OnInit {\n loading = true;\n authed = false;\n email: string;\n formPromise: Promise;\n\n providerId: string;\n token: string;\n name: string;\n billingEmail: string;\n\n protected showPaymentMethodWarningBanners$ = this.configService.getFeatureFlag$(\n FeatureFlag.ShowPaymentMethodWarningBanners,\n false,\n );\n\n constructor(\n private router: Router,\n private platformUtilsService: PlatformUtilsService,\n private i18nService: I18nService,\n private route: ActivatedRoute,\n private cryptoService: CryptoService,\n private apiService: ApiService,\n private syncService: SyncService,\n private validationService: ValidationService,\n private configService: ConfigService,\n ) {}\n\n ngOnInit() {\n document.body.classList.remove(\"layout_frontend\");\n // eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe\n this.route.queryParams.pipe(first()).subscribe(async (qParams) => {\n const error = qParams.providerId == null || qParams.email == null || qParams.token == null;\n\n if (error) {\n this.platformUtilsService.showToast(\n \"error\",\n null,\n this.i18nService.t(\"emergencyInviteAcceptFailed\"),\n { timeout: 10000 },\n );\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/\"]);\n return;\n }\n\n this.providerId = qParams.providerId;\n this.token = qParams.token;\n\n // Check if provider exists, redirect if it does\n try {\n const provider = await this.apiService.getProvider(this.providerId);\n if (provider.name != null) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/providers\", provider.id], { replaceUrl: true });\n }\n } catch (e) {\n this.validationService.showError(e);\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/\"]);\n }\n });\n }\n\n async submit() {\n this.formPromise = this.doSubmit();\n await this.formPromise;\n this.formPromise = null;\n }\n\n async doSubmit() {\n try {\n const providerKey = await this.cryptoService.makeOrgKey();\n const key = providerKey[0].encryptedString;\n\n const request = new ProviderSetupRequest();\n request.name = this.name;\n request.billingEmail = this.billingEmail;\n request.token = this.token;\n request.key = key;\n\n const provider = await this.apiService.postProviderSetup(this.providerId, request);\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"providerSetup\"));\n await this.syncService.fullSync(true);\n\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/providers\", provider.id]);\n } catch (e) {\n this.validationService.showError(e);\n }\n }\n}\n","import { NgModule } from \"@angular/core\";\nimport { RouterModule, Routes } from \"@angular/router\";\n\nimport { AuthGuard } from \"@bitwarden/angular/auth/guards\";\nimport { Provider } from \"@bitwarden/common/admin-console/models/domain/provider\";\nimport { ProvidersComponent } from \"@bitwarden/web-vault/app/admin-console/providers/providers.component\";\nimport { FrontendLayoutComponent } from \"@bitwarden/web-vault/app/layouts/frontend-layout.component\";\nimport { UserLayoutComponent } from \"@bitwarden/web-vault/app/layouts/user-layout.component\";\n\nimport { ClientsComponent } from \"./clients/clients.component\";\nimport { CreateOrganizationComponent } from \"./clients/create-organization.component\";\nimport { ProviderPermissionsGuard } from \"./guards/provider-permissions.guard\";\nimport { AcceptProviderComponent } from \"./manage/accept-provider.component\";\nimport { EventsComponent } from \"./manage/events.component\";\nimport { PeopleComponent } from \"./manage/people.component\";\nimport { ProvidersLayoutComponent } from \"./providers-layout.component\";\nimport { AccountComponent } from \"./settings/account.component\";\nimport { SetupProviderComponent } from \"./setup/setup-provider.component\";\nimport { SetupComponent } from \"./setup/setup.component\";\n\nconst routes: Routes = [\n {\n path: \"\",\n canActivate: [AuthGuard],\n component: UserLayoutComponent,\n children: [\n {\n path: \"\",\n canActivate: [AuthGuard],\n component: ProvidersComponent,\n data: { titleId: \"providers\" },\n },\n ],\n },\n {\n path: \"\",\n component: FrontendLayoutComponent,\n children: [\n {\n path: \"setup-provider\",\n component: SetupProviderComponent,\n data: { titleId: \"setupProvider\" },\n },\n {\n path: \"accept-provider\",\n component: AcceptProviderComponent,\n data: { titleId: \"acceptProvider\" },\n },\n ],\n },\n {\n path: \"\",\n canActivate: [AuthGuard],\n children: [\n {\n path: \"setup\",\n component: SetupComponent,\n },\n {\n path: \":providerId\",\n component: ProvidersLayoutComponent,\n canActivate: [ProviderPermissionsGuard],\n children: [\n { path: \"\", pathMatch: \"full\", redirectTo: \"clients\" },\n { path: \"clients/create\", component: CreateOrganizationComponent },\n { path: \"clients\", component: ClientsComponent, data: { titleId: \"clients\" } },\n {\n path: \"manage\",\n children: [\n {\n path: \"\",\n pathMatch: \"full\",\n redirectTo: \"people\",\n },\n {\n path: \"people\",\n component: PeopleComponent,\n canActivate: [ProviderPermissionsGuard],\n data: {\n titleId: \"people\",\n providerPermissions: (provider: Provider) => provider.canManageUsers,\n },\n },\n {\n path: \"events\",\n component: EventsComponent,\n canActivate: [ProviderPermissionsGuard],\n data: {\n titleId: \"eventLogs\",\n providerPermissions: (provider: Provider) => provider.canAccessEventLogs,\n },\n },\n ],\n },\n {\n path: \"settings\",\n children: [\n {\n path: \"\",\n pathMatch: \"full\",\n redirectTo: \"account\",\n },\n {\n path: \"account\",\n component: AccountComponent,\n canActivate: [ProviderPermissionsGuard],\n data: {\n titleId: \"myProvider\",\n providerPermissions: (provider: Provider) => provider.isProviderAdmin,\n },\n },\n ],\n },\n ],\n },\n ],\n },\n];\n\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule],\n})\nexport class ProvidersRoutingModule {}\n","import { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\nimport { FormsModule } from \"@angular/forms\";\n\nimport { JslibModule } from \"@bitwarden/angular/jslib.module\";\nimport { SearchModule } from \"@bitwarden/components\";\nimport { OrganizationPlansComponent } from \"@bitwarden/web-vault/app/billing\";\nimport { PaymentMethodWarningsModule } from \"@bitwarden/web-vault/app/billing/shared\";\nimport { OssModule } from \"@bitwarden/web-vault/app/oss.module\";\n\nimport { AddOrganizationComponent } from \"./clients/add-organization.component\";\nimport { ClientsComponent } from \"./clients/clients.component\";\nimport { CreateOrganizationComponent } from \"./clients/create-organization.component\";\nimport { ProviderPermissionsGuard } from \"./guards/provider-permissions.guard\";\nimport { AcceptProviderComponent } from \"./manage/accept-provider.component\";\nimport { BulkConfirmComponent } from \"./manage/bulk/bulk-confirm.component\";\nimport { BulkRemoveComponent } from \"./manage/bulk/bulk-remove.component\";\nimport { EventsComponent } from \"./manage/events.component\";\nimport { PeopleComponent } from \"./manage/people.component\";\nimport { UserAddEditComponent } from \"./manage/user-add-edit.component\";\nimport { ProvidersLayoutComponent } from \"./providers-layout.component\";\nimport { ProvidersRoutingModule } from \"./providers-routing.module\";\nimport { WebProviderService } from \"./services/web-provider.service\";\nimport { AccountComponent } from \"./settings/account.component\";\nimport { SetupProviderComponent } from \"./setup/setup-provider.component\";\nimport { SetupComponent } from \"./setup/setup.component\";\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n OssModule,\n JslibModule,\n ProvidersRoutingModule,\n OrganizationPlansComponent,\n SearchModule,\n ProvidersLayoutComponent,\n PaymentMethodWarningsModule,\n ],\n declarations: [\n AcceptProviderComponent,\n AccountComponent,\n AddOrganizationComponent,\n BulkConfirmComponent,\n BulkRemoveComponent,\n ClientsComponent,\n CreateOrganizationComponent,\n EventsComponent,\n PeopleComponent,\n SetupComponent,\n SetupProviderComponent,\n UserAddEditComponent,\n ],\n providers: [WebProviderService, ProviderPermissionsGuard],\n})\nexport class ProvidersModule {}\n","import { NgModule } from \"@angular/core\";\nimport { RouterModule, Routes } from \"@angular/router\";\n\nimport { deepLinkGuard } from \"@bitwarden/web-vault/app/auth/guards/deep-link.guard\";\n\nimport { ProvidersModule } from \"./admin-console/providers/providers.module\";\n\nconst routes: Routes = [\n {\n path: \"providers\",\n canActivate: [deepLinkGuard()],\n loadChildren: () => ProvidersModule,\n },\n {\n path: \"sm\",\n canActivate: [deepLinkGuard()],\n loadChildren: async () =>\n (await import(\"./secrets-manager/secrets-manager.module\")).SecretsManagerModule,\n },\n];\n\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule],\n})\nexport class AppRoutingModule {}\n","import { DOCUMENT } from \"@angular/common\";\nimport { Component, Inject, NgZone, OnDestroy, OnInit, SecurityContext } from \"@angular/core\";\nimport { DomSanitizer } from \"@angular/platform-browser\";\nimport { NavigationEnd, Router } from \"@angular/router\";\nimport * as jq from \"jquery\";\nimport { IndividualConfig, ToastrService } from \"ngx-toastr\";\nimport { Subject, switchMap, takeUntil, timer } from \"rxjs\";\n\nimport { EventUploadService } from \"@bitwarden/common/abstractions/event/event-upload.service\";\nimport { NotificationsService } from \"@bitwarden/common/abstractions/notifications.service\";\nimport { SearchService } from \"@bitwarden/common/abstractions/search.service\";\nimport { VaultTimeoutService } from \"@bitwarden/common/abstractions/vault-timeout/vault-timeout.service\";\nimport { InternalOrganizationServiceAbstraction } from \"@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction\";\nimport { InternalPolicyService } from \"@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction\";\nimport { AuthService } from \"@bitwarden/common/auth/abstractions/auth.service\";\nimport { KeyConnectorService } from \"@bitwarden/common/auth/abstractions/key-connector.service\";\nimport { PaymentMethodWarningsServiceAbstraction as PaymentMethodWarningService } from \"@bitwarden/common/billing/abstractions/payment-method-warnings-service.abstraction\";\nimport { BroadcasterService } from \"@bitwarden/common/platform/abstractions/broadcaster.service\";\nimport { ConfigServiceAbstraction } from \"@bitwarden/common/platform/abstractions/config/config.service.abstraction\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { BiometricStateService } from \"@bitwarden/common/platform/biometrics/biometric-state.service\";\nimport { StateEventRunnerService } from \"@bitwarden/common/platform/state\";\nimport { PasswordGenerationServiceAbstraction } from \"@bitwarden/common/tools/generator/password\";\nimport { UserId } from \"@bitwarden/common/types/guid\";\nimport { CipherService } from \"@bitwarden/common/vault/abstractions/cipher.service\";\nimport { CollectionService } from \"@bitwarden/common/vault/abstractions/collection.service\";\nimport { InternalFolderService } from \"@bitwarden/common/vault/abstractions/folder/folder.service.abstraction\";\nimport { SyncService } from \"@bitwarden/common/vault/abstractions/sync/sync.service.abstraction\";\nimport { DialogService } from \"@bitwarden/components\";\n\nimport { PolicyListService } from \"./admin-console/core/policy-list.service\";\nimport {\n DisableSendPolicy,\n MasterPasswordPolicy,\n PasswordGeneratorPolicy,\n PersonalOwnershipPolicy,\n RequireSsoPolicy,\n ResetPasswordPolicy,\n SendOptionsPolicy,\n SingleOrgPolicy,\n TwoFactorAuthenticationPolicy,\n} from \"./admin-console/organizations/policies\";\n\nconst BroadcasterSubscriptionId = \"AppComponent\";\nconst IdleTimeout = 60000 * 10; // 10 minutes\nconst PaymentMethodWarningsRefresh = 60000; // 1 Minute\n\n@Component({\n selector: \"app-root\",\n templateUrl: \"app.component.html\",\n})\nexport class AppComponent implements OnDestroy, OnInit {\n private lastActivity: number = null;\n private idleTimer: number = null;\n private isIdle = false;\n private destroy$ = new Subject();\n private paymentMethodWarningsRefresh$ = timer(0, PaymentMethodWarningsRefresh);\n\n constructor(\n @Inject(DOCUMENT) private document: Document,\n private broadcasterService: BroadcasterService,\n private folderService: InternalFolderService,\n private syncService: SyncService,\n private passwordGenerationService: PasswordGenerationServiceAbstraction,\n private cipherService: CipherService,\n private authService: AuthService,\n private router: Router,\n private toastrService: ToastrService,\n private i18nService: I18nService,\n private platformUtilsService: PlatformUtilsService,\n private ngZone: NgZone,\n private vaultTimeoutService: VaultTimeoutService,\n private cryptoService: CryptoService,\n private collectionService: CollectionService,\n private sanitizer: DomSanitizer,\n private searchService: SearchService,\n private notificationsService: NotificationsService,\n private stateService: StateService,\n private eventUploadService: EventUploadService,\n private policyService: InternalPolicyService,\n protected policyListService: PolicyListService,\n private keyConnectorService: KeyConnectorService,\n private configService: ConfigServiceAbstraction,\n private dialogService: DialogService,\n private biometricStateService: BiometricStateService,\n private stateEventRunnerService: StateEventRunnerService,\n private paymentMethodWarningService: PaymentMethodWarningService,\n private organizationService: InternalOrganizationServiceAbstraction,\n ) {}\n\n ngOnInit() {\n this.i18nService.locale$.pipe(takeUntil(this.destroy$)).subscribe((locale) => {\n this.document.documentElement.lang = locale;\n });\n\n this.ngZone.runOutsideAngular(() => {\n window.onmousemove = () => this.recordActivity();\n window.onmousedown = () => this.recordActivity();\n window.ontouchstart = () => this.recordActivity();\n window.onclick = () => this.recordActivity();\n window.onscroll = () => this.recordActivity();\n window.onkeypress = () => this.recordActivity();\n });\n\n /// ############ DEPRECATED ############\n /// Please do not use the AppComponent to send events between services.\n ///\n /// Services that depends on other services, should do so through Dependency Injection\n /// and subscribe to events through that service observable.\n ///\n this.broadcasterService.subscribe(BroadcasterSubscriptionId, async (message: any) => {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.ngZone.run(async () => {\n switch (message.command) {\n case \"loggedIn\":\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.notificationsService.updateConnection(false);\n break;\n case \"loggedOut\":\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.notificationsService.updateConnection(false);\n break;\n case \"unlocked\":\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.notificationsService.updateConnection(false);\n break;\n case \"authBlocked\":\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/\"]);\n break;\n case \"logout\":\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.logOut(!!message.expired, message.redirect);\n break;\n case \"lockVault\":\n await this.vaultTimeoutService.lock();\n break;\n case \"locked\":\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.notificationsService.updateConnection(false);\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"lock\"]);\n break;\n case \"lockedUrl\":\n break;\n case \"syncStarted\":\n break;\n case \"syncCompleted\":\n if (message.successfully) {\n this.configService.triggerServerConfigFetch();\n }\n break;\n case \"upgradeOrganization\": {\n const upgradeConfirmed = await this.dialogService.openSimpleDialog({\n title: { key: \"upgradeOrganization\" },\n content: { key: \"upgradeOrganizationDesc\" },\n acceptButtonText: { key: \"upgradeOrganization\" },\n type: \"info\",\n });\n if (upgradeConfirmed) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\n \"organizations\",\n message.organizationId,\n \"billing\",\n \"subscription\",\n ]);\n }\n break;\n }\n case \"premiumRequired\": {\n const premiumConfirmed = await this.dialogService.openSimpleDialog({\n title: { key: \"premiumRequired\" },\n content: { key: \"premiumRequiredDesc\" },\n acceptButtonText: { key: \"upgrade\" },\n type: \"success\",\n });\n if (premiumConfirmed) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"settings/subscription/premium\"]);\n }\n break;\n }\n case \"emailVerificationRequired\": {\n const emailVerificationConfirmed = await this.dialogService.openSimpleDialog({\n title: { key: \"emailVerificationRequired\" },\n content: { key: \"emailVerificationRequiredDesc\" },\n acceptButtonText: { key: \"learnMore\" },\n type: \"info\",\n });\n if (emailVerificationConfirmed) {\n this.platformUtilsService.launchUri(\n \"https://bitwarden.com/help/create-bitwarden-account/\",\n );\n }\n break;\n }\n case \"showToast\":\n this.showToast(message);\n break;\n case \"convertAccountToKeyConnector\":\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/remove-password\"]);\n break;\n default:\n break;\n }\n });\n });\n\n this.router.events.pipe(takeUntil(this.destroy$)).subscribe((event) => {\n if (event instanceof NavigationEnd) {\n const modals = Array.from(document.querySelectorAll(\".modal\"));\n for (const modal of modals) {\n (jq(modal) as any).modal(\"hide\");\n }\n }\n });\n\n this.policyListService.addPolicies([\n new TwoFactorAuthenticationPolicy(),\n new MasterPasswordPolicy(),\n new ResetPasswordPolicy(),\n new PasswordGeneratorPolicy(),\n new SingleOrgPolicy(),\n new RequireSsoPolicy(),\n new PersonalOwnershipPolicy(),\n new DisableSendPolicy(),\n new SendOptionsPolicy(),\n ]);\n\n this.paymentMethodWarningsRefresh$\n .pipe(\n switchMap(() => this.organizationService.memberOrganizations$),\n switchMap(\n async (organizations) =>\n await Promise.all(\n organizations.map((organization) =>\n this.paymentMethodWarningService.update(organization.id),\n ),\n ),\n ),\n takeUntil(this.destroy$),\n )\n .subscribe();\n }\n\n ngOnDestroy() {\n this.broadcasterService.unsubscribe(BroadcasterSubscriptionId);\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private async logOut(expired: boolean, redirect = true) {\n await this.eventUploadService.uploadEvents();\n const userId = await this.stateService.getUserId();\n await Promise.all([\n this.syncService.setLastSync(new Date(0)),\n this.cryptoService.clearKeys(),\n this.cipherService.clear(userId),\n this.folderService.clear(userId),\n this.collectionService.clear(userId),\n this.policyService.clear(userId),\n this.passwordGenerationService.clear(),\n this.keyConnectorService.clear(),\n this.biometricStateService.logout(userId as UserId),\n this.paymentMethodWarningService.clear(),\n ]);\n\n await this.stateEventRunnerService.handleEvent(\"logout\", userId as UserId);\n\n this.searchService.clearIndex();\n this.authService.logOut(async () => {\n if (expired) {\n this.platformUtilsService.showToast(\n \"warning\",\n this.i18nService.t(\"loggedOut\"),\n this.i18nService.t(\"loginExpired\"),\n );\n }\n\n await this.stateService.clean({ userId: userId });\n if (redirect) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.router.navigate([\"/\"]);\n }\n });\n }\n\n private async recordActivity() {\n const now = new Date().getTime();\n if (this.lastActivity != null && now - this.lastActivity < 250) {\n return;\n }\n\n this.lastActivity = now;\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.stateService.setLastActive(now);\n // Idle states\n if (this.isIdle) {\n this.isIdle = false;\n this.idleStateChanged();\n }\n if (this.idleTimer != null) {\n window.clearTimeout(this.idleTimer);\n this.idleTimer = null;\n }\n this.idleTimer = window.setTimeout(() => {\n if (!this.isIdle) {\n this.isIdle = true;\n this.idleStateChanged();\n }\n }, IdleTimeout);\n }\n\n private showToast(msg: any) {\n let message = \"\";\n\n const options: Partial = {};\n\n if (typeof msg.text === \"string\") {\n message = msg.text;\n } else if (msg.text.length === 1) {\n message = msg.text[0];\n } else {\n msg.text.forEach(\n (t: string) =>\n (message += \"

    \" + this.sanitizer.sanitize(SecurityContext.HTML, t) + \"

    \"),\n );\n options.enableHtml = true;\n }\n if (msg.options != null) {\n if (msg.options.trustedHtml === true) {\n options.enableHtml = true;\n }\n if (msg.options.timeout != null && msg.options.timeout > 0) {\n options.timeOut = msg.options.timeout;\n }\n }\n\n this.toastrService.show(message, msg.title, options, \"toast-\" + msg.type);\n }\n\n private idleStateChanged() {\n if (this.isIdle) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.notificationsService.disconnectFromInactivity();\n } else {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.notificationsService.reconnectFromActivity();\n }\n }\n}\n","\n","import { Component } from \"@angular/core\";\n\nimport { PolicyType } from \"@bitwarden/common/admin-console/enums\";\nimport { Organization } from \"@bitwarden/common/admin-console/models/domain/organization\";\nimport {\n BasePolicy,\n BasePolicyComponent,\n} from \"@bitwarden/web-vault/app/admin-console/organizations/policies/base-policy.component\";\n\nexport class ActivateAutofillPolicy extends BasePolicy {\n name = \"activateAutofill\";\n description = \"activateAutofillPolicyDesc\";\n type = PolicyType.ActivateAutofill;\n component = ActivateAutofillPolicyComponent;\n\n display(organization: Organization) {\n return organization.useActivateAutofillPolicy;\n }\n}\n\n@Component({\n selector: \"policy-activate-autofill\",\n templateUrl: \"activate-autofill.component.html\",\n})\nexport class ActivateAutofillPolicyComponent extends BasePolicyComponent {}\n","\n {{ \"experimentalFeature\" | i18n }}\n {{\n \"learnMoreAboutAutofill\" | i18n\n }}\n\n\n
    \n
    \n \n \n
    \n
    \n","import { Component } from \"@angular/core\";\n\nimport { PolicyType } from \"@bitwarden/common/admin-console/enums\";\nimport {\n BasePolicy,\n BasePolicyComponent,\n} from \"@bitwarden/web-vault/app/admin-console/organizations/policies/base-policy.component\";\n\nexport class DisablePersonalVaultExportPolicy extends BasePolicy {\n name = \"disablePersonalVaultExport\";\n description = \"disablePersonalVaultExportDescription\";\n type = PolicyType.DisablePersonalVaultExport;\n component = DisablePersonalVaultExportPolicyComponent;\n}\n\n@Component({\n selector: \"policy-disable-personal-vault-export\",\n templateUrl: \"disable-personal-vault-export.component.html\",\n})\nexport class DisablePersonalVaultExportPolicyComponent extends BasePolicyComponent {}\n","
    \n
    \n \n \n
    \n
    \n","\n {{ \"requireSsoPolicyReq\" | i18n }}\n\n\n
    \n
    \n \n \n
    \n
    \n\n
    \n
    \n \n
    \n
    \n \n {{ \"hours\" | i18n }}\n
    \n
    \n \n {{ \"minutes\" | i18n }}\n
    \n
    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n","import { Component } from \"@angular/core\";\nimport { FormBuilder, FormControl } from \"@angular/forms\";\n\nimport { PolicyType } from \"@bitwarden/common/admin-console/enums\";\nimport { PolicyRequest } from \"@bitwarden/common/admin-console/models/request/policy.request\";\nimport { VaultTimeoutAction } from \"@bitwarden/common/enums/vault-timeout-action.enum\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport {\n BasePolicy,\n BasePolicyComponent,\n} from \"@bitwarden/web-vault/app/admin-console/organizations/policies/base-policy.component\";\n\nexport class MaximumVaultTimeoutPolicy extends BasePolicy {\n name = \"maximumVaultTimeout\";\n description = \"maximumVaultTimeoutDesc\";\n type = PolicyType.MaximumVaultTimeout;\n component = MaximumVaultTimeoutPolicyComponent;\n}\n\n@Component({\n selector: \"policy-maximum-timeout\",\n templateUrl: \"maximum-vault-timeout.component.html\",\n})\nexport class MaximumVaultTimeoutPolicyComponent extends BasePolicyComponent {\n vaultTimeoutActionOptions: { name: string; value: string }[];\n data = this.formBuilder.group({\n hours: new FormControl(null),\n minutes: new FormControl(null),\n action: new FormControl(null),\n });\n\n constructor(\n private formBuilder: FormBuilder,\n private i18nService: I18nService,\n ) {\n super();\n this.vaultTimeoutActionOptions = [\n { name: i18nService.t(\"userPreference\"), value: null },\n { name: i18nService.t(VaultTimeoutAction.Lock), value: VaultTimeoutAction.Lock },\n { name: i18nService.t(VaultTimeoutAction.LogOut), value: VaultTimeoutAction.LogOut },\n ];\n }\n\n loadData() {\n const minutes = this.policyResponse.data?.minutes;\n const action = this.policyResponse.data?.action;\n\n this.data.patchValue({\n hours: minutes ? Math.floor(minutes / 60) : null,\n minutes: minutes ? minutes % 60 : null,\n action: action,\n });\n }\n\n buildRequestData() {\n if (this.data.value.hours == null && this.data.value.minutes == null) {\n return null;\n }\n\n return {\n minutes: this.data.value.hours * 60 + this.data.value.minutes,\n action: this.data.value.action,\n };\n }\n\n buildRequest(policiesEnabledMap: Map): Promise {\n const singleOrgEnabled = policiesEnabledMap.get(PolicyType.SingleOrg) ?? false;\n if (this.enabled.value && !singleOrgEnabled) {\n throw new Error(this.i18nService.t(\"requireSsoPolicyReqError\"));\n }\n\n const data = this.buildRequestData();\n if (data?.minutes == null || data?.minutes <= 0) {\n throw new Error(this.i18nService.t(\"invalidMaximumVaultTimeout\"));\n }\n\n return super.buildRequest(policiesEnabledMap);\n }\n}\n","import { Component } from \"@angular/core\";\n\nimport { AppComponent as BaseAppComponent } from \"@bitwarden/web-vault/app/app.component\";\n\nimport { ActivateAutofillPolicy } from \"./admin-console/policies/activate-autofill.component\";\nimport { DisablePersonalVaultExportPolicy } from \"./admin-console/policies/disable-personal-vault-export.component\";\nimport { MaximumVaultTimeoutPolicy } from \"./admin-console/policies/maximum-vault-timeout.component\";\n\n@Component({\n selector: \"app-root\",\n templateUrl: \"../../../../apps/web/src/app/app.component.html\",\n})\nexport class AppComponent extends BaseAppComponent {\n ngOnInit() {\n super.ngOnInit();\n\n this.policyListService.addPolicies([\n new MaximumVaultTimeoutPolicy(),\n new DisablePersonalVaultExportPolicy(),\n new ActivateAutofillPolicy(),\n ]);\n }\n}\n","import { DragDropModule } from \"@angular/cdk/drag-drop\";\nimport { OverlayModule } from \"@angular/cdk/overlay\";\nimport { NgModule } from \"@angular/core\";\nimport { FormsModule, ReactiveFormsModule } from \"@angular/forms\";\nimport { BrowserAnimationsModule } from \"@angular/platform-browser/animations\";\nimport { RouterModule } from \"@angular/router\";\nimport { InfiniteScrollModule } from \"ngx-infinite-scroll\";\n\nimport { JslibModule } from \"@bitwarden/angular/jslib.module\";\nimport { CoreModule } from \"@bitwarden/web-vault/app/core\";\nimport { OssRoutingModule } from \"@bitwarden/web-vault/app/oss-routing.module\";\nimport { OssModule } from \"@bitwarden/web-vault/app/oss.module\";\nimport { WildcardRoutingModule } from \"@bitwarden/web-vault/app/wildcard-routing.module\";\n\nimport { OrganizationsModule } from \"./admin-console/organizations/organizations.module\";\nimport { ActivateAutofillPolicyComponent } from \"./admin-console/policies/activate-autofill.component\";\nimport { DisablePersonalVaultExportPolicyComponent } from \"./admin-console/policies/disable-personal-vault-export.component\";\nimport { MaximumVaultTimeoutPolicyComponent } from \"./admin-console/policies/maximum-vault-timeout.component\";\nimport { AppRoutingModule } from \"./app-routing.module\";\nimport { AppComponent } from \"./app.component\";\n\n/**\n * This is the AppModule for the commercial version of Bitwarden.\n * `apps/web/app.module.ts` contains the OSS version.\n *\n * You probably do not want to modify this file. Consider editing `oss.module.ts` instead.\n */\n@NgModule({\n imports: [\n OverlayModule,\n OssModule,\n JslibModule,\n BrowserAnimationsModule,\n FormsModule,\n ReactiveFormsModule,\n CoreModule,\n InfiniteScrollModule,\n DragDropModule,\n AppRoutingModule,\n OssRoutingModule,\n OrganizationsModule, // Must be after OssRoutingModule for competing routes to resolve properly\n RouterModule,\n WildcardRoutingModule, // Needs to be last to catch all non-existing routes\n ],\n declarations: [\n AppComponent,\n DisablePersonalVaultExportPolicyComponent,\n MaximumVaultTimeoutPolicyComponent,\n ActivateAutofillPolicyComponent,\n ],\n bootstrap: [AppComponent],\n})\nexport class AppModule {}\n","import { enableProdMode } from \"@angular/core\";\nimport { platformBrowserDynamic } from \"@angular/platform-browser-dynamic\";\n\nimport \"bootstrap\";\nimport \"jquery\";\nimport \"popper.js\";\n\nrequire(\"@bitwarden/web-vault/scss/styles.scss\");\nrequire(\"@bitwarden/web-vault/scss/tailwind.css\");\n\nimport { AppModule } from \"./app/app.module\";\n\nif (process.env.NODE_ENV === \"production\") {\n enableProdMode();\n}\n\n// FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n// eslint-disable-next-line @typescript-eslint/no-floating-promises\nplatformBrowserDynamic().bootstrapModule(AppModule, { preserveWhitespaces: true });\n","import { Directive } from \"@angular/core\";\nimport { ActivatedRoute, NavigationExtras, Router } from \"@angular/router\";\nimport { firstValueFrom } from \"rxjs\";\nimport { first } from \"rxjs/operators\";\n\nimport {\n LoginStrategyServiceAbstraction,\n SsoLoginCredentials,\n TrustedDeviceUserDecryptionOption,\n UserDecryptionOptions,\n UserDecryptionOptionsServiceAbstraction,\n} from \"@bitwarden/auth/common\";\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { SsoLoginServiceAbstraction } from \"@bitwarden/common/auth/abstractions/sso-login.service.abstraction\";\nimport { AuthResult } from \"@bitwarden/common/auth/models/domain/auth-result\";\nimport { ForceSetPasswordReason } from \"@bitwarden/common/auth/models/domain/force-set-password-reason\";\nimport { SsoPreValidateResponse } from \"@bitwarden/common/auth/models/response/sso-pre-validate.response\";\nimport { ConfigServiceAbstraction } from \"@bitwarden/common/platform/abstractions/config/config.service.abstraction\";\nimport { CryptoFunctionService } from \"@bitwarden/common/platform/abstractions/crypto-function.service\";\nimport { EnvironmentService } from \"@bitwarden/common/platform/abstractions/environment.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\nimport { PasswordGenerationServiceAbstraction } from \"@bitwarden/common/tools/generator/password\";\n\n@Directive()\nexport class SsoComponent {\n identifier: string;\n loggingIn = false;\n\n formPromise: Promise;\n initiateSsoFormPromise: Promise;\n onSuccessfulLogin: () => Promise;\n onSuccessfulLoginNavigate: () => Promise;\n onSuccessfulLoginTwoFactorNavigate: () => Promise;\n onSuccessfulLoginChangePasswordNavigate: () => Promise;\n onSuccessfulLoginForceResetNavigate: () => Promise;\n\n onSuccessfulLoginTde: () => Promise;\n onSuccessfulLoginTdeNavigate: () => Promise;\n\n protected twoFactorRoute = \"2fa\";\n protected successRoute = \"lock\";\n protected trustedDeviceEncRoute = \"login-initiated\";\n protected changePasswordRoute = \"set-password\";\n protected forcePasswordResetRoute = \"update-temp-password\";\n protected clientId: string;\n protected redirectUri: string;\n protected state: string;\n protected codeChallenge: string;\n\n constructor(\n protected ssoLoginService: SsoLoginServiceAbstraction,\n protected loginStrategyService: LoginStrategyServiceAbstraction,\n protected router: Router,\n protected i18nService: I18nService,\n protected route: ActivatedRoute,\n protected stateService: StateService,\n protected platformUtilsService: PlatformUtilsService,\n protected apiService: ApiService,\n protected cryptoFunctionService: CryptoFunctionService,\n protected environmentService: EnvironmentService,\n protected passwordGenerationService: PasswordGenerationServiceAbstraction,\n protected logService: LogService,\n protected userDecryptionOptionsService: UserDecryptionOptionsServiceAbstraction,\n protected configService: ConfigServiceAbstraction,\n ) {}\n\n async ngOnInit() {\n // eslint-disable-next-line rxjs/no-async-subscribe\n this.route.queryParams.pipe(first()).subscribe(async (qParams) => {\n if (qParams.code != null && qParams.state != null) {\n const codeVerifier = await this.ssoLoginService.getCodeVerifier();\n const state = await this.ssoLoginService.getSsoState();\n await this.ssoLoginService.setCodeVerifier(null);\n await this.ssoLoginService.setSsoState(null);\n if (\n qParams.code != null &&\n codeVerifier != null &&\n state != null &&\n this.checkState(state, qParams.state)\n ) {\n const ssoOrganizationIdentifier = this.getOrgIdentifierFromState(qParams.state);\n await this.logIn(qParams.code, codeVerifier, ssoOrganizationIdentifier);\n }\n } else if (\n qParams.clientId != null &&\n qParams.redirectUri != null &&\n qParams.state != null &&\n qParams.codeChallenge != null\n ) {\n this.redirectUri = qParams.redirectUri;\n this.state = qParams.state;\n this.codeChallenge = qParams.codeChallenge;\n this.clientId = qParams.clientId;\n }\n });\n }\n\n async submit(returnUri?: string, includeUserIdentifier?: boolean) {\n if (this.identifier == null || this.identifier === \"\") {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"ssoValidationFailed\"),\n this.i18nService.t(\"ssoIdentifierRequired\"),\n );\n return;\n }\n\n this.initiateSsoFormPromise = this.apiService.preValidateSso(this.identifier);\n const response = await this.initiateSsoFormPromise;\n\n const authorizeUrl = await this.buildAuthorizeUrl(\n returnUri,\n includeUserIdentifier,\n response.token,\n );\n this.platformUtilsService.launchUri(authorizeUrl, { sameWindow: true });\n }\n\n protected async buildAuthorizeUrl(\n returnUri?: string,\n includeUserIdentifier?: boolean,\n token?: string,\n ): Promise {\n let codeChallenge = this.codeChallenge;\n let state = this.state;\n\n const passwordOptions: any = {\n type: \"password\",\n length: 64,\n uppercase: true,\n lowercase: true,\n numbers: true,\n special: false,\n };\n\n if (codeChallenge == null) {\n const codeVerifier = await this.passwordGenerationService.generatePassword(passwordOptions);\n const codeVerifierHash = await this.cryptoFunctionService.hash(codeVerifier, \"sha256\");\n codeChallenge = Utils.fromBufferToUrlB64(codeVerifierHash);\n await this.ssoLoginService.setCodeVerifier(codeVerifier);\n }\n\n if (state == null) {\n state = await this.passwordGenerationService.generatePassword(passwordOptions);\n if (returnUri) {\n state += `_returnUri='${returnUri}'`;\n }\n }\n\n // Add Organization Identifier to state\n state += `_identifier=${this.identifier}`;\n\n // Save state (regardless of new or existing)\n await this.ssoLoginService.setSsoState(state);\n\n const env = await firstValueFrom(this.environmentService.environment$);\n\n let authorizeUrl =\n env.getIdentityUrl() +\n \"/connect/authorize?\" +\n \"client_id=\" +\n this.clientId +\n \"&redirect_uri=\" +\n encodeURIComponent(this.redirectUri) +\n \"&\" +\n \"response_type=code&scope=api offline_access&\" +\n \"state=\" +\n state +\n \"&code_challenge=\" +\n codeChallenge +\n \"&\" +\n \"code_challenge_method=S256&response_mode=query&\" +\n \"domain_hint=\" +\n encodeURIComponent(this.identifier) +\n \"&ssoToken=\" +\n encodeURIComponent(token);\n\n if (includeUserIdentifier) {\n const userIdentifier = await this.apiService.getSsoUserIdentifier();\n authorizeUrl += `&user_identifier=${encodeURIComponent(userIdentifier)}`;\n }\n\n return authorizeUrl;\n }\n\n private async logIn(code: string, codeVerifier: string, orgSsoIdentifier: string): Promise {\n this.loggingIn = true;\n try {\n const email = await this.ssoLoginService.getSsoEmail();\n\n const credentials = new SsoLoginCredentials(\n code,\n codeVerifier,\n this.redirectUri,\n orgSsoIdentifier,\n email,\n );\n this.formPromise = this.loginStrategyService.logIn(credentials);\n const authResult = await this.formPromise;\n\n if (authResult.requiresTwoFactor) {\n return await this.handleTwoFactorRequired(orgSsoIdentifier);\n }\n\n // Everything after the 2FA check is considered a successful login\n // Just have to figure out where to send the user\n\n // Save off the OrgSsoIdentifier for use in the TDE flows (or elsewhere)\n // - TDE login decryption options component\n // - Browser SSO on extension open\n // Note: you cannot set this in state before 2FA b/c there won't be an account in state.\n await this.ssoLoginService.setActiveUserOrganizationSsoIdentifier(orgSsoIdentifier);\n\n // Users enrolled in admin acct recovery can be forced to set a new password after\n // having the admin set a temp password for them (affects TDE & standard users)\n if (authResult.forcePasswordReset == ForceSetPasswordReason.AdminForcePasswordReset) {\n // Weak password is not a valid scenario here b/c we cannot have evaluated a MP yet\n return await this.handleForcePasswordReset(orgSsoIdentifier);\n }\n\n // must come after 2fa check since user decryption options aren't available if 2fa is required\n const userDecryptionOpts = await firstValueFrom(\n this.userDecryptionOptionsService.userDecryptionOptions$,\n );\n\n const tdeEnabled = await this.isTrustedDeviceEncEnabled(\n userDecryptionOpts.trustedDeviceOption,\n );\n\n if (tdeEnabled) {\n return await this.handleTrustedDeviceEncryptionEnabled(\n authResult,\n orgSsoIdentifier,\n userDecryptionOpts,\n );\n }\n\n // In the standard, non TDE case, a user must set password if they don't\n // have one and they aren't using key connector.\n // Note: TDE & Key connector are mutually exclusive org config options.\n const requireSetPassword =\n !userDecryptionOpts.hasMasterPassword &&\n userDecryptionOpts.keyConnectorOption === undefined;\n\n if (requireSetPassword || authResult.resetMasterPassword) {\n // Change implies going no password -> password in this case\n return await this.handleChangePasswordRequired(orgSsoIdentifier);\n }\n\n // Standard SSO login success case\n return await this.handleSuccessfulLogin();\n } catch (e) {\n await this.handleLoginError(e);\n }\n }\n\n private async isTrustedDeviceEncEnabled(\n trustedDeviceOption: TrustedDeviceUserDecryptionOption,\n ): Promise {\n return trustedDeviceOption !== undefined;\n }\n\n private async handleTwoFactorRequired(orgIdentifier: string) {\n await this.navigateViaCallbackOrRoute(\n this.onSuccessfulLoginTwoFactorNavigate,\n [this.twoFactorRoute],\n {\n queryParams: {\n identifier: orgIdentifier,\n sso: \"true\",\n },\n },\n );\n }\n\n private async handleTrustedDeviceEncryptionEnabled(\n authResult: AuthResult,\n orgIdentifier: string,\n userDecryptionOpts: UserDecryptionOptions,\n ): Promise {\n // If user doesn't have a MP, but has reset password permission, they must set a MP\n if (\n !userDecryptionOpts.hasMasterPassword &&\n userDecryptionOpts.trustedDeviceOption.hasManageResetPasswordPermission\n ) {\n // Set flag so that auth guard can redirect to set password screen after decryption (trusted or untrusted device)\n // Note: we cannot directly navigate in this scenario as we are in a pre-decryption state, and\n // if you try to set a new MP before decrypting, you will invalidate the user's data by making a new user key.\n await this.stateService.setForceSetPasswordReason(\n ForceSetPasswordReason.TdeUserWithoutPasswordHasPasswordResetPermission,\n );\n }\n\n if (this.onSuccessfulLoginTde != null) {\n // Don't await b/c causes hang on desktop & browser\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.onSuccessfulLoginTde();\n }\n\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.navigateViaCallbackOrRoute(\n this.onSuccessfulLoginTdeNavigate,\n // Navigate to TDE page (if user was on trusted device and TDE has decrypted\n // their user key, the login-initiated guard will redirect them to the vault)\n [this.trustedDeviceEncRoute],\n );\n }\n\n private async handleChangePasswordRequired(orgIdentifier: string) {\n await this.navigateViaCallbackOrRoute(\n this.onSuccessfulLoginChangePasswordNavigate,\n [this.changePasswordRoute],\n {\n queryParams: {\n identifier: orgIdentifier,\n },\n },\n );\n }\n\n private async handleForcePasswordReset(orgIdentifier: string) {\n await this.navigateViaCallbackOrRoute(\n this.onSuccessfulLoginForceResetNavigate,\n [this.forcePasswordResetRoute],\n {\n queryParams: {\n identifier: orgIdentifier,\n },\n },\n );\n }\n\n private async handleSuccessfulLogin() {\n if (this.onSuccessfulLogin != null) {\n // Don't await b/c causes hang on desktop & browser\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.onSuccessfulLogin();\n }\n\n await this.navigateViaCallbackOrRoute(this.onSuccessfulLoginNavigate, [this.successRoute]);\n }\n\n private async handleLoginError(e: any) {\n this.logService.error(e);\n\n // TODO: Key Connector Service should pass this error message to the logout callback instead of displaying here\n if (e.message === \"Key Connector error\") {\n this.platformUtilsService.showToast(\n \"error\",\n null,\n this.i18nService.t(\"ssoKeyConnectorError\"),\n );\n }\n }\n\n private async navigateViaCallbackOrRoute(\n callback: () => Promise,\n commands: unknown[],\n extras?: NavigationExtras,\n ): Promise {\n if (callback) {\n await callback();\n } else {\n await this.router.navigate(commands, extras);\n }\n }\n\n private getOrgIdentifierFromState(state: string): string {\n if (state === null || state === undefined) {\n return null;\n }\n\n const stateSplit = state.split(\"_identifier=\");\n return stateSplit.length > 1 ? stateSplit[1] : null;\n }\n\n private checkState(state: string, checkState: string): boolean {\n if (state === null || state === undefined) {\n return false;\n }\n if (checkState === null || checkState === undefined) {\n return false;\n }\n\n const stateSplit = state.split(\"_identifier=\");\n const checkStateSplit = checkState.split(\"_identifier=\");\n return stateSplit[0] === checkStateSplit[0];\n }\n}\n","import { Injectable } from \"@angular/core\";\nimport { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from \"@angular/router\";\n\nimport { AuthService } from \"@bitwarden/common/auth/abstractions/auth.service\";\nimport { KeyConnectorService } from \"@bitwarden/common/auth/abstractions/key-connector.service\";\nimport { AuthenticationStatus } from \"@bitwarden/common/auth/enums/authentication-status\";\nimport { ForceSetPasswordReason } from \"@bitwarden/common/auth/models/domain/force-set-password-reason\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\n\n@Injectable()\nexport class AuthGuard implements CanActivate {\n constructor(\n private authService: AuthService,\n private router: Router,\n private messagingService: MessagingService,\n private keyConnectorService: KeyConnectorService,\n private stateService: StateService,\n ) {}\n\n async canActivate(route: ActivatedRouteSnapshot, routerState: RouterStateSnapshot) {\n const authStatus = await this.authService.getAuthStatus();\n\n if (authStatus === AuthenticationStatus.LoggedOut) {\n this.messagingService.send(\"authBlocked\", { url: routerState.url });\n return false;\n }\n\n if (authStatus === AuthenticationStatus.Locked) {\n if (routerState != null) {\n this.messagingService.send(\"lockedUrl\", { url: routerState.url });\n }\n return this.router.createUrlTree([\"lock\"], { queryParams: { promptBiometric: true } });\n }\n\n if (\n !routerState.url.includes(\"remove-password\") &&\n (await this.keyConnectorService.getConvertAccountRequired())\n ) {\n return this.router.createUrlTree([\"/remove-password\"]);\n }\n\n const forceSetPasswordReason = await this.stateService.getForceSetPasswordReason();\n\n if (\n forceSetPasswordReason ===\n ForceSetPasswordReason.TdeUserWithoutPasswordHasPasswordResetPermission &&\n !routerState.url.includes(\"set-password\")\n ) {\n return this.router.createUrlTree([\"/set-password\"]);\n }\n\n if (\n forceSetPasswordReason !== ForceSetPasswordReason.None &&\n !routerState.url.includes(\"update-temp-password\")\n ) {\n return this.router.createUrlTree([\"/update-temp-password\"]);\n }\n\n return true;\n }\n}\n","import { inject } from \"@angular/core\";\nimport {\n ActivatedRouteSnapshot,\n CanActivateFn,\n Router,\n RouterStateSnapshot,\n} from \"@angular/router\";\nimport { firstValueFrom } from \"rxjs\";\n\nimport { AuthService } from \"@bitwarden/common/auth/abstractions/auth.service\";\nimport { DeviceTrustCryptoServiceAbstraction } from \"@bitwarden/common/auth/abstractions/device-trust-crypto.service.abstraction\";\nimport { UserVerificationService } from \"@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction\";\nimport { AuthenticationStatus } from \"@bitwarden/common/auth/enums/authentication-status\";\nimport { ClientType } from \"@bitwarden/common/enums\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\n\n/**\n * Only allow access to this route if the vault is locked.\n * If TDE is enabled then the user must also have had a user key at some point.\n * Otherwise redirect to root.\n *\n * TODO: This should return Observable once we can remove all the promises\n */\nexport function lockGuard(): CanActivateFn {\n return async (\n activatedRouteSnapshot: ActivatedRouteSnapshot,\n routerStateSnapshot: RouterStateSnapshot,\n ) => {\n const authService = inject(AuthService);\n const cryptoService = inject(CryptoService);\n const deviceTrustCryptoService = inject(DeviceTrustCryptoServiceAbstraction);\n const platformUtilService = inject(PlatformUtilsService);\n const messagingService = inject(MessagingService);\n const router = inject(Router);\n const userVerificationService = inject(UserVerificationService);\n\n const authStatus = await authService.getAuthStatus();\n if (authStatus !== AuthenticationStatus.Locked) {\n return router.createUrlTree([\"/\"]);\n }\n\n // If legacy user on web, redirect to migration page\n if (await cryptoService.isLegacyUser()) {\n if (platformUtilService.getClientType() === ClientType.Web) {\n return router.createUrlTree([\"migrate-legacy-encryption\"]);\n }\n // Log out legacy users on other clients\n messagingService.send(\"logout\");\n return false;\n }\n\n // User is authN and in locked state.\n\n const tdeEnabled = await firstValueFrom(deviceTrustCryptoService.supportsDeviceTrust$);\n\n // Create special exception which allows users to go from the login-initiated page to the lock page for the approve w/ MP flow\n // The MP check is necessary to prevent direct manual navigation from other locked state pages for users who don't have a MP\n if (\n activatedRouteSnapshot.queryParams[\"from\"] === \"login-initiated\" &&\n tdeEnabled &&\n (await userVerificationService.hasMasterPassword())\n ) {\n return true;\n }\n\n // If authN user with TDE directly navigates to lock, kick them upwards so redirect guard can\n // properly route them to the login decryption options component.\n const everHadUserKey = await firstValueFrom(cryptoService.everHadUserKey$);\n if (tdeEnabled && !everHadUserKey) {\n return router.createUrlTree([\"/\"]);\n }\n\n return true;\n };\n}\n","import { inject } from \"@angular/core\";\nimport { CanActivateFn, Router } from \"@angular/router\";\nimport { firstValueFrom } from \"rxjs\";\n\nimport { AuthService } from \"@bitwarden/common/auth/abstractions/auth.service\";\nimport { DeviceTrustCryptoServiceAbstraction } from \"@bitwarden/common/auth/abstractions/device-trust-crypto.service.abstraction\";\nimport { AuthenticationStatus } from \"@bitwarden/common/auth/enums/authentication-status\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\n\nexport interface RedirectRoutes {\n loggedIn: string;\n loggedOut: string;\n locked: string;\n notDecrypted: string;\n}\n\nconst defaultRoutes: RedirectRoutes = {\n loggedIn: \"/vault\",\n loggedOut: \"/login\",\n locked: \"/lock\",\n notDecrypted: \"/login-initiated\",\n};\n\n/**\n * Guard that consolidates all redirection logic, should be applied to root route.\n *\n * TODO: This should return Observable once we can get rid of all the promises\n */\nexport function redirectGuard(overrides: Partial = {}): CanActivateFn {\n const routes = { ...defaultRoutes, ...overrides };\n return async (route) => {\n const authService = inject(AuthService);\n const cryptoService = inject(CryptoService);\n const deviceTrustCryptoService = inject(DeviceTrustCryptoServiceAbstraction);\n const router = inject(Router);\n\n const authStatus = await authService.getAuthStatus();\n\n if (authStatus === AuthenticationStatus.LoggedOut) {\n return router.createUrlTree([routes.loggedOut], { queryParams: route.queryParams });\n }\n\n if (authStatus === AuthenticationStatus.Unlocked) {\n return router.createUrlTree([routes.loggedIn], { queryParams: route.queryParams });\n }\n\n // If locked, TDE is enabled, and the user hasn't decrypted yet, then redirect to the\n // login decryption options component.\n const tdeEnabled = await firstValueFrom(deviceTrustCryptoService.supportsDeviceTrust$);\n const everHadUserKey = await firstValueFrom(cryptoService.everHadUserKey$);\n if (authStatus === AuthenticationStatus.Locked && tdeEnabled && !everHadUserKey) {\n return router.createUrlTree([routes.notDecrypted], { queryParams: route.queryParams });\n }\n\n if (authStatus === AuthenticationStatus.Locked) {\n return router.createUrlTree([routes.locked], { queryParams: route.queryParams });\n }\n\n return router.createUrlTree([\"/\"]);\n };\n}\n","import { inject } from \"@angular/core\";\nimport {\n ActivatedRouteSnapshot,\n Router,\n RouterStateSnapshot,\n CanActivateFn,\n} from \"@angular/router\";\nimport { firstValueFrom } from \"rxjs\";\n\nimport { AuthService } from \"@bitwarden/common/auth/abstractions/auth.service\";\nimport { DeviceTrustCryptoServiceAbstraction } from \"@bitwarden/common/auth/abstractions/device-trust-crypto.service.abstraction\";\nimport { AuthenticationStatus } from \"@bitwarden/common/auth/enums/authentication-status\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\n\n/**\n * Only allow access to this route if the vault is locked and has never been decrypted.\n * Otherwise redirect to root.\n *\n * TODO: This should return Observable once we can get rid of all the promises\n */\nexport function tdeDecryptionRequiredGuard(): CanActivateFn {\n return async (_: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {\n const authService = inject(AuthService);\n const cryptoService = inject(CryptoService);\n const deviceTrustCryptoService = inject(DeviceTrustCryptoServiceAbstraction);\n const router = inject(Router);\n\n const authStatus = await authService.getAuthStatus();\n const tdeEnabled = await firstValueFrom(deviceTrustCryptoService.supportsDeviceTrust$);\n const everHadUserKey = await firstValueFrom(cryptoService.everHadUserKey$);\n if (authStatus !== AuthenticationStatus.Locked || !tdeEnabled || everHadUserKey) {\n return router.createUrlTree([\"/\"]);\n }\n\n return true;\n };\n}\n","import { Injectable, inject } from \"@angular/core\";\nimport { CanActivate, CanActivateFn, Router, UrlTree } from \"@angular/router\";\nimport { Observable, map } from \"rxjs\";\n\nimport { AccountService } from \"@bitwarden/common/auth/abstractions/account.service\";\nimport { AuthService } from \"@bitwarden/common/auth/abstractions/auth.service\";\nimport { AuthenticationStatus } from \"@bitwarden/common/auth/enums/authentication-status\";\n\n/**\n * @deprecated use unauthGuardFn function instead\n */\n@Injectable()\nexport class UnauthGuard implements CanActivate {\n protected homepage = \"vault\";\n constructor(\n private authService: AuthService,\n private router: Router,\n ) {}\n\n async canActivate() {\n const authStatus = await this.authService.getAuthStatus();\n\n if (authStatus === AuthenticationStatus.LoggedOut) {\n return true;\n }\n\n if (authStatus === AuthenticationStatus.Locked) {\n return this.router.createUrlTree([\"lock\"]);\n }\n\n return this.router.createUrlTree([this.homepage]);\n }\n}\n\ntype UnauthRoutes = {\n homepage: () => string;\n locked: string;\n};\n\nconst defaultRoutes: UnauthRoutes = {\n homepage: () => \"/vault\",\n locked: \"/lock\",\n};\n\nfunction unauthGuard(routes: UnauthRoutes): Observable {\n const accountService = inject(AccountService);\n const router = inject(Router);\n\n return accountService.activeAccount$.pipe(\n map((accountData) => {\n if (accountData == null || accountData.status === AuthenticationStatus.LoggedOut) {\n return true;\n } else if (accountData.status === AuthenticationStatus.Locked) {\n return router.createUrlTree([routes.locked]);\n } else {\n return router.createUrlTree([routes.homepage()]);\n }\n }),\n );\n}\n\nexport function unauthGuardFn(overrides: Partial = {}): CanActivateFn {\n return () => unauthGuard({ ...defaultRoutes, ...overrides });\n}\n","\n

    \n \n {{ title }}\n

    \n
    \n {{ enforcedPolicyMessage }}\n
      \n
    • 0\">\n {{ \"policyInEffectMinComplexity\" | i18n: getPasswordScoreAlertDisplay() }}\n
    • \n
    • 0\">\n {{ \"policyInEffectMinLength\" | i18n: enforcedPolicyOptions?.minLength.toString() }}\n
    • \n
    • \n {{ \"policyInEffectUppercase\" | i18n }}\n
    • \n
    • \n {{ \"policyInEffectLowercase\" | i18n }}\n
    • \n
    • \n {{ \"policyInEffectNumbers\" | i18n }}\n
    • \n
    • \n {{ \"policyInEffectSpecial\" | i18n: \"!@#$%^&*\" }}\n
    • \n
    \n
    \n \n\n","import { Component, Input, OnInit } from \"@angular/core\";\n\nimport { MasterPasswordPolicyOptions } from \"@bitwarden/common/admin-console/models/domain/master-password-policy-options\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\n\n@Component({\n selector: \"app-callout\",\n templateUrl: \"callout.component.html\",\n})\nexport class CalloutComponent implements OnInit {\n @Input() type = \"info\";\n @Input() icon: string;\n @Input() title: string;\n @Input() clickable: boolean;\n @Input() enforcedPolicyOptions: MasterPasswordPolicyOptions;\n @Input() enforcedPolicyMessage: string;\n @Input() useAlertRole = false;\n\n calloutStyle: string;\n\n constructor(private i18nService: I18nService) {}\n\n ngOnInit() {\n this.calloutStyle = this.type;\n\n if (this.enforcedPolicyMessage === undefined) {\n this.enforcedPolicyMessage = this.i18nService.t(\"masterPasswordPolicyInEffect\");\n }\n\n if (this.type === \"warning\" || this.type === \"danger\") {\n if (this.type === \"danger\") {\n this.calloutStyle = \"danger\";\n }\n if (this.title === undefined) {\n this.title = this.i18nService.t(\"warning\");\n }\n if (this.icon === undefined) {\n this.icon = \"bwi-exclamation-triangle\";\n }\n } else if (this.type === \"error\") {\n this.calloutStyle = \"danger\";\n if (this.title === undefined) {\n this.title = this.i18nService.t(\"error\");\n }\n if (this.icon === undefined) {\n this.icon = \"bwi-error\";\n }\n } else if (this.type === \"tip\") {\n this.calloutStyle = \"success\";\n if (this.title === undefined) {\n this.title = this.i18nService.t(\"tip\");\n }\n if (this.icon === undefined) {\n this.icon = \"bwi-lightbulb\";\n }\n }\n }\n\n getPasswordScoreAlertDisplay() {\n if (this.enforcedPolicyOptions == null) {\n return \"\";\n }\n\n let str: string;\n switch (this.enforcedPolicyOptions.minComplexity) {\n case 4:\n str = this.i18nService.t(\"strong\");\n break;\n case 3:\n str = this.i18nService.t(\"good\");\n break;\n default:\n str = this.i18nService.t(\"weak\");\n break;\n }\n return str + \" (\" + this.enforcedPolicyOptions.minComplexity + \")\";\n }\n}\n","import { Directive, ElementRef, Input, Renderer2 } from \"@angular/core\";\n\n@Directive({\n selector: \"[appA11yTitle]\",\n})\nexport class A11yTitleDirective {\n @Input() set appA11yTitle(title: string) {\n this.title = title;\n }\n\n private title: string;\n\n constructor(\n private el: ElementRef,\n private renderer: Renderer2,\n ) {}\n\n ngOnInit() {\n if (!this.el.nativeElement.hasAttribute(\"title\")) {\n this.renderer.setAttribute(this.el.nativeElement, \"title\", this.title);\n }\n if (!this.el.nativeElement.hasAttribute(\"aria-label\")) {\n this.renderer.setAttribute(this.el.nativeElement, \"aria-label\", this.title);\n }\n }\n}\n","import { Directive, ElementRef, Input, OnChanges } from \"@angular/core\";\n\nimport { ErrorResponse } from \"@bitwarden/common/models/response/error.response\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { ValidationService } from \"@bitwarden/common/platform/abstractions/validation.service\";\n\n/**\n * Provides error handling, in particular for any error returned by the server in an api call.\n * Attach it to a
    element and provide the name of the class property that will hold the api call promise.\n * e.g. \n * Any errors/rejections that occur will be intercepted and displayed as error toasts.\n */\n@Directive({\n selector: \"[appApiAction]\",\n})\nexport class ApiActionDirective implements OnChanges {\n @Input() appApiAction: Promise;\n\n constructor(\n private el: ElementRef,\n private validationService: ValidationService,\n private logService: LogService,\n ) {}\n\n ngOnChanges(changes: any) {\n if (this.appApiAction == null || this.appApiAction.then == null) {\n return;\n }\n\n this.el.nativeElement.loading = true;\n\n this.appApiAction.then(\n (response: any) => {\n this.el.nativeElement.loading = false;\n },\n (e: any) => {\n this.el.nativeElement.loading = false;\n\n if ((e as ErrorResponse).captchaRequired) {\n this.logService.error(\"Captcha required error response: \" + e.getSingleMessage());\n return;\n }\n this.logService?.error(`Received API exception: ${e}`);\n this.validationService.showError(e);\n },\n );\n }\n}\n","import { Directive, HostListener, Input } from \"@angular/core\";\n\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\n\n@Directive({\n selector: \"[appCopyClick]\",\n})\nexport class CopyClickDirective {\n constructor(private platformUtilsService: PlatformUtilsService) {}\n\n @Input(\"appCopyClick\") valueToCopy = \"\";\n\n @HostListener(\"click\") onClick() {\n this.platformUtilsService.copyToClipboard(this.valueToCopy);\n }\n}\n","import { Directive, ElementRef, Input, Renderer2 } from \"@angular/core\";\n\n@Directive({\n selector: \"[appInputVerbatim]\",\n})\nexport class InputVerbatimDirective {\n @Input() set appInputVerbatim(condition: boolean | string) {\n this.disableComplete = condition === \"\" || condition === true;\n }\n\n private disableComplete: boolean;\n\n constructor(\n private el: ElementRef,\n private renderer: Renderer2,\n ) {}\n\n ngOnInit() {\n if (this.disableComplete && !this.el.nativeElement.hasAttribute(\"autocomplete\")) {\n this.renderer.setAttribute(this.el.nativeElement, \"autocomplete\", \"off\");\n }\n if (!this.el.nativeElement.hasAttribute(\"autocapitalize\")) {\n this.renderer.setAttribute(this.el.nativeElement, \"autocapitalize\", \"none\");\n }\n if (!this.el.nativeElement.hasAttribute(\"autocorrect\")) {\n this.renderer.setAttribute(this.el.nativeElement, \"autocorrect\", \"none\");\n }\n if (!this.el.nativeElement.hasAttribute(\"spellcheck\")) {\n this.renderer.setAttribute(this.el.nativeElement, \"spellcheck\", \"false\");\n }\n if (!this.el.nativeElement.hasAttribute(\"inputmode\")) {\n this.renderer.setAttribute(this.el.nativeElement, \"inputmode\", \"verbatim\");\n }\n }\n}\n","import { Directive, HostListener } from \"@angular/core\";\n\n@Directive({\n selector: \"[appStopClick]\",\n})\nexport class StopClickDirective {\n @HostListener(\"click\", [\"$event\"]) onClick($event: MouseEvent) {\n $event.preventDefault();\n }\n}\n","import { Directive, HostListener } from \"@angular/core\";\n\n@Directive({\n selector: \"[appStopProp]\",\n})\nexport class StopPropDirective {\n @HostListener(\"click\", [\"$event\"]) onClick($event: MouseEvent) {\n $event.stopPropagation();\n }\n}\n","import { animate, state, style, transition, trigger } from \"@angular/animations\";\nimport { CommonModule } from \"@angular/common\";\nimport { Component, ModuleWithProviders, NgModule } from \"@angular/core\";\nimport {\n DefaultNoComponentGlobalConfig,\n GlobalConfig,\n Toast as BaseToast,\n ToastPackage,\n ToastrService,\n TOAST_CONFIG,\n} from \"ngx-toastr\";\n\n@Component({\n selector: \"[toast-component2]\",\n template: `\n \n ×\n \n
    \n \n
    \n
    \n
    \n {{ title }} [{{ duplicatesCount + 1 }}]\n
    \n
    \n \n {{ message }}\n \n \n
    \n
    \n
    \n `,\n animations: [\n trigger(\"flyInOut\", [\n state(\"inactive\", style({ opacity: 0 })),\n state(\"active\", style({ opacity: 1 })),\n state(\"removed\", style({ opacity: 0 })),\n transition(\"inactive => active\", animate(\"{{ easeTime }}ms {{ easing }}\")),\n transition(\"active => removed\", animate(\"{{ easeTime }}ms {{ easing }}\")),\n ]),\n ],\n preserveWhitespaces: false,\n})\nexport class BitwardenToast extends BaseToast {\n constructor(\n protected toastrService: ToastrService,\n public toastPackage: ToastPackage,\n ) {\n super(toastrService, toastPackage);\n }\n}\n\nexport const BitwardenToastGlobalConfig: GlobalConfig = {\n ...DefaultNoComponentGlobalConfig,\n toastComponent: BitwardenToast,\n};\n\n@NgModule({\n imports: [CommonModule],\n declarations: [BitwardenToast],\n exports: [BitwardenToast],\n})\nexport class BitwardenToastModule {\n static forRoot(config: Partial = {}): ModuleWithProviders {\n return {\n ngModule: BitwardenToastModule,\n providers: [\n {\n provide: TOAST_CONFIG,\n useValue: {\n default: BitwardenToastGlobalConfig,\n config: config,\n },\n },\n ],\n };\n }\n}\n","import { Pipe, PipeTransform } from \"@angular/core\";\n\ninterface CardRuleEntry {\n cardLength: number;\n blocks: number[];\n}\n\n// See https://baymard.com/checkout-usability/credit-card-patterns for\n// all possible credit card spacing patterns. For now, we just handle\n// the below.\nconst numberFormats: Record = {\n Visa: [{ cardLength: 16, blocks: [4, 4, 4, 4] }],\n Mastercard: [{ cardLength: 16, blocks: [4, 4, 4, 4] }],\n Maestro: [\n { cardLength: 16, blocks: [4, 4, 4, 4] },\n { cardLength: 13, blocks: [4, 4, 5] },\n { cardLength: 15, blocks: [4, 6, 5] },\n { cardLength: 19, blocks: [4, 4, 4, 4, 3] },\n ],\n Discover: [{ cardLength: 16, blocks: [4, 4, 4, 4] }],\n \"Diners Club\": [{ cardLength: 14, blocks: [4, 6, 4] }],\n JCB: [{ cardLength: 16, blocks: [4, 4, 4, 4] }],\n UnionPay: [\n { cardLength: 16, blocks: [4, 4, 4, 4] },\n { cardLength: 19, blocks: [6, 13] },\n ],\n Amex: [{ cardLength: 15, blocks: [4, 6, 5] }],\n Other: [{ cardLength: 16, blocks: [4, 4, 4, 4] }],\n};\n\n@Pipe({ name: \"creditCardNumber\" })\nexport class CreditCardNumberPipe implements PipeTransform {\n transform(creditCardNumber: string, brand: string): string {\n let rules = numberFormats[brand];\n\n if (rules == null) {\n rules = numberFormats[\"Other\"];\n }\n\n const cardLength = creditCardNumber.length;\n\n let matchingRule = rules.find((r) => r.cardLength == cardLength);\n if (matchingRule == null) {\n matchingRule = rules[0];\n }\n\n const blocks = matchingRule.blocks;\n\n const chunks: string[] = [];\n let total = 0;\n\n blocks.forEach((c) => {\n chunks.push(creditCardNumber.slice(total, total + c));\n total += c;\n });\n\n // Append the remaining part\n if (cardLength > total) {\n chunks.push(creditCardNumber.slice(total));\n }\n\n return chunks.join(\" \");\n }\n}\n","import { CommonModule, DatePipe } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\nimport { FormsModule, ReactiveFormsModule } from \"@angular/forms\";\n\nimport { AutofocusDirective } from \"@bitwarden/components\";\n\nimport { CalloutComponent } from \"./components/callout.component\";\nimport { BitwardenToastModule } from \"./components/toastr.component\";\nimport { A11yInvalidDirective } from \"./directives/a11y-invalid.directive\";\nimport { A11yTitleDirective } from \"./directives/a11y-title.directive\";\nimport { ApiActionDirective } from \"./directives/api-action.directive\";\nimport { BoxRowDirective } from \"./directives/box-row.directive\";\nimport { CopyClickDirective } from \"./directives/copy-click.directive\";\nimport { CopyTextDirective } from \"./directives/copy-text.directive\";\nimport { FallbackSrcDirective } from \"./directives/fallback-src.directive\";\nimport { IfFeatureDirective } from \"./directives/if-feature.directive\";\nimport { InputStripSpacesDirective } from \"./directives/input-strip-spaces.directive\";\nimport { InputVerbatimDirective } from \"./directives/input-verbatim.directive\";\nimport { LaunchClickDirective } from \"./directives/launch-click.directive\";\nimport { NotPremiumDirective } from \"./directives/not-premium.directive\";\nimport { StopClickDirective } from \"./directives/stop-click.directive\";\nimport { StopPropDirective } from \"./directives/stop-prop.directive\";\nimport { TrueFalseValueDirective } from \"./directives/true-false-value.directive\";\nimport { CreditCardNumberPipe } from \"./pipes/credit-card-number.pipe\";\nimport { SearchCiphersPipe } from \"./pipes/search-ciphers.pipe\";\nimport { SearchPipe } from \"./pipes/search.pipe\";\nimport { UserNamePipe } from \"./pipes/user-name.pipe\";\nimport { UserTypePipe } from \"./pipes/user-type.pipe\";\nimport { EllipsisPipe } from \"./platform/pipes/ellipsis.pipe\";\nimport { FingerprintPipe } from \"./platform/pipes/fingerprint.pipe\";\nimport { I18nPipe } from \"./platform/pipes/i18n.pipe\";\nimport { PasswordStrengthComponent } from \"./tools/password-strength/password-strength.component\";\nimport { IconComponent } from \"./vault/components/icon.component\";\n\n@NgModule({\n imports: [\n BitwardenToastModule.forRoot({\n maxOpened: 5,\n autoDismiss: true,\n closeButton: true,\n }),\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n ],\n declarations: [\n A11yInvalidDirective,\n A11yTitleDirective,\n ApiActionDirective,\n AutofocusDirective,\n BoxRowDirective,\n CalloutComponent,\n CopyTextDirective,\n CreditCardNumberPipe,\n EllipsisPipe,\n FallbackSrcDirective,\n I18nPipe,\n IconComponent,\n InputStripSpacesDirective,\n InputVerbatimDirective,\n NotPremiumDirective,\n SearchCiphersPipe,\n SearchPipe,\n StopClickDirective,\n StopPropDirective,\n TrueFalseValueDirective,\n CopyClickDirective,\n LaunchClickDirective,\n UserNamePipe,\n PasswordStrengthComponent,\n UserTypePipe,\n IfFeatureDirective,\n FingerprintPipe,\n ],\n exports: [\n A11yInvalidDirective,\n A11yTitleDirective,\n ApiActionDirective,\n AutofocusDirective,\n BitwardenToastModule,\n BoxRowDirective,\n CalloutComponent,\n CopyTextDirective,\n CreditCardNumberPipe,\n EllipsisPipe,\n FallbackSrcDirective,\n I18nPipe,\n IconComponent,\n InputStripSpacesDirective,\n InputVerbatimDirective,\n NotPremiumDirective,\n SearchCiphersPipe,\n SearchPipe,\n StopClickDirective,\n StopPropDirective,\n TrueFalseValueDirective,\n CopyClickDirective,\n LaunchClickDirective,\n UserNamePipe,\n PasswordStrengthComponent,\n UserTypePipe,\n IfFeatureDirective,\n FingerprintPipe,\n ],\n providers: [\n CreditCardNumberPipe,\n DatePipe,\n I18nPipe,\n SearchPipe,\n UserNamePipe,\n UserTypePipe,\n FingerprintPipe,\n ],\n})\nexport class JslibModule {}\n","import { Pipe, PipeTransform } from \"@angular/core\";\n\ntype PropertyValueFunction = (item: T) => { toString: () => string };\n\n@Pipe({\n name: \"search\",\n})\nexport class SearchPipe implements PipeTransform {\n transform(\n items: T[],\n searchText: string,\n prop1?: keyof T,\n prop2?: keyof T,\n prop3?: keyof T,\n ): T[];\n transform(\n items: T[],\n searchText: string,\n prop1?: PropertyValueFunction,\n prop2?: PropertyValueFunction,\n prop3?: PropertyValueFunction,\n ): T[];\n transform(\n items: T[],\n searchText: string,\n prop1?: keyof T | PropertyValueFunction,\n prop2?: keyof T | PropertyValueFunction,\n prop3?: keyof T | PropertyValueFunction,\n ): T[] {\n if (items == null || items.length === 0) {\n return [];\n }\n\n if (searchText == null || searchText.length < 2) {\n return items;\n }\n\n searchText = searchText.trim().toLowerCase();\n return items.filter((i) => {\n if (prop1 != null) {\n const propValue = typeof prop1 === \"function\" ? prop1(i) : i[prop1];\n\n if (propValue?.toString().toLowerCase().indexOf(searchText) > -1) {\n return true;\n }\n }\n\n if (prop2 != null) {\n const propValue = typeof prop2 === \"function\" ? prop2(i) : i[prop2];\n\n if (propValue?.toString().toLowerCase().indexOf(searchText) > -1) {\n return true;\n }\n }\n\n if (prop3 != null) {\n const propValue = typeof prop3 === \"function\" ? prop3(i) : i[prop3];\n\n if (propValue?.toString().toLowerCase().indexOf(searchText) > -1) {\n return true;\n }\n }\n\n return false;\n });\n }\n}\n","import { Pipe, PipeTransform } from \"@angular/core\";\n\ninterface User {\n name?: string;\n email?: string;\n}\n\n@Pipe({\n name: \"userName\",\n})\nexport class UserNamePipe implements PipeTransform {\n transform(user?: User): string {\n if (user == null) {\n return null;\n }\n\n if (user.name == null && user.email == null) {\n return null;\n }\n\n return user.name == null || user.name.trim() === \"\" ? user.email : user.name;\n }\n}\n","import { Pipe, PipeTransform } from \"@angular/core\";\n\nimport { OrganizationUserType } from \"@bitwarden/common/admin-console/enums\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\n\n@Pipe({\n name: \"userType\",\n})\nexport class UserTypePipe implements PipeTransform {\n constructor(private i18nService: I18nService) {}\n\n transform(value?: OrganizationUserType): string {\n if (value == null) {\n return this.i18nService.t(\"unknown\");\n }\n switch (value) {\n case OrganizationUserType.Owner:\n return this.i18nService.t(\"owner\");\n case OrganizationUserType.Admin:\n return this.i18nService.t(\"admin\");\n case OrganizationUserType.User:\n return this.i18nService.t(\"user\");\n case OrganizationUserType.Manager:\n return this.i18nService.t(\"manager\");\n case OrganizationUserType.Custom:\n return this.i18nService.t(\"custom\");\n }\n }\n}\n","import { AbstractControl } from \"@angular/forms\";\nexport interface AllValidationErrors {\n controlName: string;\n errorName: string;\n}\n\nexport interface FormGroupControls {\n [key: string]: AbstractControl;\n}\n\nexport abstract class FormValidationErrorsService {\n getFormValidationErrors: (controls: FormGroupControls) => AllValidationErrors[];\n}\n","import { Pipe, PipeTransform } from \"@angular/core\";\n\n@Pipe({\n name: \"ellipsis\",\n})\n/**\n * @deprecated Use the tailwind class 'tw-truncate' instead\n */\nexport class EllipsisPipe implements PipeTransform {\n transform(value: string, limit = 25, completeWords = false, ellipsis = \"...\") {\n if (value.length <= limit) {\n return value;\n }\n limit -= ellipsis.length;\n if (completeWords && value.length > limit && value.indexOf(\" \") > 0) {\n limit = value.substring(0, limit).lastIndexOf(\" \");\n }\n return value.substring(0, limit) + ellipsis;\n }\n}\n","import { Pipe } from \"@angular/core\";\n\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\n\n@Pipe({\n name: \"fingerprint\",\n})\nexport class FingerprintPipe {\n constructor(private cryptoService: CryptoService) {}\n\n async transform(publicKey: string | Uint8Array, fingerprintMaterial: string): Promise {\n try {\n if (typeof publicKey === \"string\") {\n publicKey = Utils.fromB64ToArray(publicKey);\n }\n\n const fingerprint = await this.cryptoService.getFingerprint(fingerprintMaterial, publicKey);\n\n if (fingerprint != null) {\n return fingerprint.join(\"-\");\n }\n\n return \"\";\n } catch {\n return \"\";\n }\n }\n}\n","import { Pipe, PipeTransform } from \"@angular/core\";\n\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\n\n@Pipe({\n name: \"i18n\",\n})\nexport class I18nPipe implements PipeTransform {\n constructor(private i18nService: I18nService) {}\n\n transform(id: string, p1?: string | number, p2?: string | number, p3?: string | number): string {\n return this.i18nService.t(id, p1, p2, p3);\n }\n}\n","import { Observable, Subscription } from \"rxjs\";\n\nimport { ThemeType } from \"@bitwarden/common/platform/enums\";\n\n/**\n * A service for managing and observing the current application theme.\n */\n// FIXME: Rename to ThemingService\nexport abstract class AbstractThemingService {\n /**\n * The effective theme based on the user configured choice and the current system theme if\n * the configured choice is {@link ThemeType.System}.\n */\n theme$: Observable;\n /**\n * Listens for effective theme changes and applies changes to the provided document.\n * @param document The document that should have theme classes applied to it.\n *\n * @returns A subscription that can be unsubscribed from to cancel the application of theme classes.\n */\n applyThemeChangesTo: (document: Document) => Subscription;\n}\n","import { InjectionToken } from \"@angular/core\";\nimport { Observable } from \"rxjs\";\n\nimport {\n AbstractMemoryStorageService,\n AbstractStorageService,\n ObservableStorageService,\n} from \"@bitwarden/common/platform/abstractions/storage.service\";\nimport { ThemeType } from \"@bitwarden/common/platform/enums\";\nimport { StateFactory } from \"@bitwarden/common/platform/factories/state-factory\";\n\ndeclare const tag: unique symbol;\n/**\n * A (more) typesafe version of InjectionToken which will more strictly enforce the generic type parameter.\n * @remarks The default angular implementation does not use the generic type to define the structure of the object,\n * so the structural type system will not complain about a mismatch in the type parameter.\n * This is solved by assigning T to an arbitrary private property.\n */\nexport class SafeInjectionToken extends InjectionToken {\n private readonly [tag]: T;\n}\n\nexport const WINDOW = new SafeInjectionToken(\"WINDOW\");\nexport const OBSERVABLE_MEMORY_STORAGE = new SafeInjectionToken<\n AbstractMemoryStorageService & ObservableStorageService\n>(\"OBSERVABLE_MEMORY_STORAGE\");\nexport const OBSERVABLE_DISK_STORAGE = new SafeInjectionToken<\n AbstractStorageService & ObservableStorageService\n>(\"OBSERVABLE_DISK_STORAGE\");\nexport const OBSERVABLE_DISK_LOCAL_STORAGE = new SafeInjectionToken<\n AbstractStorageService & ObservableStorageService\n>(\"OBSERVABLE_DISK_LOCAL_STORAGE\");\nexport const MEMORY_STORAGE = new SafeInjectionToken(\n \"MEMORY_STORAGE\",\n);\nexport const SECURE_STORAGE = new SafeInjectionToken(\"SECURE_STORAGE\");\nexport const STATE_FACTORY = new SafeInjectionToken(\"STATE_FACTORY\");\nexport const STATE_SERVICE_USE_CACHE = new SafeInjectionToken(\"STATE_SERVICE_USE_CACHE\");\nexport const LOGOUT_CALLBACK = new SafeInjectionToken<\n (expired: boolean, userId?: string) => Promise\n>(\"LOGOUT_CALLBACK\");\nexport const LOCKED_CALLBACK = new SafeInjectionToken<(userId?: string) => Promise>(\n \"LOCKED_CALLBACK\",\n);\nexport const SUPPORTS_SECURE_STORAGE = new SafeInjectionToken(\"SUPPORTS_SECURE_STORAGE\");\nexport const LOCALES_DIRECTORY = new SafeInjectionToken(\"LOCALES_DIRECTORY\");\nexport const SYSTEM_LANGUAGE = new SafeInjectionToken(\"SYSTEM_LANGUAGE\");\nexport const LOG_MAC_FAILURES = new SafeInjectionToken(\"LOG_MAC_FAILURES\");\nexport const SYSTEM_THEME_OBSERVABLE = new SafeInjectionToken>(\n \"SYSTEM_THEME_OBSERVABLE\",\n);\n","import { Observable, Subject } from \"rxjs\";\nimport { first } from \"rxjs/operators\";\n\nexport class ModalRef {\n onCreated: Observable; // Modal added to the DOM.\n onClose: Observable; // Initiated close.\n onClosed: Observable; // Modal was closed (Remove element from DOM)\n onShow: Observable; // Start showing modal\n onShown: Observable; // Modal is fully visible\n\n private readonly _onCreated = new Subject();\n private readonly _onClose = new Subject();\n private readonly _onClosed = new Subject();\n private readonly _onShow = new Subject();\n private readonly _onShown = new Subject();\n private lastResult: any;\n\n constructor() {\n this.onCreated = this._onCreated.asObservable();\n this.onClose = this._onClose.asObservable();\n this.onClosed = this._onClosed.asObservable();\n this.onShow = this._onShow.asObservable();\n this.onShown = this._onShow.asObservable();\n }\n\n show() {\n this._onShow.next();\n }\n\n shown() {\n this._onShown.next();\n }\n\n close(result?: any) {\n this.lastResult = result;\n this._onClose.next(result);\n }\n\n closed() {\n this._onClosed.next(this.lastResult);\n }\n\n created(el: HTMLElement) {\n this._onCreated.next(el);\n }\n\n onClosedPromise(): Promise {\n return this.onClosed.pipe(first()).toPromise();\n }\n}\n","import { ConfigurableFocusTrap, ConfigurableFocusTrapFactory } from \"@angular/cdk/a11y\";\nimport {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ComponentRef,\n ElementRef,\n OnDestroy,\n Type,\n ViewChild,\n ViewContainerRef,\n} from \"@angular/core\";\n\nimport { ModalRef } from \"./modal.ref\";\n\n@Component({\n selector: \"app-modal\",\n template: \"\",\n})\nexport class DynamicModalComponent implements AfterViewInit, OnDestroy {\n componentRef: ComponentRef;\n\n @ViewChild(\"modalContent\", { read: ViewContainerRef, static: true })\n modalContentRef: ViewContainerRef;\n\n childComponentType: Type;\n setComponentParameters: (component: any) => void;\n\n private focusTrap: ConfigurableFocusTrap;\n\n constructor(\n private cd: ChangeDetectorRef,\n private el: ElementRef,\n private focusTrapFactory: ConfigurableFocusTrapFactory,\n public modalRef: ModalRef,\n ) {}\n\n ngAfterViewInit() {\n this.loadChildComponent(this.childComponentType);\n if (this.setComponentParameters != null) {\n this.setComponentParameters(this.componentRef.instance);\n }\n this.cd.detectChanges();\n\n this.modalRef.created(this.el.nativeElement);\n this.focusTrap = this.focusTrapFactory.create(\n this.el.nativeElement.querySelector(\".modal-dialog\"),\n );\n if (this.el.nativeElement.querySelector(\"[appAutoFocus]\") == null) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.focusTrap.focusFirstTabbableElementWhenReady();\n }\n }\n\n loadChildComponent(componentType: Type) {\n this.modalContentRef.clear();\n this.componentRef = this.modalContentRef.createComponent(componentType);\n }\n\n ngOnDestroy() {\n if (this.componentRef) {\n this.componentRef.destroy();\n }\n this.focusTrap.destroy();\n }\n\n close() {\n this.modalRef.close();\n }\n\n getFocus() {\n const autoFocusEl = this.el.nativeElement.querySelector(\"[appAutoFocus]\") as HTMLElement;\n autoFocusEl?.focus();\n }\n}\n","import { InjectFlags, InjectOptions, Injector, ProviderToken } from \"@angular/core\";\n\nexport class ModalInjector implements Injector {\n constructor(\n private _parentInjector: Injector,\n private _additionalTokens: WeakMap,\n ) {}\n\n get(\n token: ProviderToken,\n notFoundValue: undefined,\n options: InjectOptions & { optional?: false },\n ): T;\n get(token: ProviderToken, notFoundValue: null, options: InjectOptions): T;\n get(token: ProviderToken, notFoundValue?: T, options?: InjectOptions | InjectFlags): T;\n get(token: ProviderToken, notFoundValue?: T, flags?: InjectFlags): T;\n get(token: any, notFoundValue?: any): any;\n get(token: any, notFoundValue?: any, flags?: any): any {\n return this._additionalTokens.get(token) ?? this._parentInjector.get(token, notFoundValue);\n }\n}\n","import { ComponentRef, Injectable, Injector, Type, ViewContainerRef } from \"@angular/core\";\nimport { first } from \"rxjs/operators\";\n\nimport { DynamicModalComponent } from \"../components/modal/dynamic-modal.component\";\nimport { ModalInjector } from \"../components/modal/modal-injector\";\nimport { ModalRef } from \"../components/modal/modal.ref\";\n\n/**\n * @deprecated Use the Component Library's `DialogService` instead.\n */\n@Injectable()\nexport class ModalService {\n protected modalList: ComponentRef[] = [];\n\n constructor(private injector: Injector) {\n document.addEventListener(\"keyup\", (event) => {\n if (event.key === \"Escape\" && this.modalCount > 0) {\n this.topModal.instance.close();\n }\n });\n }\n\n get modalCount() {\n return this.modalList.length;\n }\n\n private get topModal() {\n return this.modalList[this.modalCount - 1];\n }\n\n /**\n * @deprecated Use `dialogService.open` instead.\n * If replacing an existing call to this method, also remove any `@ViewChild` and `` associated with the\n * existing usage.\n */\n async openViewRef(\n componentType: Type,\n viewContainerRef: ViewContainerRef,\n setComponentParameters: (component: T) => void = null,\n ): Promise<[ModalRef, T]> {\n const [modalRef, modalComponentRef] = this.openInternal(viewContainerRef, componentType);\n modalComponentRef.instance.setComponentParameters = setComponentParameters;\n\n viewContainerRef.insert(modalComponentRef.hostView);\n\n await modalRef.onCreated.pipe(first()).toPromise();\n\n return [modalRef, modalComponentRef.instance.componentRef.instance];\n }\n\n closeAll(): void {\n this.modalList.forEach((modal) => modal.instance.close());\n }\n\n protected openInternal(\n viewContainerRef: ViewContainerRef,\n componentType: Type,\n ): [ModalRef, ComponentRef] {\n const [modalRef, componentRef] = this.createModalComponent(viewContainerRef);\n componentRef.instance.childComponentType = componentType;\n\n modalRef.onClosed.pipe(first()).subscribe(() => {\n componentRef.destroy();\n\n this.modalList.pop();\n if (this.modalCount > 0) {\n this.topModal.instance.getFocus();\n }\n });\n\n this.setupHandlers(modalRef);\n\n this.modalList.push(componentRef);\n\n return [modalRef, componentRef];\n }\n\n protected setupHandlers(modalRef: ModalRef) {\n let backdrop: HTMLElement = null;\n\n // Add backdrop, setup [data-dismiss] handler.\n modalRef.onCreated.pipe(first()).subscribe((el) => {\n document.body.classList.add(\"modal-open\");\n\n const modalEl: HTMLElement = el.querySelector(\".modal\");\n const dialogEl = modalEl.querySelector(\".modal-dialog\") as HTMLElement;\n\n backdrop = document.createElement(\"div\");\n backdrop.className = \"modal-backdrop fade\";\n backdrop.style.zIndex = `${this.modalCount}040`;\n modalEl.prepend(backdrop);\n\n dialogEl.addEventListener(\"click\", (e: Event) => {\n e.stopPropagation();\n });\n dialogEl.style.zIndex = `${this.modalCount}050`;\n\n const modals = Array.from(\n el.querySelectorAll('.modal-backdrop, .modal *[data-dismiss=\"modal\"]'),\n );\n for (const closeElement of modals) {\n closeElement.addEventListener(\"click\", () => {\n modalRef.close();\n });\n }\n });\n\n // onClose is used in Web to hook into bootstrap. On other projects we pipe it directly to closed.\n modalRef.onClose.pipe(first()).subscribe(() => {\n modalRef.closed();\n\n if (this.modalCount === 0) {\n document.body.classList.remove(\"modal-open\");\n }\n });\n }\n\n protected createModalComponent(\n viewContainerRef: ViewContainerRef,\n ): [ModalRef, ComponentRef] {\n const modalRef = new ModalRef();\n\n const map = new WeakMap();\n map.set(ModalRef, modalRef);\n\n const injector = new ModalInjector(this.injector, map);\n const componentRef = viewContainerRef.createComponent(DynamicModalComponent, { injector });\n\n return [modalRef, componentRef];\n }\n}\n","
    \n \n \n {{ text }}\n \n
    \n\n","import { Component, EventEmitter, Input, OnChanges, Output } from \"@angular/core\";\n\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { PasswordStrengthServiceAbstraction } from \"@bitwarden/common/tools/password-strength\";\n\nexport interface PasswordColorText {\n color: string;\n text: string;\n}\n\n@Component({\n selector: \"app-password-strength\",\n templateUrl: \"password-strength.component.html\",\n})\nexport class PasswordStrengthComponent implements OnChanges {\n @Input() showText = false;\n @Input() email: string;\n @Input() name: string;\n @Input() set password(value: string) {\n this.updatePasswordStrength(value);\n }\n @Output() passwordStrengthResult = new EventEmitter();\n @Output() passwordScoreColor = new EventEmitter();\n\n masterPasswordScore: number;\n scoreWidth = 0;\n color = \"bg-danger\";\n text: string;\n\n private masterPasswordStrengthTimeout: any;\n\n //used by desktop and browser to display strength text color\n get masterPasswordScoreColor() {\n switch (this.masterPasswordScore) {\n case 4:\n return \"success\";\n case 3:\n return \"primary\";\n case 2:\n return \"warning\";\n default:\n return \"danger\";\n }\n }\n\n //used by desktop and browser to display strength text\n get masterPasswordScoreText() {\n switch (this.masterPasswordScore) {\n case 4:\n return this.i18nService.t(\"strong\");\n case 3:\n return this.i18nService.t(\"good\");\n case 2:\n return this.i18nService.t(\"weak\");\n default:\n return this.masterPasswordScore != null ? this.i18nService.t(\"weak\") : null;\n }\n }\n\n constructor(\n private i18nService: I18nService,\n private passwordStrengthService: PasswordStrengthServiceAbstraction,\n ) {}\n\n ngOnChanges(): void {\n this.masterPasswordStrengthTimeout = setTimeout(() => {\n this.scoreWidth = this.masterPasswordScore == null ? 0 : (this.masterPasswordScore + 1) * 20;\n\n switch (this.masterPasswordScore) {\n case 4:\n this.color = \"bg-success\";\n this.text = this.i18nService.t(\"strong\");\n break;\n case 3:\n this.color = \"bg-primary\";\n this.text = this.i18nService.t(\"good\");\n break;\n case 2:\n this.color = \"bg-warning\";\n this.text = this.i18nService.t(\"weak\");\n break;\n default:\n this.color = \"bg-danger\";\n this.text = this.masterPasswordScore != null ? this.i18nService.t(\"weak\") : null;\n break;\n }\n\n this.setPasswordScoreText(this.color, this.text);\n }, 300);\n }\n\n updatePasswordStrength(password: string) {\n const masterPassword = password;\n\n if (this.masterPasswordStrengthTimeout != null) {\n clearTimeout(this.masterPasswordStrengthTimeout);\n }\n\n const strengthResult = this.passwordStrengthService.getPasswordStrength(\n masterPassword,\n this.email,\n this.name?.trim().toLowerCase().split(\" \"),\n );\n this.passwordStrengthResult.emit(strengthResult);\n this.masterPasswordScore = strengthResult == null ? null : strengthResult.score;\n }\n\n setPasswordScoreText(color: string, text: string) {\n color = color.slice(3);\n this.passwordScoreColor.emit({ color: color, text: text });\n }\n}\n","import { AbstractControl, FormArray } from \"@angular/forms\";\n\nexport type SelectionItemId = {\n id: string;\n};\n\nfunction findSortedIndex(sortedArray: T[], val: T, compareFn: (a: T, b: T) => number) {\n let low = 0;\n let high = sortedArray.length || 0;\n let mid = -1,\n c = 0;\n while (low < high) {\n mid = Math.floor((low + high) / 2);\n c = compareFn(sortedArray[mid], val);\n if (c < 0) {\n low = mid + 1;\n } else if (c > 0) {\n high = mid;\n } else {\n return mid;\n }\n }\n return low;\n}\n\n/**\n * Utility to help manage a list of selectable items for use with Reactive Angular forms and FormArrays.\n *\n * It supports selecting/deselecting items, keeping items sorted, and synchronizing the selected items\n * with an array of FormControl.\n *\n * The first type parameter TItem represents the item being selected/deselected, it must have an `id`\n * property for identification/comparison. The second type parameter TControlValue represents the value\n * type of the form control.\n */\nexport class FormSelectionList<\n TItem extends SelectionItemId,\n TControlValue extends SelectionItemId,\n> {\n allItems: TItem[] = [];\n /**\n * Sorted list of selected items\n * Immutable and should be recreated whenever a modification is made\n */\n selectedItems: TItem[] = [];\n\n /**\n * Sorted list of deselected items\n * Immutable and should be recreated whenever a modification is made\n */\n deselectedItems: TItem[] = [];\n\n /**\n * Sorted FormArray that corresponds and stays in sync with the selectedItems\n */\n formArray: FormArray, TControlValue>> = new FormArray([]);\n\n /**\n * Construct a new FormSelectionList\n * @param controlFactory - Factory responsible for creating initial form controls for each selected item. It is\n * provided a copy of the selected item for any form control initialization logic. Specify any additional form\n * control options or validators here.\n * @param compareFn - Comparison function used for sorting the items.\n */\n constructor(\n private controlFactory: (item: TItem) => AbstractControl, TControlValue>,\n private compareFn: (a: TItem, b: TItem) => number,\n ) {}\n\n /**\n * Select multiple items by their ids at once. Optionally provide an initial form control value.\n * @param ids - List of ids to select\n * @param initialValue - Value that will be applied to the corresponding form controls\n * The provided `id` arguments will be automatically assigned to each form control value\n */\n selectItems(ids: string[], initialValue?: Partial | undefined) {\n for (const id of ids) {\n this.selectItem(id, initialValue);\n }\n }\n\n /**\n * Deselect multiple items by their ids at once\n * @param ids - List of ids to deselect\n */\n deselectItems(ids: string[]) {\n for (const id of ids) {\n this.deselectItem(id);\n }\n }\n\n deselectAll() {\n this.formArray.clear();\n this.selectedItems = [];\n this.deselectedItems = [...this.allItems];\n }\n\n /**\n * Select a single item by id.\n *\n * Maintains list order for both selected items, deselected items, and the FormArray.\n *\n * @param id - Id of the item to select\n * @param initialValue - Value that will be applied to the corresponding form control for the selected item.\n * The provided `id` argument will be automatically assigned unless explicitly set in the initialValue.\n */\n selectItem(id: string, initialValue?: Partial) {\n const index = this.deselectedItems.findIndex((o) => o.id === id);\n\n if (index === -1) {\n return;\n }\n\n const selectedOption = this.deselectedItems[index];\n\n // Note: Changes to the deselected/selected arrays must create a new copy of the array\n // in order for Angular's Change Detection to pick up the modification (i.e. treat the arrays as immutable)\n\n // Remove from the list of deselected options\n this.deselectedItems = [\n ...this.deselectedItems.slice(0, index),\n ...this.deselectedItems.slice(index + 1),\n ];\n\n // Insert into the sorted selected options list\n const sortedInsertIndex = findSortedIndex(this.selectedItems, selectedOption, this.compareFn);\n\n this.selectedItems = [\n ...this.selectedItems.slice(0, sortedInsertIndex),\n selectedOption,\n ...this.selectedItems.slice(sortedInsertIndex),\n ];\n\n const newControl = this.controlFactory(selectedOption);\n\n // Patch the value and ensure the `id` is set\n newControl.patchValue({\n id,\n ...initialValue,\n });\n\n this.formArray.insert(sortedInsertIndex, newControl);\n }\n\n /**\n * Deselect a single item by id.\n *\n * Maintains list order for both selected items, deselected items, and the FormArray.\n *\n * @param id - Id of the item to deselect\n */\n deselectItem(id: string) {\n const index = this.selectedItems.findIndex((o) => o.id === id);\n\n if (index === -1) {\n return;\n }\n\n const deselectedOption = this.selectedItems[index];\n\n // Note: Changes to the deselected/selected arrays must create a new copy of the array\n // in order for Angular's Change Detection to pick up the modification (i.e. treat the arrays as immutable)\n\n // Remove from the list of selected items (and FormArray)\n this.selectedItems = [\n ...this.selectedItems.slice(0, index),\n ...this.selectedItems.slice(index + 1),\n ];\n this.formArray.removeAt(index);\n\n // Insert into the sorted deselected array\n const sortedInsertIndex = findSortedIndex(\n this.deselectedItems,\n deselectedOption,\n this.compareFn,\n );\n\n this.deselectedItems = [\n ...this.deselectedItems.slice(0, sortedInsertIndex),\n deselectedOption,\n ...this.deselectedItems.slice(sortedInsertIndex),\n ];\n }\n\n /**\n * Populate the list of deselected items, and optional specify which items should be selected and with what initial\n * value for their Form Control\n * @param items - A list of all items. (Will be sorted internally)\n * @param selectedItems - The items to select initially\n */\n populateItems(items: TItem[], selectedItems: TControlValue[] = []) {\n this.formArray.clear();\n this.allItems = [...items].sort(this.compareFn);\n this.selectedItems = [];\n this.deselectedItems = [...this.allItems];\n\n for (const selectedItem of selectedItems) {\n this.selectItem(selectedItem.id, selectedItem);\n }\n }\n\n /**\n * Helper method to iterate over each \"selected\" form control and its corresponding item\n * @param fn - The function to call for each form control and its corresponding item\n */\n forEachControlItem(\n fn: (control: AbstractControl, TControlValue>, value: TItem) => void,\n ) {\n for (let i = 0; i < this.formArray.length; i++) {\n // The selectedItems array and formArray are explicitly kept in sync,\n // so we can safely assume the index of the form control and item are the same\n fn(this.formArray.at(i), this.selectedItems[i]);\n }\n }\n}\n","import { Directive, EventEmitter, Input, OnInit, Output } from \"@angular/core\";\nimport { firstValueFrom } from \"rxjs\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { BillingAccountProfileStateService } from \"@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service\";\nimport { ErrorResponse } from \"@bitwarden/common/models/response/error.response\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { FileDownloadService } from \"@bitwarden/common/platform/abstractions/file-download/file-download.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { EncArrayBuffer } from \"@bitwarden/common/platform/models/domain/enc-array-buffer\";\nimport { CipherService } from \"@bitwarden/common/vault/abstractions/cipher.service\";\nimport { Cipher } from \"@bitwarden/common/vault/models/domain/cipher\";\nimport { AttachmentView } from \"@bitwarden/common/vault/models/view/attachment.view\";\nimport { CipherView } from \"@bitwarden/common/vault/models/view/cipher.view\";\nimport { DialogService } from \"@bitwarden/components\";\n\n@Directive()\nexport class AttachmentsComponent implements OnInit {\n @Input() cipherId: string;\n @Output() onUploadedAttachment = new EventEmitter();\n @Output() onDeletedAttachment = new EventEmitter();\n @Output() onReuploadedAttachment = new EventEmitter();\n\n cipher: CipherView;\n cipherDomain: Cipher;\n canAccessAttachments: boolean;\n formPromise: Promise;\n deletePromises: { [id: string]: Promise } = {};\n reuploadPromises: { [id: string]: Promise } = {};\n emergencyAccessId?: string = null;\n protected componentName = \"\";\n\n constructor(\n protected cipherService: CipherService,\n protected i18nService: I18nService,\n protected cryptoService: CryptoService,\n protected platformUtilsService: PlatformUtilsService,\n protected apiService: ApiService,\n protected win: Window,\n protected logService: LogService,\n protected stateService: StateService,\n protected fileDownloadService: FileDownloadService,\n protected dialogService: DialogService,\n protected billingAccountProfileStateService: BillingAccountProfileStateService,\n ) {}\n\n async ngOnInit() {\n await this.init();\n }\n\n async submit() {\n const fileEl = document.getElementById(\"file\") as HTMLInputElement;\n const files = fileEl.files;\n if (files == null || files.length === 0) {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"selectFile\"),\n );\n return;\n }\n\n if (files[0].size > 524288000) {\n // 500 MB\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"errorOccurred\"),\n this.i18nService.t(\"maxFileSize\"),\n );\n return;\n }\n\n try {\n this.formPromise = this.saveCipherAttachment(files[0]);\n this.cipherDomain = await this.formPromise;\n this.cipher = await this.cipherDomain.decrypt(\n await this.cipherService.getKeyForCipherKeyDecryption(this.cipherDomain),\n );\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"attachmentSaved\"));\n this.onUploadedAttachment.emit();\n } catch (e) {\n this.logService.error(e);\n }\n\n // reset file input\n // ref: https://stackoverflow.com/a/20552042\n fileEl.type = \"\";\n fileEl.type = \"file\";\n fileEl.value = \"\";\n }\n\n async delete(attachment: AttachmentView) {\n if (this.deletePromises[attachment.id] != null) {\n return;\n }\n\n const confirmed = await this.dialogService.openSimpleDialog({\n title: { key: \"deleteAttachment\" },\n content: { key: \"deleteAttachmentConfirmation\" },\n type: \"warning\",\n });\n\n if (!confirmed) {\n return;\n }\n\n try {\n this.deletePromises[attachment.id] = this.deleteCipherAttachment(attachment.id);\n await this.deletePromises[attachment.id];\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"deletedAttachment\"));\n const i = this.cipher.attachments.indexOf(attachment);\n if (i > -1) {\n this.cipher.attachments.splice(i, 1);\n }\n } catch (e) {\n this.logService.error(e);\n }\n\n this.deletePromises[attachment.id] = null;\n this.onDeletedAttachment.emit();\n }\n\n async download(attachment: AttachmentView) {\n const a = attachment as any;\n if (a.downloading) {\n return;\n }\n\n if (!this.canAccessAttachments) {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"premiumRequired\"),\n this.i18nService.t(\"premiumRequiredDesc\"),\n );\n return;\n }\n\n let url: string;\n try {\n const attachmentDownloadResponse = await this.apiService.getAttachmentData(\n this.cipher.id,\n attachment.id,\n this.emergencyAccessId,\n );\n url = attachmentDownloadResponse.url;\n } catch (e) {\n if (e instanceof ErrorResponse && (e as ErrorResponse).statusCode === 404) {\n url = attachment.url;\n } else if (e instanceof ErrorResponse) {\n throw new Error((e as ErrorResponse).getSingleMessage());\n } else {\n throw e;\n }\n }\n\n a.downloading = true;\n const response = await fetch(new Request(url, { cache: \"no-store\" }));\n if (response.status !== 200) {\n this.platformUtilsService.showToast(\"error\", null, this.i18nService.t(\"errorOccurred\"));\n a.downloading = false;\n return;\n }\n\n try {\n const encBuf = await EncArrayBuffer.fromResponse(response);\n const key =\n attachment.key != null\n ? attachment.key\n : await this.cryptoService.getOrgKey(this.cipher.organizationId);\n const decBuf = await this.cryptoService.decryptFromBytes(encBuf, key);\n this.fileDownloadService.download({\n fileName: attachment.fileName,\n blobData: decBuf,\n });\n } catch (e) {\n this.platformUtilsService.showToast(\"error\", null, this.i18nService.t(\"errorOccurred\"));\n }\n\n a.downloading = false;\n }\n\n protected async init() {\n this.cipherDomain = await this.loadCipher();\n this.cipher = await this.cipherDomain.decrypt(\n await this.cipherService.getKeyForCipherKeyDecryption(this.cipherDomain),\n );\n\n const canAccessPremium = await firstValueFrom(\n this.billingAccountProfileStateService.hasPremiumFromAnySource$,\n );\n this.canAccessAttachments = canAccessPremium || this.cipher.organizationId != null;\n\n if (!this.canAccessAttachments) {\n const confirmed = await this.dialogService.openSimpleDialog({\n title: { key: \"premiumRequired\" },\n content: { key: \"premiumRequiredDesc\" },\n acceptButtonText: { key: \"learnMore\" },\n type: \"success\",\n });\n\n if (confirmed) {\n this.platformUtilsService.launchUri(\n \"https://vault.bitwarden.com/#/settings/subscription/premium\",\n );\n }\n }\n }\n\n protected async reuploadCipherAttachment(attachment: AttachmentView, admin: boolean) {\n const a = attachment as any;\n if (attachment.key != null || a.downloading || this.reuploadPromises[attachment.id] != null) {\n return;\n }\n\n try {\n this.reuploadPromises[attachment.id] = Promise.resolve().then(async () => {\n // 1. Download\n a.downloading = true;\n const response = await fetch(new Request(attachment.url, { cache: \"no-store\" }));\n if (response.status !== 200) {\n this.platformUtilsService.showToast(\"error\", null, this.i18nService.t(\"errorOccurred\"));\n a.downloading = false;\n return;\n }\n\n try {\n // 2. Resave\n const encBuf = await EncArrayBuffer.fromResponse(response);\n const key =\n attachment.key != null\n ? attachment.key\n : await this.cryptoService.getOrgKey(this.cipher.organizationId);\n const decBuf = await this.cryptoService.decryptFromBytes(encBuf, key);\n this.cipherDomain = await this.cipherService.saveAttachmentRawWithServer(\n this.cipherDomain,\n attachment.fileName,\n decBuf,\n admin,\n );\n this.cipher = await this.cipherDomain.decrypt(\n await this.cipherService.getKeyForCipherKeyDecryption(this.cipherDomain),\n );\n\n // 3. Delete old\n this.deletePromises[attachment.id] = this.deleteCipherAttachment(attachment.id);\n await this.deletePromises[attachment.id];\n const foundAttachment = this.cipher.attachments.filter((a2) => a2.id === attachment.id);\n if (foundAttachment.length > 0) {\n const i = this.cipher.attachments.indexOf(foundAttachment[0]);\n if (i > -1) {\n this.cipher.attachments.splice(i, 1);\n }\n }\n\n this.platformUtilsService.showToast(\n \"success\",\n null,\n this.i18nService.t(\"attachmentSaved\"),\n );\n this.onReuploadedAttachment.emit();\n } catch (e) {\n this.platformUtilsService.showToast(\"error\", null, this.i18nService.t(\"errorOccurred\"));\n }\n\n a.downloading = false;\n });\n await this.reuploadPromises[attachment.id];\n } catch (e) {\n this.logService.error(e);\n }\n }\n\n protected loadCipher() {\n return this.cipherService.get(this.cipherId);\n }\n\n protected saveCipherAttachment(file: File) {\n return this.cipherService.saveAttachmentWithServer(this.cipherDomain, file);\n }\n\n protected deleteCipherAttachment(attachmentId: string) {\n return this.cipherService.deleteAttachmentWithServer(this.cipher.id, attachmentId);\n }\n\n protected async reupload(attachment: AttachmentView) {\n // TODO: This should be removed but is needed since we re-use the same template\n }\n}\n","import { Directive, ElementRef, HostListener, Input } from \"@angular/core\";\n\n@Directive({\n selector: \"[appFallbackSrc]\",\n})\nexport class FallbackSrcDirective {\n @Input(\"appFallbackSrc\") appFallbackSrc: string;\n\n /** Only try setting the fallback once. This prevents an infinite loop if the fallback itself is missing. */\n private tryFallback = true;\n\n constructor(private el: ElementRef) {}\n\n @HostListener(\"error\") onError() {\n if (this.tryFallback) {\n this.el.nativeElement.src = this.appFallbackSrc;\n this.tryFallback = false;\n }\n }\n}\n","
    \n \n \n \n \n
    \n","import { ChangeDetectionStrategy, Component, Input, OnInit } from \"@angular/core\";\nimport {\n BehaviorSubject,\n combineLatest,\n distinctUntilChanged,\n filter,\n map,\n Observable,\n} from \"rxjs\";\n\nimport { DomainSettingsService } from \"@bitwarden/common/autofill/services/domain-settings.service\";\nimport { EnvironmentService } from \"@bitwarden/common/platform/abstractions/environment.service\";\nimport { buildCipherIcon } from \"@bitwarden/common/vault/icon/build-cipher-icon\";\nimport { CipherView } from \"@bitwarden/common/vault/models/view/cipher.view\";\n\n@Component({\n selector: \"app-vault-icon\",\n templateUrl: \"icon.component.html\",\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class IconComponent implements OnInit {\n @Input()\n set cipher(value: CipherView) {\n this.cipher$.next(value);\n }\n\n protected data$: Observable<{\n imageEnabled: boolean;\n image?: string;\n fallbackImage: string;\n icon?: string;\n }>;\n\n private cipher$ = new BehaviorSubject(undefined);\n\n constructor(\n private environmentService: EnvironmentService,\n private domainSettingsService: DomainSettingsService,\n ) {}\n\n async ngOnInit() {\n this.data$ = combineLatest([\n this.environmentService.environment$.pipe(map((e) => e.getIconsUrl())),\n this.domainSettingsService.showFavicons$.pipe(distinctUntilChanged()),\n this.cipher$.pipe(filter((c) => c !== undefined)),\n ]).pipe(\n map(([iconsUrl, showFavicon, cipher]) => buildCipherIcon(iconsUrl, cipher, showFavicon)),\n );\n }\n}\n","import { Utils } from \"../../platform/misc/utils\";\nimport { CipherType } from \"../enums/cipher-type\";\nimport { CipherView } from \"../models/view/cipher.view\";\n\nexport function buildCipherIcon(iconsServerUrl: string, cipher: CipherView, showFavicon: boolean) {\n let icon;\n let image;\n let fallbackImage = \"\";\n const cardIcons: Record = {\n Visa: \"card-visa\",\n Mastercard: \"card-mastercard\",\n Amex: \"card-amex\",\n Discover: \"card-discover\",\n \"Diners Club\": \"card-diners-club\",\n JCB: \"card-jcb\",\n Maestro: \"card-maestro\",\n UnionPay: \"card-union-pay\",\n RuPay: \"card-ru-pay\",\n };\n\n switch (cipher.type) {\n case CipherType.Login:\n icon = \"bwi-globe\";\n\n if (cipher.login.uri) {\n let hostnameUri = cipher.login.uri;\n let isWebsite = false;\n\n if (hostnameUri.indexOf(\"androidapp://\") === 0) {\n icon = \"bwi-android\";\n image = null;\n } else if (hostnameUri.indexOf(\"iosapp://\") === 0) {\n icon = \"bwi-apple\";\n image = null;\n } else if (\n showFavicon &&\n hostnameUri.indexOf(\"://\") === -1 &&\n hostnameUri.indexOf(\".\") > -1\n ) {\n hostnameUri = `http://${hostnameUri}`;\n isWebsite = true;\n } else if (showFavicon) {\n isWebsite = hostnameUri.indexOf(\"http\") === 0 && hostnameUri.indexOf(\".\") > -1;\n }\n\n if (showFavicon && isWebsite) {\n try {\n image = `${iconsServerUrl}/${Utils.getHostname(hostnameUri)}/icon.png`;\n fallbackImage = \"images/bwi-globe.png\";\n } catch (e) {\n // Ignore error since the fallback icon will be shown if image is null.\n }\n }\n } else {\n image = null;\n }\n break;\n case CipherType.SecureNote:\n icon = \"bwi-sticky-note\";\n break;\n case CipherType.Card:\n icon = \"bwi-credit-card\";\n if (showFavicon && cipher.card.brand in cardIcons) {\n icon = `credit-card-icon ${cardIcons[cipher.card.brand]}`;\n }\n break;\n case CipherType.Identity:\n icon = \"bwi-id-card\";\n break;\n default:\n break;\n }\n\n return {\n imageEnabled: showFavicon,\n image,\n fallbackImage,\n icon,\n };\n}\n","import { svgIcon } from \"@bitwarden/components\";\n\nexport const UserVerificationBiometricsIcon = svgIcon`\n\n \n \n \n \n \n \n\n`;\n","import { DIALOG_DATA } from \"@angular/cdk/dialog\";\nimport { Component, Inject } from \"@angular/core\";\n\nimport { JslibModule } from \"@bitwarden/angular/jslib.module\";\nimport { ButtonModule, DialogModule, DialogService } from \"@bitwarden/components\";\n\nexport type FingerprintDialogData = {\n fingerprint: string[];\n};\n\n@Component({\n templateUrl: \"fingerprint-dialog.component.html\",\n standalone: true,\n imports: [JslibModule, ButtonModule, DialogModule],\n})\nexport class FingerprintDialogComponent {\n constructor(@Inject(DIALOG_DATA) protected data: FingerprintDialogData) {}\n\n static open(dialogService: DialogService, data: FingerprintDialogData) {\n return dialogService.open(FingerprintDialogComponent, { data });\n }\n}\n","\n \n {{ \"yourAccountsFingerprint\" | i18n }}:\n \n {{ data.fingerprint.join(\"-\") }}\n \n \n \n {{ \"learnMore\" | i18n }}\n \n \n \n \n\n","export enum ActiveClientVerificationOption {\n MasterPassword = \"masterPassword\",\n Pin = \"pin\",\n Biometrics = \"biometrics\",\n None = \"none\",\n}\n","\n
    \n \n \n \n \n\n \n \n \n {{ \"pin\" | i18n }}\n \n \n {{ \"confirmIdentity\" | i18n }}\n \n \n\n \n \n
    \n \n

    {{ \"verifyWithBiometrics\" | i18n }}

    \n
    \n \n {{ \"awaitingConfirmation\" | i18n }}\n
    \n
    \n\n \n {{ \"couldNotCompleteBiometrics\" | i18n }}\n \n \n \n\n \n \n

    {{ \"needADifferentMethod\" | i18n }}

    \n\n \n {{ \"useBiometrics\" | i18n }}\n \n\n \n {{ \"usePin\" | i18n }}\n \n\n \n {{ \"useMasterPassword\" | i18n }}\n \n
    \n \n
    \n\n\n \n \n \n \n
    \n \n
    \n\n
    \n {{ \"enterVerificationCodeSentToEmail\" | i18n }}\n\n

    \n \n\n \n \n {{ \"codeSent\" | i18n }}\n \n

    \n
    \n\n \n {{ \"verificationCode\" | i18n }}\n \n {{ \"confirmIdentity\" | i18n }}\n \n
    \n
    \n\n\n \n {{ \"masterPass\" | i18n }}\n \n \n {{ \"confirmIdentity\" | i18n }}\n \n\n","import { animate, style, transition, trigger } from \"@angular/animations\";\nimport { CommonModule } from \"@angular/common\";\nimport { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from \"@angular/core\";\nimport {\n ControlValueAccessor,\n FormControl,\n Validators,\n NG_VALUE_ACCESSOR,\n ReactiveFormsModule,\n} from \"@angular/forms\";\nimport { BehaviorSubject, Subject, takeUntil } from \"rxjs\";\n\nimport { JslibModule } from \"@bitwarden/angular/jslib.module\";\nimport { UserVerificationService } from \"@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction\";\nimport { VerificationType } from \"@bitwarden/common/auth/enums/verification-type\";\nimport { UserVerificationOptions } from \"@bitwarden/common/auth/types/user-verification-options\";\nimport { VerificationWithSecret } from \"@bitwarden/common/auth/types/verification\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\nimport {\n AsyncActionsModule,\n ButtonModule,\n CalloutModule,\n FormFieldModule,\n IconButtonModule,\n IconModule,\n LinkModule,\n} from \"@bitwarden/components\";\n\nimport { UserVerificationBiometricsIcon } from \"../icons\";\n\nimport { ActiveClientVerificationOption } from \"./active-client-verification-option.enum\";\n\n/**\n * Used for general-purpose user verification throughout the app.\n * Collects the user's master password, or if they are not using a password, prompts for an OTP via email.\n * This is exposed to the parent component via the ControlValueAccessor interface (e.g. bind it to a FormControl).\n * Use UserVerificationService to verify the user's input.\n */\n@Component({\n selector: \"app-user-verification-form-input\",\n templateUrl: \"user-verification-form-input.component.html\",\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n multi: true,\n useExisting: UserVerificationFormInputComponent,\n },\n ],\n animations: [\n trigger(\"sent\", [\n transition(\":enter\", [style({ opacity: 0 }), animate(\"100ms\", style({ opacity: 1 }))]),\n ]),\n ],\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n JslibModule,\n FormFieldModule,\n AsyncActionsModule,\n IconButtonModule,\n IconModule,\n LinkModule,\n ButtonModule,\n CalloutModule,\n ],\n})\n// eslint-disable-next-line rxjs-angular/prefer-takeuntil\nexport class UserVerificationFormInputComponent implements ControlValueAccessor, OnInit, OnDestroy {\n @Input() verificationType: \"server\" | \"client\" = \"server\"; // server represents original behavior\n private _invalidSecret = false;\n @Input()\n get invalidSecret() {\n return this._invalidSecret;\n }\n set invalidSecret(value: boolean) {\n this._invalidSecret = value;\n this.invalidSecretChange.emit(value);\n\n // ISSUE: This is pretty hacky but unfortunately there is no way of knowing if the parent\n // control has been marked as touched, see: https://github.com/angular/angular/issues/10887\n // When that functionality has been added we should also look into forwarding reactive form\n // controls errors so that we don't need a separate input/output `invalidSecret`.\n if (value) {\n this.secret.markAsTouched();\n }\n this.secret.updateValueAndValidity({ emitEvent: false });\n }\n @Output() invalidSecretChange = new EventEmitter();\n\n @Output() activeClientVerificationOptionChange =\n new EventEmitter();\n\n @Output() biometricsVerificationResultChange = new EventEmitter();\n\n readonly Icons = { UserVerificationBiometricsIcon };\n\n // default to false to avoid null checks in template\n userVerificationOptions: UserVerificationOptions = {\n client: {\n masterPassword: false,\n pin: false,\n biometrics: false,\n },\n server: {\n masterPassword: false,\n otp: false,\n },\n };\n\n ActiveClientVerificationOption = ActiveClientVerificationOption;\n\n private _activeClientVerificationOptionSubject =\n new BehaviorSubject(null);\n\n activeClientVerificationOption$ = this._activeClientVerificationOptionSubject.asObservable();\n\n set activeClientVerificationOption(value: ActiveClientVerificationOption) {\n this._activeClientVerificationOptionSubject.next(value);\n }\n\n get activeClientVerificationOption(): ActiveClientVerificationOption {\n return this._activeClientVerificationOptionSubject.getValue();\n }\n\n get hasMultipleClientVerificationOptions(): boolean {\n let optionsCount = 0;\n if (this.userVerificationOptions.client.masterPassword) {\n optionsCount++;\n }\n if (this.userVerificationOptions.client.pin) {\n optionsCount++;\n }\n if (this.userVerificationOptions.client.biometrics) {\n optionsCount++;\n }\n return optionsCount >= 2;\n }\n\n biometricsVerificationFailed = false;\n\n disableRequestOTP = false;\n sentInitialCode = false;\n sentCode = false;\n\n secret = new FormControl(\"\", [\n Validators.required,\n () => {\n if (this.invalidSecret) {\n return {\n invalidSecret: {\n message: this.getInvalidSecretErrorMessage(),\n },\n };\n }\n },\n ]);\n\n private getInvalidSecretErrorMessage(): string {\n // must determine client or server\n if (this.verificationType === \"server\") {\n return this.userVerificationOptions.server.masterPassword\n ? this.i18nService.t(\"incorrectPassword\")\n : this.i18nService.t(\"incorrectCode\");\n } else {\n // client\n if (this.activeClientVerificationOption === ActiveClientVerificationOption.MasterPassword) {\n return this.i18nService.t(\"incorrectPassword\");\n } else if (this.activeClientVerificationOption === ActiveClientVerificationOption.Pin) {\n return this.i18nService.t(\"incorrectPin\");\n }\n }\n }\n\n private onChange: (value: VerificationWithSecret) => void;\n private destroy$ = new Subject();\n\n constructor(\n private userVerificationService: UserVerificationService,\n private i18nService: I18nService,\n ) {}\n\n async ngOnInit() {\n this.userVerificationOptions =\n await this.userVerificationService.getAvailableVerificationOptions(this.verificationType);\n\n if (this.verificationType === \"client\") {\n this.setDefaultActiveClientVerificationOption();\n this.setupClientVerificationOptionChangeHandler();\n } else {\n if (this.userVerificationOptions.server.otp) {\n // New design requires requesting on load to prevent user from having to click send code\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.requestOTP();\n }\n }\n\n // Don't bother executing secret changes if biometrics verification is active.\n if (this.activeClientVerificationOption === ActiveClientVerificationOption.Biometrics) {\n this.processSecretChanges(this.secret.value);\n }\n\n this.secret.valueChanges\n .pipe(takeUntil(this.destroy$))\n .subscribe((secret: string) => this.processSecretChanges(secret));\n }\n\n private setDefaultActiveClientVerificationOption(): void {\n // Priorities should be Bio > Pin > Master Password for speed based on design\n if (this.userVerificationOptions.client.biometrics) {\n this.activeClientVerificationOption = ActiveClientVerificationOption.Biometrics;\n } else if (this.userVerificationOptions.client.pin) {\n this.activeClientVerificationOption = ActiveClientVerificationOption.Pin;\n } else if (this.userVerificationOptions.client.masterPassword) {\n this.activeClientVerificationOption = ActiveClientVerificationOption.MasterPassword;\n } else {\n this.activeClientVerificationOption = ActiveClientVerificationOption.None;\n }\n }\n\n private setupClientVerificationOptionChangeHandler(): void {\n this.activeClientVerificationOption$\n .pipe(takeUntil(this.destroy$))\n .subscribe((activeClientVerificationOption: ActiveClientVerificationOption) => {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.handleActiveClientVerificationOptionChange(activeClientVerificationOption);\n });\n }\n\n private async handleActiveClientVerificationOptionChange(\n activeClientVerificationOption: ActiveClientVerificationOption,\n ): Promise {\n // Emit to parent component so it can implement behavior if needed.\n this.activeClientVerificationOptionChange.emit(activeClientVerificationOption);\n\n // clear secret value when switching verification methods\n this.secret.setValue(null);\n\n // Reset validation errors when swapping active client verification options\n this.secret.markAsUntouched();\n this.secret.updateValueAndValidity({ emitEvent: false });\n\n // if changing to biometrics, we need to prompt for biometrics\n if (activeClientVerificationOption === \"biometrics\") {\n // reset biometrics failed\n this.biometricsVerificationFailed = false;\n await this.verifyUserViaBiometrics();\n }\n }\n\n async verifyUserViaBiometrics() {\n this.biometricsVerificationFailed = false;\n\n const biometricsResult = await this.userVerificationService.verifyUser({\n type: VerificationType.Biometrics,\n });\n\n this.biometricsVerificationResultChange.emit(biometricsResult);\n\n this.biometricsVerificationFailed = !biometricsResult;\n }\n\n requestOTP = async () => {\n if (!this.userVerificationOptions.server.masterPassword) {\n this.disableRequestOTP = true;\n try {\n await this.userVerificationService.requestOTP();\n this.sentCode = true;\n this.sentInitialCode = true;\n\n // after 3 seconds reset sentCode to false\n setTimeout(() => {\n this.sentCode = false;\n }, 3000);\n } finally {\n this.disableRequestOTP = false;\n }\n }\n };\n\n writeValue(obj: any): void {\n this.secret.setValue(obj);\n }\n\n /** Required for NG_VALUE_ACCESSOR */\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n /** Required for NG_VALUE_ACCESSOR */\n registerOnTouched(fn: any): void {\n // Not implemented\n }\n\n setDisabledState?(isDisabled: boolean): void {\n this.disableRequestOTP = isDisabled;\n if (isDisabled) {\n this.secret.disable();\n } else {\n this.secret.enable();\n }\n }\n\n processSecretChanges(secret: string) {\n this.invalidSecret = false;\n\n // Short circuit secret change handling when biometrics is chosen as biometrics has no secret\n if (this.activeClientVerificationOption === ActiveClientVerificationOption.Biometrics) {\n return;\n }\n\n if (this.onChange == null) {\n return;\n }\n\n this.onChange({\n type: this.determineVerificationWithSecretType(),\n secret: Utils.isNullOrWhitespace(secret) ? null : secret,\n });\n }\n\n private determineVerificationWithSecretType():\n | VerificationType.MasterPassword\n | VerificationType.OTP\n | VerificationType.PIN {\n if (this.verificationType === \"server\") {\n return this.userVerificationOptions.server.masterPassword\n ? VerificationType.MasterPassword\n : VerificationType.OTP;\n } else {\n // client\n return this.userVerificationOptions.client.masterPassword &&\n this.activeClientVerificationOption === ActiveClientVerificationOption.MasterPassword\n ? VerificationType.MasterPassword\n : VerificationType.PIN;\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n}\n","\n \n \n {{\n dialogOptions.title ? (dialogOptions.title | i18n) : (\"verificationRequired\" | i18n)\n }}\n \n \n \n

    \n {{ dialogOptions.bodyText | i18n }}\n

    \n\n \n {{ dialogOptions.calloutOptions.text | i18n }}\n \n
    \n\n \n \n

    \n {{ \"verificationRequiredForActionSetPinToContinue\" | i18n }}\n

    \n \n\n \n \n \n \n \n \n \n \n \n {{ \"submit\" | i18n }}\n \n\n \n \n {{ dialogOptions.confirmButtonOptions.text | i18n }}\n \n \n\n \n \n \n \n \n\n \n \n
    \n\n","import { DIALOG_DATA, DialogRef } from \"@angular/cdk/dialog\";\nimport { CommonModule } from \"@angular/common\";\nimport { Component, Inject } from \"@angular/core\";\nimport { FormBuilder, ReactiveFormsModule } from \"@angular/forms\";\nimport { firstValueFrom } from \"rxjs\";\n\nimport { JslibModule } from \"@bitwarden/angular/jslib.module\";\nimport { UserVerificationService } from \"@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction\";\nimport { VerificationWithSecret } from \"@bitwarden/common/auth/types/verification\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport {\n AsyncActionsModule,\n ButtonModule,\n CalloutModule,\n DialogModule,\n DialogService,\n} from \"@bitwarden/components\";\n\nimport { ActiveClientVerificationOption } from \"./active-client-verification-option.enum\";\nimport {\n UserVerificationDialogOptions,\n UserVerificationDialogResult,\n} from \"./user-verification-dialog.types\";\nimport { UserVerificationFormInputComponent } from \"./user-verification-form-input.component\";\n\n@Component({\n templateUrl: \"user-verification-dialog.component.html\",\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n JslibModule,\n ButtonModule,\n DialogModule,\n AsyncActionsModule,\n UserVerificationFormInputComponent,\n CalloutModule,\n ],\n})\nexport class UserVerificationDialogComponent {\n verificationForm = this.formBuilder.group({\n secret: this.formBuilder.control(null),\n });\n\n get secret() {\n return this.verificationForm.controls.secret;\n }\n\n invalidSecret = false;\n activeClientVerificationOption: ActiveClientVerificationOption;\n readonly ActiveClientVerificationOption = ActiveClientVerificationOption;\n\n constructor(\n @Inject(DIALOG_DATA) public dialogOptions: UserVerificationDialogOptions,\n private dialogRef: DialogRef,\n private formBuilder: FormBuilder,\n private userVerificationService: UserVerificationService,\n private platformUtilsService: PlatformUtilsService,\n private i18nService: I18nService,\n ) {}\n\n /**\n * Opens the user verification dialog.\n *\n * @param {DialogService} dialogService - The service used to open the dialog.\n * @param {UserVerificationDialogOptions} data - Parameters for configuring the dialog.\n * @returns {Promise} A promise that resolves to the result of the user verification process.\n *\n * @example\n * // Example 1: Default, simple scenario\n * const result = await UserVerificationDialogComponent.open(\n * this.dialogService,\n * {}\n * );\n *\n * // Handle the result of the dialog based on user action and verification success\n * if (result.userAction === 'cancel') {\n * // User cancelled the dialog\n * return;\n * }\n *\n * // User confirmed the dialog so check verification success\n * if (!result.verificationSuccess) {\n * // verification failed\n * return;\n * }\n *\n * ----------------------------------------------------------\n *\n * @example\n * // Example 2: Custom scenario\n * const result = await UserVerificationDialogComponent.open(\n * this.dialogService,\n * {\n * title: 'customTitle',\n * bodyText: 'customBodyText',\n * calloutOptions: {\n * text: 'customCalloutText',\n * type: 'warning',\n * },\n * confirmButtonOptions: {\n * text: 'customConfirmButtonText',\n * type: 'danger',\n * }\n * }\n * );\n *\n * // Handle the result of the dialog based on user action and verification success\n * if (result.userAction === 'cancel') {\n * // User cancelled the dialog\n * return;\n * }\n *\n * // User confirmed the dialog so check verification success\n * if (!result.verificationSuccess) {\n * // verification failed\n * return;\n * }\n *\n * ----------------------------------------------------------\n *\n * @example\n * // Example 3: Client side verification scenario only\n * const result = await UserVerificationDialogComponent.open(\n * this.dialogService,\n * { clientSideOnlyVerification: true }\n * );\n *\n * // Handle the result of the dialog based on user action and verification success\n * if (result.userAction === 'cancel') {\n * // User cancelled the dialog\n * return;\n * }\n *\n * // User confirmed the dialog so check verification success\n * if (!result.verificationSuccess) {\n * if (result.noAvailableClientVerificationMethods) {\n * // No client-side verification methods are available\n * // Could send user to configure a verification method like PIN or biometrics\n * }\n * return;\n * }\n *\n */\n static async open(\n dialogService: DialogService,\n data: UserVerificationDialogOptions,\n ): Promise {\n const dialogRef = dialogService.open(\n UserVerificationDialogComponent,\n {\n data,\n },\n );\n\n const dialogResult = await firstValueFrom(dialogRef.closed);\n\n // An empty string is returned when the user hits the x to close the dialog.\n // Undefined is returned when the users hits the escape key to close the dialog.\n if (typeof dialogResult === \"string\" || dialogResult === undefined) {\n // User used x to close dialog\n return {\n userAction: \"cancel\",\n verificationSuccess: false,\n };\n } else {\n return dialogResult;\n }\n }\n\n handleActiveClientVerificationOptionChange(\n activeClientVerificationOption: ActiveClientVerificationOption,\n ) {\n this.activeClientVerificationOption = activeClientVerificationOption;\n }\n\n handleBiometricsVerificationResultChange(biometricsVerificationResult: boolean) {\n if (biometricsVerificationResult) {\n this.close({\n userAction: \"confirm\",\n verificationSuccess: true,\n noAvailableClientVerificationMethods: false,\n });\n }\n }\n\n submit = async () => {\n if (this.activeClientVerificationOption === ActiveClientVerificationOption.None) {\n this.close({\n userAction: \"confirm\",\n verificationSuccess: false,\n noAvailableClientVerificationMethods: true,\n });\n return;\n }\n\n this.verificationForm.markAllAsTouched();\n\n if (this.verificationForm.invalid) {\n return;\n }\n\n try {\n // TODO: once we migrate all user verification scenarios to use this new implementation,\n // we should consider refactoring the user verification service handling of the\n // OTP and MP flows to not throw errors on verification failure.\n const verificationResult = await this.userVerificationService.verifyUser(this.secret.value);\n\n if (verificationResult) {\n this.invalidSecret = false;\n this.close({\n userAction: \"confirm\",\n verificationSuccess: true,\n noAvailableClientVerificationMethods: false,\n });\n } else {\n this.invalidSecret = true;\n\n // Only pin should ever get here, but added this check to be safe.\n if (this.activeClientVerificationOption === ActiveClientVerificationOption.Pin) {\n this.platformUtilsService.showToast(\n \"error\",\n this.i18nService.t(\"error\"),\n this.i18nService.t(\"invalidPin\"),\n );\n } else {\n this.platformUtilsService.showToast(\"error\", null, this.i18nService.t(\"unexpectedError\"));\n }\n }\n } catch (e) {\n // Catch handles OTP and MP verification scenarios as those throw errors on verification failure instead of returning false like PIN and biometrics.\n this.invalidSecret = true;\n this.platformUtilsService.showToast(\"error\", this.i18nService.t(\"error\"), e.message);\n return;\n }\n };\n\n cancel() {\n this.close({\n userAction: \"cancel\",\n verificationSuccess: false,\n });\n }\n\n close(dialogResult: UserVerificationDialogResult) {\n this.dialogRef.close(dialogResult);\n }\n}\n","\n {{ message | i18n }}\n\n
      \n
    • 0\">\n {{ \"policyInEffectMinComplexity\" | i18n: getPasswordScoreAlertDisplay() }}\n
    • \n
    • 0\">\n {{ \"policyInEffectMinLength\" | i18n: policy?.minLength.toString() }}\n
    • \n
    • \n {{ \"policyInEffectUppercase\" | i18n }}\n
    • \n
    • \n {{ \"policyInEffectLowercase\" | i18n }}\n
    • \n
    • \n {{ \"policyInEffectNumbers\" | i18n }}\n
    • \n
    • \n {{ \"policyInEffectSpecial\" | i18n: \"!@#$%^&*\" }}\n
    • \n
    \n
    \n","import { CommonModule } from \"@angular/common\";\nimport { Component, Input } from \"@angular/core\";\n\nimport { JslibModule } from \"@bitwarden/angular/jslib.module\";\nimport { MasterPasswordPolicyOptions } from \"@bitwarden/common/admin-console/models/domain/master-password-policy-options\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { CalloutModule } from \"@bitwarden/components\";\n\n@Component({\n selector: \"auth-password-callout\",\n templateUrl: \"password-callout.component.html\",\n standalone: true,\n imports: [CommonModule, JslibModule, CalloutModule],\n})\nexport class PasswordCalloutComponent {\n @Input() message = \"masterPasswordPolicyInEffect\";\n @Input() policy: MasterPasswordPolicyOptions;\n\n constructor(private i18nService: I18nService) {}\n\n getPasswordScoreAlertDisplay() {\n let str: string;\n switch (this.policy.minComplexity) {\n case 4:\n str = this.i18nService.t(\"strong\");\n break;\n case 3:\n str = this.i18nService.t(\"good\");\n break;\n default:\n str = this.i18nService.t(\"weak\");\n break;\n }\n return str + \" (\" + this.policy.minComplexity + \")\";\n }\n}\n","import { UserKey } from \"@bitwarden/common/types/key\";\n\nexport abstract class PinCryptoServiceAbstraction {\n decryptUserKeyWithPin: (pin: string) => Promise;\n}\n","import { Observable } from \"rxjs\";\n\nimport { AuthenticationType } from \"@bitwarden/common/auth/enums/authentication-type\";\nimport { AuthResult } from \"@bitwarden/common/auth/models/domain/auth-result\";\nimport { TokenTwoFactorRequest } from \"@bitwarden/common/auth/models/request/identity-token/token-two-factor.request\";\nimport { AuthRequestResponse } from \"@bitwarden/common/auth/models/response/auth-request.response\";\nimport { AuthRequestPushNotification } from \"@bitwarden/common/models/response/notification.response\";\nimport { MasterKey } from \"@bitwarden/common/types/key\";\n\nimport {\n UserApiLoginCredentials,\n PasswordLoginCredentials,\n SsoLoginCredentials,\n AuthRequestLoginCredentials,\n WebAuthnLoginCredentials,\n} from \"../models/domain/login-credentials\";\n\nexport abstract class LoginStrategyServiceAbstraction {\n /**\n * The current strategy being used to authenticate.\n * Emits null if the session has timed out.\n */\n currentAuthType$: Observable;\n /**\n * Emits when an auth request has been approved.\n */\n authRequestPushNotification$: Observable;\n /**\n * If the login strategy uses the email address of the user, this\n * will return it. Otherwise, it will return null.\n */\n getEmail: () => Promise;\n /**\n * If the user is logging in with a master password, this will return\n * the master password hash. Otherwise, it will return null.\n */\n getMasterPasswordHash: () => Promise;\n /**\n * If the user is logging in with SSO, this will return\n * the email auth token. Otherwise, it will return null.\n * @see {@link SsoLoginStrategyData.ssoEmail2FaSessionToken}\n */\n getSsoEmail2FaSessionToken: () => Promise;\n /**\n * Returns the access code if the user is logging in with an\n * Auth Request. Otherwise, it will return null.\n */\n getAccessCode: () => Promise;\n /**\n * Returns the auth request ID if the user is logging in with an\n * Auth Request. Otherwise, it will return null.\n */\n getAuthRequestId: () => Promise;\n\n /**\n * Sends a token request to the server using the provided credentials.\n */\n logIn: (\n credentials:\n | UserApiLoginCredentials\n | PasswordLoginCredentials\n | SsoLoginCredentials\n | AuthRequestLoginCredentials\n | WebAuthnLoginCredentials,\n ) => Promise;\n /**\n * Sends a token request to the server with the provided two factor token\n * and captcha response. This uses data stored from {@link LoginStrategyServiceAbstraction.logIn},\n * so that must be called first.\n * Returns an error if no session data is found.\n */\n logInTwoFactor: (\n twoFactor: TokenTwoFactorRequest,\n captchaResponse: string,\n ) => Promise;\n /**\n * Creates a master key from the provided master password and email.\n */\n makePreloginKey: (masterPassword: string, email: string) => Promise;\n /**\n * Sends a notification to {@link LoginStrategyServiceAbstraction.authRequestPushNotification}\n */\n sendAuthRequestPushNotification: (notification: AuthRequestPushNotification) => Promise;\n /**\n * Sends a response to an auth request.\n */\n passwordlessLogin: (\n id: string,\n key: string,\n requestApproved: boolean,\n ) => Promise;\n}\n","import { Observable } from \"rxjs\";\n\nimport { UserDecryptionOptions } from \"../models\";\n\nexport abstract class UserDecryptionOptionsServiceAbstraction {\n /**\n * Returns what decryption options are available for the current user.\n * @remark This is sent from the server on authentication.\n */\n abstract userDecryptionOptions$: Observable;\n /**\n * Uses user decryption options to determine if current user has a master password.\n * @remark This is sent from the server, and does not indicate if the master password\n * was used to login and/or if a master key is saved locally.\n */\n abstract hasMasterPassword$: Observable;\n\n /**\n * Returns the user decryption options for the given user id.\n * @param userId The user id to check.\n */\n abstract userDecryptionOptionsById$(userId: string): Observable;\n}\n\nexport abstract class InternalUserDecryptionOptionsServiceAbstraction extends UserDecryptionOptionsServiceAbstraction {\n /**\n * Sets the current decryption options for the user, contains the current configuration\n * of the users account related to how they can decrypt their vault.\n * @remark Intended to be used when user decryption options are received from server, does\n * not update the server. Consider syncing instead of updating locally.\n * @param userDecryptionOptions Current user decryption options received from server.\n */\n abstract setUserDecryptionOptions(userDecryptionOptions: UserDecryptionOptions): Promise;\n}\n","import { AuthRequestResponse } from \"@bitwarden/common/auth/models/response/auth-request.response\";\nimport { UserKey, MasterKey } from \"@bitwarden/common/types/key\";\n\nexport abstract class AuthRequestServiceAbstraction {\n /**\n * Approve or deny an auth request.\n * @param approve True to approve, false to deny.\n * @param authRequest The auth request to approve or deny, must have an id and key.\n * @returns The updated auth request, the `requestApproved` field will be true if\n * approval was successful.\n * @throws If the auth request is missing an id or key.\n */\n abstract approveOrDenyAuthRequest: (\n approve: boolean,\n authRequest: AuthRequestResponse,\n ) => Promise;\n /**\n * Sets the `UserKey` from an auth request. Auth request must have a `UserKey`.\n * @param authReqResponse The auth request.\n * @param authReqPrivateKey The private key corresponding to the public key sent in the auth request.\n */\n abstract setUserKeyAfterDecryptingSharedUserKey: (\n authReqResponse: AuthRequestResponse,\n authReqPrivateKey: ArrayBuffer,\n ) => Promise;\n /**\n * Sets the `MasterKey` and `MasterKeyHash` from an auth request. Auth request must have a `MasterKey` and `MasterKeyHash`.\n * @param authReqResponse The auth request.\n * @param authReqPrivateKey The private key corresponding to the public key sent in the auth request.\n */\n abstract setKeysAfterDecryptingSharedMasterKeyAndHash: (\n authReqResponse: AuthRequestResponse,\n authReqPrivateKey: ArrayBuffer,\n ) => Promise;\n /**\n * Decrypts a `UserKey` from a public key encrypted `UserKey`.\n * @param pubKeyEncryptedUserKey The public key encrypted `UserKey`.\n * @param privateKey The private key corresponding to the public key used to encrypt the `UserKey`.\n * @returns The decrypted `UserKey`.\n */\n abstract decryptPubKeyEncryptedUserKey: (\n pubKeyEncryptedUserKey: string,\n privateKey: ArrayBuffer,\n ) => Promise;\n /**\n * Decrypts a `MasterKey` and `MasterKeyHash` from a public key encrypted `MasterKey` and `MasterKeyHash`.\n * @param pubKeyEncryptedMasterKey The public key encrypted `MasterKey`.\n * @param pubKeyEncryptedMasterKeyHash The public key encrypted `MasterKeyHash`.\n * @param privateKey The private key corresponding to the public key used to encrypt the `MasterKey` and `MasterKeyHash`.\n * @returns The decrypted `MasterKey` and `MasterKeyHash`.\n */\n abstract decryptPubKeyEncryptedMasterKeyAndHash: (\n pubKeyEncryptedMasterKey: string,\n pubKeyEncryptedMasterKeyHash: string,\n privateKey: ArrayBuffer,\n ) => Promise<{ masterKey: MasterKey; masterKeyHash: string }>;\n}\n","import { EncString } from \"@bitwarden/common/platform/models/domain/enc-string\";\nimport { SymmetricCryptoKey } from \"@bitwarden/common/platform/models/domain/symmetric-crypto-key\";\nimport { PrfKey } from \"@bitwarden/common/types/key\";\n\ndeclare const tag: unique symbol;\n\n/**\n * A set of keys where a `UserKey` is protected by an encrypted public/private key-pair.\n * The `UserKey` is used to encrypt/decrypt data, while the public/private key-pair is\n * used to rotate the `UserKey`.\n *\n * The `PrivateKey` is protected by an `ExternalKey`, such as a `DeviceKey`, or `PrfKey`,\n * and the `PublicKey` is protected by the `UserKey`. This setup allows:\n *\n * - Access to `UserKey` by knowing the `ExternalKey`\n * - Rotation to a `NewUserKey` by knowing the current `UserKey`,\n * without needing access to the `ExternalKey`\n */\nexport class RotateableKeySet {\n private readonly [tag]: ExternalKey;\n\n constructor(\n /** PublicKey encrypted UserKey */\n readonly encryptedUserKey: EncString,\n\n /** UserKey encrypted PublicKey */\n readonly encryptedPublicKey: EncString,\n\n /** ExternalKey encrypted PrivateKey */\n readonly encryptedPrivateKey: EncString,\n ) {}\n}\n\nexport type PrfKeySet = RotateableKeySet;\n","import { Jsonify } from \"type-fest\";\n\nimport { AuthenticationType } from \"@bitwarden/common/auth/enums/authentication-type\";\nimport { TokenTwoFactorRequest } from \"@bitwarden/common/auth/models/request/identity-token/token-two-factor.request\";\nimport { WebAuthnLoginAssertionResponseRequest } from \"@bitwarden/common/auth/services/webauthn-login/request/webauthn-login-assertion-response.request\";\nimport { SymmetricCryptoKey } from \"@bitwarden/common/platform/models/domain/symmetric-crypto-key\";\nimport { UserKey, MasterKey } from \"@bitwarden/common/types/key\";\n\nexport class PasswordLoginCredentials {\n readonly type = AuthenticationType.Password;\n\n constructor(\n public email: string,\n public masterPassword: string,\n public captchaToken?: string,\n public twoFactor?: TokenTwoFactorRequest,\n ) {}\n}\n\nexport class SsoLoginCredentials {\n readonly type = AuthenticationType.Sso;\n\n constructor(\n public code: string,\n public codeVerifier: string,\n public redirectUrl: string,\n public orgId: string,\n /**\n * Optional email address for SSO login.\n * Used for looking up 2FA token on clients that support remembering 2FA token.\n */\n public email?: string,\n public twoFactor?: TokenTwoFactorRequest,\n ) {}\n}\n\nexport class UserApiLoginCredentials {\n readonly type = AuthenticationType.UserApiKey;\n\n constructor(\n public clientId: string,\n public clientSecret: string,\n ) {}\n}\n\nexport class AuthRequestLoginCredentials {\n readonly type = AuthenticationType.AuthRequest;\n\n constructor(\n public email: string,\n public accessCode: string,\n public authRequestId: string,\n public decryptedUserKey: UserKey,\n public decryptedMasterKey: MasterKey,\n public decryptedMasterKeyHash: string,\n public twoFactor?: TokenTwoFactorRequest,\n ) {}\n\n static fromJSON(json: Jsonify) {\n return Object.assign(\n new AuthRequestLoginCredentials(\n json.email,\n json.accessCode,\n json.authRequestId,\n null,\n null,\n json.decryptedMasterKeyHash,\n json.twoFactor\n ? new TokenTwoFactorRequest(\n json.twoFactor.provider,\n json.twoFactor.token,\n json.twoFactor.remember,\n )\n : json.twoFactor,\n ),\n {\n decryptedUserKey: SymmetricCryptoKey.fromJSON(json.decryptedUserKey) as UserKey,\n decryptedMasterKey: SymmetricCryptoKey.fromJSON(json.decryptedMasterKey) as MasterKey,\n },\n );\n }\n}\n\nexport class WebAuthnLoginCredentials {\n readonly type = AuthenticationType.WebAuthn;\n\n constructor(\n public token: string,\n public deviceResponse: WebAuthnLoginAssertionResponseRequest,\n public prfKey?: SymmetricCryptoKey,\n ) {}\n\n static fromJSON(json: Jsonify) {\n return new WebAuthnLoginCredentials(\n json.token,\n Object.assign(\n Object.create(WebAuthnLoginAssertionResponseRequest.prototype),\n json.deviceResponse,\n ),\n SymmetricCryptoKey.fromJSON(json.prfKey),\n );\n }\n}\n","import { Jsonify } from \"type-fest\";\n\nimport { KeyConnectorUserDecryptionOptionResponse } from \"@bitwarden/common/auth/models/response/user-decryption-options/key-connector-user-decryption-option.response\";\nimport { TrustedDeviceUserDecryptionOptionResponse } from \"@bitwarden/common/auth/models/response/user-decryption-options/trusted-device-user-decryption-option.response\";\nimport { IdentityTokenResponse } from \"@bitwarden/common/src/auth/models/response/identity-token.response\";\n\n/**\n * Key Connector decryption options. Intended to be sent to the client for use after authentication.\n * @see {@link UserDecryptionOptions}\n */\nexport class KeyConnectorUserDecryptionOption {\n /** The URL of the key connector configured for this user. */\n keyConnectorUrl: string;\n\n /**\n * Initializes a new instance of the KeyConnectorUserDecryptionOption from a response object.\n * @param response The key connector user decryption option response object.\n * @returns A new instance of the KeyConnectorUserDecryptionOption or undefined if `response` is nullish.\n */\n static fromResponse(\n response: KeyConnectorUserDecryptionOptionResponse,\n ): KeyConnectorUserDecryptionOption | undefined {\n if (response == null) {\n return undefined;\n }\n const options = new KeyConnectorUserDecryptionOption();\n options.keyConnectorUrl = response?.keyConnectorUrl ?? null;\n return options;\n }\n\n /**\n * Initializes a new instance of a KeyConnectorUserDecryptionOption from a JSON object.\n * @param obj JSON object to deserialize.\n * @returns A new instance of the KeyConnectorUserDecryptionOption or undefined if `obj` is nullish.\n */\n static fromJSON(\n obj: Jsonify,\n ): KeyConnectorUserDecryptionOption | undefined {\n if (obj == null) {\n return undefined;\n }\n return Object.assign(new KeyConnectorUserDecryptionOption(), obj);\n }\n}\n\n/**\n * Trusted device decryption options. Intended to be sent to the client for use after authentication.\n * @see {@link UserDecryptionOptions}\n */\nexport class TrustedDeviceUserDecryptionOption {\n /** True if an admin has approved an admin auth request previously made from this device. */\n hasAdminApproval: boolean;\n /** True if the user has a device capable of approving an auth request. */\n hasLoginApprovingDevice: boolean;\n /** True if the user has manage reset password permission, as these users must be forced to have a master password. */\n hasManageResetPasswordPermission: boolean;\n\n /**\n * Initializes a new instance of the TrustedDeviceUserDecryptionOption from a response object.\n * @param response The trusted device user decryption option response object.\n * @returns A new instance of the TrustedDeviceUserDecryptionOption or undefined if `response` is nullish.\n */\n static fromResponse(\n response: TrustedDeviceUserDecryptionOptionResponse,\n ): TrustedDeviceUserDecryptionOption | undefined {\n if (response == null) {\n return undefined;\n }\n const options = new TrustedDeviceUserDecryptionOption();\n options.hasAdminApproval = response?.hasAdminApproval ?? false;\n options.hasLoginApprovingDevice = response?.hasLoginApprovingDevice ?? false;\n options.hasManageResetPasswordPermission = response?.hasManageResetPasswordPermission ?? false;\n return options;\n }\n\n /**\n * Initializes a new instance of the TrustedDeviceUserDecryptionOption from a JSON object.\n * @param obj JSON object to deserialize.\n * @returns A new instance of the TrustedDeviceUserDecryptionOption or undefined if `obj` is nullish.\n */\n static fromJSON(\n obj: Jsonify,\n ): TrustedDeviceUserDecryptionOption | undefined {\n if (obj == null) {\n return undefined;\n }\n return Object.assign(new TrustedDeviceUserDecryptionOption(), obj);\n }\n}\n\n/**\n * Represents the decryption options the user has configured on the server. This is intended to be sent\n * to the client on authentication, and can be used to determine how to decrypt the user's vault.\n */\nexport class UserDecryptionOptions {\n /** True if the user has a master password configured on the server. */\n hasMasterPassword: boolean;\n /** {@link TrustedDeviceUserDecryptionOption} */\n trustedDeviceOption?: TrustedDeviceUserDecryptionOption;\n /** {@link KeyConnectorUserDecryptionOption} */\n keyConnectorOption?: KeyConnectorUserDecryptionOption;\n\n /**\n * Initializes a new instance of the UserDecryptionOptions from a response object.\n * @param response user decryption options response object\n * @returns A new instance of the UserDecryptionOptions.\n * @throws If the response is nullish, this method will throw an error. User decryption options\n * are required for client initialization.\n */\n // TODO: Change response type to `UserDecryptionOptionsResponse` after 2023.10 release (https://bitwarden.atlassian.net/browse/PM-3537)\n static fromResponse(response: IdentityTokenResponse): UserDecryptionOptions {\n if (response == null) {\n throw new Error(\"User Decryption Options are required for client initialization.\");\n }\n\n const decryptionOptions = new UserDecryptionOptions();\n\n if (response.userDecryptionOptions) {\n // If the response has userDecryptionOptions, this means it's on a post-TDE server version and can interrogate\n // the new decryption options.\n const responseOptions = response.userDecryptionOptions;\n decryptionOptions.hasMasterPassword = responseOptions.hasMasterPassword;\n\n decryptionOptions.trustedDeviceOption = TrustedDeviceUserDecryptionOption.fromResponse(\n responseOptions.trustedDeviceOption,\n );\n\n decryptionOptions.keyConnectorOption = KeyConnectorUserDecryptionOption.fromResponse(\n responseOptions.keyConnectorOption,\n );\n } else {\n // If the response does not have userDecryptionOptions, this means it's on a pre-TDE server version and so\n // we must base our decryption options on the presence of the keyConnectorUrl.\n // Note that the presence of keyConnectorUrl implies that the user does not have a master password, as in pre-TDE\n // server versions, a master password short-circuited the addition of the keyConnectorUrl to the response.\n // TODO: remove this check after 2023.10 release (https://bitwarden.atlassian.net/browse/PM-3537)\n const usingKeyConnector = response.keyConnectorUrl != null;\n decryptionOptions.hasMasterPassword = !usingKeyConnector;\n if (usingKeyConnector) {\n decryptionOptions.keyConnectorOption = new KeyConnectorUserDecryptionOption();\n decryptionOptions.keyConnectorOption.keyConnectorUrl = response.keyConnectorUrl;\n }\n }\n return decryptionOptions;\n }\n\n /**\n * Initializes a new instance of the UserDecryptionOptions from a JSON object.\n * @param obj JSON object to deserialize.\n * @returns A new instance of the UserDecryptionOptions. Will initialize even if the JSON object is nullish.\n */\n static fromJSON(obj: Jsonify): UserDecryptionOptions {\n const decryptionOptions = Object.assign(new UserDecryptionOptions(), obj);\n\n decryptionOptions.trustedDeviceOption = TrustedDeviceUserDecryptionOption.fromJSON(\n obj?.trustedDeviceOption,\n );\n\n decryptionOptions.keyConnectorOption = KeyConnectorUserDecryptionOption.fromJSON(\n obj?.keyConnectorOption,\n );\n\n return decryptionOptions;\n }\n}\n","import { VaultTimeoutSettingsService } from \"@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service\";\nimport { KdfConfig } from \"@bitwarden/common/auth/models/domain/kdf-config\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { KdfType } from \"@bitwarden/common/platform/enums\";\nimport { EncString } from \"@bitwarden/common/platform/models/domain/enc-string\";\nimport { PinLockType } from \"@bitwarden/common/services/vault-timeout/vault-timeout-settings.service\";\nimport { UserKey } from \"@bitwarden/common/types/key\";\n\nimport { PinCryptoServiceAbstraction } from \"../../abstractions/pin-crypto.service.abstraction\";\n\nexport class PinCryptoService implements PinCryptoServiceAbstraction {\n constructor(\n private stateService: StateService,\n private cryptoService: CryptoService,\n private vaultTimeoutSettingsService: VaultTimeoutSettingsService,\n private logService: LogService,\n ) {}\n async decryptUserKeyWithPin(pin: string): Promise {\n try {\n const pinLockType: PinLockType = await this.vaultTimeoutSettingsService.isPinLockSet();\n\n const { pinKeyEncryptedUserKey, oldPinKeyEncryptedMasterKey } =\n await this.getPinKeyEncryptedKeys(pinLockType);\n\n const kdf: KdfType = await this.stateService.getKdfType();\n const kdfConfig: KdfConfig = await this.stateService.getKdfConfig();\n let userKey: UserKey;\n const email = await this.stateService.getEmail();\n if (oldPinKeyEncryptedMasterKey) {\n userKey = await this.cryptoService.decryptAndMigrateOldPinKey(\n pinLockType === \"TRANSIENT\",\n pin,\n email,\n kdf,\n kdfConfig,\n oldPinKeyEncryptedMasterKey,\n );\n } else {\n userKey = await this.cryptoService.decryptUserKeyWithPin(\n pin,\n email,\n kdf,\n kdfConfig,\n pinKeyEncryptedUserKey,\n );\n }\n\n if (!userKey) {\n this.logService.warning(`User key null after pin key decryption.`);\n return null;\n }\n\n if (!(await this.validatePin(userKey, pin))) {\n this.logService.warning(`Pin key decryption successful but pin validation failed.`);\n return null;\n }\n\n return userKey;\n } catch (error) {\n this.logService.error(`Error decrypting user key with pin: ${error}`);\n return null;\n }\n }\n\n // Note: oldPinKeyEncryptedMasterKey is only used for migrating old pin keys\n // and will be null for all migrated accounts\n private async getPinKeyEncryptedKeys(\n pinLockType: PinLockType,\n ): Promise<{ pinKeyEncryptedUserKey: EncString; oldPinKeyEncryptedMasterKey?: EncString }> {\n switch (pinLockType) {\n case \"PERSISTANT\": {\n const pinKeyEncryptedUserKey = await this.stateService.getPinKeyEncryptedUserKey();\n const oldPinKeyEncryptedMasterKey = await this.stateService.getEncryptedPinProtected();\n return {\n pinKeyEncryptedUserKey,\n oldPinKeyEncryptedMasterKey: oldPinKeyEncryptedMasterKey\n ? new EncString(oldPinKeyEncryptedMasterKey)\n : undefined,\n };\n }\n case \"TRANSIENT\": {\n const pinKeyEncryptedUserKey = await this.stateService.getPinKeyEncryptedUserKeyEphemeral();\n const oldPinKeyEncryptedMasterKey = await this.stateService.getDecryptedPinProtected();\n return { pinKeyEncryptedUserKey, oldPinKeyEncryptedMasterKey };\n }\n case \"DISABLED\":\n throw new Error(\"Pin is disabled\");\n default: {\n // Compile-time check for exhaustive switch\n const _exhaustiveCheck: never = pinLockType;\n return _exhaustiveCheck;\n }\n }\n }\n\n private async validatePin(userKey: UserKey, pin: string): Promise {\n const protectedPin = await this.stateService.getProtectedPin();\n const decryptedPin = await this.cryptoService.decryptToUtf8(\n new EncString(protectedPin),\n userKey,\n );\n return decryptedPin === pin;\n }\n}\n","export class PasswordlessAuthRequest {\n constructor(\n readonly key: string,\n readonly masterPasswordHash: string,\n readonly deviceIdentifier: string,\n readonly requestApproved: boolean,\n ) {}\n}\n","export class PreloginRequest {\n email: string;\n\n constructor(email: string) {\n this.email = email;\n }\n}\n","import { ClientType } from \"../../../../enums\";\nimport { Utils } from \"../../../../platform/misc/utils\";\nimport { CaptchaProtectedRequest } from \"../captcha-protected.request\";\n\nimport { DeviceRequest } from \"./device.request\";\nimport { TokenTwoFactorRequest } from \"./token-two-factor.request\";\nimport { TokenRequest } from \"./token.request\";\n\nexport class PasswordTokenRequest extends TokenRequest implements CaptchaProtectedRequest {\n constructor(\n public email: string,\n public masterPasswordHash: string,\n public captchaResponse: string,\n protected twoFactor: TokenTwoFactorRequest,\n device?: DeviceRequest,\n ) {\n super(twoFactor, device);\n }\n\n toIdentityToken(clientId: ClientType) {\n const obj = super.toIdentityToken(clientId);\n\n obj.grant_type = \"password\";\n obj.username = this.email;\n obj.password = this.masterPasswordHash;\n\n if (this.captchaResponse != null) {\n obj.captchaResponse = this.captchaResponse;\n }\n\n return obj;\n }\n\n alterIdentityTokenHeaders(headers: Headers) {\n headers.set(\"Auth-Email\", Utils.fromUtf8ToUrlB64(this.email));\n }\n\n static fromJSON(json: any) {\n return Object.assign(Object.create(PasswordTokenRequest.prototype), json, {\n device: json.device ? DeviceRequest.fromJSON(json.device) : undefined,\n twoFactor: json.twoFactor\n ? Object.assign(new TokenTwoFactorRequest(), json.twoFactor)\n : undefined,\n });\n }\n}\n","import { Utils } from \"../../../platform/misc/utils\";\nimport { TwoFactorProviderType } from \"../../enums/two-factor-provider-type\";\n\nimport { ForceSetPasswordReason } from \"./force-set-password-reason\";\n\nexport class AuthResult {\n captchaSiteKey = \"\";\n // TODO: PM-3287 - Remove this after 3 releases of backwards compatibility. - Target release 2023.12 for removal\n /**\n * @deprecated\n * Replace with using UserDecryptionOptions to determine if the user does\n * not have a master password and is not using Key Connector.\n * */\n resetMasterPassword = false;\n\n forcePasswordReset: ForceSetPasswordReason = ForceSetPasswordReason.None;\n twoFactorProviders: Map = null;\n ssoEmail2FaSessionToken?: string;\n email: string;\n requiresEncryptionKeyMigration: boolean;\n\n get requiresCaptcha() {\n return !Utils.isNullOrWhitespace(this.captchaSiteKey);\n }\n\n get requiresTwoFactor() {\n return this.twoFactorProviders != null;\n }\n}\n","import { BehaviorSubject } from \"rxjs\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { TokenService } from \"@bitwarden/common/auth/abstractions/token.service\";\nimport { TwoFactorService } from \"@bitwarden/common/auth/abstractions/two-factor.service\";\nimport { TwoFactorProviderType } from \"@bitwarden/common/auth/enums/two-factor-provider-type\";\nimport { AuthResult } from \"@bitwarden/common/auth/models/domain/auth-result\";\nimport { ForceSetPasswordReason } from \"@bitwarden/common/auth/models/domain/force-set-password-reason\";\nimport { DeviceRequest } from \"@bitwarden/common/auth/models/request/identity-token/device.request\";\nimport { PasswordTokenRequest } from \"@bitwarden/common/auth/models/request/identity-token/password-token.request\";\nimport { SsoTokenRequest } from \"@bitwarden/common/auth/models/request/identity-token/sso-token.request\";\nimport { TokenTwoFactorRequest } from \"@bitwarden/common/auth/models/request/identity-token/token-two-factor.request\";\nimport { UserApiTokenRequest } from \"@bitwarden/common/auth/models/request/identity-token/user-api-token.request\";\nimport { WebAuthnLoginTokenRequest } from \"@bitwarden/common/auth/models/request/identity-token/webauthn-login-token.request\";\nimport { IdentityCaptchaResponse } from \"@bitwarden/common/auth/models/response/identity-captcha.response\";\nimport { IdentityTokenResponse } from \"@bitwarden/common/auth/models/response/identity-token.response\";\nimport { IdentityTwoFactorResponse } from \"@bitwarden/common/auth/models/response/identity-two-factor.response\";\nimport { BillingAccountProfileStateService } from \"@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service\";\nimport { ClientType } from \"@bitwarden/common/enums\";\nimport { VaultTimeoutAction } from \"@bitwarden/common/enums/vault-timeout-action.enum\";\nimport { KeysRequest } from \"@bitwarden/common/models/request/keys.request\";\nimport { AppIdService } from \"@bitwarden/common/platform/abstractions/app-id.service\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport {\n AccountKeys,\n Account,\n AccountProfile,\n AccountTokens,\n} from \"@bitwarden/common/platform/models/domain/account\";\n\nimport { InternalUserDecryptionOptionsServiceAbstraction } from \"../abstractions/user-decryption-options.service.abstraction\";\nimport {\n UserApiLoginCredentials,\n PasswordLoginCredentials,\n SsoLoginCredentials,\n AuthRequestLoginCredentials,\n WebAuthnLoginCredentials,\n} from \"../models/domain/login-credentials\";\nimport { UserDecryptionOptions } from \"../models/domain/user-decryption-options\";\nimport { CacheData } from \"../services/login-strategies/login-strategy.state\";\n\ntype IdentityResponse = IdentityTokenResponse | IdentityTwoFactorResponse | IdentityCaptchaResponse;\n\nexport abstract class LoginStrategyData {\n tokenRequest:\n | UserApiTokenRequest\n | PasswordTokenRequest\n | SsoTokenRequest\n | WebAuthnLoginTokenRequest;\n captchaBypassToken?: string;\n\n /** User's entered email obtained pre-login. */\n abstract userEnteredEmail?: string;\n}\n\nexport abstract class LoginStrategy {\n protected abstract cache: BehaviorSubject;\n\n constructor(\n protected cryptoService: CryptoService,\n protected apiService: ApiService,\n protected tokenService: TokenService,\n protected appIdService: AppIdService,\n protected platformUtilsService: PlatformUtilsService,\n protected messagingService: MessagingService,\n protected logService: LogService,\n protected stateService: StateService,\n protected twoFactorService: TwoFactorService,\n protected userDecryptionOptionsService: InternalUserDecryptionOptionsServiceAbstraction,\n protected billingAccountProfileStateService: BillingAccountProfileStateService,\n ) {}\n\n abstract exportCache(): CacheData;\n\n abstract logIn(\n credentials:\n | UserApiLoginCredentials\n | PasswordLoginCredentials\n | SsoLoginCredentials\n | AuthRequestLoginCredentials\n | WebAuthnLoginCredentials,\n ): Promise;\n\n async logInTwoFactor(\n twoFactor: TokenTwoFactorRequest,\n captchaResponse: string = null,\n ): Promise {\n const data = this.cache.value;\n data.tokenRequest.setTwoFactor(twoFactor);\n this.cache.next(data);\n const [authResult] = await this.startLogIn();\n return authResult;\n }\n\n protected async startLogIn(): Promise<[AuthResult, IdentityResponse]> {\n this.twoFactorService.clearSelectedProvider();\n\n const tokenRequest = this.cache.value.tokenRequest;\n const response = await this.apiService.postIdentityToken(tokenRequest);\n\n if (response instanceof IdentityTwoFactorResponse) {\n return [await this.processTwoFactorResponse(response), response];\n } else if (response instanceof IdentityCaptchaResponse) {\n return [await this.processCaptchaResponse(response), response];\n } else if (response instanceof IdentityTokenResponse) {\n return [await this.processTokenResponse(response), response];\n }\n\n throw new Error(\"Invalid response object.\");\n }\n\n protected async buildDeviceRequest() {\n const appId = await this.appIdService.getAppId();\n return new DeviceRequest(appId, this.platformUtilsService);\n }\n\n /**\n * Builds the TokenTwoFactorRequest to be used within other login strategies token requests\n * to the server.\n * If the user provided a 2FA token in an already created TokenTwoFactorRequest, it will be used.\n * If not, and the user has previously remembered a 2FA token, it will be used.\n * If neither of these are true, an empty TokenTwoFactorRequest will be returned.\n * @param userProvidedTwoFactor - optional - The 2FA token request provided by the caller\n * @param email - optional - ensure that email is provided for any login strategies that support remember 2FA functionality\n * @returns a promise which resolves to a TokenTwoFactorRequest to be sent to the server\n */\n protected async buildTwoFactor(\n userProvidedTwoFactor?: TokenTwoFactorRequest,\n email?: string,\n ): Promise {\n if (userProvidedTwoFactor != null) {\n return userProvidedTwoFactor;\n }\n\n if (email) {\n const storedTwoFactorToken = await this.tokenService.getTwoFactorToken(email);\n if (storedTwoFactorToken != null) {\n return new TokenTwoFactorRequest(\n TwoFactorProviderType.Remember,\n storedTwoFactorToken,\n false,\n );\n }\n }\n\n return new TokenTwoFactorRequest();\n }\n\n /**\n * Initializes the account with information from the IdTokenResponse after successful login.\n * It also sets the access token and refresh token in the token service.\n *\n * @param {IdentityTokenResponse} tokenResponse - The response from the server containing the identity token.\n * @returns {Promise} - A promise that resolves when the account information has been successfully saved.\n */\n protected async saveAccountInformation(tokenResponse: IdentityTokenResponse): Promise {\n const accountInformation = await this.tokenService.decodeAccessToken(tokenResponse.accessToken);\n\n // Must persist existing device key if it exists for trusted device decryption to work\n // However, we must provide a user id so that the device key can be retrieved\n // as the state service won't have an active account at this point in time\n // even though the data exists in local storage.\n const userId = accountInformation.sub;\n\n const deviceKey = await this.stateService.getDeviceKey({ userId });\n const accountKeys = new AccountKeys();\n if (deviceKey) {\n accountKeys.deviceKey = deviceKey;\n }\n\n // If you don't persist existing admin auth requests on login, they will get deleted.\n const adminAuthRequest = await this.stateService.getAdminAuthRequest({ userId });\n\n const vaultTimeoutAction = await this.stateService.getVaultTimeoutAction();\n const vaultTimeout = await this.stateService.getVaultTimeout();\n\n // set access token and refresh token before account initialization so authN status can be accurate\n // User id will be derived from the access token.\n await this.tokenService.setTokens(\n tokenResponse.accessToken,\n vaultTimeoutAction as VaultTimeoutAction,\n vaultTimeout,\n tokenResponse.refreshToken, // Note: CLI login via API key sends undefined for refresh token.\n );\n\n await this.stateService.addAccount(\n new Account({\n profile: {\n ...new AccountProfile(),\n ...{\n userId,\n name: accountInformation.name,\n email: accountInformation.email,\n kdfIterations: tokenResponse.kdfIterations,\n kdfMemory: tokenResponse.kdfMemory,\n kdfParallelism: tokenResponse.kdfParallelism,\n kdfType: tokenResponse.kdf,\n },\n },\n tokens: {\n ...new AccountTokens(),\n },\n keys: accountKeys,\n adminAuthRequest: adminAuthRequest?.toJSON(),\n }),\n );\n\n await this.userDecryptionOptionsService.setUserDecryptionOptions(\n UserDecryptionOptions.fromResponse(tokenResponse),\n );\n\n await this.billingAccountProfileStateService.setHasPremium(accountInformation.premium, false);\n }\n\n protected async processTokenResponse(response: IdentityTokenResponse): Promise {\n const result = new AuthResult();\n\n // Old encryption keys must be migrated, but is currently only available on web.\n // Other clients shouldn't continue the login process.\n if (this.encryptionKeyMigrationRequired(response)) {\n result.requiresEncryptionKeyMigration = true;\n if (this.platformUtilsService.getClientType() !== ClientType.Web) {\n return result;\n }\n }\n\n result.resetMasterPassword = response.resetMasterPassword;\n\n // Convert boolean to enum\n if (response.forcePasswordReset) {\n result.forcePasswordReset = ForceSetPasswordReason.AdminForcePasswordReset;\n }\n\n // Must come before setting keys, user key needs email to update additional keys\n await this.saveAccountInformation(response);\n\n if (response.twoFactorToken != null) {\n // note: we can read email from access token b/c it was saved in saveAccountInformation\n const userEmail = await this.tokenService.getEmail();\n\n await this.tokenService.setTwoFactorToken(userEmail, response.twoFactorToken);\n }\n\n await this.setMasterKey(response);\n await this.setUserKey(response);\n await this.setPrivateKey(response);\n\n this.messagingService.send(\"loggedIn\");\n\n return result;\n }\n\n // The keys comes from different sources depending on the login strategy\n protected abstract setMasterKey(response: IdentityTokenResponse): Promise;\n protected abstract setUserKey(response: IdentityTokenResponse): Promise;\n protected abstract setPrivateKey(response: IdentityTokenResponse): Promise;\n\n // Old accounts used master key for encryption. We are forcing migrations but only need to\n // check on password logins\n protected encryptionKeyMigrationRequired(response: IdentityTokenResponse): boolean {\n return false;\n }\n\n protected async createKeyPairForOldAccount() {\n try {\n const [publicKey, privateKey] = await this.cryptoService.makeKeyPair();\n await this.apiService.postAccountKeys(new KeysRequest(publicKey, privateKey.encryptedString));\n return privateKey.encryptedString;\n } catch (e) {\n this.logService.error(e);\n }\n }\n\n /**\n * Handles the response from the server when a 2FA is required.\n * It clears any existing 2FA token, as it's no longer valid, and sets up the necessary data for the 2FA process.\n *\n * @param {IdentityTwoFactorResponse} response - The response from the server indicating that 2FA is required.\n * @returns {Promise} - A promise that resolves to an AuthResult object\n */\n private async processTwoFactorResponse(response: IdentityTwoFactorResponse): Promise {\n // If we get a 2FA required response, then we should clear the 2FA token\n // just in case as it is no longer valid.\n await this.clearTwoFactorToken();\n\n const result = new AuthResult();\n result.twoFactorProviders = response.twoFactorProviders2;\n\n this.twoFactorService.setProviders(response);\n this.cache.next({ ...this.cache.value, captchaBypassToken: response.captchaToken ?? null });\n result.ssoEmail2FaSessionToken = response.ssoEmail2faSessionToken;\n result.email = response.email;\n return result;\n }\n\n /**\n * Clears the 2FA token from the token service using the user's email if it exists\n */\n private async clearTwoFactorToken() {\n const email = this.cache.value.userEnteredEmail;\n if (email) {\n await this.tokenService.clearTwoFactorToken(email);\n }\n }\n\n private async processCaptchaResponse(response: IdentityCaptchaResponse): Promise {\n const result = new AuthResult();\n result.captchaSiteKey = response.siteKey;\n return result;\n }\n}\n","import { Observable, map, BehaviorSubject } from \"rxjs\";\nimport { Jsonify } from \"type-fest\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { DeviceTrustCryptoServiceAbstraction } from \"@bitwarden/common/auth/abstractions/device-trust-crypto.service.abstraction\";\nimport { TokenService } from \"@bitwarden/common/auth/abstractions/token.service\";\nimport { TwoFactorService } from \"@bitwarden/common/auth/abstractions/two-factor.service\";\nimport { AuthResult } from \"@bitwarden/common/auth/models/domain/auth-result\";\nimport { PasswordTokenRequest } from \"@bitwarden/common/auth/models/request/identity-token/password-token.request\";\nimport { TokenTwoFactorRequest } from \"@bitwarden/common/auth/models/request/identity-token/token-two-factor.request\";\nimport { IdentityTokenResponse } from \"@bitwarden/common/auth/models/response/identity-token.response\";\nimport { BillingAccountProfileStateService } from \"@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service\";\nimport { AppIdService } from \"@bitwarden/common/platform/abstractions/app-id.service\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\n\nimport { InternalUserDecryptionOptionsServiceAbstraction } from \"../abstractions/user-decryption-options.service.abstraction\";\nimport { AuthRequestLoginCredentials } from \"../models/domain/login-credentials\";\nimport { CacheData } from \"../services/login-strategies/login-strategy.state\";\n\nimport { LoginStrategy, LoginStrategyData } from \"./login.strategy\";\n\nexport class AuthRequestLoginStrategyData implements LoginStrategyData {\n tokenRequest: PasswordTokenRequest;\n captchaBypassToken: string;\n authRequestCredentials: AuthRequestLoginCredentials;\n\n static fromJSON(obj: Jsonify): AuthRequestLoginStrategyData {\n const data = Object.assign(new AuthRequestLoginStrategyData(), obj, {\n tokenRequest: PasswordTokenRequest.fromJSON(obj.tokenRequest),\n authRequestCredentials: AuthRequestLoginCredentials.fromJSON(obj.authRequestCredentials),\n });\n return data;\n }\n}\n\nexport class AuthRequestLoginStrategy extends LoginStrategy {\n email$: Observable;\n accessCode$: Observable;\n authRequestId$: Observable;\n\n protected cache: BehaviorSubject;\n\n constructor(\n data: AuthRequestLoginStrategyData,\n cryptoService: CryptoService,\n apiService: ApiService,\n tokenService: TokenService,\n appIdService: AppIdService,\n platformUtilsService: PlatformUtilsService,\n messagingService: MessagingService,\n logService: LogService,\n stateService: StateService,\n twoFactorService: TwoFactorService,\n userDecryptionOptionsService: InternalUserDecryptionOptionsServiceAbstraction,\n private deviceTrustCryptoService: DeviceTrustCryptoServiceAbstraction,\n billingAccountProfileStateService: BillingAccountProfileStateService,\n ) {\n super(\n cryptoService,\n apiService,\n tokenService,\n appIdService,\n platformUtilsService,\n messagingService,\n logService,\n stateService,\n twoFactorService,\n userDecryptionOptionsService,\n billingAccountProfileStateService,\n );\n\n this.cache = new BehaviorSubject(data);\n this.email$ = this.cache.pipe(map((data) => data.tokenRequest.email));\n this.accessCode$ = this.cache.pipe(map((data) => data.authRequestCredentials.accessCode));\n this.authRequestId$ = this.cache.pipe(map((data) => data.authRequestCredentials.authRequestId));\n }\n\n override async logIn(credentials: AuthRequestLoginCredentials) {\n const data = new AuthRequestLoginStrategyData();\n data.tokenRequest = new PasswordTokenRequest(\n credentials.email,\n credentials.accessCode,\n null,\n await this.buildTwoFactor(credentials.twoFactor, credentials.email),\n await this.buildDeviceRequest(),\n );\n data.tokenRequest.setAuthRequestAccessCode(credentials.authRequestId);\n data.authRequestCredentials = credentials;\n this.cache.next(data);\n\n const [authResult] = await this.startLogIn();\n return authResult;\n }\n\n override async logInTwoFactor(\n twoFactor: TokenTwoFactorRequest,\n captchaResponse: string,\n ): Promise {\n const data = this.cache.value;\n data.tokenRequest.captchaResponse = captchaResponse ?? data.captchaBypassToken;\n this.cache.next(data);\n\n return super.logInTwoFactor(twoFactor);\n }\n\n protected override async setMasterKey(response: IdentityTokenResponse) {\n const authRequestCredentials = this.cache.value.authRequestCredentials;\n if (\n authRequestCredentials.decryptedMasterKey &&\n authRequestCredentials.decryptedMasterKeyHash\n ) {\n await this.cryptoService.setMasterKey(authRequestCredentials.decryptedMasterKey);\n await this.cryptoService.setMasterKeyHash(authRequestCredentials.decryptedMasterKeyHash);\n }\n }\n\n protected override async setUserKey(response: IdentityTokenResponse): Promise {\n const authRequestCredentials = this.cache.value.authRequestCredentials;\n // User now may or may not have a master password\n // but set the master key encrypted user key if it exists regardless\n await this.cryptoService.setMasterKeyEncryptedUserKey(response.key);\n\n if (authRequestCredentials.decryptedUserKey) {\n await this.cryptoService.setUserKey(authRequestCredentials.decryptedUserKey);\n } else {\n await this.trySetUserKeyWithMasterKey();\n // Establish trust if required after setting user key\n await this.deviceTrustCryptoService.trustDeviceIfRequired();\n }\n }\n\n private async trySetUserKeyWithMasterKey(): Promise {\n const masterKey = await this.cryptoService.getMasterKey();\n if (masterKey) {\n const userKey = await this.cryptoService.decryptUserKeyWithMasterKey(masterKey);\n await this.cryptoService.setUserKey(userKey);\n }\n }\n\n protected override async setPrivateKey(response: IdentityTokenResponse): Promise {\n await this.cryptoService.setPrivateKey(\n response.privateKey ?? (await this.createKeyPairForOldAccount()),\n );\n }\n\n exportCache(): CacheData {\n return {\n authRequest: this.cache.value,\n };\n }\n}\n","import { BehaviorSubject, map, Observable } from \"rxjs\";\nimport { Jsonify } from \"type-fest\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { PolicyService } from \"@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction\";\nimport { MasterPasswordPolicyOptions } from \"@bitwarden/common/admin-console/models/domain/master-password-policy-options\";\nimport { TokenService } from \"@bitwarden/common/auth/abstractions/token.service\";\nimport { TwoFactorService } from \"@bitwarden/common/auth/abstractions/two-factor.service\";\nimport { AuthResult } from \"@bitwarden/common/auth/models/domain/auth-result\";\nimport { ForceSetPasswordReason } from \"@bitwarden/common/auth/models/domain/force-set-password-reason\";\nimport { PasswordTokenRequest } from \"@bitwarden/common/auth/models/request/identity-token/password-token.request\";\nimport { TokenTwoFactorRequest } from \"@bitwarden/common/auth/models/request/identity-token/token-two-factor.request\";\nimport { IdentityCaptchaResponse } from \"@bitwarden/common/auth/models/response/identity-captcha.response\";\nimport { IdentityTokenResponse } from \"@bitwarden/common/auth/models/response/identity-token.response\";\nimport { IdentityTwoFactorResponse } from \"@bitwarden/common/auth/models/response/identity-two-factor.response\";\nimport { BillingAccountProfileStateService } from \"@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service\";\nimport { AppIdService } from \"@bitwarden/common/platform/abstractions/app-id.service\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { HashPurpose } from \"@bitwarden/common/platform/enums\";\nimport { SymmetricCryptoKey } from \"@bitwarden/common/platform/models/domain/symmetric-crypto-key\";\nimport { PasswordStrengthServiceAbstraction } from \"@bitwarden/common/tools/password-strength\";\nimport { MasterKey } from \"@bitwarden/common/types/key\";\n\nimport { LoginStrategyServiceAbstraction } from \"../abstractions\";\nimport { InternalUserDecryptionOptionsServiceAbstraction } from \"../abstractions/user-decryption-options.service.abstraction\";\nimport { PasswordLoginCredentials } from \"../models/domain/login-credentials\";\nimport { CacheData } from \"../services/login-strategies/login-strategy.state\";\n\nimport { LoginStrategy, LoginStrategyData } from \"./login.strategy\";\n\nexport class PasswordLoginStrategyData implements LoginStrategyData {\n tokenRequest: PasswordTokenRequest;\n\n /** User's entered email obtained pre-login. Always present in MP login. */\n userEnteredEmail: string;\n /** If 2fa is required, token is returned to bypass captcha */\n captchaBypassToken?: string;\n /** The local version of the user's master key hash */\n localMasterKeyHash: string;\n /** The user's master key */\n masterKey: MasterKey;\n /**\n * Tracks if the user needs to update their password due to\n * a password that does not meet an organization's master password policy.\n */\n forcePasswordResetReason: ForceSetPasswordReason = ForceSetPasswordReason.None;\n\n static fromJSON(obj: Jsonify): PasswordLoginStrategyData {\n const data = Object.assign(new PasswordLoginStrategyData(), obj, {\n tokenRequest: PasswordTokenRequest.fromJSON(obj.tokenRequest),\n masterKey: SymmetricCryptoKey.fromJSON(obj.masterKey),\n });\n return data;\n }\n}\n\nexport class PasswordLoginStrategy extends LoginStrategy {\n /** The email address of the user attempting to log in. */\n email$: Observable;\n /** The master key hash used for authentication */\n serverMasterKeyHash$: Observable;\n /** The local master key hash we store client side */\n localMasterKeyHash$: Observable;\n\n protected cache: BehaviorSubject;\n\n constructor(\n data: PasswordLoginStrategyData,\n cryptoService: CryptoService,\n apiService: ApiService,\n tokenService: TokenService,\n appIdService: AppIdService,\n platformUtilsService: PlatformUtilsService,\n messagingService: MessagingService,\n logService: LogService,\n protected stateService: StateService,\n twoFactorService: TwoFactorService,\n userDecryptionOptionsService: InternalUserDecryptionOptionsServiceAbstraction,\n private passwordStrengthService: PasswordStrengthServiceAbstraction,\n private policyService: PolicyService,\n private loginStrategyService: LoginStrategyServiceAbstraction,\n billingAccountProfileStateService: BillingAccountProfileStateService,\n ) {\n super(\n cryptoService,\n apiService,\n tokenService,\n appIdService,\n platformUtilsService,\n messagingService,\n logService,\n stateService,\n twoFactorService,\n userDecryptionOptionsService,\n billingAccountProfileStateService,\n );\n\n this.cache = new BehaviorSubject(data);\n this.email$ = this.cache.pipe(map((state) => state.tokenRequest.email));\n this.serverMasterKeyHash$ = this.cache.pipe(\n map((state) => state.tokenRequest.masterPasswordHash),\n );\n this.localMasterKeyHash$ = this.cache.pipe(map((state) => state.localMasterKeyHash));\n }\n\n override async logIn(credentials: PasswordLoginCredentials) {\n const { email, masterPassword, captchaToken, twoFactor } = credentials;\n\n const data = new PasswordLoginStrategyData();\n data.masterKey = await this.loginStrategyService.makePreloginKey(masterPassword, email);\n data.userEnteredEmail = email;\n\n // Hash the password early (before authentication) so we don't persist it in memory in plaintext\n data.localMasterKeyHash = await this.cryptoService.hashMasterKey(\n masterPassword,\n data.masterKey,\n HashPurpose.LocalAuthorization,\n );\n const serverMasterKeyHash = await this.cryptoService.hashMasterKey(\n masterPassword,\n data.masterKey,\n );\n\n data.tokenRequest = new PasswordTokenRequest(\n email,\n serverMasterKeyHash,\n captchaToken,\n await this.buildTwoFactor(twoFactor, email),\n await this.buildDeviceRequest(),\n );\n\n this.cache.next(data);\n\n const [authResult, identityResponse] = await this.startLogIn();\n\n const masterPasswordPolicyOptions =\n this.getMasterPasswordPolicyOptionsFromResponse(identityResponse);\n\n // The identity result can contain master password policies for the user's organizations\n if (masterPasswordPolicyOptions?.enforceOnLogin) {\n // If there is a policy active, evaluate the supplied password before its no longer in memory\n const meetsRequirements = this.evaluateMasterPassword(\n credentials,\n masterPasswordPolicyOptions,\n );\n\n if (!meetsRequirements) {\n if (authResult.requiresCaptcha || authResult.requiresTwoFactor) {\n // Save the flag to this strategy for later use as the master password is about to pass out of scope\n this.cache.next({\n ...this.cache.value,\n forcePasswordResetReason: ForceSetPasswordReason.WeakMasterPassword,\n });\n } else {\n // Authentication was successful, save the force update password options with the state service\n await this.stateService.setForceSetPasswordReason(\n ForceSetPasswordReason.WeakMasterPassword,\n );\n authResult.forcePasswordReset = ForceSetPasswordReason.WeakMasterPassword;\n }\n }\n }\n return authResult;\n }\n\n override async logInTwoFactor(\n twoFactor: TokenTwoFactorRequest,\n captchaResponse: string,\n ): Promise {\n const data = this.cache.value;\n data.tokenRequest.captchaResponse = captchaResponse ?? data.captchaBypassToken;\n this.cache.next(data);\n\n const result = await super.logInTwoFactor(twoFactor);\n\n // 2FA was successful, save the force update password options with the state service if defined\n const forcePasswordResetReason = this.cache.value.forcePasswordResetReason;\n if (\n !result.requiresTwoFactor &&\n !result.requiresCaptcha &&\n forcePasswordResetReason != ForceSetPasswordReason.None\n ) {\n await this.stateService.setForceSetPasswordReason(forcePasswordResetReason);\n result.forcePasswordReset = forcePasswordResetReason;\n }\n\n return result;\n }\n\n protected override async setMasterKey(response: IdentityTokenResponse) {\n const { masterKey, localMasterKeyHash } = this.cache.value;\n await this.cryptoService.setMasterKey(masterKey);\n await this.cryptoService.setMasterKeyHash(localMasterKeyHash);\n }\n\n protected override async setUserKey(response: IdentityTokenResponse): Promise {\n // If migration is required, we won't have a user key to set yet.\n if (this.encryptionKeyMigrationRequired(response)) {\n return;\n }\n await this.cryptoService.setMasterKeyEncryptedUserKey(response.key);\n\n const masterKey = await this.cryptoService.getMasterKey();\n if (masterKey) {\n const userKey = await this.cryptoService.decryptUserKeyWithMasterKey(masterKey);\n await this.cryptoService.setUserKey(userKey);\n }\n }\n\n protected override async setPrivateKey(response: IdentityTokenResponse): Promise {\n await this.cryptoService.setPrivateKey(\n response.privateKey ?? (await this.createKeyPairForOldAccount()),\n );\n }\n\n protected override encryptionKeyMigrationRequired(response: IdentityTokenResponse): boolean {\n return !response.key;\n }\n\n private getMasterPasswordPolicyOptionsFromResponse(\n response: IdentityTokenResponse | IdentityTwoFactorResponse | IdentityCaptchaResponse,\n ): MasterPasswordPolicyOptions {\n if (response == null || response instanceof IdentityCaptchaResponse) {\n return null;\n }\n return MasterPasswordPolicyOptions.fromResponse(response.masterPasswordPolicy);\n }\n\n private evaluateMasterPassword(\n { masterPassword, email }: PasswordLoginCredentials,\n options: MasterPasswordPolicyOptions,\n ): boolean {\n const passwordStrength = this.passwordStrengthService.getPasswordStrength(\n masterPassword,\n email,\n )?.score;\n\n return this.policyService.evaluateMasterPassword(passwordStrength, masterPassword, options);\n }\n\n exportCache(): CacheData {\n return {\n password: this.cache.value,\n };\n }\n}\n","import { DeviceRequest } from \"./device.request\";\nimport { TokenTwoFactorRequest } from \"./token-two-factor.request\";\nimport { TokenRequest } from \"./token.request\";\n\nexport class SsoTokenRequest extends TokenRequest {\n constructor(\n public code: string,\n public codeVerifier: string,\n public redirectUri: string,\n protected twoFactor: TokenTwoFactorRequest,\n device?: DeviceRequest,\n ) {\n super(twoFactor, device);\n }\n\n toIdentityToken(clientId: string) {\n const obj = super.toIdentityToken(clientId);\n\n obj.grant_type = \"authorization_code\";\n obj.code = this.code;\n obj.code_verifier = this.codeVerifier;\n obj.redirect_uri = this.redirectUri;\n\n return obj;\n }\n\n static fromJSON(json: any) {\n return Object.assign(Object.create(SsoTokenRequest.prototype), json, {\n device: json.device ? DeviceRequest.fromJSON(json.device) : undefined,\n twoFactor: json.twoFactor\n ? Object.assign(new TokenTwoFactorRequest(), json.twoFactor)\n : undefined,\n });\n }\n}\n","import { Observable, map, BehaviorSubject } from \"rxjs\";\nimport { Jsonify } from \"type-fest\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { DeviceTrustCryptoServiceAbstraction } from \"@bitwarden/common/auth/abstractions/device-trust-crypto.service.abstraction\";\nimport { KeyConnectorService } from \"@bitwarden/common/auth/abstractions/key-connector.service\";\nimport { TokenService } from \"@bitwarden/common/auth/abstractions/token.service\";\nimport { TwoFactorService } from \"@bitwarden/common/auth/abstractions/two-factor.service\";\nimport { ForceSetPasswordReason } from \"@bitwarden/common/auth/models/domain/force-set-password-reason\";\nimport { SsoTokenRequest } from \"@bitwarden/common/auth/models/request/identity-token/sso-token.request\";\nimport { AuthRequestResponse } from \"@bitwarden/common/auth/models/response/auth-request.response\";\nimport { IdentityTokenResponse } from \"@bitwarden/common/auth/models/response/identity-token.response\";\nimport { BillingAccountProfileStateService } from \"@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service\";\nimport { HttpStatusCode } from \"@bitwarden/common/enums\";\nimport { ErrorResponse } from \"@bitwarden/common/models/response/error.response\";\nimport { AppIdService } from \"@bitwarden/common/platform/abstractions/app-id.service\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\n\nimport {\n InternalUserDecryptionOptionsServiceAbstraction,\n AuthRequestServiceAbstraction,\n} from \"../abstractions\";\nimport { SsoLoginCredentials } from \"../models/domain/login-credentials\";\nimport { CacheData } from \"../services/login-strategies/login-strategy.state\";\n\nimport { LoginStrategyData, LoginStrategy } from \"./login.strategy\";\n\nexport class SsoLoginStrategyData implements LoginStrategyData {\n captchaBypassToken: string;\n tokenRequest: SsoTokenRequest;\n /**\n * User's entered email obtained pre-login. Present in most SSO flows, but not CLI + SSO Flow.\n */\n userEnteredEmail?: string;\n /**\n * User email address. Only available after authentication.\n */\n email?: string;\n /**\n * The organization ID that the user is logging into. Used for Key Connector\n * purposes after authentication.\n */\n orgId: string;\n /**\n * A token provided by the server as an authentication factor for sending\n * email OTPs to the user's configured 2FA email address. This is required\n * as we don't have a master password hash or other verifiable secret when using SSO.\n */\n ssoEmail2FaSessionToken?: string;\n\n static fromJSON(obj: Jsonify): SsoLoginStrategyData {\n return Object.assign(new SsoLoginStrategyData(), obj, {\n tokenRequest: SsoTokenRequest.fromJSON(obj.tokenRequest),\n });\n }\n}\n\nexport class SsoLoginStrategy extends LoginStrategy {\n /**\n * @see {@link SsoLoginStrategyData.email}\n */\n email$: Observable;\n /**\n * @see {@link SsoLoginStrategyData.orgId}\n */\n orgId$: Observable;\n /**\n * @see {@link SsoLoginStrategyData.ssoEmail2FaSessionToken}\n */\n ssoEmail2FaSessionToken$: Observable;\n\n protected cache: BehaviorSubject;\n\n constructor(\n data: SsoLoginStrategyData,\n cryptoService: CryptoService,\n apiService: ApiService,\n tokenService: TokenService,\n appIdService: AppIdService,\n platformUtilsService: PlatformUtilsService,\n messagingService: MessagingService,\n logService: LogService,\n stateService: StateService,\n twoFactorService: TwoFactorService,\n userDecryptionOptionsService: InternalUserDecryptionOptionsServiceAbstraction,\n private keyConnectorService: KeyConnectorService,\n private deviceTrustCryptoService: DeviceTrustCryptoServiceAbstraction,\n private authRequestService: AuthRequestServiceAbstraction,\n private i18nService: I18nService,\n billingAccountProfileStateService: BillingAccountProfileStateService,\n ) {\n super(\n cryptoService,\n apiService,\n tokenService,\n appIdService,\n platformUtilsService,\n messagingService,\n logService,\n stateService,\n twoFactorService,\n userDecryptionOptionsService,\n billingAccountProfileStateService,\n );\n\n this.cache = new BehaviorSubject(data);\n this.email$ = this.cache.pipe(map((state) => state.email));\n this.orgId$ = this.cache.pipe(map((state) => state.orgId));\n this.ssoEmail2FaSessionToken$ = this.cache.pipe(map((state) => state.ssoEmail2FaSessionToken));\n }\n\n async logIn(credentials: SsoLoginCredentials) {\n const data = new SsoLoginStrategyData();\n data.orgId = credentials.orgId;\n\n data.userEnteredEmail = credentials.email;\n\n data.tokenRequest = new SsoTokenRequest(\n credentials.code,\n credentials.codeVerifier,\n credentials.redirectUrl,\n await this.buildTwoFactor(credentials.twoFactor, credentials.email),\n await this.buildDeviceRequest(),\n );\n\n this.cache.next(data);\n\n const [ssoAuthResult] = await this.startLogIn();\n\n const email = ssoAuthResult.email;\n const ssoEmail2FaSessionToken = ssoAuthResult.ssoEmail2FaSessionToken;\n\n // Auth guard currently handles redirects for this.\n if (ssoAuthResult.forcePasswordReset == ForceSetPasswordReason.AdminForcePasswordReset) {\n await this.stateService.setForceSetPasswordReason(ssoAuthResult.forcePasswordReset);\n }\n\n this.cache.next({\n ...this.cache.value,\n email,\n ssoEmail2FaSessionToken,\n });\n\n return ssoAuthResult;\n }\n\n protected override async setMasterKey(tokenResponse: IdentityTokenResponse) {\n // The only way we can be setting a master key at this point is if we are using Key Connector.\n // First, check to make sure that we should do so based on the token response.\n if (this.shouldSetMasterKeyFromKeyConnector(tokenResponse)) {\n // If we're here, we know that the user should use Key Connector (they have a KeyConnectorUrl) and does not have a master password.\n // We can now check the key on the token response to see whether they are a brand new user or an existing user.\n // The presence of a masterKeyEncryptedUserKey indicates that the user has already been provisioned in Key Connector.\n const newSsoUser = tokenResponse.key == null;\n if (newSsoUser) {\n await this.keyConnectorService.convertNewSsoUserToKeyConnector(\n tokenResponse,\n this.cache.value.orgId,\n );\n } else {\n const keyConnectorUrl = this.getKeyConnectorUrl(tokenResponse);\n await this.keyConnectorService.setMasterKeyFromUrl(keyConnectorUrl);\n }\n }\n }\n\n /**\n * Determines if it is possible set the `masterKey` from Key Connector.\n * @param tokenResponse\n * @returns `true` if the master key can be set from Key Connector, `false` otherwise\n */\n private shouldSetMasterKeyFromKeyConnector(tokenResponse: IdentityTokenResponse): boolean {\n const userDecryptionOptions = tokenResponse?.userDecryptionOptions;\n\n if (userDecryptionOptions != null) {\n const userHasMasterPassword = userDecryptionOptions.hasMasterPassword;\n const userHasKeyConnectorUrl =\n userDecryptionOptions.keyConnectorOption?.keyConnectorUrl != null;\n\n // In order for us to set the master key from Key Connector, we need to have a Key Connector URL\n // and the user must not have a master password.\n return userHasKeyConnectorUrl && !userHasMasterPassword;\n } else {\n // In pre-TDE versions of the server, the userDecryptionOptions will not be present.\n // In this case, we can determine if the user has a master password and has a Key Connector URL by\n // just checking the keyConnectorUrl property. This is because the server short-circuits on the response\n // and will not pass back the URL in the response if the user has a master password.\n // TODO: remove compatibility check after 2023.10 release (https://bitwarden.atlassian.net/browse/PM-3537)\n return tokenResponse.keyConnectorUrl != null;\n }\n }\n\n private getKeyConnectorUrl(tokenResponse: IdentityTokenResponse): string {\n // TODO: remove tokenResponse.keyConnectorUrl reference after 2023.10 release (https://bitwarden.atlassian.net/browse/PM-3537)\n const userDecryptionOptions = tokenResponse?.userDecryptionOptions;\n return (\n tokenResponse.keyConnectorUrl ?? userDecryptionOptions?.keyConnectorOption?.keyConnectorUrl\n );\n }\n\n // TODO: future passkey login strategy will need to support setting user key (decrypting via TDE or admin approval request)\n // so might be worth moving this logic to a common place (base login strategy or a separate service?)\n protected override async setUserKey(tokenResponse: IdentityTokenResponse): Promise {\n const masterKeyEncryptedUserKey = tokenResponse.key;\n\n // Note: masterKeyEncryptedUserKey is undefined for SSO JIT provisioned users\n // on account creation and subsequent logins (confirmed or unconfirmed)\n // but that is fine for TDE so we cannot return if it is undefined\n\n if (masterKeyEncryptedUserKey) {\n // set the master key encrypted user key if it exists\n await this.cryptoService.setMasterKeyEncryptedUserKey(masterKeyEncryptedUserKey);\n }\n\n const userDecryptionOptions = tokenResponse?.userDecryptionOptions;\n\n // Note: TDE and key connector are mutually exclusive\n if (userDecryptionOptions?.trustedDeviceOption) {\n await this.trySetUserKeyWithApprovedAdminRequestIfExists();\n\n const hasUserKey = await this.cryptoService.hasUserKey();\n\n // Only try to set user key with device key if admin approval request was not successful\n if (!hasUserKey) {\n await this.trySetUserKeyWithDeviceKey(tokenResponse);\n }\n } else if (\n masterKeyEncryptedUserKey != null &&\n this.getKeyConnectorUrl(tokenResponse) != null\n ) {\n // Key connector enabled for user\n await this.trySetUserKeyWithMasterKey();\n }\n\n // Note: In the traditional SSO flow with MP without key connector, the lock component\n // is responsible for deriving master key from MP entry and then decrypting the user key\n }\n\n private async trySetUserKeyWithApprovedAdminRequestIfExists(): Promise {\n // At this point a user could have an admin auth request that has been approved\n const adminAuthReqStorable = await this.stateService.getAdminAuthRequest();\n\n if (!adminAuthReqStorable) {\n return;\n }\n\n // Call server to see if admin auth request has been approved\n let adminAuthReqResponse: AuthRequestResponse;\n\n try {\n adminAuthReqResponse = await this.apiService.getAuthRequest(adminAuthReqStorable.id);\n } catch (error) {\n if (error instanceof ErrorResponse && error.statusCode === HttpStatusCode.NotFound) {\n // if we get a 404, it means the auth request has been deleted so clear it from storage\n await this.stateService.setAdminAuthRequest(null);\n }\n\n // Always return on an error here as we don't want to block the user from logging in\n return;\n }\n\n if (adminAuthReqResponse?.requestApproved) {\n // if masterPasswordHash has a value, we will always receive authReqResponse.key\n // as authRequestPublicKey(masterKey) + authRequestPublicKey(masterPasswordHash)\n if (adminAuthReqResponse.masterPasswordHash) {\n await this.authRequestService.setKeysAfterDecryptingSharedMasterKeyAndHash(\n adminAuthReqResponse,\n adminAuthReqStorable.privateKey,\n );\n } else {\n // if masterPasswordHash is null, we will always receive authReqResponse.key\n // as authRequestPublicKey(userKey)\n await this.authRequestService.setUserKeyAfterDecryptingSharedUserKey(\n adminAuthReqResponse,\n adminAuthReqStorable.privateKey,\n );\n }\n\n if (await this.cryptoService.hasUserKey()) {\n // Now that we have a decrypted user key in memory, we can check if we\n // need to establish trust on the current device\n await this.deviceTrustCryptoService.trustDeviceIfRequired();\n\n // if we successfully decrypted the user key, we can delete the admin auth request out of state\n // TODO: eventually we post and clean up DB as well once consumed on client\n await this.stateService.setAdminAuthRequest(null);\n\n this.platformUtilsService.showToast(\"success\", null, this.i18nService.t(\"loginApproved\"));\n }\n }\n }\n\n private async trySetUserKeyWithDeviceKey(tokenResponse: IdentityTokenResponse): Promise {\n const trustedDeviceOption = tokenResponse.userDecryptionOptions?.trustedDeviceOption;\n\n const deviceKey = await this.deviceTrustCryptoService.getDeviceKey();\n const encDevicePrivateKey = trustedDeviceOption?.encryptedPrivateKey;\n const encUserKey = trustedDeviceOption?.encryptedUserKey;\n\n if (!deviceKey || !encDevicePrivateKey || !encUserKey) {\n return;\n }\n\n const userKey = await this.deviceTrustCryptoService.decryptUserKeyWithDeviceKey(\n encDevicePrivateKey,\n encUserKey,\n deviceKey,\n );\n\n if (userKey) {\n await this.cryptoService.setUserKey(userKey);\n }\n }\n\n private async trySetUserKeyWithMasterKey(): Promise {\n const masterKey = await this.cryptoService.getMasterKey();\n\n // There is a scenario in which the master key is not set here. That will occur if the user\n // has a master password and is using Key Connector. In that case, we cannot set the master key\n // because the user hasn't entered their master password yet.\n // Instead, we'll return here and let the migration to Key Connector handle setting the master key.\n if (!masterKey) {\n return;\n }\n\n const userKey = await this.cryptoService.decryptUserKeyWithMasterKey(masterKey);\n await this.cryptoService.setUserKey(userKey);\n }\n\n protected override async setPrivateKey(tokenResponse: IdentityTokenResponse): Promise {\n const newSsoUser = tokenResponse.key == null;\n\n if (!newSsoUser) {\n await this.cryptoService.setPrivateKey(\n tokenResponse.privateKey ?? (await this.createKeyPairForOldAccount()),\n );\n }\n }\n\n exportCache(): CacheData {\n return {\n sso: this.cache.value,\n };\n }\n}\n","import { firstValueFrom, BehaviorSubject } from \"rxjs\";\nimport { Jsonify } from \"type-fest\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { KeyConnectorService } from \"@bitwarden/common/auth/abstractions/key-connector.service\";\nimport { TokenService } from \"@bitwarden/common/auth/abstractions/token.service\";\nimport { TwoFactorService } from \"@bitwarden/common/auth/abstractions/two-factor.service\";\nimport { UserApiTokenRequest } from \"@bitwarden/common/auth/models/request/identity-token/user-api-token.request\";\nimport { IdentityTokenResponse } from \"@bitwarden/common/auth/models/response/identity-token.response\";\nimport { BillingAccountProfileStateService } from \"@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service\";\nimport { VaultTimeoutAction } from \"@bitwarden/common/enums/vault-timeout-action.enum\";\nimport { AppIdService } from \"@bitwarden/common/platform/abstractions/app-id.service\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { EnvironmentService } from \"@bitwarden/common/platform/abstractions/environment.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\n\nimport { InternalUserDecryptionOptionsServiceAbstraction } from \"../abstractions/user-decryption-options.service.abstraction\";\nimport { UserApiLoginCredentials } from \"../models/domain/login-credentials\";\nimport { CacheData } from \"../services/login-strategies/login-strategy.state\";\n\nimport { LoginStrategy, LoginStrategyData } from \"./login.strategy\";\n\nexport class UserApiLoginStrategyData implements LoginStrategyData {\n tokenRequest: UserApiTokenRequest;\n captchaBypassToken: string;\n\n static fromJSON(obj: Jsonify): UserApiLoginStrategyData {\n return Object.assign(new UserApiLoginStrategyData(), obj, {\n tokenRequest: UserApiTokenRequest.fromJSON(obj.tokenRequest),\n });\n }\n}\n\nexport class UserApiLoginStrategy extends LoginStrategy {\n protected cache: BehaviorSubject;\n\n constructor(\n data: UserApiLoginStrategyData,\n cryptoService: CryptoService,\n apiService: ApiService,\n tokenService: TokenService,\n appIdService: AppIdService,\n platformUtilsService: PlatformUtilsService,\n messagingService: MessagingService,\n logService: LogService,\n stateService: StateService,\n twoFactorService: TwoFactorService,\n userDecryptionOptionsService: InternalUserDecryptionOptionsServiceAbstraction,\n private environmentService: EnvironmentService,\n private keyConnectorService: KeyConnectorService,\n billingAccountProfileStateService: BillingAccountProfileStateService,\n ) {\n super(\n cryptoService,\n apiService,\n tokenService,\n appIdService,\n platformUtilsService,\n messagingService,\n logService,\n stateService,\n twoFactorService,\n userDecryptionOptionsService,\n billingAccountProfileStateService,\n );\n this.cache = new BehaviorSubject(data);\n }\n\n override async logIn(credentials: UserApiLoginCredentials) {\n const data = new UserApiLoginStrategyData();\n data.tokenRequest = new UserApiTokenRequest(\n credentials.clientId,\n credentials.clientSecret,\n await this.buildTwoFactor(),\n await this.buildDeviceRequest(),\n );\n this.cache.next(data);\n\n const [authResult] = await this.startLogIn();\n return authResult;\n }\n\n protected override async setMasterKey(response: IdentityTokenResponse) {\n if (response.apiUseKeyConnector) {\n const env = await firstValueFrom(this.environmentService.environment$);\n const keyConnectorUrl = env.getKeyConnectorUrl();\n await this.keyConnectorService.setMasterKeyFromUrl(keyConnectorUrl);\n }\n }\n\n protected override async setUserKey(response: IdentityTokenResponse): Promise {\n await this.cryptoService.setMasterKeyEncryptedUserKey(response.key);\n\n if (response.apiUseKeyConnector) {\n const masterKey = await this.cryptoService.getMasterKey();\n if (masterKey) {\n const userKey = await this.cryptoService.decryptUserKeyWithMasterKey(masterKey);\n await this.cryptoService.setUserKey(userKey);\n }\n }\n }\n\n protected override async setPrivateKey(response: IdentityTokenResponse): Promise {\n await this.cryptoService.setPrivateKey(\n response.privateKey ?? (await this.createKeyPairForOldAccount()),\n );\n }\n\n protected async saveAccountInformation(tokenResponse: IdentityTokenResponse) {\n await super.saveAccountInformation(tokenResponse);\n\n const vaultTimeout = await this.stateService.getVaultTimeout();\n const vaultTimeoutAction = await this.stateService.getVaultTimeoutAction();\n\n const tokenRequest = this.cache.value.tokenRequest;\n\n await this.tokenService.setClientId(\n tokenRequest.clientId,\n vaultTimeoutAction as VaultTimeoutAction,\n vaultTimeout,\n );\n await this.tokenService.setClientSecret(\n tokenRequest.clientSecret,\n vaultTimeoutAction as VaultTimeoutAction,\n vaultTimeout,\n );\n }\n\n exportCache(): CacheData {\n return {\n userApiKey: this.cache.value,\n };\n }\n}\n","import { WebAuthnLoginAssertionResponseRequest } from \"../../../services/webauthn-login/request/webauthn-login-assertion-response.request\";\n\nimport { DeviceRequest } from \"./device.request\";\nimport { TokenTwoFactorRequest } from \"./token-two-factor.request\";\nimport { TokenRequest } from \"./token.request\";\n\nexport class WebAuthnLoginTokenRequest extends TokenRequest {\n constructor(\n public token: string,\n public deviceResponse: WebAuthnLoginAssertionResponseRequest,\n device?: DeviceRequest,\n ) {\n super(undefined, device);\n }\n\n toIdentityToken(clientId: string) {\n const obj = super.toIdentityToken(clientId);\n\n obj.grant_type = \"webauthn\";\n obj.token = this.token;\n // must be a string b/c sending as form encoded data\n obj.deviceResponse = JSON.stringify(this.deviceResponse);\n\n return obj;\n }\n\n static fromJSON(json: any) {\n return Object.assign(Object.create(WebAuthnLoginTokenRequest.prototype), json, {\n deviceResponse: WebAuthnLoginAssertionResponseRequest.fromJSON(json.deviceResponse),\n device: json.device ? DeviceRequest.fromJSON(json.device) : undefined,\n twoFactor: json.twoFactor\n ? Object.assign(new TokenTwoFactorRequest(), json.twoFactor)\n : undefined,\n });\n }\n}\n","import { BehaviorSubject } from \"rxjs\";\nimport { Jsonify } from \"type-fest\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { TokenService } from \"@bitwarden/common/auth/abstractions/token.service\";\nimport { TwoFactorService } from \"@bitwarden/common/auth/abstractions/two-factor.service\";\nimport { AuthResult } from \"@bitwarden/common/auth/models/domain/auth-result\";\nimport { WebAuthnLoginTokenRequest } from \"@bitwarden/common/auth/models/request/identity-token/webauthn-login-token.request\";\nimport { IdentityTokenResponse } from \"@bitwarden/common/auth/models/response/identity-token.response\";\nimport { BillingAccountProfileStateService } from \"@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service\";\nimport { AppIdService } from \"@bitwarden/common/platform/abstractions/app-id.service\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { SymmetricCryptoKey } from \"@bitwarden/common/platform/models/domain/symmetric-crypto-key\";\nimport { UserKey } from \"@bitwarden/common/types/key\";\n\nimport { InternalUserDecryptionOptionsServiceAbstraction } from \"../abstractions\";\nimport { WebAuthnLoginCredentials } from \"../models/domain/login-credentials\";\nimport { CacheData } from \"../services/login-strategies/login-strategy.state\";\n\nimport { LoginStrategy, LoginStrategyData } from \"./login.strategy\";\n\nexport class WebAuthnLoginStrategyData implements LoginStrategyData {\n tokenRequest: WebAuthnLoginTokenRequest;\n captchaBypassToken?: string;\n credentials: WebAuthnLoginCredentials;\n\n static fromJSON(obj: Jsonify): WebAuthnLoginStrategyData {\n return Object.assign(new WebAuthnLoginStrategyData(), obj, {\n tokenRequest: WebAuthnLoginTokenRequest.fromJSON(obj.tokenRequest),\n credentials: WebAuthnLoginCredentials.fromJSON(obj.credentials),\n });\n }\n}\n\nexport class WebAuthnLoginStrategy extends LoginStrategy {\n protected cache: BehaviorSubject;\n\n constructor(\n data: WebAuthnLoginStrategyData,\n cryptoService: CryptoService,\n apiService: ApiService,\n tokenService: TokenService,\n appIdService: AppIdService,\n platformUtilsService: PlatformUtilsService,\n messagingService: MessagingService,\n logService: LogService,\n stateService: StateService,\n twoFactorService: TwoFactorService,\n userDecryptionOptionsService: InternalUserDecryptionOptionsServiceAbstraction,\n billingAccountProfileStateService: BillingAccountProfileStateService,\n ) {\n super(\n cryptoService,\n apiService,\n tokenService,\n appIdService,\n platformUtilsService,\n messagingService,\n logService,\n stateService,\n twoFactorService,\n userDecryptionOptionsService,\n billingAccountProfileStateService,\n );\n\n this.cache = new BehaviorSubject(data);\n }\n\n async logIn(credentials: WebAuthnLoginCredentials) {\n const data = new WebAuthnLoginStrategyData();\n data.credentials = credentials;\n data.tokenRequest = new WebAuthnLoginTokenRequest(\n credentials.token,\n credentials.deviceResponse,\n await this.buildDeviceRequest(),\n );\n this.cache.next(data);\n\n const [authResult] = await this.startLogIn();\n return authResult;\n }\n\n async logInTwoFactor(): Promise {\n throw new Error(\"2FA not supported yet for WebAuthn Login.\");\n }\n\n protected override async setMasterKey() {\n return Promise.resolve();\n }\n\n protected override async setUserKey(idTokenResponse: IdentityTokenResponse) {\n const masterKeyEncryptedUserKey = idTokenResponse.key;\n\n if (masterKeyEncryptedUserKey) {\n // set the master key encrypted user key if it exists\n await this.cryptoService.setMasterKeyEncryptedUserKey(masterKeyEncryptedUserKey);\n }\n\n const userDecryptionOptions = idTokenResponse?.userDecryptionOptions;\n\n if (userDecryptionOptions?.webAuthnPrfOption) {\n const webAuthnPrfOption = idTokenResponse.userDecryptionOptions?.webAuthnPrfOption;\n\n const credentials = this.cache.value.credentials;\n // confirm we still have the prf key\n if (!credentials.prfKey) {\n return;\n }\n\n // decrypt prf encrypted private key\n const privateKey = await this.cryptoService.decryptToBytes(\n webAuthnPrfOption.encryptedPrivateKey,\n credentials.prfKey,\n );\n\n // decrypt user key with private key\n const userKey = await this.cryptoService.rsaDecrypt(\n webAuthnPrfOption.encryptedUserKey.encryptedString,\n privateKey,\n );\n\n if (userKey) {\n await this.cryptoService.setUserKey(new SymmetricCryptoKey(userKey) as UserKey);\n }\n }\n }\n\n protected override async setPrivateKey(response: IdentityTokenResponse): Promise {\n await this.cryptoService.setPrivateKey(\n response.privateKey ?? (await this.createKeyPairForOldAccount()),\n );\n }\n\n exportCache(): CacheData {\n return {\n webAuthn: this.cache.value,\n };\n }\n}\n","import { AuthenticationType } from \"@bitwarden/common/auth/enums/authentication-type\";\nimport { KeyDefinition, LOGIN_STRATEGY_MEMORY } from \"@bitwarden/common/platform/state\";\n\nimport { AuthRequestLoginStrategyData } from \"../../login-strategies/auth-request-login.strategy\";\nimport { PasswordLoginStrategyData } from \"../../login-strategies/password-login.strategy\";\nimport { SsoLoginStrategyData } from \"../../login-strategies/sso-login.strategy\";\nimport { UserApiLoginStrategyData } from \"../../login-strategies/user-api-login.strategy\";\nimport { WebAuthnLoginStrategyData } from \"../../login-strategies/webauthn-login.strategy\";\n\n/**\n * The current login strategy in use.\n */\nexport const CURRENT_LOGIN_STRATEGY_KEY = new KeyDefinition(\n LOGIN_STRATEGY_MEMORY,\n \"currentLoginStrategy\",\n {\n deserializer: (data) => data,\n },\n);\n\n/**\n * The expiration date for the login strategy cache.\n * Used as a backup to the timer set on the service.\n */\nexport const CACHE_EXPIRATION_KEY = new KeyDefinition(\n LOGIN_STRATEGY_MEMORY,\n \"loginStrategyCacheExpiration\",\n {\n deserializer: (data) => (data ? null : new Date(data)),\n },\n);\n\n/**\n * Auth Request notification for all instances of the login strategy service.\n * Note: this isn't an ideal approach, but allows both a background and\n * foreground instance to send out the notification.\n * TODO: Move to Auth Request service.\n */\nexport const AUTH_REQUEST_PUSH_NOTIFICATION_KEY = new KeyDefinition(\n LOGIN_STRATEGY_MEMORY,\n \"authRequestPushNotification\",\n {\n deserializer: (data) => data,\n },\n);\n\nexport type CacheData = {\n password?: PasswordLoginStrategyData;\n sso?: SsoLoginStrategyData;\n userApiKey?: UserApiLoginStrategyData;\n authRequest?: AuthRequestLoginStrategyData;\n webAuthn?: WebAuthnLoginStrategyData;\n};\n\n/**\n * A cache for login strategies to use for data persistence through\n * the login process.\n */\nexport const CACHE_KEY = new KeyDefinition(\n LOGIN_STRATEGY_MEMORY,\n \"loginStrategyCache\",\n {\n deserializer: (data) => {\n if (data == null) {\n return null;\n }\n return {\n password: data.password ? PasswordLoginStrategyData.fromJSON(data.password) : undefined,\n sso: data.sso ? SsoLoginStrategyData.fromJSON(data.sso) : undefined,\n userApiKey: data.userApiKey\n ? UserApiLoginStrategyData.fromJSON(data.userApiKey)\n : undefined,\n authRequest: data.authRequest\n ? AuthRequestLoginStrategyData.fromJSON(data.authRequest)\n : undefined,\n webAuthn: data.webAuthn ? WebAuthnLoginStrategyData.fromJSON(data.webAuthn) : undefined,\n };\n },\n },\n);\n","import {\n combineLatestWith,\n distinctUntilChanged,\n filter,\n firstValueFrom,\n map,\n Observable,\n shareReplay,\n} from \"rxjs\";\n\nimport { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { PolicyService } from \"@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction\";\nimport { DeviceTrustCryptoServiceAbstraction } from \"@bitwarden/common/auth/abstractions/device-trust-crypto.service.abstraction\";\nimport { KeyConnectorService } from \"@bitwarden/common/auth/abstractions/key-connector.service\";\nimport { TokenService } from \"@bitwarden/common/auth/abstractions/token.service\";\nimport { TwoFactorService } from \"@bitwarden/common/auth/abstractions/two-factor.service\";\nimport { AuthenticationType } from \"@bitwarden/common/auth/enums/authentication-type\";\nimport { AuthResult } from \"@bitwarden/common/auth/models/domain/auth-result\";\nimport { KdfConfig } from \"@bitwarden/common/auth/models/domain/kdf-config\";\nimport { TokenTwoFactorRequest } from \"@bitwarden/common/auth/models/request/identity-token/token-two-factor.request\";\nimport { PasswordlessAuthRequest } from \"@bitwarden/common/auth/models/request/passwordless-auth.request\";\nimport { AuthRequestResponse } from \"@bitwarden/common/auth/models/response/auth-request.response\";\nimport { BillingAccountProfileStateService } from \"@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service\";\nimport { PreloginRequest } from \"@bitwarden/common/models/request/prelogin.request\";\nimport { ErrorResponse } from \"@bitwarden/common/models/response/error.response\";\nimport { AuthRequestPushNotification } from \"@bitwarden/common/models/response/notification.response\";\nimport { AppIdService } from \"@bitwarden/common/platform/abstractions/app-id.service\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { EncryptService } from \"@bitwarden/common/platform/abstractions/encrypt.service\";\nimport { EnvironmentService } from \"@bitwarden/common/platform/abstractions/environment.service\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { MessagingService } from \"@bitwarden/common/platform/abstractions/messaging.service\";\nimport { PlatformUtilsService } from \"@bitwarden/common/platform/abstractions/platform-utils.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { KdfType } from \"@bitwarden/common/platform/enums\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\nimport { GlobalState, GlobalStateProvider } from \"@bitwarden/common/platform/state\";\nimport { PasswordStrengthServiceAbstraction } from \"@bitwarden/common/tools/password-strength\";\nimport { MasterKey } from \"@bitwarden/common/types/key\";\n\nimport { AuthRequestServiceAbstraction, LoginStrategyServiceAbstraction } from \"../../abstractions\";\nimport { InternalUserDecryptionOptionsServiceAbstraction } from \"../../abstractions/user-decryption-options.service.abstraction\";\nimport { AuthRequestLoginStrategy } from \"../../login-strategies/auth-request-login.strategy\";\nimport { PasswordLoginStrategy } from \"../../login-strategies/password-login.strategy\";\nimport { SsoLoginStrategy } from \"../../login-strategies/sso-login.strategy\";\nimport { UserApiLoginStrategy } from \"../../login-strategies/user-api-login.strategy\";\nimport { WebAuthnLoginStrategy } from \"../../login-strategies/webauthn-login.strategy\";\nimport {\n UserApiLoginCredentials,\n PasswordLoginCredentials,\n SsoLoginCredentials,\n AuthRequestLoginCredentials,\n WebAuthnLoginCredentials,\n} from \"../../models\";\n\nimport {\n AUTH_REQUEST_PUSH_NOTIFICATION_KEY,\n CURRENT_LOGIN_STRATEGY_KEY,\n CacheData,\n CACHE_EXPIRATION_KEY,\n CACHE_KEY,\n} from \"./login-strategy.state\";\n\nconst sessionTimeoutLength = 2 * 60 * 1000; // 2 minutes\n\nexport class LoginStrategyService implements LoginStrategyServiceAbstraction {\n private sessionTimeout: unknown;\n private currentAuthnTypeState: GlobalState;\n private loginStrategyCacheState: GlobalState;\n private loginStrategyCacheExpirationState: GlobalState;\n private authRequestPushNotificationState: GlobalState;\n\n private loginStrategy$: Observable<\n | UserApiLoginStrategy\n | PasswordLoginStrategy\n | SsoLoginStrategy\n | AuthRequestLoginStrategy\n | WebAuthnLoginStrategy\n | null\n >;\n\n currentAuthType$: Observable;\n // TODO: move to auth request service\n authRequestPushNotification$: Observable;\n\n constructor(\n protected cryptoService: CryptoService,\n protected apiService: ApiService,\n protected tokenService: TokenService,\n protected appIdService: AppIdService,\n protected platformUtilsService: PlatformUtilsService,\n protected messagingService: MessagingService,\n protected logService: LogService,\n protected keyConnectorService: KeyConnectorService,\n protected environmentService: EnvironmentService,\n protected stateService: StateService,\n protected twoFactorService: TwoFactorService,\n protected i18nService: I18nService,\n protected encryptService: EncryptService,\n protected passwordStrengthService: PasswordStrengthServiceAbstraction,\n protected policyService: PolicyService,\n protected deviceTrustCryptoService: DeviceTrustCryptoServiceAbstraction,\n protected authRequestService: AuthRequestServiceAbstraction,\n protected userDecryptionOptionsService: InternalUserDecryptionOptionsServiceAbstraction,\n protected stateProvider: GlobalStateProvider,\n protected billingAccountProfileStateService: BillingAccountProfileStateService,\n ) {\n this.currentAuthnTypeState = this.stateProvider.get(CURRENT_LOGIN_STRATEGY_KEY);\n this.loginStrategyCacheState = this.stateProvider.get(CACHE_KEY);\n this.loginStrategyCacheExpirationState = this.stateProvider.get(CACHE_EXPIRATION_KEY);\n this.authRequestPushNotificationState = this.stateProvider.get(\n AUTH_REQUEST_PUSH_NOTIFICATION_KEY,\n );\n\n this.currentAuthType$ = this.currentAuthnTypeState.state$;\n this.authRequestPushNotification$ = this.authRequestPushNotificationState.state$.pipe(\n filter((id) => id != null),\n );\n this.loginStrategy$ = this.currentAuthnTypeState.state$.pipe(\n distinctUntilChanged(),\n combineLatestWith(this.loginStrategyCacheState.state$),\n this.initializeLoginStrategy.bind(this),\n shareReplay({ refCount: true, bufferSize: 1 }),\n );\n }\n\n async getEmail(): Promise {\n const strategy = await firstValueFrom(this.loginStrategy$);\n\n if (\"email$\" in strategy) {\n return await firstValueFrom(strategy.email$);\n }\n return null;\n }\n\n async getMasterPasswordHash(): Promise {\n const strategy = await firstValueFrom(this.loginStrategy$);\n\n if (\"serverMasterKeyHash$\" in strategy) {\n return await firstValueFrom(strategy.serverMasterKeyHash$);\n }\n return null;\n }\n\n async getSsoEmail2FaSessionToken(): Promise {\n const strategy = await firstValueFrom(this.loginStrategy$);\n\n if (\"ssoEmail2FaSessionToken$\" in strategy) {\n return await firstValueFrom(strategy.ssoEmail2FaSessionToken$);\n }\n return null;\n }\n\n async getAccessCode(): Promise {\n const strategy = await firstValueFrom(this.loginStrategy$);\n\n if (\"accessCode$\" in strategy) {\n return await firstValueFrom(strategy.accessCode$);\n }\n return null;\n }\n\n async getAuthRequestId(): Promise {\n const strategy = await firstValueFrom(this.loginStrategy$);\n\n if (\"authRequestId$\" in strategy) {\n return await firstValueFrom(strategy.authRequestId$);\n }\n return null;\n }\n\n async logIn(\n credentials:\n | UserApiLoginCredentials\n | PasswordLoginCredentials\n | SsoLoginCredentials\n | AuthRequestLoginCredentials\n | WebAuthnLoginCredentials,\n ): Promise {\n await this.clearCache();\n\n await this.currentAuthnTypeState.update((_) => credentials.type);\n\n const strategy = await firstValueFrom(this.loginStrategy$);\n\n // Note: We aren't passing the credentials directly to the strategy since they are\n // created in the popup and can cause DeadObject references on Firefox.\n // This is a shallow copy, but use deep copy in future if objects are added to credentials\n // that were created in popup.\n // If the popup uses its own instance of this service, this can be removed.\n const ownedCredentials = { ...credentials };\n\n const result = await strategy.logIn(ownedCredentials as any);\n\n if (result != null && !result.requiresTwoFactor) {\n await this.clearCache();\n } else {\n // Cache the strategy data so we can attempt again later with 2fa. Cache supports different contexts\n await this.loginStrategyCacheState.update((_) => strategy.exportCache());\n await this.startSessionTimeout();\n }\n\n return result;\n }\n\n async logInTwoFactor(\n twoFactor: TokenTwoFactorRequest,\n captchaResponse: string,\n ): Promise {\n if (!(await this.isSessionValid())) {\n throw new Error(this.i18nService.t(\"sessionTimeout\"));\n }\n\n const strategy = await firstValueFrom(this.loginStrategy$);\n if (strategy == null) {\n throw new Error(\"No login strategy found.\");\n }\n\n try {\n const result = await strategy.logInTwoFactor(twoFactor, captchaResponse);\n\n // Only clear cache if 2FA token has been accepted, otherwise we need to be able to try again\n if (result != null && !result.requiresTwoFactor && !result.requiresCaptcha) {\n await this.clearCache();\n }\n return result;\n } catch (e) {\n // API exceptions are okay, but if there are any unhandled client-side errors then clear cache to be safe\n if (!(e instanceof ErrorResponse)) {\n await this.clearCache();\n }\n throw e;\n }\n }\n\n async makePreloginKey(masterPassword: string, email: string): Promise {\n email = email.trim().toLowerCase();\n let kdf: KdfType = null;\n let kdfConfig: KdfConfig = null;\n try {\n const preloginResponse = await this.apiService.postPrelogin(new PreloginRequest(email));\n if (preloginResponse != null) {\n kdf = preloginResponse.kdf;\n kdfConfig = new KdfConfig(\n preloginResponse.kdfIterations,\n preloginResponse.kdfMemory,\n preloginResponse.kdfParallelism,\n );\n }\n } catch (e) {\n if (e == null || e.statusCode !== 404) {\n throw e;\n }\n }\n return await this.cryptoService.makeMasterKey(masterPassword, email, kdf, kdfConfig);\n }\n\n // TODO move to auth request service\n async sendAuthRequestPushNotification(notification: AuthRequestPushNotification): Promise {\n if (notification.id != null) {\n await this.authRequestPushNotificationState.update((_) => notification.id);\n }\n }\n\n // TODO: move to auth request service\n async passwordlessLogin(\n id: string,\n key: string,\n requestApproved: boolean,\n ): Promise {\n const pubKey = Utils.fromB64ToArray(key);\n\n const masterKey = await this.cryptoService.getMasterKey();\n let keyToEncrypt;\n let encryptedMasterKeyHash = null;\n\n if (masterKey) {\n keyToEncrypt = masterKey.encKey;\n\n // Only encrypt the master password hash if masterKey exists as\n // we won't have a masterKeyHash without a masterKey\n const masterKeyHash = await this.stateService.getKeyHash();\n if (masterKeyHash != null) {\n encryptedMasterKeyHash = await this.cryptoService.rsaEncrypt(\n Utils.fromUtf8ToArray(masterKeyHash),\n pubKey,\n );\n }\n } else {\n const userKey = await this.cryptoService.getUserKey();\n keyToEncrypt = userKey.key;\n }\n\n const encryptedKey = await this.cryptoService.rsaEncrypt(keyToEncrypt, pubKey);\n\n const request = new PasswordlessAuthRequest(\n encryptedKey.encryptedString,\n encryptedMasterKeyHash?.encryptedString,\n await this.appIdService.getAppId(),\n requestApproved,\n );\n return await this.apiService.putAuthRequest(id, request);\n }\n\n private async clearCache(): Promise {\n await this.currentAuthnTypeState.update((_) => null);\n await this.loginStrategyCacheState.update((_) => null);\n await this.clearSessionTimeout();\n }\n\n private async startSessionTimeout(): Promise {\n await this.clearSessionTimeout();\n await this.loginStrategyCacheExpirationState.update(\n (_) => new Date(Date.now() + sessionTimeoutLength),\n );\n this.sessionTimeout = setTimeout(() => this.clearCache(), sessionTimeoutLength);\n }\n\n private async clearSessionTimeout(): Promise {\n await this.loginStrategyCacheExpirationState.update((_) => null);\n this.sessionTimeout = null;\n }\n\n private async isSessionValid(): Promise {\n const cache = await firstValueFrom(this.loginStrategyCacheState.state$);\n if (cache == null) {\n return false;\n }\n const expiration = await firstValueFrom(this.loginStrategyCacheExpirationState.state$);\n if (expiration != null && expiration < new Date()) {\n await this.clearCache();\n return false;\n }\n return true;\n }\n\n private initializeLoginStrategy(\n source: Observable<[AuthenticationType | null, CacheData | null]>,\n ) {\n return source.pipe(\n map(([strategy, data]) => {\n if (strategy == null) {\n return null;\n }\n switch (strategy) {\n case AuthenticationType.Password:\n return new PasswordLoginStrategy(\n data?.password,\n this.cryptoService,\n this.apiService,\n this.tokenService,\n this.appIdService,\n this.platformUtilsService,\n this.messagingService,\n this.logService,\n this.stateService,\n this.twoFactorService,\n this.userDecryptionOptionsService,\n this.passwordStrengthService,\n this.policyService,\n this,\n this.billingAccountProfileStateService,\n );\n case AuthenticationType.Sso:\n return new SsoLoginStrategy(\n data?.sso,\n this.cryptoService,\n this.apiService,\n this.tokenService,\n this.appIdService,\n this.platformUtilsService,\n this.messagingService,\n this.logService,\n this.stateService,\n this.twoFactorService,\n this.userDecryptionOptionsService,\n this.keyConnectorService,\n this.deviceTrustCryptoService,\n this.authRequestService,\n this.i18nService,\n this.billingAccountProfileStateService,\n );\n case AuthenticationType.UserApiKey:\n return new UserApiLoginStrategy(\n data?.userApiKey,\n this.cryptoService,\n this.apiService,\n this.tokenService,\n this.appIdService,\n this.platformUtilsService,\n this.messagingService,\n this.logService,\n this.stateService,\n this.twoFactorService,\n this.userDecryptionOptionsService,\n this.environmentService,\n this.keyConnectorService,\n this.billingAccountProfileStateService,\n );\n case AuthenticationType.AuthRequest:\n return new AuthRequestLoginStrategy(\n data?.authRequest,\n this.cryptoService,\n this.apiService,\n this.tokenService,\n this.appIdService,\n this.platformUtilsService,\n this.messagingService,\n this.logService,\n this.stateService,\n this.twoFactorService,\n this.userDecryptionOptionsService,\n this.deviceTrustCryptoService,\n this.billingAccountProfileStateService,\n );\n case AuthenticationType.WebAuthn:\n return new WebAuthnLoginStrategy(\n data?.webAuthn,\n this.cryptoService,\n this.apiService,\n this.tokenService,\n this.appIdService,\n this.platformUtilsService,\n this.messagingService,\n this.logService,\n this.stateService,\n this.twoFactorService,\n this.userDecryptionOptionsService,\n this.billingAccountProfileStateService,\n );\n }\n }),\n );\n }\n}\n","import { map } from \"rxjs\";\n\nimport {\n ActiveUserState,\n StateProvider,\n USER_DECRYPTION_OPTIONS_DISK,\n UserKeyDefinition,\n} from \"@bitwarden/common/platform/state\";\nimport { UserId } from \"@bitwarden/common/src/types/guid\";\n\nimport { InternalUserDecryptionOptionsServiceAbstraction } from \"../../abstractions/user-decryption-options.service.abstraction\";\nimport { UserDecryptionOptions } from \"../../models\";\n\nexport const USER_DECRYPTION_OPTIONS = new UserKeyDefinition(\n USER_DECRYPTION_OPTIONS_DISK,\n \"decryptionOptions\",\n {\n deserializer: (decryptionOptions) => UserDecryptionOptions.fromJSON(decryptionOptions),\n clearOn: [\"logout\"],\n },\n);\n\nexport class UserDecryptionOptionsService\n implements InternalUserDecryptionOptionsServiceAbstraction\n{\n private userDecryptionOptionsState: ActiveUserState;\n\n userDecryptionOptions$;\n hasMasterPassword$;\n\n constructor(private stateProvider: StateProvider) {\n this.userDecryptionOptionsState = this.stateProvider.getActive(USER_DECRYPTION_OPTIONS);\n\n this.userDecryptionOptions$ = this.userDecryptionOptionsState.state$;\n this.hasMasterPassword$ = this.userDecryptionOptions$.pipe(\n map((options) => options?.hasMasterPassword ?? false),\n );\n }\n\n userDecryptionOptionsById$(userId: UserId) {\n return this.stateProvider.getUser(userId, USER_DECRYPTION_OPTIONS).state$;\n }\n\n async setUserDecryptionOptions(userDecryptionOptions: UserDecryptionOptions): Promise {\n await this.userDecryptionOptionsState.update((_) => userDecryptionOptions);\n }\n}\n","import { ApiService } from \"@bitwarden/common/abstractions/api.service\";\nimport { PasswordlessAuthRequest } from \"@bitwarden/common/auth/models/request/passwordless-auth.request\";\nimport { AuthRequestResponse } from \"@bitwarden/common/auth/models/response/auth-request.response\";\nimport { AppIdService } from \"@bitwarden/common/platform/abstractions/app-id.service\";\nimport { CryptoService } from \"@bitwarden/common/platform/abstractions/crypto.service\";\nimport { StateService } from \"@bitwarden/common/platform/abstractions/state.service\";\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\nimport { SymmetricCryptoKey } from \"@bitwarden/common/platform/models/domain/symmetric-crypto-key\";\nimport { MasterKey, UserKey } from \"@bitwarden/common/types/key\";\n\nimport { AuthRequestServiceAbstraction } from \"../../abstractions/auth-request.service.abstraction\";\n\nexport class AuthRequestService implements AuthRequestServiceAbstraction {\n constructor(\n private appIdService: AppIdService,\n private cryptoService: CryptoService,\n private apiService: ApiService,\n private stateService: StateService,\n ) {}\n\n async approveOrDenyAuthRequest(\n approve: boolean,\n authRequest: AuthRequestResponse,\n ): Promise {\n if (!authRequest.id) {\n throw new Error(\"Auth request has no id\");\n }\n if (!authRequest.publicKey) {\n throw new Error(\"Auth request has no public key\");\n }\n const pubKey = Utils.fromB64ToArray(authRequest.publicKey);\n\n const masterKey = await this.cryptoService.getMasterKey();\n const masterKeyHash = await this.stateService.getKeyHash();\n let encryptedMasterKeyHash;\n let keyToEncrypt;\n\n if (masterKey && masterKeyHash) {\n // Only encrypt the master password hash if masterKey exists as\n // we won't have a masterKeyHash without a masterKey\n encryptedMasterKeyHash = await this.cryptoService.rsaEncrypt(\n Utils.fromUtf8ToArray(masterKeyHash),\n pubKey,\n );\n keyToEncrypt = masterKey.encKey;\n } else {\n const userKey = await this.cryptoService.getUserKey();\n keyToEncrypt = userKey.key;\n }\n\n const encryptedKey = await this.cryptoService.rsaEncrypt(keyToEncrypt, pubKey);\n\n const response = new PasswordlessAuthRequest(\n encryptedKey.encryptedString,\n encryptedMasterKeyHash?.encryptedString,\n await this.appIdService.getAppId(),\n approve,\n );\n return await this.apiService.putAuthRequest(authRequest.id, response);\n }\n\n async setUserKeyAfterDecryptingSharedUserKey(\n authReqResponse: AuthRequestResponse,\n authReqPrivateKey: Uint8Array,\n ) {\n const userKey = await this.decryptPubKeyEncryptedUserKey(\n authReqResponse.key,\n authReqPrivateKey,\n );\n await this.cryptoService.setUserKey(userKey);\n }\n\n async setKeysAfterDecryptingSharedMasterKeyAndHash(\n authReqResponse: AuthRequestResponse,\n authReqPrivateKey: Uint8Array,\n ) {\n const { masterKey, masterKeyHash } = await this.decryptPubKeyEncryptedMasterKeyAndHash(\n authReqResponse.key,\n authReqResponse.masterPasswordHash,\n authReqPrivateKey,\n );\n\n // Decrypt and set user key in state\n const userKey = await this.cryptoService.decryptUserKeyWithMasterKey(masterKey);\n\n // Set masterKey + masterKeyHash in state after decryption (in case decryption fails)\n await this.cryptoService.setMasterKey(masterKey);\n await this.cryptoService.setMasterKeyHash(masterKeyHash);\n\n await this.cryptoService.setUserKey(userKey);\n }\n\n // Decryption helpers\n async decryptPubKeyEncryptedUserKey(\n pubKeyEncryptedUserKey: string,\n privateKey: Uint8Array,\n ): Promise {\n const decryptedUserKeyBytes = await this.cryptoService.rsaDecrypt(\n pubKeyEncryptedUserKey,\n privateKey,\n );\n\n return new SymmetricCryptoKey(decryptedUserKeyBytes) as UserKey;\n }\n\n async decryptPubKeyEncryptedMasterKeyAndHash(\n pubKeyEncryptedMasterKey: string,\n pubKeyEncryptedMasterKeyHash: string,\n privateKey: Uint8Array,\n ): Promise<{ masterKey: MasterKey; masterKeyHash: string }> {\n const decryptedMasterKeyArrayBuffer = await this.cryptoService.rsaDecrypt(\n pubKeyEncryptedMasterKey,\n privateKey,\n );\n\n const decryptedMasterKeyHashArrayBuffer = await this.cryptoService.rsaDecrypt(\n pubKeyEncryptedMasterKeyHash,\n privateKey,\n );\n\n const masterKey = new SymmetricCryptoKey(decryptedMasterKeyArrayBuffer) as MasterKey;\n const masterKeyHash = Utils.fromBufferToUtf8(decryptedMasterKeyHashArrayBuffer);\n\n return {\n masterKey,\n masterKeyHash,\n };\n }\n}\n","import { Utils } from \"@bitwarden/common/platform/misc/utils\";\n\nexport function decodeJwtTokenToJson(jwtToken: string): any {\n if (jwtToken == null) {\n throw new Error(\"JWT token not found\");\n }\n\n const parts = jwtToken.split(\".\");\n if (parts.length !== 3) {\n throw new Error(\"JWT must have 3 parts\");\n }\n\n // JWT has 3 parts: header, payload, signature separated by '.'\n // So, grab the payload to decode\n const encodedPayload = parts[1];\n\n let decodedPayloadJSON: string;\n try {\n // Attempt to decode from URL-safe Base64 to UTF-8\n decodedPayloadJSON = Utils.fromUrlB64ToUtf8(encodedPayload);\n } catch (decodingError) {\n throw new Error(\"Cannot decode the token\");\n }\n\n try {\n // Attempt to parse the JSON payload\n const decodedToken = JSON.parse(decodedPayloadJSON);\n return decodedToken;\n } catch (jsonError) {\n throw new Error(\"Cannot parse the token's payload into JSON\");\n }\n}\n","import { OrganizationConnectionType } from \"../admin-console/enums\";\nimport { OrganizationSponsorshipCreateRequest } from \"../admin-console/models/request/organization/organization-sponsorship-create.request\";\nimport { OrganizationSponsorshipRedeemRequest } from \"../admin-console/models/request/organization/organization-sponsorship-redeem.request\";\nimport { OrganizationConnectionRequest } from \"../admin-console/models/request/organization-connection.request\";\nimport { ProviderAddOrganizationRequest } from \"../admin-console/models/request/provider/provider-add-organization.request\";\nimport { ProviderOrganizationCreateRequest } from \"../admin-console/models/request/provider/provider-organization-create.request\";\nimport { ProviderSetupRequest } from \"../admin-console/models/request/provider/provider-setup.request\";\nimport { ProviderUpdateRequest } from \"../admin-console/models/request/provider/provider-update.request\";\nimport { ProviderUserAcceptRequest } from \"../admin-console/models/request/provider/provider-user-accept.request\";\nimport { ProviderUserBulkConfirmRequest } from \"../admin-console/models/request/provider/provider-user-bulk-confirm.request\";\nimport { ProviderUserBulkRequest } from \"../admin-console/models/request/provider/provider-user-bulk.request\";\nimport { ProviderUserConfirmRequest } from \"../admin-console/models/request/provider/provider-user-confirm.request\";\nimport { ProviderUserInviteRequest } from \"../admin-console/models/request/provider/provider-user-invite.request\";\nimport { ProviderUserUpdateRequest } from \"../admin-console/models/request/provider/provider-user-update.request\";\nimport { SelectionReadOnlyRequest } from \"../admin-console/models/request/selection-read-only.request\";\nimport {\n OrganizationConnectionConfigApis,\n OrganizationConnectionResponse,\n} from \"../admin-console/models/response/organization-connection.response\";\nimport { OrganizationExportResponse } from \"../admin-console/models/response/organization-export.response\";\nimport { OrganizationSponsorshipSyncStatusResponse } from \"../admin-console/models/response/organization-sponsorship-sync-status.response\";\nimport {\n ProviderOrganizationOrganizationDetailsResponse,\n ProviderOrganizationResponse,\n} from \"../admin-console/models/response/provider/provider-organization.response\";\nimport { ProviderUserBulkPublicKeyResponse } from \"../admin-console/models/response/provider/provider-user-bulk-public-key.response\";\nimport { ProviderUserBulkResponse } from \"../admin-console/models/response/provider/provider-user-bulk.response\";\nimport {\n ProviderUserResponse,\n ProviderUserUserDetailsResponse,\n} from \"../admin-console/models/response/provider/provider-user.response\";\nimport { ProviderResponse } from \"../admin-console/models/response/provider/provider.response\";\nimport { SelectionReadOnlyResponse } from \"../admin-console/models/response/selection-read-only.response\";\nimport { CreateAuthRequest } from \"../auth/models/request/create-auth.request\";\nimport { DeviceVerificationRequest } from \"../auth/models/request/device-verification.request\";\nimport { EmailTokenRequest } from \"../auth/models/request/email-token.request\";\nimport { EmailRequest } from \"../auth/models/request/email.request\";\nimport { PasswordTokenRequest } from \"../auth/models/request/identity-token/password-token.request\";\nimport { SsoTokenRequest } from \"../auth/models/request/identity-token/sso-token.request\";\nimport { UserApiTokenRequest } from \"../auth/models/request/identity-token/user-api-token.request\";\nimport { WebAuthnLoginTokenRequest } from \"../auth/models/request/identity-token/webauthn-login-token.request\";\nimport { KeyConnectorUserKeyRequest } from \"../auth/models/request/key-connector-user-key.request\";\nimport { PasswordHintRequest } from \"../auth/models/request/password-hint.request\";\nimport { PasswordRequest } from \"../auth/models/request/password.request\";\nimport { PasswordlessAuthRequest } from \"../auth/models/request/passwordless-auth.request\";\nimport { SecretVerificationRequest } from \"../auth/models/request/secret-verification.request\";\nimport { SetKeyConnectorKeyRequest } from \"../auth/models/request/set-key-connector-key.request\";\nimport { SetPasswordRequest } from \"../auth/models/request/set-password.request\";\nimport { TwoFactorEmailRequest } from \"../auth/models/request/two-factor-email.request\";\nimport { TwoFactorProviderRequest } from \"../auth/models/request/two-factor-provider.request\";\nimport { TwoFactorRecoveryRequest } from \"../auth/models/request/two-factor-recovery.request\";\nimport { UpdateProfileRequest } from \"../auth/models/request/update-profile.request\";\nimport { UpdateTempPasswordRequest } from \"../auth/models/request/update-temp-password.request\";\nimport { UpdateTwoFactorAuthenticatorRequest } from \"../auth/models/request/update-two-factor-authenticator.request\";\nimport { UpdateTwoFactorDuoRequest } from \"../auth/models/request/update-two-factor-duo.request\";\nimport { UpdateTwoFactorEmailRequest } from \"../auth/models/request/update-two-factor-email.request\";\nimport { UpdateTwoFactorWebAuthnDeleteRequest } from \"../auth/models/request/update-two-factor-web-authn-delete.request\";\nimport { UpdateTwoFactorWebAuthnRequest } from \"../auth/models/request/update-two-factor-web-authn.request\";\nimport { UpdateTwoFactorYubioOtpRequest } from \"../auth/models/request/update-two-factor-yubio-otp.request\";\nimport { ApiKeyResponse } from \"../auth/models/response/api-key.response\";\nimport { AuthRequestResponse } from \"../auth/models/response/auth-request.response\";\nimport { DeviceVerificationResponse } from \"../auth/models/response/device-verification.response\";\nimport { IdentityCaptchaResponse } from \"../auth/models/response/identity-captcha.response\";\nimport { IdentityTokenResponse } from \"../auth/models/response/identity-token.response\";\nimport { IdentityTwoFactorResponse } from \"../auth/models/response/identity-two-factor.response\";\nimport { KeyConnectorUserKeyResponse } from \"../auth/models/response/key-connector-user-key.response\";\nimport { MasterPasswordPolicyResponse } from \"../auth/models/response/master-password-policy.response\";\nimport { PreloginResponse } from \"../auth/models/response/prelogin.response\";\nimport { RegisterResponse } from \"../auth/models/response/register.response\";\nimport { SsoPreValidateResponse } from \"../auth/models/response/sso-pre-validate.response\";\nimport { TwoFactorAuthenticatorResponse } from \"../auth/models/response/two-factor-authenticator.response\";\nimport { TwoFactorDuoResponse } from \"../auth/models/response/two-factor-duo.response\";\nimport { TwoFactorEmailResponse } from \"../auth/models/response/two-factor-email.response\";\nimport { TwoFactorProviderResponse } from \"../auth/models/response/two-factor-provider.response\";\nimport { TwoFactorRecoverResponse } from \"../auth/models/response/two-factor-recover.response\";\nimport {\n ChallengeResponse,\n TwoFactorWebAuthnResponse,\n} from \"../auth/models/response/two-factor-web-authn.response\";\nimport { TwoFactorYubiKeyResponse } from \"../auth/models/response/two-factor-yubi-key.response\";\nimport { BitPayInvoiceRequest } from \"../billing/models/request/bit-pay-invoice.request\";\nimport { PaymentRequest } from \"../billing/models/request/payment.request\";\nimport { TaxInfoUpdateRequest } from \"../billing/models/request/tax-info-update.request\";\nimport { BillingHistoryResponse } from \"../billing/models/response/billing-history.response\";\nimport { BillingPaymentResponse } from \"../billing/models/response/billing-payment.response\";\nimport { PaymentResponse } from \"../billing/models/response/payment.response\";\nimport { PlanResponse } from \"../billing/models/response/plan.response\";\nimport { SubscriptionResponse } from \"../billing/models/response/subscription.response\";\nimport { TaxInfoResponse } from \"../billing/models/response/tax-info.response\";\nimport { TaxRateResponse } from \"../billing/models/response/tax-rate.response\";\nimport { DeleteRecoverRequest } from \"../models/request/delete-recover.request\";\nimport { EventRequest } from \"../models/request/event.request\";\nimport { KdfRequest } from \"../models/request/kdf.request\";\nimport { KeysRequest } from \"../models/request/keys.request\";\nimport { OrganizationImportRequest } from \"../models/request/organization-import.request\";\nimport { PreloginRequest } from \"../models/request/prelogin.request\";\nimport { RegisterRequest } from \"../models/request/register.request\";\nimport { StorageRequest } from \"../models/request/storage.request\";\nimport { UpdateAvatarRequest } from \"../models/request/update-avatar.request\";\nimport { UpdateDomainsRequest } from \"../models/request/update-domains.request\";\nimport { VerifyDeleteRecoverRequest } from \"../models/request/verify-delete-recover.request\";\nimport { VerifyEmailRequest } from \"../models/request/verify-email.request\";\nimport { BreachAccountResponse } from \"../models/response/breach-account.response\";\nimport { DomainsResponse } from \"../models/response/domains.response\";\nimport { EventResponse } from \"../models/response/event.response\";\nimport { ListResponse } from \"../models/response/list.response\";\nimport { ProfileResponse } from \"../models/response/profile.response\";\nimport { UserKeyResponse } from \"../models/response/user-key.response\";\nimport { AttachmentRequest } from \"../vault/models/request/attachment.request\";\nimport { CipherBulkDeleteRequest } from \"../vault/models/request/cipher-bulk-delete.request\";\nimport { CipherBulkMoveRequest } from \"../vault/models/request/cipher-bulk-move.request\";\nimport { CipherBulkRestoreRequest } from \"../vault/models/request/cipher-bulk-restore.request\";\nimport { CipherBulkShareRequest } from \"../vault/models/request/cipher-bulk-share.request\";\nimport { CipherCollectionsRequest } from \"../vault/models/request/cipher-collections.request\";\nimport { CipherCreateRequest } from \"../vault/models/request/cipher-create.request\";\nimport { CipherPartialRequest } from \"../vault/models/request/cipher-partial.request\";\nimport { CipherShareRequest } from \"../vault/models/request/cipher-share.request\";\nimport { CipherRequest } from \"../vault/models/request/cipher.request\";\nimport { CollectionRequest } from \"../vault/models/request/collection.request\";\nimport { AttachmentUploadDataResponse } from \"../vault/models/response/attachment-upload-data.response\";\nimport { AttachmentResponse } from \"../vault/models/response/attachment.response\";\nimport { CipherResponse } from \"../vault/models/response/cipher.response\";\nimport {\n CollectionAccessDetailsResponse,\n CollectionDetailsResponse,\n CollectionResponse,\n} from \"../vault/models/response/collection.response\";\nimport { SyncResponse } from \"../vault/models/response/sync.response\";\n\n/**\n * @deprecated The `ApiService` class is deprecated and calls should be extracted into individual\n * api services. The `send` method is still allowed to be used within api services. For background\n * of this decision please read https://contributing.bitwarden.com/architecture/adr/refactor-api-service.\n */\nexport abstract class ApiService {\n send: (\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\",\n path: string,\n body: any,\n authed: boolean,\n hasResponse: boolean,\n apiUrl?: string,\n alterHeaders?: (headers: Headers) => void,\n ) => Promise;\n\n postIdentityToken: (\n request:\n | PasswordTokenRequest\n | SsoTokenRequest\n | UserApiTokenRequest\n | WebAuthnLoginTokenRequest,\n ) => Promise;\n refreshIdentityToken: () => Promise;\n\n getProfile: () => Promise;\n getUserSubscription: () => Promise;\n getTaxInfo: () => Promise;\n putProfile: (request: UpdateProfileRequest) => Promise;\n putAvatar: (request: UpdateAvatarRequest) => Promise;\n putTaxInfo: (request: TaxInfoUpdateRequest) => Promise;\n postPrelogin: (request: PreloginRequest) => Promise;\n postEmailToken: (request: EmailTokenRequest) => Promise;\n postEmail: (request: EmailRequest) => Promise;\n postPassword: (request: PasswordRequest) => Promise;\n setPassword: (request: SetPasswordRequest) => Promise;\n postSetKeyConnectorKey: (request: SetKeyConnectorKeyRequest) => Promise;\n postSecurityStamp: (request: SecretVerificationRequest) => Promise;\n getAccountRevisionDate: () => Promise;\n postPasswordHint: (request: PasswordHintRequest) => Promise;\n postRegister: (request: RegisterRequest) => Promise;\n postPremium: (data: FormData) => Promise;\n postReinstatePremium: () => Promise;\n postAccountStorage: (request: StorageRequest) => Promise;\n postAccountPayment: (request: PaymentRequest) => Promise;\n postAccountLicense: (data: FormData) => Promise;\n postAccountKeys: (request: KeysRequest) => Promise;\n postAccountVerifyEmail: () => Promise;\n postAccountVerifyEmailToken: (request: VerifyEmailRequest) => Promise;\n postAccountVerifyPassword: (\n request: SecretVerificationRequest,\n ) => Promise;\n postAccountRecoverDelete: (request: DeleteRecoverRequest) => Promise;\n postAccountRecoverDeleteToken: (request: VerifyDeleteRecoverRequest) => Promise;\n postAccountKdf: (request: KdfRequest) => Promise;\n postUserApiKey: (id: string, request: SecretVerificationRequest) => Promise;\n postUserRotateApiKey: (id: string, request: SecretVerificationRequest) => Promise;\n putUpdateTempPassword: (request: UpdateTempPasswordRequest) => Promise;\n postConvertToKeyConnector: () => Promise;\n //passwordless\n postAuthRequest: (request: CreateAuthRequest) => Promise;\n postAdminAuthRequest: (request: CreateAuthRequest) => Promise;\n getAuthResponse: (id: string, accessCode: string) => Promise;\n getAuthRequest: (id: string) => Promise;\n putAuthRequest: (id: string, request: PasswordlessAuthRequest) => Promise;\n getAuthRequests: () => Promise>;\n getLastAuthRequest: () => Promise;\n\n getUserBillingHistory: () => Promise;\n getUserBillingPayment: () => Promise;\n\n getCipher: (id: string) => Promise;\n getFullCipherDetails: (id: string) => Promise;\n getCipherAdmin: (id: string) => Promise;\n getAttachmentData: (\n cipherId: string,\n attachmentId: string,\n emergencyAccessId?: string,\n ) => Promise;\n getCiphersOrganization: (organizationId: string) => Promise>;\n postCipher: (request: CipherRequest) => Promise;\n postCipherCreate: (request: CipherCreateRequest) => Promise;\n postCipherAdmin: (request: CipherCreateRequest) => Promise;\n putCipher: (id: string, request: CipherRequest) => Promise;\n putPartialCipher: (id: string, request: CipherPartialRequest) => Promise;\n putCipherAdmin: (id: string, request: CipherRequest) => Promise;\n deleteCipher: (id: string) => Promise;\n deleteCipherAdmin: (id: string) => Promise;\n deleteManyCiphers: (request: CipherBulkDeleteRequest) => Promise;\n deleteManyCiphersAdmin: (request: CipherBulkDeleteRequest) => Promise;\n putMoveCiphers: (request: CipherBulkMoveRequest) => Promise;\n putShareCipher: (id: string, request: CipherShareRequest) => Promise;\n putShareCiphers: (request: CipherBulkShareRequest) => Promise;\n putCipherCollections: (id: string, request: CipherCollectionsRequest) => Promise;\n putCipherCollectionsAdmin: (id: string, request: CipherCollectionsRequest) => Promise;\n postPurgeCiphers: (request: SecretVerificationRequest, organizationId?: string) => Promise;\n putDeleteCipher: (id: string) => Promise;\n putDeleteCipherAdmin: (id: string) => Promise;\n putDeleteManyCiphers: (request: CipherBulkDeleteRequest) => Promise;\n putDeleteManyCiphersAdmin: (request: CipherBulkDeleteRequest) => Promise;\n putRestoreCipher: (id: string) => Promise;\n putRestoreCipherAdmin: (id: string) => Promise;\n putRestoreManyCiphers: (\n request: CipherBulkRestoreRequest,\n ) => Promise>;\n putRestoreManyCiphersAdmin: (\n request: CipherBulkRestoreRequest,\n ) => Promise>;\n\n /**\n * @deprecated Mar 25 2021: This method has been deprecated in favor of direct uploads.\n * This method still exists for backward compatibility with old server versions.\n */\n postCipherAttachmentLegacy: (id: string, data: FormData) => Promise;\n /**\n * @deprecated Mar 25 2021: This method has been deprecated in favor of direct uploads.\n * This method still exists for backward compatibility with old server versions.\n */\n postCipherAttachmentAdminLegacy: (id: string, data: FormData) => Promise;\n postCipherAttachment: (\n id: string,\n request: AttachmentRequest,\n ) => Promise;\n deleteCipherAttachment: (id: string, attachmentId: string) => Promise;\n deleteCipherAttachmentAdmin: (id: string, attachmentId: string) => Promise;\n postShareCipherAttachment: (\n id: string,\n attachmentId: string,\n data: FormData,\n organizationId: string,\n ) => Promise;\n renewAttachmentUploadUrl: (\n id: string,\n attachmentId: string,\n ) => Promise;\n postAttachmentFile: (id: string, attachmentId: string, data: FormData) => Promise;\n\n getUserCollections: () => Promise>;\n getCollections: (organizationId: string) => Promise>;\n getCollectionUsers: (organizationId: string, id: string) => Promise;\n getCollectionAccessDetails: (\n organizationId: string,\n id: string,\n ) => Promise;\n getManyCollectionsWithAccessDetails: (\n orgId: string,\n ) => Promise>;\n postCollection: (\n organizationId: string,\n request: CollectionRequest,\n ) => Promise;\n putCollectionUsers: (\n organizationId: string,\n id: string,\n request: SelectionReadOnlyRequest[],\n ) => Promise;\n putCollection: (\n organizationId: string,\n id: string,\n request: CollectionRequest,\n ) => Promise;\n deleteCollection: (organizationId: string, id: string) => Promise;\n deleteManyCollections: (organizationId: string, collectionIds: string[]) => Promise;\n deleteCollectionUser: (\n organizationId: string,\n id: string,\n organizationUserId: string,\n ) => Promise;\n\n getGroupUsers: (organizationId: string, id: string) => Promise;\n putGroupUsers: (organizationId: string, id: string, request: string[]) => Promise;\n deleteGroupUser: (organizationId: string, id: string, organizationUserId: string) => Promise;\n\n getSync: () => Promise;\n postPublicImportDirectory: (request: OrganizationImportRequest) => Promise;\n\n getSettingsDomains: () => Promise;\n putSettingsDomains: (request: UpdateDomainsRequest) => Promise;\n\n getTwoFactorProviders: () => Promise>;\n getTwoFactorOrganizationProviders: (\n organizationId: string,\n ) => Promise>;\n getTwoFactorAuthenticator: (\n request: SecretVerificationRequest,\n ) => Promise;\n getTwoFactorEmail: (request: SecretVerificationRequest) => Promise;\n getTwoFactorDuo: (request: SecretVerificationRequest) => Promise;\n getTwoFactorOrganizationDuo: (\n organizationId: string,\n request: SecretVerificationRequest,\n ) => Promise;\n getTwoFactorYubiKey: (request: SecretVerificationRequest) => Promise;\n getTwoFactorWebAuthn: (request: SecretVerificationRequest) => Promise;\n getTwoFactorWebAuthnChallenge: (request: SecretVerificationRequest) => Promise;\n getTwoFactorRecover: (request: SecretVerificationRequest) => Promise;\n putTwoFactorAuthenticator: (\n request: UpdateTwoFactorAuthenticatorRequest,\n ) => Promise;\n putTwoFactorEmail: (request: UpdateTwoFactorEmailRequest) => Promise;\n putTwoFactorDuo: (request: UpdateTwoFactorDuoRequest) => Promise;\n putTwoFactorOrganizationDuo: (\n organizationId: string,\n request: UpdateTwoFactorDuoRequest,\n ) => Promise;\n putTwoFactorYubiKey: (\n request: UpdateTwoFactorYubioOtpRequest,\n ) => Promise;\n putTwoFactorWebAuthn: (\n request: UpdateTwoFactorWebAuthnRequest,\n ) => Promise;\n deleteTwoFactorWebAuthn: (\n request: UpdateTwoFactorWebAuthnDeleteRequest,\n ) => Promise;\n putTwoFactorDisable: (request: TwoFactorProviderRequest) => Promise;\n putTwoFactorOrganizationDisable: (\n organizationId: string,\n request: TwoFactorProviderRequest,\n ) => Promise;\n postTwoFactorRecover: (request: TwoFactorRecoveryRequest) => Promise;\n postTwoFactorEmailSetup: (request: TwoFactorEmailRequest) => Promise;\n postTwoFactorEmail: (request: TwoFactorEmailRequest) => Promise;\n getDeviceVerificationSettings: () => Promise;\n putDeviceVerificationSettings: (\n request: DeviceVerificationRequest,\n ) => Promise;\n\n getCloudCommunicationsEnabled: () => Promise;\n abstract getOrganizationConnection(\n id: string,\n type: OrganizationConnectionType,\n configType: { new (response: any): TConfig },\n ): Promise>;\n abstract createOrganizationConnection(\n request: OrganizationConnectionRequest,\n configType: { new (response: any): TConfig },\n ): Promise>;\n abstract updateOrganizationConnection(\n request: OrganizationConnectionRequest,\n configType: { new (response: any): TConfig },\n organizationConnectionId: string,\n ): Promise>;\n deleteOrganizationConnection: (id: string) => Promise;\n getPlans: () => Promise>;\n getTaxRates: () => Promise>;\n\n postProviderSetup: (id: string, request: ProviderSetupRequest) => Promise;\n getProvider: (id: string) => Promise;\n putProvider: (id: string, request: ProviderUpdateRequest) => Promise;\n\n getProviderUsers: (providerId: string) => Promise>;\n getProviderUser: (providerId: string, id: string) => Promise;\n postProviderUserInvite: (providerId: string, request: ProviderUserInviteRequest) => Promise;\n postProviderUserReinvite: (providerId: string, id: string) => Promise;\n postManyProviderUserReinvite: (\n providerId: string,\n request: ProviderUserBulkRequest,\n ) => Promise>;\n postProviderUserAccept: (\n providerId: string,\n id: string,\n request: ProviderUserAcceptRequest,\n ) => Promise;\n postProviderUserConfirm: (\n providerId: string,\n id: string,\n request: ProviderUserConfirmRequest,\n ) => Promise;\n postProviderUsersPublicKey: (\n providerId: string,\n request: ProviderUserBulkRequest,\n ) => Promise>;\n postProviderUserBulkConfirm: (\n providerId: string,\n request: ProviderUserBulkConfirmRequest,\n ) => Promise>;\n putProviderUser: (\n providerId: string,\n id: string,\n request: ProviderUserUpdateRequest,\n ) => Promise;\n deleteProviderUser: (organizationId: string, id: string) => Promise;\n deleteManyProviderUsers: (\n providerId: string,\n request: ProviderUserBulkRequest,\n ) => Promise>;\n getProviderClients: (\n providerId: string,\n ) => Promise>;\n postProviderAddOrganization: (\n providerId: string,\n request: ProviderAddOrganizationRequest,\n ) => Promise;\n postProviderCreateOrganization: (\n providerId: string,\n request: ProviderOrganizationCreateRequest,\n ) => Promise;\n deleteProviderOrganization: (providerId: string, organizationId: string) => Promise;\n\n getEvents: (start: string, end: string, token: string) => Promise>;\n getEventsCipher: (\n id: string,\n start: string,\n end: string,\n token: string,\n ) => Promise>;\n getEventsOrganization: (\n id: string,\n start: string,\n end: string,\n token: string,\n ) => Promise>;\n getEventsOrganizationUser: (\n organizationId: string,\n id: string,\n start: string,\n end: string,\n token: string,\n ) => Promise>;\n getEventsProvider: (\n id: string,\n start: string,\n end: string,\n token: string,\n ) => Promise>;\n getEventsProviderUser: (\n providerId: string,\n id: string,\n start: string,\n end: string,\n token: string,\n ) => Promise>;\n postEventsCollect: (request: EventRequest[]) => Promise;\n\n deleteSsoUser: (organizationId: string) => Promise;\n getSsoUserIdentifier: () => Promise;\n\n getUserPublicKey: (id: string) => Promise;\n\n getHibpBreach: (username: string) => Promise;\n\n postBitPayInvoice: (request: BitPayInvoiceRequest) => Promise;\n postSetupPayment: () => Promise;\n\n getActiveBearerToken: () => Promise;\n fetch: (request: Request) => Promise;\n nativeFetch: (request: Request) => Promise;\n\n preValidateSso: (identifier: string) => Promise;\n\n postCreateSponsorship: (\n sponsorshipOrgId: string,\n request: OrganizationSponsorshipCreateRequest,\n ) => Promise;\n getSponsorshipSyncStatus: (\n sponsoredOrgId: string,\n ) => Promise;\n deleteRevokeSponsorship: (sponsoringOrganizationId: string) => Promise;\n deleteRemoveSponsorship: (sponsoringOrgId: string) => Promise;\n postPreValidateSponsorshipToken: (sponsorshipToken: string) => Promise;\n postRedeemSponsorship: (\n sponsorshipToken: string,\n request: OrganizationSponsorshipRedeemRequest,\n ) => Promise;\n postResendSponsorshipOffer: (sponsoringOrgId: string) => Promise;\n\n getMasterKeyFromKeyConnector: (keyConnectorUrl: string) => Promise;\n postUserKeyToKeyConnector: (\n keyConnectorUrl: string,\n request: KeyConnectorUserKeyRequest,\n ) => Promise;\n getKeyConnectorAlive: (keyConnectorUrl: string) => Promise;\n getOrganizationExport: (organizationId: string) => Promise;\n}\n","import { BreachAccountResponse } from \"../models/response/breach-account.response\";\n\nexport abstract class AuditService {\n passwordLeaked: (password: string) => Promise;\n breachedAccounts: (username: string) => Promise;\n}\n","import { EventType } from \"../../enums\";\n\nexport abstract class EventCollectionService {\n collect: (\n eventType: EventType,\n cipherId?: string,\n uploadImmediately?: boolean,\n organizationId?: string,\n ) => Promise;\n}\n","import { UserId } from \"../../types/guid\";\n\nexport abstract class EventUploadService {\n uploadEvents: (userId?: UserId) => Promise;\n}\n","export abstract class NotificationsService {\n init: () => Promise;\n updateConnection: (sync?: boolean) => Promise;\n reconnectFromActivity: () => Promise;\n disconnectFromInactivity: () => Promise;\n}\n","import { SendView } from \"../tools/send/models/view/send.view\";\nimport { CipherView } from \"../vault/models/view/cipher.view\";\n\nexport abstract class SearchService {\n indexedEntityId?: string = null;\n clearIndex: () => void;\n isSearchable: (query: string) => boolean;\n indexCiphers: (ciphersToIndex: CipherView[], indexedEntityGuid?: string) => void;\n searchCiphers: (\n query: string,\n filter?: ((cipher: CipherView) => boolean) | ((cipher: CipherView) => boolean)[],\n ciphers?: CipherView[],\n ) => Promise;\n searchCiphersBasic: (ciphers: CipherView[], query: string, deleted?: boolean) => CipherView[];\n searchSends: (sends: SendView[], query: string) => SendView[];\n}\n","import { Observable } from \"rxjs\";\n\nimport { VaultTimeoutAction } from \"../../enums/vault-timeout-action.enum\";\nimport { PinLockType } from \"../../services/vault-timeout/vault-timeout-settings.service\";\n\nexport abstract class VaultTimeoutSettingsService {\n /**\n * Set the vault timeout options for the user\n * @param vaultTimeout The vault timeout in minutes\n * @param vaultTimeoutAction The vault timeout action\n * @param userId The user id to set. If not provided, the current user is used\n */\n setVaultTimeoutOptions: (\n vaultTimeout: number,\n vaultTimeoutAction: VaultTimeoutAction,\n ) => Promise;\n\n /**\n * Get the available vault timeout actions for the current user\n *\n * **NOTE:** This observable is not yet connected to the state service, so it will not update when the state changes\n * @param userId The user id to check. If not provided, the current user is used\n */\n availableVaultTimeoutActions$: (userId?: string) => Observable;\n\n /**\n * Get the current vault timeout action for the user. This is not the same as the current state, it is\n * calculated based on the current state, the user's policy, and the user's available unlock methods.\n */\n getVaultTimeout: (userId?: string) => Promise;\n\n /**\n * Observe the vault timeout action for the user. This is calculated based on users preferred lock action saved in the state,\n * the user's policy, and the user's available unlock methods.\n *\n * **NOTE:** This observable is not yet connected to the state service, so it will not update when the state changes\n * @param userId The user id to check. If not provided, the current user is used\n */\n vaultTimeoutAction$: (userId?: string) => Observable;\n\n /**\n * Has the user enabled unlock with Pin.\n * @param userId The user id to check. If not provided, the current user is used\n * @returns PinLockType\n */\n isPinLockSet: (userId?: string) => Promise;\n\n /**\n * Has the user enabled unlock with Biometric.\n * @param userId The user id to check. If not provided, the current user is used\n * @returns boolean true if biometric lock is set\n */\n isBiometricLockSet: (userId?: string) => Promise;\n\n clear: (userId?: string) => Promise;\n}\n","export abstract class VaultTimeoutService {\n checkVaultTimeout: () => Promise;\n lock: (userId?: string) => Promise;\n logOut: (userId?: string) => Promise;\n}\n","import { OrganizationDomainRequest } from \"../../services/organization-domain/requests/organization-domain.request\";\n\nimport { OrganizationDomainSsoDetailsResponse } from \"./responses/organization-domain-sso-details.response\";\nimport { OrganizationDomainResponse } from \"./responses/organization-domain.response\";\n\nexport abstract class OrgDomainApiServiceAbstraction {\n getAllByOrgId: (orgId: string) => Promise>;\n getByOrgIdAndOrgDomainId: (\n orgId: string,\n orgDomainId: string,\n ) => Promise;\n post: (\n orgId: string,\n orgDomain: OrganizationDomainRequest,\n ) => Promise;\n verify: (orgId: string, orgDomainId: string) => Promise;\n delete: (orgId: string, orgDomainId: string) => Promise;\n getClaimedOrgDomainByEmail: (email: string) => Promise;\n}\n","import { Observable } from \"rxjs\";\n\nimport { OrganizationDomainResponse } from \"./responses/organization-domain.response\";\n\nexport abstract class OrgDomainServiceAbstraction {\n orgDomains$: Observable;\n\n get: (orgDomainId: string) => OrganizationDomainResponse;\n\n copyDnsTxt: (dnsTxt: string) => void;\n}\n\n// Note: this separate class is designed to hold methods that are not\n// meant to be used in components (e.g., data write methods)\nexport abstract class OrgDomainInternalServiceAbstraction extends OrgDomainServiceAbstraction {\n upsert: (orgDomains: OrganizationDomainResponse[]) => void;\n replace: (orgDomains: OrganizationDomainResponse[]) => void;\n clearCache: () => void;\n delete: (orgDomainIds: string[]) => void;\n}\n","import { Observable } from \"rxjs\";\n\n/**\n * Manages the state of a single organization management preference.\n * Can be used to subscribe to or update a given property.\n */\nexport class OrganizationManagementPreference {\n state$: Observable;\n set: (value: T) => Promise;\n\n constructor(state$: Observable, setFn: (value: T) => Promise) {\n this.state$ = state$;\n this.set = setFn;\n }\n}\n\n/**\n * Publishes state of a given user's personal settings relating to the user experience of managing an organization.\n */\nexport abstract class OrganizationManagementPreferencesService {\n autoConfirmFingerPrints: OrganizationManagementPreference;\n}\n","import { ListResponse } from \"../../../models/response/list.response\";\n\nimport {\n OrganizationUserAcceptInitRequest,\n OrganizationUserAcceptRequest,\n OrganizationUserBulkConfirmRequest,\n OrganizationUserConfirmRequest,\n OrganizationUserInviteRequest,\n OrganizationUserResetPasswordEnrollmentRequest,\n OrganizationUserResetPasswordRequest,\n OrganizationUserUpdateRequest,\n} from \"./requests\";\nimport {\n OrganizationUserBulkPublicKeyResponse,\n OrganizationUserBulkResponse,\n OrganizationUserDetailsResponse,\n OrganizationUserResetPasswordDetailsResponse,\n OrganizationUserUserDetailsResponse,\n} from \"./responses\";\n\n/**\n * Service for interacting with Organization Users via the API\n */\nexport abstract class OrganizationUserService {\n /**\n * Retrieve a single organization user by Id\n * @param organizationId - Identifier for the user's organization\n * @param id - Organization user identifier\n * @param options - Options for the request\n */\n abstract getOrganizationUser(\n organizationId: string,\n id: string,\n options?: {\n includeGroups?: boolean;\n },\n ): Promise;\n\n /**\n * Retrieve a list of groups Ids the specified organization user belongs to\n * @param organizationId - Identifier for the user's organization\n * @param id - Organization user identifier\n */\n abstract getOrganizationUserGroups(organizationId: string, id: string): Promise;\n\n /**\n * Retrieve a list of all users that belong to the specified organization\n * @param organizationId - Identifier for the organization\n * @param options - Options for the request\n */\n abstract getAllUsers(\n organizationId: string,\n options?: {\n includeCollections?: boolean;\n includeGroups?: boolean;\n },\n ): Promise>;\n\n /**\n * Retrieve reset password details for the specified organization user\n * @param organizationId - Identifier for the user's organization\n * @param id - Organization user identifier\n */\n abstract getOrganizationUserResetPasswordDetails(\n organizationId: string,\n id: string,\n ): Promise;\n\n /**\n * Create new organization user invite(s) for the specified organization\n * @param organizationId - Identifier for the organization\n * @param request - New user invitation request details\n */\n abstract postOrganizationUserInvite(\n organizationId: string,\n request: OrganizationUserInviteRequest,\n ): Promise;\n\n /**\n * Re-invite the specified organization user\n * @param organizationId - Identifier for the user's organization\n * @param id - Organization user identifier\n */\n abstract postOrganizationUserReinvite(organizationId: string, id: string): Promise;\n\n /**\n * Re-invite many organization users for the specified organization\n * @param organizationId - Identifier for the organization\n * @param ids - A list of organization user identifiers\n * @return List of user ids, including both those that were successfully re-invited and those that had an error\n */\n abstract postManyOrganizationUserReinvite(\n organizationId: string,\n ids: string[],\n ): Promise>;\n\n /**\n * Accept an invitation to initialize and join an organization created via the Admin Portal **only**.\n * This is only used once for the initial Owner, because it also creates the organization's encryption keys.\n * This should not be used for organizations created via the Web client.\n * @param organizationId - Identifier for the organization to accept\n * @param id - Organization user identifier\n * @param request - Request details for accepting the invitation\n */\n abstract postOrganizationUserAcceptInit(\n organizationId: string,\n id: string,\n request: OrganizationUserAcceptInitRequest,\n ): Promise;\n\n /**\n * Accept an organization user invitation\n * @param organizationId - Identifier for the organization to accept\n * @param id - Organization user identifier\n * @param request - Request details for accepting the invitation\n */\n abstract postOrganizationUserAccept(\n organizationId: string,\n id: string,\n request: OrganizationUserAcceptRequest,\n ): Promise;\n\n /**\n * Confirm an organization user that has accepted their invitation\n * @param organizationId - Identifier for the organization to confirm\n * @param id - Organization user identifier\n * @param request - Request details for confirming the user\n */\n abstract postOrganizationUserConfirm(\n organizationId: string,\n id: string,\n request: OrganizationUserConfirmRequest,\n ): Promise;\n\n /**\n * Retrieve a list of the specified users' public keys\n * @param organizationId - Identifier for the organization to accept\n * @param ids - A list of organization user identifiers to retrieve public keys for\n */\n abstract postOrganizationUsersPublicKey(\n organizationId: string,\n ids: string[],\n ): Promise>;\n\n /**\n * Confirm many organization users that have accepted their invitations\n * @param organizationId - Identifier for the organization to confirm users\n * @param request - Bulk request details for confirming the user\n */\n abstract postOrganizationUserBulkConfirm(\n organizationId: string,\n request: OrganizationUserBulkConfirmRequest,\n ): Promise>;\n\n /**\n * Update an organization users\n * @param organizationId - Identifier for the organization the user belongs to\n * @param id - Organization user identifier\n * @param request - Request details for updating the user\n */\n abstract putOrganizationUser(\n organizationId: string,\n id: string,\n request: OrganizationUserUpdateRequest,\n ): Promise;\n\n /**\n * Update an organization user's reset password enrollment\n * @param organizationId - Identifier for the organization the user belongs to\n * @param userId - Organization user identifier\n * @param request - Reset password enrollment details\n */\n abstract putOrganizationUserResetPasswordEnrollment(\n organizationId: string,\n userId: string,\n request: OrganizationUserResetPasswordEnrollmentRequest,\n ): Promise;\n\n /**\n * Reset an organization user's password\n * @param organizationId - Identifier for the organization the user belongs to\n * @param id - Organization user identifier\n * @param request - Reset password details\n */\n abstract putOrganizationUserResetPassword(\n organizationId: string,\n id: string,\n request: OrganizationUserResetPasswordRequest,\n ): Promise;\n\n /**\n * Enable Secrets Manager for many users\n * @param organizationId - Identifier for the organization the user belongs to\n * @param ids - List of organization user identifiers to enable\n * @return List of user ids, including both those that were successfully enabled and those that had an error\n */\n abstract putOrganizationUserBulkEnableSecretsManager(\n organizationId: string,\n ids: string[],\n ): Promise;\n\n /**\n * Delete an organization user\n * @param organizationId - Identifier for the organization the user belongs to\n * @param id - Organization user identifier\n */\n abstract deleteOrganizationUser(organizationId: string, id: string): Promise;\n\n /**\n * Delete many organization users\n * @param organizationId - Identifier for the organization the users belongs to\n * @param ids - List of organization user identifiers to delete\n * @return List of user ids, including both those that were successfully deleted and those that had an error\n */\n abstract deleteManyOrganizationUsers(\n organizationId: string,\n ids: string[],\n ): Promise>;\n\n /**\n * Revoke an organization user's access to the organization\n * @param organizationId - Identifier for the organization the user belongs to\n * @param id - Organization user identifier\n */\n abstract revokeOrganizationUser(organizationId: string, id: string): Promise;\n\n /**\n * Revoke many organization users' access to the organization\n * @param organizationId - Identifier for the organization the users belongs to\n * @param ids - List of organization user identifiers to revoke\n * @return List of user ids, including both those that were successfully revoked and those that had an error\n */\n abstract revokeManyOrganizationUsers(\n organizationId: string,\n ids: string[],\n ): Promise>;\n\n /**\n * Restore an organization user's access to the organization\n * @param organizationId - Identifier for the organization the user belongs to\n * @param id - Organization user identifier\n */\n abstract restoreOrganizationUser(organizationId: string, id: string): Promise;\n\n /**\n * Restore many organization users' access to the organization\n * @param organizationId - Identifier for the organization the users belongs to\n * @param ids - List of organization user identifiers to restore\n * @return List of user ids, including both those that were successfully restored and those that had an error\n */\n abstract restoreManyOrganizationUsers(\n organizationId: string,\n ids: string[],\n ): Promise>;\n}\n","import { SecretVerificationRequest } from \"../../../../auth/models/request/secret-verification.request\";\n\nexport class OrganizationUserResetPasswordEnrollmentRequest extends SecretVerificationRequest {\n resetPasswordKey: string;\n}\n\nexport class OrganizationUserResetPasswordWithIdRequest extends OrganizationUserResetPasswordEnrollmentRequest {\n organizationId: string;\n}\n","export class OrganizationUserResetPasswordRequest {\n newMasterPasswordHash: string;\n key: string;\n}\n","import { OrganizationApiKeyRequest } from \"../../../admin-console/models/request/organization-api-key.request\";\nimport { OrganizationSsoRequest } from \"../../../auth/models/request/organization-sso.request\";\nimport { SecretVerificationRequest } from \"../../../auth/models/request/secret-verification.request\";\nimport { ApiKeyResponse } from \"../../../auth/models/response/api-key.response\";\nimport { OrganizationSsoResponse } from \"../../../auth/models/response/organization-sso.response\";\nimport { OrganizationSmSubscriptionUpdateRequest } from \"../../../billing/models/request/organization-sm-subscription-update.request\";\nimport { OrganizationSubscriptionUpdateRequest } from \"../../../billing/models/request/organization-subscription-update.request\";\nimport { OrganizationTaxInfoUpdateRequest } from \"../../../billing/models/request/organization-tax-info-update.request\";\nimport { PaymentRequest } from \"../../../billing/models/request/payment.request\";\nimport { SecretsManagerSubscribeRequest } from \"../../../billing/models/request/sm-subscribe.request\";\nimport { BillingResponse } from \"../../../billing/models/response/billing.response\";\nimport { OrganizationSubscriptionResponse } from \"../../../billing/models/response/organization-subscription.response\";\nimport { PaymentResponse } from \"../../../billing/models/response/payment.response\";\nimport { TaxInfoResponse } from \"../../../billing/models/response/tax-info.response\";\nimport { ImportDirectoryRequest } from \"../../../models/request/import-directory.request\";\nimport { SeatRequest } from \"../../../models/request/seat.request\";\nimport { StorageRequest } from \"../../../models/request/storage.request\";\nimport { VerifyBankRequest } from \"../../../models/request/verify-bank.request\";\nimport { ListResponse } from \"../../../models/response/list.response\";\nimport { OrganizationApiKeyType } from \"../../enums\";\nimport { OrganizationCollectionManagementUpdateRequest } from \"../../models/request/organization-collection-management-update.request\";\nimport { OrganizationCreateRequest } from \"../../models/request/organization-create.request\";\nimport { OrganizationKeysRequest } from \"../../models/request/organization-keys.request\";\nimport { OrganizationUpdateRequest } from \"../../models/request/organization-update.request\";\nimport { OrganizationUpgradeRequest } from \"../../models/request/organization-upgrade.request\";\nimport { OrganizationApiKeyInformationResponse } from \"../../models/response/organization-api-key-information.response\";\nimport { OrganizationAutoEnrollStatusResponse } from \"../../models/response/organization-auto-enroll-status.response\";\nimport { OrganizationKeysResponse } from \"../../models/response/organization-keys.response\";\nimport { OrganizationResponse } from \"../../models/response/organization.response\";\nimport { ProfileOrganizationResponse } from \"../../models/response/profile-organization.response\";\n\nexport class OrganizationApiServiceAbstraction {\n get: (id: string) => Promise;\n getBilling: (id: string) => Promise;\n getSubscription: (id: string) => Promise;\n getLicense: (id: string, installationId: string) => Promise;\n getAutoEnrollStatus: (identifier: string) => Promise;\n create: (request: OrganizationCreateRequest) => Promise;\n createLicense: (data: FormData) => Promise;\n save: (id: string, request: OrganizationUpdateRequest) => Promise;\n updatePayment: (id: string, request: PaymentRequest) => Promise;\n upgrade: (id: string, request: OrganizationUpgradeRequest) => Promise;\n updatePasswordManagerSeats: (\n id: string,\n request: OrganizationSubscriptionUpdateRequest,\n ) => Promise;\n updateSecretsManagerSubscription: (\n id: string,\n request: OrganizationSmSubscriptionUpdateRequest,\n ) => Promise;\n updateSeats: (id: string, request: SeatRequest) => Promise;\n updateStorage: (id: string, request: StorageRequest) => Promise;\n verifyBank: (id: string, request: VerifyBankRequest) => Promise;\n reinstate: (id: string) => Promise;\n leave: (id: string) => Promise;\n delete: (id: string, request: SecretVerificationRequest) => Promise;\n updateLicense: (id: string, data: FormData) => Promise;\n importDirectory: (organizationId: string, request: ImportDirectoryRequest) => Promise;\n getOrCreateApiKey: (id: string, request: OrganizationApiKeyRequest) => Promise;\n getApiKeyInformation: (\n id: string,\n organizationApiKeyType?: OrganizationApiKeyType,\n ) => Promise>;\n rotateApiKey: (id: string, request: OrganizationApiKeyRequest) => Promise;\n getTaxInfo: (id: string) => Promise;\n updateTaxInfo: (id: string, request: OrganizationTaxInfoUpdateRequest) => Promise;\n getKeys: (id: string) => Promise;\n updateKeys: (id: string, request: OrganizationKeysRequest) => Promise;\n getSso: (id: string) => Promise;\n updateSso: (id: string, request: OrganizationSsoRequest) => Promise;\n selfHostedSyncLicense: (id: string) => Promise;\n subscribeToSecretsManager: (\n id: string,\n request: SecretsManagerSubscribeRequest,\n ) => Promise;\n updateCollectionManagement: (\n id: string,\n request: OrganizationCollectionManagementUpdateRequest,\n ) => Promise;\n enableCollectionEnhancements: (id: string) => Promise;\n}\n","import { map, Observable } from \"rxjs\";\n\nimport { I18nService } from \"../../../platform/abstractions/i18n.service\";\nimport { Utils } from \"../../../platform/misc/utils\";\nimport { UserId } from \"../../../types/guid\";\nimport { OrganizationData } from \"../../models/data/organization.data\";\nimport { Organization } from \"../../models/domain/organization\";\n\nexport function canAccessVaultTab(org: Organization): boolean {\n return org.canViewAssignedCollections || org.canViewAllCollections;\n}\n\nexport function canAccessSettingsTab(org: Organization): boolean {\n return (\n org.isOwner ||\n org.canManagePolicies ||\n org.canManageSso ||\n org.canManageScim ||\n org.canAccessImportExport ||\n org.canManageDeviceApprovals\n );\n}\n\nexport function canAccessMembersTab(org: Organization): boolean {\n return org.canManageUsers || org.canManageUsersPassword;\n}\n\nexport function canAccessGroupsTab(org: Organization): boolean {\n return org.canManageGroups;\n}\n\nexport function canAccessReportingTab(org: Organization): boolean {\n return org.canAccessReports || org.canAccessEventLogs;\n}\n\nexport function canAccessBillingTab(org: Organization): boolean {\n return org.isOwner;\n}\n\nexport function canAccessOrgAdmin(org: Organization): boolean {\n // Admin console can only be accessed by Owners for disabled organizations\n if (!org.enabled && !org.isOwner) {\n return false;\n }\n return (\n canAccessMembersTab(org) ||\n canAccessGroupsTab(org) ||\n canAccessReportingTab(org) ||\n canAccessBillingTab(org) ||\n canAccessSettingsTab(org) ||\n canAccessVaultTab(org)\n );\n}\n\nexport function getOrganizationById(id: string) {\n return map((orgs) => orgs.find((o) => o.id === id));\n}\n\nexport function canAccessAdmin(i18nService: I18nService) {\n return map((orgs) =>\n orgs.filter(canAccessOrgAdmin).sort(Utils.getSortFunction(i18nService, \"name\")),\n );\n}\n\n/**\n * @deprecated\n * To be removed after Flexible Collections.\n **/\nexport function canAccessImportExport(i18nService: I18nService) {\n return map((orgs) =>\n orgs\n .filter((org) => org.canAccessImportExport)\n .sort(Utils.getSortFunction(i18nService, \"name\")),\n );\n}\n\nexport function canAccessImport(i18nService: I18nService) {\n return map((orgs) =>\n orgs\n .filter(\n (org) =>\n org.canAccessImportExport || (org.canCreateNewCollections && org.flexibleCollections),\n )\n .sort(Utils.getSortFunction(i18nService, \"name\")),\n );\n}\n\n/**\n * Returns `true` if a user is a member of an organization (rather than only being a ProviderUser)\n * @deprecated Use organizationService.organizations$ with a filter instead\n */\nexport function isMember(org: Organization): boolean {\n return org.isMember;\n}\n\n/**\n * Publishes an observable stream of organizations. This service is meant to\n * be used widely across Bitwarden as the primary way of fetching organizations.\n * Risky operations like updates are isolated to the\n * internal extension `InternalOrganizationServiceAbstraction`.\n */\nexport abstract class OrganizationService {\n /**\n * Publishes state for all organizations under the active user.\n * @returns An observable list of organizations\n */\n organizations$: Observable;\n\n // @todo Clean these up. Continuing to expand them is not recommended.\n // @see https://bitwarden.atlassian.net/browse/AC-2252\n memberOrganizations$: Observable;\n /**\n * @deprecated This is currently only used in the CLI, and should not be\n * used in any new calls. Use get$ instead for the time being, and we'll be\n * removing this method soon. See Jira for details:\n * https://bitwarden.atlassian.net/browse/AC-2252.\n */\n getFromState: (id: string) => Promise;\n canManageSponsorships: () => Promise;\n hasOrganizations: () => Promise;\n get$: (id: string) => Observable;\n get: (id: string) => Promise;\n getAll: (userId?: string) => Promise;\n //\n}\n\n/**\n * Big scary buttons that **update** organization state. These should only be\n * called from within admin-console scoped code. Extends the base\n * `OrganizationService` for easy access to `get` calls.\n * @internal\n */\nexport abstract class InternalOrganizationServiceAbstraction extends OrganizationService {\n /**\n * Replaces state for the provided organization, or creates it if not found.\n * @param organization The organization state being saved.\n * @param userId The userId to replace state for. Defaults to the active\n * user.\n */\n upsert: (OrganizationData: OrganizationData) => Promise;\n\n /**\n * Replaces state for the entire registered organization list for the active user.\n * You probably don't want this unless you're calling from a full sync\n * operation or a logout. See `upsert` for creating & updating a single\n * organization in the state.\n * @param organizations A complete list of all organization state for the active\n * user.\n * @param userId The userId to replace state for. Defaults to the active\n * user.\n */\n replace: (organizations: { [id: string]: OrganizationData }, userId?: UserId) => Promise;\n}\n","import { ListResponse } from \"../../../models/response/list.response\";\nimport { PolicyType } from \"../../enums\";\nimport { MasterPasswordPolicyOptions } from \"../../models/domain/master-password-policy-options\";\nimport { PolicyRequest } from \"../../models/request/policy.request\";\nimport { PolicyResponse } from \"../../models/response/policy.response\";\n\nexport class PolicyApiServiceAbstraction {\n getPolicy: (organizationId: string, type: PolicyType) => Promise;\n getPolicies: (organizationId: string) => Promise>;\n\n getPoliciesByToken: (\n organizationId: string,\n token: string,\n email: string,\n organizationUserId: string,\n ) => Promise>;\n\n getMasterPasswordPolicyOptsForOrgUser: (orgId: string) => Promise;\n putPolicy: (organizationId: string, type: PolicyType, request: PolicyRequest) => Promise;\n}\n","import { Observable } from \"rxjs\";\n\nimport { UserId } from \"../../../types/guid\";\nimport { PolicyType } from \"../../enums\";\nimport { PolicyData } from \"../../models/data/policy.data\";\nimport { MasterPasswordPolicyOptions } from \"../../models/domain/master-password-policy-options\";\nimport { Policy } from \"../../models/domain/policy\";\nimport { ResetPasswordPolicyOptions } from \"../../models/domain/reset-password-policy-options\";\n\nexport abstract class PolicyService {\n /**\n * All policies for the active user from sync data.\n * May include policies that are disabled or otherwise do not apply to the user. Be careful using this!\n * Consider using {@link get$} or {@link getAll$} instead, which will only return policies that should be enforced against the user.\n */\n policies$: Observable;\n\n /**\n * @returns the first {@link Policy} found that applies to the active user.\n * A policy \"applies\" if it is enabled and the user is not exempt (e.g. because they are an Owner).\n * @param policyType the {@link PolicyType} to search for\n * @see {@link getAll$} if you need all policies of a given type\n */\n get$: (policyType: PolicyType) => Observable;\n\n /**\n * @returns all {@link Policy} objects of a given type that apply to the specified user (or the active user if not specified).\n * A policy \"applies\" if it is enabled and the user is not exempt (e.g. because they are an Owner).\n * @param policyType the {@link PolicyType} to search for\n */\n getAll$: (policyType: PolicyType, userId?: UserId) => Observable;\n\n /**\n * All {@link Policy} objects for the specified user (from sync data).\n * May include policies that are disabled or otherwise do not apply to the user.\n * Consider using {@link getAll$} instead, which will only return policies that should be enforced against the user.\n */\n getAll: (policyType: PolicyType) => Promise;\n\n /**\n * @returns true if a policy of the specified type applies to the active user, otherwise false.\n * A policy \"applies\" if it is enabled and the user is not exempt (e.g. because they are an Owner).\n * This does not take into account the policy's configuration - if that is important, use {@link getAll$} to get the\n * {@link Policy} objects and then filter by Policy.data.\n */\n policyAppliesToActiveUser$: (policyType: PolicyType) => Observable;\n\n policyAppliesToUser: (policyType: PolicyType) => Promise;\n\n // Policy specific interfaces\n\n /**\n * Combines all Master Password policies that apply to the user.\n * @returns a set of options which represent the minimum Master Password settings that the user must\n * comply with in order to comply with **all** Master Password policies.\n */\n masterPasswordPolicyOptions$: (policies?: Policy[]) => Observable;\n\n /**\n * Evaluates whether a proposed Master Password complies with all Master Password policies that apply to the user.\n */\n evaluateMasterPassword: (\n passwordStrength: number,\n newPassword: string,\n enforcedPolicyOptions?: MasterPasswordPolicyOptions,\n ) => boolean;\n\n /**\n * @returns Reset Password policy options for the specified organization and a boolean indicating whether the policy\n * is enabled\n */\n getResetPasswordPolicyOptions: (\n policies: Policy[],\n orgId: string,\n ) => [ResetPasswordPolicyOptions, boolean];\n}\n\nexport abstract class InternalPolicyService extends PolicyService {\n upsert: (policy: PolicyData) => Promise;\n replace: (policies: { [id: string]: PolicyData }) => Promise;\n clear: (userId?: string) => Promise;\n}\n","import { UserId } from \"../../types/guid\";\nimport { ProviderData } from \"../models/data/provider.data\";\nimport { Provider } from \"../models/domain/provider\";\n\nexport abstract class ProviderService {\n get: (id: string) => Promise;\n getAll: () => Promise;\n save: (providers: { [id: string]: ProviderData }, userId?: UserId) => Promise;\n}\n","export enum OrganizationApiKeyType {\n Default = 0,\n BillingSync = 1,\n Scim = 2,\n}\n","export enum OrganizationConnectionType {\n CloudBillingSync = 1,\n Scim = 2,\n}\n","export enum OrganizationUserStatusType {\n Invited = 0,\n Accepted = 1,\n Confirmed = 2,\n Revoked = -1,\n}\n","export enum OrganizationUserType {\n Owner = 0,\n Admin = 1,\n User = 2,\n /**\n * @deprecated\n * This is deprecated with the introduction of Flexible Collections.\n */\n Manager = 3,\n Custom = 4,\n}\n","export enum PolicyType {\n TwoFactorAuthentication = 0, // Requires users to have 2fa enabled\n MasterPassword = 1, // Sets minimum requirements for master password complexity\n PasswordGenerator = 2, // Sets minimum requirements/default type for generated passwords/passphrases\n SingleOrg = 3, // Allows users to only be apart of one organization\n RequireSso = 4, // Requires users to authenticate with SSO\n PersonalOwnership = 5, // Disables personal vault ownership for adding/cloning items\n DisableSend = 6, // Disables the ability to create and edit Bitwarden Sends\n SendOptions = 7, // Sets restrictions or defaults for Bitwarden Sends\n ResetPassword = 8, // Allows orgs to use reset password : also can enable auto-enrollment during invite flow\n MaximumVaultTimeout = 9, // Sets the maximum allowed vault timeout\n DisablePersonalVaultExport = 10, // Disable personal vault export\n ActivateAutofill = 11, // Activates autofill with page load on the browser extension\n}\n","export enum ProviderType {\n Msp = 0,\n Reseller = 1,\n}\n","export enum ProviderUserStatusType {\n Invited = 0,\n Accepted = 1,\n Confirmed = 2,\n Revoked = -1, // Not used, compile-time support only\n}\n","export enum ProviderUserType {\n ProviderAdmin = 0,\n ServiceUser = 1,\n}\n","export enum ScimProviderType {\n Default = 0,\n AzureAd = 1,\n Okta = 2,\n OneLogin = 3,\n JumpCloud = 4,\n GoogleWorkspace = 5,\n Rippling = 6,\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\n\nexport class PermissionsApi extends BaseResponse {\n accessEventLogs: boolean;\n accessImportExport: boolean;\n accessReports: boolean;\n createNewCollections: boolean;\n editAnyCollection: boolean;\n deleteAnyCollection: boolean;\n editAssignedCollections: boolean;\n deleteAssignedCollections: boolean;\n manageCiphers: boolean;\n manageGroups: boolean;\n manageSso: boolean;\n managePolicies: boolean;\n manageUsers: boolean;\n manageResetPassword: boolean;\n manageScim: boolean;\n\n constructor(data: any = null) {\n super(data);\n if (data == null) {\n return this;\n }\n this.accessEventLogs = this.getResponseProperty(\"AccessEventLogs\");\n this.accessImportExport = this.getResponseProperty(\"AccessImportExport\");\n this.accessReports = this.getResponseProperty(\"AccessReports\");\n\n this.createNewCollections = this.getResponseProperty(\"CreateNewCollections\");\n this.editAnyCollection = this.getResponseProperty(\"EditAnyCollection\");\n this.deleteAnyCollection = this.getResponseProperty(\"DeleteAnyCollection\");\n this.editAssignedCollections = this.getResponseProperty(\"EditAssignedCollections\");\n this.deleteAssignedCollections = this.getResponseProperty(\"DeleteAssignedCollections\");\n\n this.manageCiphers = this.getResponseProperty(\"ManageCiphers\");\n this.manageGroups = this.getResponseProperty(\"ManageGroups\");\n this.manageSso = this.getResponseProperty(\"ManageSso\");\n this.managePolicies = this.getResponseProperty(\"ManagePolicies\");\n this.manageUsers = this.getResponseProperty(\"ManageUsers\");\n this.manageResetPassword = this.getResponseProperty(\"ManageResetPassword\");\n this.manageScim = this.getResponseProperty(\"ManageScim\");\n }\n}\n","import { Jsonify } from \"type-fest\";\n\nimport { ProductType } from \"../../../enums\";\nimport { OrganizationUserStatusType, OrganizationUserType, ProviderType } from \"../../enums\";\nimport { PermissionsApi } from \"../api/permissions.api\";\nimport { ProfileOrganizationResponse } from \"../response/profile-organization.response\";\n\nexport class OrganizationData {\n id: string;\n name: string;\n status: OrganizationUserStatusType;\n type: OrganizationUserType;\n enabled: boolean;\n usePolicies: boolean;\n useGroups: boolean;\n useDirectory: boolean;\n useEvents: boolean;\n useTotp: boolean;\n use2fa: boolean;\n useApi: boolean;\n useSso: boolean;\n useKeyConnector: boolean;\n useScim: boolean;\n useCustomPermissions: boolean;\n useResetPassword: boolean;\n useSecretsManager: boolean;\n usePasswordManager: boolean;\n useActivateAutofillPolicy: boolean;\n selfHost: boolean;\n usersGetPremium: boolean;\n seats: number;\n maxCollections: number;\n maxStorageGb?: number;\n ssoBound: boolean;\n identifier: string;\n permissions: PermissionsApi;\n resetPasswordEnrolled: boolean;\n userId: string;\n hasPublicAndPrivateKeys: boolean;\n providerId: string;\n providerName: string;\n providerType?: ProviderType;\n isProviderUser: boolean;\n isMember: boolean;\n familySponsorshipFriendlyName: string;\n familySponsorshipAvailable: boolean;\n planProductType: ProductType;\n keyConnectorEnabled: boolean;\n keyConnectorUrl: string;\n familySponsorshipLastSyncDate?: Date;\n familySponsorshipValidUntil?: Date;\n familySponsorshipToDelete?: boolean;\n accessSecretsManager: boolean;\n limitCollectionCreationDeletion: boolean;\n allowAdminAccessToAllCollectionItems: boolean;\n flexibleCollections: boolean;\n\n constructor(\n response?: ProfileOrganizationResponse,\n options?: {\n isMember: boolean;\n isProviderUser: boolean;\n },\n ) {\n if (response == null) {\n return;\n }\n\n this.id = response.id;\n this.name = response.name;\n this.status = response.status;\n this.type = response.type;\n this.enabled = response.enabled;\n this.usePolicies = response.usePolicies;\n this.useGroups = response.useGroups;\n this.useDirectory = response.useDirectory;\n this.useEvents = response.useEvents;\n this.useTotp = response.useTotp;\n this.use2fa = response.use2fa;\n this.useApi = response.useApi;\n this.useSso = response.useSso;\n this.useKeyConnector = response.useKeyConnector;\n this.useScim = response.useScim;\n this.useCustomPermissions = response.useCustomPermissions;\n this.useResetPassword = response.useResetPassword;\n this.useSecretsManager = response.useSecretsManager;\n this.usePasswordManager = response.usePasswordManager;\n this.useActivateAutofillPolicy = response.useActivateAutofillPolicy;\n this.selfHost = response.selfHost;\n this.usersGetPremium = response.usersGetPremium;\n this.seats = response.seats;\n this.maxCollections = response.maxCollections;\n this.maxStorageGb = response.maxStorageGb;\n this.ssoBound = response.ssoBound;\n this.identifier = response.identifier;\n this.permissions = response.permissions;\n this.resetPasswordEnrolled = response.resetPasswordEnrolled;\n this.userId = response.userId;\n this.hasPublicAndPrivateKeys = response.hasPublicAndPrivateKeys;\n this.providerId = response.providerId;\n this.providerName = response.providerName;\n this.providerType = response.providerType;\n this.familySponsorshipFriendlyName = response.familySponsorshipFriendlyName;\n this.familySponsorshipAvailable = response.familySponsorshipAvailable;\n this.planProductType = response.planProductType;\n this.keyConnectorEnabled = response.keyConnectorEnabled;\n this.keyConnectorUrl = response.keyConnectorUrl;\n this.familySponsorshipLastSyncDate = response.familySponsorshipLastSyncDate;\n this.familySponsorshipValidUntil = response.familySponsorshipValidUntil;\n this.familySponsorshipToDelete = response.familySponsorshipToDelete;\n this.accessSecretsManager = response.accessSecretsManager;\n this.limitCollectionCreationDeletion = response.limitCollectionCreationDeletion;\n this.allowAdminAccessToAllCollectionItems = response.allowAdminAccessToAllCollectionItems;\n this.flexibleCollections = response.flexibleCollections;\n\n this.isMember = options.isMember;\n this.isProviderUser = options.isProviderUser;\n }\n\n static fromJSON(obj: Jsonify) {\n return Object.assign(new OrganizationData(), obj, {\n familySponsorshipLastSyncDate:\n obj.familySponsorshipLastSyncDate != null\n ? new Date(obj.familySponsorshipLastSyncDate)\n : obj.familySponsorshipLastSyncDate,\n familySponsorshipValidUntil:\n obj.familySponsorshipValidUntil != null\n ? new Date(obj.familySponsorshipValidUntil)\n : obj.familySponsorshipValidUntil,\n });\n }\n}\n","import { PolicyId } from \"../../../types/guid\";\nimport { PolicyType } from \"../../enums\";\nimport { PolicyResponse } from \"../response/policy.response\";\n\nexport class PolicyData {\n id: PolicyId;\n organizationId: string;\n type: PolicyType;\n data: Record;\n enabled: boolean;\n\n constructor(response?: PolicyResponse) {\n if (response == null) {\n return;\n }\n\n this.id = response.id;\n this.organizationId = response.organizationId;\n this.type = response.type;\n this.data = response.data;\n this.enabled = response.enabled;\n }\n}\n","import { MasterPasswordPolicyResponse } from \"../../../auth/models/response/master-password-policy.response\";\nimport Domain from \"../../../platform/models/domain/domain-base\";\n\nexport class MasterPasswordPolicyOptions extends Domain {\n minComplexity = 0;\n minLength = 0;\n requireUpper = false;\n requireLower = false;\n requireNumbers = false;\n requireSpecial = false;\n\n /**\n * Flag to indicate if the policy should be enforced on login.\n * If true, and the user's password does not meet the policy requirements,\n * the user will be forced to update their password.\n */\n enforceOnLogin = false;\n\n static fromResponse(policy: MasterPasswordPolicyResponse): MasterPasswordPolicyOptions {\n if (policy == null) {\n return null;\n }\n const options = new MasterPasswordPolicyOptions();\n options.minComplexity = policy.minComplexity;\n options.minLength = policy.minLength;\n options.requireUpper = policy.requireUpper;\n options.requireLower = policy.requireLower;\n options.requireNumbers = policy.requireNumbers;\n options.requireSpecial = policy.requireSpecial;\n options.enforceOnLogin = policy.enforceOnLogin;\n return options;\n }\n}\n","import { Jsonify } from \"type-fest\";\n\nimport { ProductType } from \"../../../enums\";\nimport { OrganizationUserStatusType, OrganizationUserType, ProviderType } from \"../../enums\";\nimport { PermissionsApi } from \"../api/permissions.api\";\nimport { OrganizationData } from \"../data/organization.data\";\n\nexport class Organization {\n id: string;\n name: string;\n status: OrganizationUserStatusType;\n\n /**\n * The member's role in the organization.\n * Avoid using this for permission checks - use the getters instead (e.g. isOwner, isAdmin, canManageX), because they\n * properly handle permission inheritance and relationships.\n */\n type: OrganizationUserType;\n\n enabled: boolean;\n usePolicies: boolean;\n useGroups: boolean;\n useDirectory: boolean;\n useEvents: boolean;\n useTotp: boolean;\n use2fa: boolean;\n useApi: boolean;\n useSso: boolean;\n useKeyConnector: boolean;\n useScim: boolean;\n useCustomPermissions: boolean;\n useResetPassword: boolean;\n useSecretsManager: boolean;\n usePasswordManager: boolean;\n useActivateAutofillPolicy: boolean;\n selfHost: boolean;\n usersGetPremium: boolean;\n seats: number;\n maxCollections: number;\n maxStorageGb?: number;\n ssoBound: boolean;\n identifier: string;\n permissions: PermissionsApi;\n resetPasswordEnrolled: boolean;\n userId: string;\n hasPublicAndPrivateKeys: boolean;\n providerId: string;\n providerName: string;\n providerType?: ProviderType;\n /**\n * Indicates that a user is a ProviderUser for the organization\n */\n isProviderUser: boolean;\n /**\n * Indicates that a user is a member for the organization (may be `false` if they have access via a Provider only)\n */\n isMember: boolean;\n familySponsorshipFriendlyName: string;\n familySponsorshipAvailable: boolean;\n planProductType: ProductType;\n keyConnectorEnabled: boolean;\n keyConnectorUrl: string;\n familySponsorshipLastSyncDate?: Date;\n familySponsorshipValidUntil?: Date;\n familySponsorshipToDelete?: boolean;\n accessSecretsManager: boolean;\n /**\n * Refers to the ability for an organization to limit collection creation and deletion to owners and admins only\n */\n limitCollectionCreationDeletion: boolean;\n /**\n * Refers to the ability for an owner/admin to access all collection items, regardless of assigned collections\n */\n allowAdminAccessToAllCollectionItems: boolean;\n /**\n * Returns true if this organization has enabled Flexible Collections (MVP) and their data has been migrated.\n * Generally, you should use this as the feature flag to gate Flexible Collections features.\n */\n flexibleCollections: boolean;\n\n constructor(obj?: OrganizationData) {\n if (obj == null) {\n return;\n }\n\n this.id = obj.id;\n this.name = obj.name;\n this.status = obj.status;\n this.type = obj.type;\n this.enabled = obj.enabled;\n this.usePolicies = obj.usePolicies;\n this.useGroups = obj.useGroups;\n this.useDirectory = obj.useDirectory;\n this.useEvents = obj.useEvents;\n this.useTotp = obj.useTotp;\n this.use2fa = obj.use2fa;\n this.useApi = obj.useApi;\n this.useSso = obj.useSso;\n this.useKeyConnector = obj.useKeyConnector;\n this.useScim = obj.useScim;\n this.useCustomPermissions = obj.useCustomPermissions;\n this.useResetPassword = obj.useResetPassword;\n this.useSecretsManager = obj.useSecretsManager;\n this.usePasswordManager = obj.usePasswordManager;\n this.useActivateAutofillPolicy = obj.useActivateAutofillPolicy;\n this.selfHost = obj.selfHost;\n this.usersGetPremium = obj.usersGetPremium;\n this.seats = obj.seats;\n this.maxCollections = obj.maxCollections;\n this.maxStorageGb = obj.maxStorageGb;\n this.ssoBound = obj.ssoBound;\n this.identifier = obj.identifier;\n this.permissions = obj.permissions;\n this.resetPasswordEnrolled = obj.resetPasswordEnrolled;\n this.userId = obj.userId;\n this.hasPublicAndPrivateKeys = obj.hasPublicAndPrivateKeys;\n this.providerId = obj.providerId;\n this.providerName = obj.providerName;\n this.providerType = obj.providerType;\n this.isProviderUser = obj.isProviderUser;\n this.isMember = obj.isMember;\n this.familySponsorshipFriendlyName = obj.familySponsorshipFriendlyName;\n this.familySponsorshipAvailable = obj.familySponsorshipAvailable;\n this.planProductType = obj.planProductType;\n this.keyConnectorEnabled = obj.keyConnectorEnabled;\n this.keyConnectorUrl = obj.keyConnectorUrl;\n this.familySponsorshipLastSyncDate = obj.familySponsorshipLastSyncDate;\n this.familySponsorshipValidUntil = obj.familySponsorshipValidUntil;\n this.familySponsorshipToDelete = obj.familySponsorshipToDelete;\n this.accessSecretsManager = obj.accessSecretsManager;\n this.limitCollectionCreationDeletion = obj.limitCollectionCreationDeletion;\n this.allowAdminAccessToAllCollectionItems = obj.allowAdminAccessToAllCollectionItems;\n this.flexibleCollections = obj.flexibleCollections;\n }\n\n get canAccess() {\n if (this.isOwner) {\n return true;\n }\n return this.enabled && this.status === OrganizationUserStatusType.Confirmed;\n }\n\n /**\n * Whether a user has Manager permissions or greater\n *\n * @deprecated\n * This is deprecated with the introduction of Flexible Collections.\n */\n get isManager() {\n return this.type === OrganizationUserType.Manager || this.isAdmin;\n }\n\n /**\n * Whether a user has Admin permissions or greater\n */\n get isAdmin() {\n return this.type === OrganizationUserType.Admin || this.isOwner;\n }\n\n /**\n * Whether a user has Owner permissions (including ProviderUsers)\n */\n get isOwner() {\n return this.type === OrganizationUserType.Owner || this.isProviderUser;\n }\n\n get canAccessEventLogs() {\n return (this.isAdmin || this.permissions.accessEventLogs) && this.useEvents;\n }\n\n get canAccessImportExport() {\n return this.isAdmin || this.permissions.accessImportExport;\n }\n\n get canAccessReports() {\n return this.isAdmin || this.permissions.accessReports;\n }\n\n get canCreateNewCollections() {\n if (this.flexibleCollections) {\n return (\n !this.limitCollectionCreationDeletion ||\n this.isAdmin ||\n this.permissions.createNewCollections\n );\n }\n\n return this.isManager || this.permissions.createNewCollections;\n }\n\n get canEditAnyCollection() {\n return this.isAdmin || this.permissions.editAnyCollection;\n }\n\n get canUseAdminCollections() {\n return this.canEditAnyCollection;\n }\n\n canEditAllCiphers(flexibleCollectionsV1Enabled: boolean) {\n // Before Flexible Collections, anyone with editAnyCollection permission could edit all ciphers\n if (!flexibleCollectionsV1Enabled) {\n return this.canEditAnyCollection;\n }\n // Post Flexible Collections V1, the allowAdminAccessToAllCollectionItems flag can restrict admins\n // Providers and custom users with canEditAnyCollection are not affected by allowAdminAccessToAllCollectionItems flag\n return (\n this.isProviderUser ||\n (this.type === OrganizationUserType.Custom && this.permissions.editAnyCollection) ||\n (this.allowAdminAccessToAllCollectionItems && this.isAdmin)\n );\n }\n\n get canDeleteAnyCollection() {\n return this.isAdmin || this.permissions.deleteAnyCollection;\n }\n\n get canViewAllCollections() {\n return this.canEditAnyCollection || this.canDeleteAnyCollection;\n }\n\n /**\n * @deprecated\n * This is deprecated with the introduction of Flexible Collections.\n * This will always return false if FlexibleCollections flag is on.\n */\n get canEditAssignedCollections() {\n return this.isManager || this.permissions.editAssignedCollections;\n }\n\n /**\n * @deprecated\n * This is deprecated with the introduction of Flexible Collections.\n * This will always return false if FlexibleCollections flag is on.\n */\n get canDeleteAssignedCollections() {\n return this.isManager || this.permissions.deleteAssignedCollections;\n }\n\n /**\n * @deprecated\n * This is deprecated with the introduction of Flexible Collections.\n * This will always return false if FlexibleCollections flag is on.\n */\n get canViewAssignedCollections() {\n return this.canDeleteAssignedCollections || this.canEditAssignedCollections;\n }\n\n get canManageGroups() {\n return (this.isAdmin || this.permissions.manageGroups) && this.useGroups;\n }\n\n get canManageSso() {\n return (this.isAdmin || this.permissions.manageSso) && this.useSso;\n }\n\n get canManageDomainVerification() {\n return (this.isAdmin || this.permissions.manageSso) && this.useSso;\n }\n\n get canManageScim() {\n return (this.isAdmin || this.permissions.manageScim) && this.useScim;\n }\n\n get canManagePolicies() {\n return (this.isAdmin || this.permissions.managePolicies) && this.usePolicies;\n }\n\n get canManageUsers() {\n return this.isAdmin || this.permissions.manageUsers;\n }\n\n get canManageUsersPassword() {\n return this.isAdmin || this.permissions.manageResetPassword;\n }\n\n get canManageDeviceApprovals() {\n return (this.isAdmin || this.permissions.manageResetPassword) && this.useSso;\n }\n\n get isExemptFromPolicies() {\n return this.canManagePolicies;\n }\n\n get canViewSubscription() {\n if (this.canEditSubscription) {\n return true;\n }\n\n return this.hasProvider && this.providerType === ProviderType.Msp\n ? this.isProviderUser\n : this.isOwner;\n }\n\n get canEditSubscription() {\n return this.hasProvider ? this.isProviderUser : this.isOwner;\n }\n\n get canEditPaymentMethods() {\n return this.canEditSubscription;\n }\n\n get canViewBillingHistory() {\n return this.canEditSubscription;\n }\n\n get hasProvider() {\n return this.providerId != null || this.providerName != null;\n }\n\n get hasReseller() {\n return this.hasProvider && this.providerType === ProviderType.Reseller;\n }\n\n get canAccessSecretsManager() {\n return this.useSecretsManager && this.accessSecretsManager;\n }\n\n get isFreeOrg() {\n // return true if organization needs to be upgraded from a free org\n return !this.useTotp;\n }\n\n get canManageSponsorships() {\n return this.familySponsorshipAvailable || this.familySponsorshipFriendlyName !== null;\n }\n\n static fromJSON(json: Jsonify) {\n if (json == null) {\n return null;\n }\n\n return Object.assign(new Organization(), json, {\n familySponsorshipLastSyncDate: new Date(json.familySponsorshipLastSyncDate),\n familySponsorshipValidUntil: new Date(json.familySponsorshipValidUntil),\n });\n }\n}\n","import { ListResponse } from \"../../../models/response/list.response\";\nimport Domain from \"../../../platform/models/domain/domain-base\";\nimport { PolicyId } from \"../../../types/guid\";\nimport { PolicyType } from \"../../enums\";\nimport { PolicyData } from \"../data/policy.data\";\nimport { PolicyResponse } from \"../response/policy.response\";\n\nexport class Policy extends Domain {\n id: PolicyId;\n organizationId: string;\n type: PolicyType;\n data: any;\n\n /**\n * Warning: a user can be exempt from a policy even if the policy is enabled.\n * @see {@link PolicyService} has methods to tell you whether a policy applies to a user.\n */\n enabled: boolean;\n\n constructor(obj?: PolicyData) {\n super();\n if (obj == null) {\n return;\n }\n\n this.id = obj.id;\n this.organizationId = obj.organizationId;\n this.type = obj.type;\n this.data = obj.data;\n this.enabled = obj.enabled;\n }\n\n static fromResponse(response: PolicyResponse): Policy {\n return new Policy(new PolicyData(response));\n }\n\n static fromListResponse(response: ListResponse): Policy[] | undefined {\n return response.data?.map((d) => Policy.fromResponse(d)) ?? undefined;\n }\n}\n","import { SecretVerificationRequest } from \"../../../auth/models/request/secret-verification.request\";\nimport { OrganizationApiKeyType } from \"../../enums\";\n\nexport class OrganizationApiKeyRequest extends SecretVerificationRequest {\n type: OrganizationApiKeyType = OrganizationApiKeyType.Default;\n}\n","import { BillingSyncConfigRequest } from \"../../../billing/models/request/billing-sync-config.request\";\nimport { OrganizationConnectionType } from \"../../enums\";\n\nimport { ScimConfigRequest } from \"./scim-config.request\";\n\n/**API request config types for OrganizationConnectionRequest */\nexport type OrganizationConnectionRequestConfigs = BillingSyncConfigRequest | ScimConfigRequest;\n\nexport class OrganizationConnectionRequest {\n constructor(\n public organizationId: string,\n public type: OrganizationConnectionType,\n public enabled: boolean,\n public config: OrganizationConnectionRequestConfigs,\n ) {}\n}\n","import { PaymentMethodType, PlanType } from \"../../../billing/enums\";\nimport { InitiationPath } from \"../../../models/request/reference-event.request\";\n\nimport { OrganizationKeysRequest } from \"./organization-keys.request\";\n\nexport class OrganizationCreateRequest {\n name: string;\n businessName: string;\n billingEmail: string;\n planType: PlanType;\n key: string;\n keys: OrganizationKeysRequest;\n paymentMethodType: PaymentMethodType;\n paymentToken: string;\n additionalSeats: number;\n maxAutoscaleSeats: number;\n additionalStorageGb: number;\n premiumAccessAddon: boolean;\n collectionName: string;\n taxIdNumber: string;\n billingAddressLine1: string;\n billingAddressLine2: string;\n billingAddressCity: string;\n billingAddressState: string;\n billingAddressPostalCode: string;\n billingAddressCountry: string;\n useSecretsManager: boolean;\n additionalSmSeats: number;\n additionalServiceAccounts: number;\n isFromSecretsManagerTrial: boolean;\n initiationPath: InitiationPath;\n}\n","import { KeysRequest } from \"../../../models/request/keys.request\";\n\nexport class OrganizationKeysRequest extends KeysRequest {\n constructor(publicKey: string, encryptedPrivateKey: string) {\n super(publicKey, encryptedPrivateKey);\n }\n}\n","export class SelectionReadOnlyRequest {\n id: string;\n readOnly: boolean;\n hidePasswords: boolean;\n manage: boolean;\n\n constructor(id: string, readOnly: boolean, hidePasswords: boolean, manage: boolean) {\n this.id = id;\n this.readOnly = readOnly;\n this.hidePasswords = hidePasswords;\n this.manage = manage;\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\nimport { PolicyId } from \"../../../types/guid\";\nimport { PolicyType } from \"../../enums\";\n\nexport class PolicyResponse extends BaseResponse {\n id: PolicyId;\n organizationId: string;\n type: PolicyType;\n data: any;\n enabled: boolean;\n\n constructor(response: any) {\n super(response);\n this.id = this.getResponseProperty(\"Id\");\n this.organizationId = this.getResponseProperty(\"OrganizationId\");\n this.type = this.getResponseProperty(\"Type\");\n this.data = this.getResponseProperty(\"Data\");\n this.enabled = this.getResponseProperty(\"Enabled\");\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\n\nexport class SelectionReadOnlyResponse extends BaseResponse {\n id: string;\n readOnly: boolean;\n hidePasswords: boolean;\n manage: boolean;\n\n constructor(response: any) {\n super(response);\n this.id = this.getResponseProperty(\"Id\");\n this.readOnly = this.getResponseProperty(\"ReadOnly\");\n this.hidePasswords = this.getResponseProperty(\"HidePasswords\");\n this.manage = this.getResponseProperty(\"Manage\");\n }\n}\n","import { Verification } from \"../types/verification\";\n\nexport abstract class AccountApiService {\n abstract deleteAccount(verification: Verification): Promise;\n}\n","import { Observable } from \"rxjs\";\n\nimport { UserId } from \"../../types/guid\";\nimport { AuthenticationStatus } from \"../enums/authentication-status\";\n\n/**\n * Holds information about an account for use in the AccountService\n * if more information is added, be sure to update the equality method.\n */\nexport type AccountInfo = {\n status: AuthenticationStatus;\n email: string;\n name: string | undefined;\n};\n\nexport function accountInfoEqual(a: AccountInfo, b: AccountInfo) {\n return a?.status === b?.status && a?.email === b?.email && a?.name === b?.name;\n}\n\nexport abstract class AccountService {\n accounts$: Observable>;\n activeAccount$: Observable<{ id: UserId | undefined } & AccountInfo>;\n accountLock$: Observable;\n accountLogout$: Observable;\n /**\n * Updates the `accounts$` observable with the new account data.\n * @param userId\n * @param accountData\n */\n abstract addAccount(userId: UserId, accountData: AccountInfo): Promise;\n /**\n * updates the `accounts$` observable with the new preferred name for the account.\n * @param userId\n * @param name\n */\n abstract setAccountName(userId: UserId, name: string): Promise;\n /**\n * updates the `accounts$` observable with the new email for the account.\n * @param userId\n * @param email\n */\n abstract setAccountEmail(userId: UserId, email: string): Promise;\n /**\n * Updates the `accounts$` observable with the new account status.\n * Also emits the `accountLock$` or `accountLogout$` observable if the status is `Locked` or `LoggedOut` respectively.\n * @param userId\n * @param status\n */\n abstract setAccountStatus(userId: UserId, status: AuthenticationStatus): Promise;\n /**\n * Updates the `accounts$` observable with the new account status if the current status is higher than the `maxStatus`.\n *\n * This method only downgrades status to the maximum value sent in, it will not increase authentication status.\n *\n * @example An account is transitioning from unlocked to logged out. If callbacks that set the status to locked occur\n * after it is updated to logged out, the account will be in the incorrect state.\n * @param userId The user id of the account to be updated.\n * @param maxStatus The new status of the account.\n */\n abstract setMaxAccountStatus(userId: UserId, maxStatus: AuthenticationStatus): Promise;\n /**\n * Updates the `activeAccount$` observable with the new active account.\n * @param userId\n */\n abstract switchAccount(userId: UserId): Promise;\n}\n\nexport abstract class InternalAccountService extends AccountService {\n abstract delete(): void;\n}\n","export abstract class AnonymousHubService {\n createHubConnection: (token: string) => void;\n stopHubConnection: () => void;\n}\n","import { AuthenticationStatus } from \"../enums/authentication-status\";\n\nexport abstract class AuthService {\n getAuthStatus: (userId?: string) => Promise;\n logOut: (callback: () => void) => void;\n}\n","import { Observable } from \"rxjs\";\n\nimport { UserId } from \"../../types/guid\";\n\nexport abstract class AvatarService {\n /**\n * An observable monitoring the active user's avatar color.\n * The observable updates when the avatar color changes.\n */\n avatarColor$: Observable;\n /**\n * Sets the avatar color of the active user\n *\n * @param color the color to set the avatar color to\n * @returns a promise that resolves when the avatar color is set\n */\n abstract setAvatarColor(color: string): Promise;\n /**\n * Sets the avatar color for the given user, meant to be used via sync.\n *\n * @remarks This is meant to be used for getting an updated avatar color from\n * the sync endpoint. If the user is changing their avatar color\n * on device, you should instead call {@link setAvatarColor}.\n *\n * @param userId The user id for the user to set the avatar color for\n * @param color The color to set the avatar color to\n */\n abstract setSyncAvatarColor(userId: UserId, color: string): Promise;\n /**\n * Gets the avatar color of the specified user.\n *\n * @remarks This is most useful for account switching where we show an\n * avatar for each account. If you only need the active user's\n * avatar color, use the avatarColor$ observable above instead.\n *\n * @param userId the userId of the user whose avatar color should be retreived\n * @return an Observable that emits a string of the avatar color of the specified user\n */\n abstract getUserAvatarColor$(userId: UserId): Observable;\n}\n","import { Observable } from \"rxjs\";\n\nimport { EncString } from \"../../platform/models/domain/enc-string\";\nimport { DeviceKey, UserKey } from \"../../types/key\";\nimport { DeviceResponse } from \"../abstractions/devices/responses/device.response\";\n\nexport abstract class DeviceTrustCryptoServiceAbstraction {\n supportsDeviceTrust$: Observable;\n /**\n * @description Retrieves the users choice to trust the device which can only happen after decryption\n * Note: this value should only be used once and then reset\n */\n getShouldTrustDevice: () => Promise;\n setShouldTrustDevice: (value: boolean) => Promise;\n\n trustDeviceIfRequired: () => Promise;\n\n trustDevice: () => Promise;\n getDeviceKey: () => Promise;\n decryptUserKeyWithDeviceKey: (\n encryptedDevicePrivateKey: EncString,\n encryptedUserKey: EncString,\n deviceKey?: DeviceKey,\n ) => Promise;\n rotateDevicesTrust: (newUserKey: UserKey, masterPasswordHash: string) => Promise;\n}\n","import { ListResponse } from \"../../models/response/list.response\";\nimport { DeviceResponse } from \"../abstractions/devices/responses/device.response\";\nimport { SecretVerificationRequest } from \"../models/request/secret-verification.request\";\nimport { UpdateDevicesTrustRequest } from \"../models/request/update-devices-trust.request\";\nimport { ProtectedDeviceResponse } from \"../models/response/protected-device.response\";\n\nexport abstract class DevicesApiServiceAbstraction {\n getKnownDevice: (email: string, deviceIdentifier: string) => Promise;\n\n getDeviceByIdentifier: (deviceIdentifier: string) => Promise;\n\n getDevices: () => Promise>;\n\n updateTrustedDeviceKeys: (\n deviceIdentifier: string,\n devicePublicKeyEncryptedUserKey: string,\n userKeyEncryptedDevicePublicKey: string,\n deviceKeyEncryptedDevicePrivateKey: string,\n ) => Promise;\n\n updateTrust: (\n updateDevicesTrustRequestModel: UpdateDevicesTrustRequest,\n deviceIdentifier: string,\n ) => Promise;\n\n getDeviceKeys: (\n deviceIdentifier: string,\n secretVerificationRequest: SecretVerificationRequest,\n ) => Promise;\n}\n","import { Observable } from \"rxjs\";\n\nimport { DeviceView } from \"./views/device.view\";\n\nexport abstract class DevicesServiceAbstraction {\n getDevices$: () => Observable>;\n getDeviceByIdentifier$: (deviceIdentifier: string) => Observable;\n isDeviceKnownForUser$: (email: string, deviceIdentifier: string) => Observable;\n updateTrustedDeviceKeys$: (\n deviceIdentifier: string,\n devicePublicKeyEncryptedUserKey: string,\n userKeyEncryptedDevicePublicKey: string,\n deviceKeyEncryptedDevicePrivateKey: string,\n ) => Observable;\n}\n","import { Organization } from \"../../admin-console/models/domain/organization\";\nimport { IdentityTokenResponse } from \"../models/response/identity-token.response\";\n\nexport abstract class KeyConnectorService {\n setMasterKeyFromUrl: (url?: string) => Promise;\n getManagingOrganization: () => Promise;\n getUsesKeyConnector: () => Promise;\n migrateUser: () => Promise;\n userNeedsMigration: () => Promise;\n convertNewSsoUserToKeyConnector: (\n tokenResponse: IdentityTokenResponse,\n orgId: string,\n ) => Promise;\n setUsesKeyConnector: (enabled: boolean) => Promise;\n setConvertAccountRequired: (status: boolean) => Promise;\n getConvertAccountRequired: () => Promise;\n removeConvertAccountRequired: () => Promise;\n clear: () => Promise;\n}\n","export abstract class LoginService {\n getEmail: () => string;\n getRememberEmail: () => boolean;\n setEmail: (value: string) => void;\n setRememberEmail: (value: boolean) => void;\n clearValues: () => void;\n saveEmailSettings: () => Promise;\n}\n","import { UserKey } from \"../../types/key\";\n\nexport abstract class PasswordResetEnrollmentServiceAbstraction {\n /*\n * Checks the user's enrollment status and enrolls them if required\n */\n abstract enrollIfRequired(organizationSsoIdentifier: string): Promise;\n\n /**\n * Enroll current user in password reset\n * @param organizationId - Organization in which to enroll the user\n * @returns Promise that resolves when the user is enrolled\n * @throws Error if the action fails\n */\n abstract enroll(organizationId: string): Promise;\n\n /**\n * Enroll user in password reset\n * @param organizationId - Organization in which to enroll the user\n * @param userId - User to enroll\n * @param userKey - User's symmetric key\n * @returns Promise that resolves when the user is enrolled\n * @throws Error if the action fails\n */\n abstract enroll(organizationId: string, userId: string, userKey: UserKey): Promise;\n}\n","export abstract class SsoLoginServiceAbstraction {\n /**\n * Gets the code verifier used for SSO.\n *\n * PKCE requires a `code_verifier` to be generated which is then used to derive a `code_challenge`.\n * While the `code_challenge` is verified upon return from the SSO provider, the `code_verifier` is\n * sent to the server with the `authorization_code` so that the server can derive the same `code_challenge`\n * and verify it matches the one sent in the request for the `authorization_code`.\n * @see https://datatracker.ietf.org/doc/html/rfc7636\n * @returns The code verifier used for SSO.\n */\n getCodeVerifier: () => Promise;\n /**\n * Sets the code verifier used for SSO.\n *\n * PKCE requires a `code_verifier` to be generated which is then used to derive a `code_challenge`.\n * While the `code_challenge` is verified upon return from the SSO provider, the `code_verifier` is\n * sent to the server with the `authorization_code` so that the server can derive the same `code_challenge`\n * and verify it matches the one sent in the request for the `authorization_code`.\n * @see https://datatracker.ietf.org/doc/html/rfc7636\n */\n setCodeVerifier: (codeVerifier: string) => Promise;\n /**\n * Gets the value of the SSO state.\n *\n * `state` is a parameter used in the Authorization Code Flow of OAuth 2.0 to prevent CSRF attacks. It is an\n * opaque value generated on the client and is sent to the authorization server. The authorization server\n * returns the `state` in the callback and the client verifies that the value returned matches the value sent.\n * @see https://datatracker.ietf.org/doc/html/rfc6749#section-4.1\n * @returns The SSO state.\n */\n getSsoState: () => Promise;\n /**\n * Sets the value of the SSO state.\n *\n * `state` is a parameter used in the Authorization Code Flow of OAuth 2.0 to prevent CSRF attacks. It is an\n * opaque value generated on the client and is sent to the authorization server. The authorization server\n * returns the `state` in the callback and the client verifies that the value returned matches the value sent.\n * @see https://datatracker.ietf.org/doc/html/rfc6749#section-4.1\n */\n setSsoState: (ssoState: string) => Promise;\n /**\n * Gets the value of the user's organization sso identifier.\n *\n * This should only be used during the SSO flow to identify the organization that the user is attempting to log in to.\n * Do not use this value outside of the SSO login flow.\n * @returns The user's organization identifier.\n */\n getOrganizationSsoIdentifier: () => Promise;\n /**\n * Sets the value of the user's organization sso identifier.\n *\n * This should only be used during the SSO flow to identify the organization that the user is attempting to log in to.\n * Do not use this value outside of the SSO login flow.\n */\n setOrganizationSsoIdentifier: (organizationIdentifier: string) => Promise;\n /**\n * Gets the user's email.\n * Note: This should only be used during the SSO flow to identify the user that is attempting to log in.\n * @returns The user's email.\n */\n getSsoEmail: () => Promise;\n /**\n * Sets the user's email.\n * Note: This should only be used during the SSO flow to identify the user that is attempting to log in.\n * @param email The user's email.\n * @returns A promise that resolves when the email has been set.\n *\n */\n setSsoEmail: (email: string) => Promise;\n /**\n * Gets the value of the active user's organization sso identifier.\n *\n * This should only be used post successful SSO login once the user is initialized.\n */\n getActiveUserOrganizationSsoIdentifier: () => Promise;\n /**\n * Sets the value of the active user's organization sso identifier.\n *\n * This should only be used post successful SSO login once the user is initialized.\n */\n setActiveUserOrganizationSsoIdentifier: (organizationIdentifier: string) => Promise;\n}\n","import { VaultTimeoutAction } from \"../../enums/vault-timeout-action.enum\";\nimport { UserId } from \"../../types/guid\";\nimport { DecodedAccessToken } from \"../services/token.service\";\n\nexport abstract class TokenService {\n /**\n * Sets the access token, refresh token, API Key Client ID, and API Key Client Secret in memory or disk\n * based on the given vaultTimeoutAction and vaultTimeout and the derived access token user id.\n * Note: for platforms that support secure storage, the access & refresh tokens are stored in secure storage instead of on disk.\n * Note 2: this method also enforces always setting the access token and the refresh token together as\n * we can retrieve the user id required to set the refresh token from the access token for efficiency.\n * @param accessToken The access token to set.\n * @param vaultTimeoutAction The action to take when the vault times out.\n * @param vaultTimeout The timeout for the vault.\n * @param refreshToken The optional refresh token to set. Note: this is undefined when using the CLI Login Via API Key flow\n * @param clientIdClientSecret The API Key Client ID and Client Secret to set.\n *\n * @returns A promise that resolves when the tokens have been set.\n */\n setTokens: (\n accessToken: string,\n vaultTimeoutAction: VaultTimeoutAction,\n vaultTimeout: number | null,\n refreshToken?: string,\n clientIdClientSecret?: [string, string],\n ) => Promise;\n\n /**\n * Clears the access token, refresh token, API Key Client ID, and API Key Client Secret out of memory, disk, and secure storage if supported.\n * @param userId The optional user id to clear the tokens for; if not provided, the active user id is used.\n * @returns A promise that resolves when the tokens have been cleared.\n */\n clearTokens: (userId?: UserId) => Promise;\n\n /**\n * Sets the access token in memory or disk based on the given vaultTimeoutAction and vaultTimeout\n * and the user id read off the access token\n * Note: for platforms that support secure storage, the access & refresh tokens are stored in secure storage instead of on disk.\n * @param accessToken The access token to set.\n * @param vaultTimeoutAction The action to take when the vault times out.\n * @param vaultTimeout The timeout for the vault.\n * @returns A promise that resolves when the access token has been set.\n */\n setAccessToken: (\n accessToken: string,\n vaultTimeoutAction: VaultTimeoutAction,\n vaultTimeout: number | null,\n ) => Promise;\n\n // TODO: revisit having this public clear method approach once the state service is fully deprecated.\n /**\n * Clears the access token for the given user id out of memory, disk, and secure storage if supported.\n * @param userId The optional user id to clear the access token for; if not provided, the active user id is used.\n * @returns A promise that resolves when the access token has been cleared.\n *\n * Note: This method is required so that the StateService doesn't have to inject the VaultTimeoutSettingsService to\n * pass in the vaultTimeoutAction and vaultTimeout.\n * This avoids a circular dependency between the StateService, TokenService, and VaultTimeoutSettingsService.\n */\n clearAccessToken: (userId?: UserId) => Promise;\n\n /**\n * Gets the access token\n * @param userId - The optional user id to get the access token for; if not provided, the active user is used.\n * @returns A promise that resolves with the access token or undefined.\n */\n getAccessToken: (userId?: UserId) => Promise;\n\n /**\n * Gets the refresh token.\n * @param userId - The optional user id to get the refresh token for; if not provided, the active user is used.\n * @returns A promise that resolves with the refresh token or undefined.\n */\n getRefreshToken: (userId?: UserId) => Promise;\n\n /**\n * Sets the API Key Client ID for the active user id in memory or disk based on the given vaultTimeoutAction and vaultTimeout.\n * @param clientId The API Key Client ID to set.\n * @param vaultTimeoutAction The action to take when the vault times out.\n * @param vaultTimeout The timeout for the vault.\n * @returns A promise that resolves when the API Key Client ID has been set.\n */\n setClientId: (\n clientId: string,\n vaultTimeoutAction: VaultTimeoutAction,\n vaultTimeout: number | null,\n userId?: UserId,\n ) => Promise;\n\n /**\n * Gets the API Key Client ID for the active user.\n * @returns A promise that resolves with the API Key Client ID or undefined\n */\n getClientId: (userId?: UserId) => Promise;\n\n /**\n * Sets the API Key Client Secret for the active user id in memory or disk based on the given vaultTimeoutAction and vaultTimeout.\n * @param clientSecret The API Key Client Secret to set.\n * @param vaultTimeoutAction The action to take when the vault times out.\n * @param vaultTimeout The timeout for the vault.\n * @returns A promise that resolves when the API Key Client Secret has been set.\n */\n setClientSecret: (\n clientSecret: string,\n vaultTimeoutAction: VaultTimeoutAction,\n vaultTimeout: number | null,\n userId?: UserId,\n ) => Promise;\n\n /**\n * Gets the API Key Client Secret for the active user.\n * @returns A promise that resolves with the API Key Client Secret or undefined\n */\n getClientSecret: (userId?: UserId) => Promise;\n\n /**\n * Sets the two factor token for the given email in global state.\n * The two factor token is set when the user checks \"remember me\" when completing two factor\n * authentication and it is used to bypass two factor authentication for a period of time.\n * @param email The email to set the two factor token for.\n * @param twoFactorToken The two factor token to set.\n * @returns A promise that resolves when the two factor token has been set.\n */\n setTwoFactorToken: (email: string, twoFactorToken: string) => Promise;\n\n /**\n * Gets the two factor token for the given email.\n * @param email The email to get the two factor token for.\n * @returns A promise that resolves with the two factor token for the given email or null if it isn't found.\n */\n getTwoFactorToken: (email: string) => Promise;\n\n /**\n * Clears the two factor token for the given email out of global state.\n * @param email The email to clear the two factor token for.\n * @returns A promise that resolves when the two factor token has been cleared.\n */\n clearTwoFactorToken: (email: string) => Promise;\n\n /**\n * Decodes the access token.\n * @param token The access token to decode.\n * @returns A promise that resolves with the decoded access token.\n */\n decodeAccessToken: (token?: string) => Promise;\n\n /**\n * Gets the expiration date for the access token. Returns if token can't be decoded or has no expiration\n * @returns A promise that resolves with the expiration date for the access token.\n */\n getTokenExpirationDate: () => Promise;\n\n /**\n * Calculates the adjusted time in seconds until the access token expires, considering an optional offset.\n *\n * @param {number} [offsetSeconds=0] Optional seconds to subtract from the remaining time,\n * creating a buffer before actual expiration. Useful for preemptive actions\n * before token expiry. A value of 0 or omitting this parameter calculates time\n * based on the actual expiration.\n * @returns {Promise} Promise resolving to the adjusted seconds remaining.\n */\n tokenSecondsRemaining: (offsetSeconds?: number) => Promise;\n\n /**\n * Checks if the access token needs to be refreshed.\n * @param {number} [minutes=5] - Optional number of minutes before the access token expires to consider refreshing it.\n * @returns A promise that resolves with a boolean indicating if the access token needs to be refreshed.\n */\n tokenNeedsRefresh: (minutes?: number) => Promise;\n\n /**\n * Gets the user id for the active user from the access token.\n * @returns A promise that resolves with the user id for the active user.\n * @deprecated Use AccountService.activeAccount$ instead.\n */\n getUserId: () => Promise;\n\n /**\n * Gets the email for the active user from the access token.\n * @returns A promise that resolves with the email for the active user.\n * @deprecated Use AccountService.activeAccount$ instead.\n */\n getEmail: () => Promise;\n\n /**\n * Gets the email verified status for the active user from the access token.\n * @returns A promise that resolves with the email verified status for the active user.\n */\n getEmailVerified: () => Promise;\n\n /**\n * Gets the name for the active user from the access token.\n * @returns A promise that resolves with the name for the active user.\n * @deprecated Use AccountService.activeAccount$ instead.\n */\n getName: () => Promise;\n\n /**\n * Gets the issuer for the active user from the access token.\n * @returns A promise that resolves with the issuer for the active user.\n */\n getIssuer: () => Promise;\n\n /**\n * Gets whether or not the user authenticated via an external mechanism.\n * @returns A promise that resolves with a boolean representing the user's external authN status.\n */\n getIsExternal: () => Promise;\n}\n","import { TwoFactorProviderType } from \"../enums/two-factor-provider-type\";\nimport { IdentityTwoFactorResponse } from \"../models/response/identity-two-factor.response\";\n\nexport interface TwoFactorProviderDetails {\n type: TwoFactorProviderType;\n name: string;\n description: string;\n priority: number;\n sort: number;\n premium: boolean;\n}\n\nexport abstract class TwoFactorService {\n init: () => void;\n getSupportedProviders: (win: Window) => TwoFactorProviderDetails[];\n getDefaultProvider: (webAuthnSupported: boolean) => TwoFactorProviderType;\n setSelectedProvider: (type: TwoFactorProviderType) => void;\n clearSelectedProvider: () => void;\n\n setProviders: (response: IdentityTwoFactorResponse) => void;\n clearProviders: () => void;\n getProviders: () => Map;\n}\n","import { SecretVerificationRequest } from \"../../models/request/secret-verification.request\";\nimport { UserVerificationOptions } from \"../../types/user-verification-options\";\nimport { Verification } from \"../../types/verification\";\n\nexport abstract class UserVerificationService {\n buildRequest: (\n verification: Verification,\n requestClass?: new () => T,\n alreadyHashed?: boolean,\n ) => Promise;\n verifyUser: (verification: Verification) => Promise;\n requestOTP: () => Promise;\n /**\n * Check if user has master password or only uses passwordless technologies to log in\n * @param userId The user id to check. If not provided, the current user is used\n * @returns True if the user has a master password\n */\n hasMasterPassword: (userId?: string) => Promise;\n /**\n * Check if the user has a master password and has used it during their current session\n * @param userId The user id to check. If not provided, the current user id used\n * @returns True if the user has a master password and has used it in the current session\n */\n hasMasterPasswordAndMasterKeyHash: (userId?: string) => Promise;\n\n getAvailableVerificationOptions: (\n verificationType: keyof UserVerificationOptions,\n ) => Promise;\n}\n","import { PrfKey } from \"../../../types/key\";\n\n/**\n * Contains methods for all crypto operations specific to the WebAuthn login flow.\n */\nexport abstract class WebAuthnLoginPrfCryptoServiceAbstraction {\n /**\n * Get the salt used to generate the PRF-output used when logging in with WebAuthn.\n */\n getLoginWithPrfSalt: () => Promise;\n\n /**\n * Create a symmetric key from the PRF-output by stretching it.\n * This should be used as `ExternalKey` with `RotateableKeySet`.\n */\n createSymmetricKeyFromPrf: (prf: ArrayBuffer) => Promise;\n}\n","import { AuthResult } from \"../../models/domain/auth-result\";\nimport { WebAuthnLoginCredentialAssertionOptionsView } from \"../../models/view/webauthn-login/webauthn-login-credential-assertion-options.view\";\nimport { WebAuthnLoginCredentialAssertionView } from \"../../models/view/webauthn-login/webauthn-login-credential-assertion.view\";\n\n/**\n * Service for logging in with WebAuthnLogin credentials.\n */\nexport abstract class WebAuthnLoginServiceAbstraction {\n /**\n * Gets the credential assertion options needed for initiating the WebAuthn\n * authentication process. It should provide the challenge and other data\n * (whether FIDO2 user verification is required, the relying party id, timeout duration for the process to complete, etc.)\n * for the authenticator.\n */\n getCredentialAssertionOptions: () => Promise;\n\n /**\n * Asserts the credential. This involves user interaction with the authenticator\n * to sign a challenge with a private key (proving ownership of the private key).\n * This will trigger the browsers WebAuthn API to assert a credential. A PRF-output might\n * be included in the response if the authenticator supports it.\n *\n * @param {WebAuthnLoginCredentialAssertionOptionsView} credentialAssertionOptions - The options provided by the\n * `getCredentialAssertionOptions` method, including the challenge and other data.\n * @returns {WebAuthnLoginCredentialAssertionView} The assertion obtained from the authenticator.\n * If the assertion is not successfully obtained, it returns undefined.\n */\n assertCredential: (\n credentialAssertionOptions: WebAuthnLoginCredentialAssertionOptionsView,\n ) => Promise;\n\n /**\n * Logs the user in using the assertion obtained from the authenticator.\n * It completes the authentication process if the assertion is successfully validated server side:\n * the server verifies the signed challenge with the corresponding public key.\n *\n * @param {WebAuthnLoginCredentialAssertionView} assertion - The assertion obtained from the authenticator\n * that needs to be validated for login.\n */\n logIn: (assertion: WebAuthnLoginCredentialAssertionView) => Promise;\n}\n","export enum AuthenticationStatus {\n LoggedOut = 0,\n Locked = 1,\n Unlocked = 2,\n}\n","export enum AuthenticationType {\n Password = 0,\n Sso = 1,\n UserApiKey = 2,\n AuthRequest = 3,\n WebAuthn = 4,\n}\n","export enum SsoType {\n None = 0,\n OpenIdConnect = 1,\n Saml2 = 2,\n}\n\nexport enum MemberDecryptionType {\n MasterPassword = 0,\n KeyConnector = 1,\n TrustedDeviceEncryption = 2,\n}\n\nexport enum OpenIdConnectRedirectBehavior {\n RedirectGet = 0,\n FormPost = 1,\n}\n\nexport enum Saml2BindingType {\n HttpRedirect = 1,\n HttpPost = 2,\n}\n\nexport enum Saml2NameIdFormat {\n NotConfigured = 0,\n Unspecified = 1,\n EmailAddress = 2,\n X509SubjectName = 3,\n WindowsDomainQualifiedName = 4,\n KerberosPrincipalName = 5,\n EntityIdentifier = 6,\n Persistent = 7,\n Transient = 8,\n}\n\nexport enum Saml2SigningBehavior {\n IfIdpWantAuthnRequestsSigned = 0,\n Always = 1,\n Never = 3,\n}\n","export enum TwoFactorProviderType {\n Authenticator = 0,\n Email = 1,\n Duo = 2,\n Yubikey = 3,\n U2f = 4,\n Remember = 5,\n OrganizationDuo = 6,\n WebAuthn = 7,\n}\n","export enum VerificationType {\n MasterPassword = 0,\n OTP = 1,\n PIN = 2,\n Biometrics = 3,\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\nimport {\n MemberDecryptionType,\n OpenIdConnectRedirectBehavior,\n Saml2BindingType,\n Saml2NameIdFormat,\n Saml2SigningBehavior,\n SsoType,\n} from \"../../enums/sso\";\nimport { SsoConfigView } from \"../view/sso-config.view\";\n\nexport class SsoConfigApi extends BaseResponse {\n static fromView(view: SsoConfigView, api = new SsoConfigApi()) {\n api.configType = view.configType;\n api.memberDecryptionType = view.memberDecryptionType;\n\n api.keyConnectorUrl = view.keyConnectorUrl;\n\n if (api.configType === SsoType.OpenIdConnect) {\n api.authority = view.openId.authority;\n api.clientId = view.openId.clientId;\n api.clientSecret = view.openId.clientSecret;\n api.metadataAddress = view.openId.metadataAddress;\n api.redirectBehavior = view.openId.redirectBehavior;\n api.getClaimsFromUserInfoEndpoint = view.openId.getClaimsFromUserInfoEndpoint;\n api.additionalScopes = view.openId.additionalScopes;\n api.additionalUserIdClaimTypes = view.openId.additionalUserIdClaimTypes;\n api.additionalEmailClaimTypes = view.openId.additionalEmailClaimTypes;\n api.additionalNameClaimTypes = view.openId.additionalNameClaimTypes;\n api.acrValues = view.openId.acrValues;\n api.expectedReturnAcrValue = view.openId.expectedReturnAcrValue;\n } else if (api.configType === SsoType.Saml2) {\n api.spUniqueEntityId = view.saml.spUniqueEntityId;\n api.spNameIdFormat = view.saml.spNameIdFormat;\n api.spOutboundSigningAlgorithm = view.saml.spOutboundSigningAlgorithm;\n api.spSigningBehavior = view.saml.spSigningBehavior;\n api.spMinIncomingSigningAlgorithm = view.saml.spMinIncomingSigningAlgorithm;\n api.spWantAssertionsSigned = view.saml.spWantAssertionsSigned;\n api.spValidateCertificates = view.saml.spValidateCertificates;\n\n api.idpEntityId = view.saml.idpEntityId;\n api.idpBindingType = view.saml.idpBindingType;\n api.idpSingleSignOnServiceUrl = view.saml.idpSingleSignOnServiceUrl;\n api.idpSingleLogoutServiceUrl = view.saml.idpSingleLogoutServiceUrl;\n api.idpX509PublicCert = view.saml.idpX509PublicCert;\n api.idpOutboundSigningAlgorithm = view.saml.idpOutboundSigningAlgorithm;\n api.idpAllowUnsolicitedAuthnResponse = view.saml.idpAllowUnsolicitedAuthnResponse;\n api.idpWantAuthnRequestsSigned = view.saml.idpWantAuthnRequestsSigned;\n\n // Value is inverted in the api model (disable instead of allow)\n api.idpDisableOutboundLogoutRequests = !view.saml.idpAllowOutboundLogoutRequests;\n }\n\n return api;\n }\n configType: SsoType;\n memberDecryptionType: MemberDecryptionType;\n\n keyConnectorUrl: string;\n\n // OpenId\n authority: string;\n clientId: string;\n clientSecret: string;\n metadataAddress: string;\n redirectBehavior: OpenIdConnectRedirectBehavior;\n getClaimsFromUserInfoEndpoint: boolean;\n additionalScopes: string;\n additionalUserIdClaimTypes: string;\n additionalEmailClaimTypes: string;\n additionalNameClaimTypes: string;\n acrValues: string;\n expectedReturnAcrValue: string;\n\n // SAML\n spUniqueEntityId: boolean;\n spNameIdFormat: Saml2NameIdFormat;\n spOutboundSigningAlgorithm: string;\n spSigningBehavior: Saml2SigningBehavior;\n spMinIncomingSigningAlgorithm: string;\n spWantAssertionsSigned: boolean;\n spValidateCertificates: boolean;\n\n idpEntityId: string;\n idpBindingType: Saml2BindingType;\n idpSingleSignOnServiceUrl: string;\n idpSingleLogoutServiceUrl: string;\n idpX509PublicCert: string;\n idpOutboundSigningAlgorithm: string;\n idpAllowUnsolicitedAuthnResponse: boolean;\n idpDisableOutboundLogoutRequests: boolean;\n idpWantAuthnRequestsSigned: boolean;\n\n constructor(data: any = null) {\n super(data);\n if (data == null) {\n return;\n }\n\n this.configType = this.getResponseProperty(\"ConfigType\");\n this.memberDecryptionType = this.getResponseProperty(\"MemberDecryptionType\");\n\n this.keyConnectorUrl = this.getResponseProperty(\"KeyConnectorUrl\");\n\n this.authority = this.getResponseProperty(\"Authority\");\n this.clientId = this.getResponseProperty(\"ClientId\");\n this.clientSecret = this.getResponseProperty(\"ClientSecret\");\n this.metadataAddress = this.getResponseProperty(\"MetadataAddress\");\n this.redirectBehavior = this.getResponseProperty(\"RedirectBehavior\");\n this.getClaimsFromUserInfoEndpoint = this.getResponseProperty(\"GetClaimsFromUserInfoEndpoint\");\n this.additionalScopes = this.getResponseProperty(\"AdditionalScopes\");\n this.additionalUserIdClaimTypes = this.getResponseProperty(\"AdditionalUserIdClaimTypes\");\n this.additionalEmailClaimTypes = this.getResponseProperty(\"AdditionalEmailClaimTypes\");\n this.additionalNameClaimTypes = this.getResponseProperty(\"AdditionalNameClaimTypes\");\n this.acrValues = this.getResponseProperty(\"AcrValues\");\n this.expectedReturnAcrValue = this.getResponseProperty(\"ExpectedReturnAcrValue\");\n\n this.spUniqueEntityId = this.getResponseProperty(\"SpUniqueEntityId\");\n this.spNameIdFormat = this.getResponseProperty(\"SpNameIdFormat\");\n this.spOutboundSigningAlgorithm = this.getResponseProperty(\"SpOutboundSigningAlgorithm\");\n this.spSigningBehavior = this.getResponseProperty(\"SpSigningBehavior\");\n this.spMinIncomingSigningAlgorithm = this.getResponseProperty(\"SpMinIncomingSigningAlgorithm\");\n this.spWantAssertionsSigned = this.getResponseProperty(\"SpWantAssertionsSigned\");\n this.spValidateCertificates = this.getResponseProperty(\"SpValidateCertificates\");\n\n this.idpEntityId = this.getResponseProperty(\"IdpEntityId\");\n this.idpBindingType = this.getResponseProperty(\"IdpBindingType\");\n this.idpSingleSignOnServiceUrl = this.getResponseProperty(\"IdpSingleSignOnServiceUrl\");\n this.idpSingleLogoutServiceUrl = this.getResponseProperty(\"IdpSingleLogoutServiceUrl\");\n this.idpX509PublicCert = this.getResponseProperty(\"IdpX509PublicCert\");\n this.idpOutboundSigningAlgorithm = this.getResponseProperty(\"IdpOutboundSigningAlgorithm\");\n this.idpAllowUnsolicitedAuthnResponse = this.getResponseProperty(\n \"IdpAllowUnsolicitedAuthnResponse\",\n );\n this.idpDisableOutboundLogoutRequests = this.getResponseProperty(\n \"IdpDisableOutboundLogoutRequests\",\n );\n this.idpWantAuthnRequestsSigned = this.getResponseProperty(\"IdpWantAuthnRequestsSigned\");\n }\n}\n","import { Utils } from \"../../../platform/misc/utils\";\n\n// TODO: Tech Debt: potentially create a type Storage shape vs using a class here in the future\n// type StorageShape {\n// id: string;\n// privateKey: string;\n// }\n// so we can get rid of the any type passed into fromJSON and coming out of ToJSON\nexport class AdminAuthRequestStorable {\n id: string;\n privateKey: Uint8Array;\n\n constructor(init?: Partial) {\n if (init) {\n Object.assign(this, init);\n }\n }\n\n toJSON() {\n return {\n id: this.id,\n privateKey: Utils.fromBufferToByteString(this.privateKey),\n };\n }\n\n static fromJSON(obj: any): AdminAuthRequestStorable {\n if (obj == null) {\n return null;\n }\n\n let privateKeyBuffer = null;\n if (obj.privateKey) {\n privateKeyBuffer = Utils.fromByteStringToArray(obj.privateKey);\n }\n\n return new AdminAuthRequestStorable({\n id: obj.id,\n privateKey: privateKeyBuffer,\n });\n }\n}\n","/*\n * This enum is used to determine if a user should be forced to initially set or reset their password\n * on login (server flag) or unlock via MP (client evaluation).\n */\nexport enum ForceSetPasswordReason {\n /**\n * A password reset should not be forced.\n */\n None,\n\n /**\n * Occurs when an organization admin forces a user to reset their password.\n * Communicated via server flag.\n */\n AdminForcePasswordReset,\n\n /**\n * Occurs when a user logs in / unlocks their vault with a master password that does not meet an organization's\n * master password policy that is enforced on login/unlock.\n * Only set client side b/c server can't evaluate MP.\n */\n WeakMasterPassword,\n\n /**\n * Occurs when a TDE user without a password obtains the password reset permission.\n * Set post login & decryption client side and by server in sync (to catch logged in users).\n */\n TdeUserWithoutPasswordHasPasswordResetPermission,\n}\n","export class KdfConfig {\n iterations: number;\n memory?: number;\n parallelism?: number;\n\n constructor(iterations: number, memory?: number, parallelism?: number) {\n this.iterations = iterations;\n this.memory = memory;\n this.parallelism = parallelism;\n }\n}\n","import { Jsonify } from \"type-fest\";\n\nimport { DeviceType } from \"../../../../enums\";\nimport { PlatformUtilsService } from \"../../../../platform/abstractions/platform-utils.service\";\n\nexport class DeviceRequest {\n type: DeviceType;\n name: string;\n identifier: string;\n pushToken?: string;\n\n constructor(appId: string, platformUtilsService: PlatformUtilsService) {\n this.type = platformUtilsService.getDevice();\n this.name = platformUtilsService.getDeviceString();\n this.identifier = appId;\n this.pushToken = null;\n }\n\n static fromJSON(json: Jsonify) {\n return Object.assign(Object.create(DeviceRequest.prototype), json);\n }\n}\n","import { TwoFactorProviderType } from \"../../../enums/two-factor-provider-type\";\n\nexport class TokenTwoFactorRequest {\n constructor(\n public provider: TwoFactorProviderType = null,\n public token: string = null,\n public remember: boolean = false,\n ) {}\n}\n","import { DeviceRequest } from \"./device.request\";\nimport { TokenTwoFactorRequest } from \"./token-two-factor.request\";\n\nexport abstract class TokenRequest {\n protected device?: DeviceRequest;\n protected authRequest: string;\n\n constructor(\n protected twoFactor?: TokenTwoFactorRequest,\n device?: DeviceRequest,\n ) {\n this.device = device != null ? device : null;\n }\n\n // eslint-disable-next-line\n alterIdentityTokenHeaders(headers: Headers) {\n // Implemented in subclass if required\n }\n\n setTwoFactor(twoFactor: TokenTwoFactorRequest | undefined) {\n this.twoFactor = twoFactor;\n }\n\n setAuthRequestAccessCode(accessCode: string) {\n this.authRequest = accessCode;\n }\n\n protected toIdentityToken(clientId: string) {\n const obj: any = {\n scope: \"api offline_access\",\n client_id: clientId,\n };\n\n if (this.device) {\n obj.deviceType = this.device.type;\n obj.deviceIdentifier = this.device.identifier;\n obj.deviceName = this.device.name;\n // no push tokens for browser apps yet\n // obj.devicePushToken = this.device.pushToken;\n }\n\n //passswordless login\n if (this.authRequest) {\n obj.authRequest = this.authRequest;\n }\n\n if (this.twoFactor) {\n if (this.twoFactor.token && this.twoFactor.provider != null) {\n obj.twoFactorToken = this.twoFactor.token;\n obj.twoFactorProvider = this.twoFactor.provider;\n obj.twoFactorRemember = this.twoFactor.remember ? \"1\" : \"0\";\n }\n }\n\n return obj;\n }\n}\n","import { DeviceRequest } from \"./device.request\";\nimport { TokenTwoFactorRequest } from \"./token-two-factor.request\";\nimport { TokenRequest } from \"./token.request\";\n\nexport class UserApiTokenRequest extends TokenRequest {\n constructor(\n public clientId: string,\n public clientSecret: string,\n protected twoFactor: TokenTwoFactorRequest,\n device?: DeviceRequest,\n ) {\n super(twoFactor, device);\n }\n\n toIdentityToken() {\n const obj = super.toIdentityToken(this.clientId);\n\n obj.scope = this.clientId.startsWith(\"organization\") ? \"api.organization\" : \"api\";\n obj.grant_type = \"client_credentials\";\n obj.client_secret = this.clientSecret;\n\n return obj;\n }\n\n static fromJSON(json: any) {\n return Object.assign(Object.create(UserApiTokenRequest.prototype), json, {\n device: json.device ? DeviceRequest.fromJSON(json.device) : undefined,\n twoFactor: json.twoFactor\n ? Object.assign(new TokenTwoFactorRequest(), json.twoFactor)\n : undefined,\n });\n }\n}\n","export class SecretVerificationRequest {\n masterPasswordHash: string;\n otp: string;\n authRequestAccessCode: string;\n}\n","import { SecretVerificationRequest } from \"./secret-verification.request\";\n\nexport class TwoFactorEmailRequest extends SecretVerificationRequest {\n email: string;\n deviceIdentifier: string;\n authRequestId: string;\n ssoEmail2FaSessionToken?: string;\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\n\nexport class IdentityCaptchaResponse extends BaseResponse {\n siteKey: string;\n\n constructor(response: any) {\n super(response);\n this.siteKey = this.getResponseProperty(\"HCaptcha_SiteKey\");\n }\n}\n","import { BaseResponse } from \"../../../../models/response/base.response\";\n\nexport interface IKeyConnectorUserDecryptionOptionServerResponse {\n KeyConnectorUrl: string;\n}\n\nexport class KeyConnectorUserDecryptionOptionResponse extends BaseResponse {\n keyConnectorUrl: string;\n\n constructor(response: IKeyConnectorUserDecryptionOptionServerResponse) {\n super(response);\n this.keyConnectorUrl = this.getResponseProperty(\"KeyConnectorUrl\");\n }\n}\n","import { BaseResponse } from \"../../../../models/response/base.response\";\nimport { EncString } from \"../../../../platform/models/domain/enc-string\";\n\nexport interface ITrustedDeviceUserDecryptionOptionServerResponse {\n HasAdminApproval: boolean;\n HasLoginApprovingDevice: boolean;\n HasManageResetPasswordPermission: boolean;\n EncryptedPrivateKey?: string;\n EncryptedUserKey?: string;\n}\n\nexport class TrustedDeviceUserDecryptionOptionResponse extends BaseResponse {\n hasAdminApproval: boolean;\n hasLoginApprovingDevice: boolean;\n hasManageResetPasswordPermission: boolean;\n encryptedPrivateKey: EncString;\n encryptedUserKey: EncString;\n\n constructor(response: any) {\n super(response);\n this.hasAdminApproval = this.getResponseProperty(\"HasAdminApproval\");\n\n this.hasLoginApprovingDevice = this.getResponseProperty(\"HasLoginApprovingDevice\");\n this.hasManageResetPasswordPermission = this.getResponseProperty(\n \"HasManageResetPasswordPermission\",\n );\n\n if (response.EncryptedPrivateKey) {\n this.encryptedPrivateKey = new EncString(this.getResponseProperty(\"EncryptedPrivateKey\"));\n }\n if (response.EncryptedUserKey) {\n this.encryptedUserKey = new EncString(this.getResponseProperty(\"EncryptedUserKey\"));\n }\n }\n}\n","import { BaseResponse } from \"../../../../models/response/base.response\";\nimport { EncString } from \"../../../../platform/models/domain/enc-string\";\n\nexport interface IWebAuthnPrfDecryptionOptionServerResponse {\n EncryptedPrivateKey: string;\n EncryptedUserKey: string;\n}\n\nexport class WebAuthnPrfDecryptionOptionResponse extends BaseResponse {\n encryptedPrivateKey: EncString;\n encryptedUserKey: EncString;\n\n constructor(response: IWebAuthnPrfDecryptionOptionServerResponse) {\n super(response);\n if (response.EncryptedPrivateKey) {\n this.encryptedPrivateKey = new EncString(this.getResponseProperty(\"EncryptedPrivateKey\"));\n }\n if (response.EncryptedUserKey) {\n this.encryptedUserKey = new EncString(this.getResponseProperty(\"EncryptedUserKey\"));\n }\n }\n}\n","import { BaseResponse } from \"../../../../models/response/base.response\";\n\nimport {\n IKeyConnectorUserDecryptionOptionServerResponse,\n KeyConnectorUserDecryptionOptionResponse,\n} from \"./key-connector-user-decryption-option.response\";\nimport {\n ITrustedDeviceUserDecryptionOptionServerResponse,\n TrustedDeviceUserDecryptionOptionResponse,\n} from \"./trusted-device-user-decryption-option.response\";\nimport {\n IWebAuthnPrfDecryptionOptionServerResponse,\n WebAuthnPrfDecryptionOptionResponse,\n} from \"./webauthn-prf-decryption-option.response\";\n\nexport interface IUserDecryptionOptionsServerResponse {\n HasMasterPassword: boolean;\n TrustedDeviceOption?: ITrustedDeviceUserDecryptionOptionServerResponse;\n KeyConnectorOption?: IKeyConnectorUserDecryptionOptionServerResponse;\n WebAuthnPrfOption?: IWebAuthnPrfDecryptionOptionServerResponse;\n}\n\nexport class UserDecryptionOptionsResponse extends BaseResponse {\n hasMasterPassword: boolean;\n trustedDeviceOption?: TrustedDeviceUserDecryptionOptionResponse;\n keyConnectorOption?: KeyConnectorUserDecryptionOptionResponse;\n webAuthnPrfOption?: WebAuthnPrfDecryptionOptionResponse;\n\n constructor(response: IUserDecryptionOptionsServerResponse) {\n super(response);\n\n this.hasMasterPassword = this.getResponseProperty(\"HasMasterPassword\");\n\n if (response.TrustedDeviceOption) {\n this.trustedDeviceOption = new TrustedDeviceUserDecryptionOptionResponse(\n this.getResponseProperty(\"TrustedDeviceOption\"),\n );\n }\n if (response.KeyConnectorOption) {\n this.keyConnectorOption = new KeyConnectorUserDecryptionOptionResponse(\n this.getResponseProperty(\"KeyConnectorOption\"),\n );\n }\n if (response.WebAuthnPrfOption) {\n this.webAuthnPrfOption = new WebAuthnPrfDecryptionOptionResponse(\n this.getResponseProperty(\"WebAuthnPrfOption\"),\n );\n }\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\nimport { KdfType } from \"../../../platform/enums\";\n\nimport { MasterPasswordPolicyResponse } from \"./master-password-policy.response\";\nimport { UserDecryptionOptionsResponse } from \"./user-decryption-options/user-decryption-options.response\";\n\nexport class IdentityTokenResponse extends BaseResponse {\n accessToken: string;\n expiresIn: number;\n refreshToken: string;\n tokenType: string;\n\n resetMasterPassword: boolean;\n privateKey: string;\n key: string;\n twoFactorToken: string;\n kdf: KdfType;\n kdfIterations: number;\n kdfMemory?: number;\n kdfParallelism?: number;\n forcePasswordReset: boolean;\n masterPasswordPolicy: MasterPasswordPolicyResponse;\n apiUseKeyConnector: boolean;\n keyConnectorUrl: string;\n\n userDecryptionOptions: UserDecryptionOptionsResponse;\n\n constructor(response: any) {\n super(response);\n this.accessToken = response.access_token;\n this.expiresIn = response.expires_in;\n this.refreshToken = response.refresh_token;\n this.tokenType = response.token_type;\n\n this.resetMasterPassword = this.getResponseProperty(\"ResetMasterPassword\");\n this.privateKey = this.getResponseProperty(\"PrivateKey\");\n this.key = this.getResponseProperty(\"Key\");\n this.twoFactorToken = this.getResponseProperty(\"TwoFactorToken\");\n this.kdf = this.getResponseProperty(\"Kdf\");\n this.kdfIterations = this.getResponseProperty(\"KdfIterations\");\n this.kdfMemory = this.getResponseProperty(\"KdfMemory\");\n this.kdfParallelism = this.getResponseProperty(\"KdfParallelism\");\n this.forcePasswordReset = this.getResponseProperty(\"ForcePasswordReset\");\n this.apiUseKeyConnector = this.getResponseProperty(\"ApiUseKeyConnector\");\n this.keyConnectorUrl = this.getResponseProperty(\"KeyConnectorUrl\");\n this.masterPasswordPolicy = new MasterPasswordPolicyResponse(\n this.getResponseProperty(\"MasterPasswordPolicy\"),\n );\n\n if (response.UserDecryptionOptions) {\n this.userDecryptionOptions = new UserDecryptionOptionsResponse(\n this.getResponseProperty(\"UserDecryptionOptions\"),\n );\n }\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\nimport { TwoFactorProviderType } from \"../../enums/two-factor-provider-type\";\n\nimport { MasterPasswordPolicyResponse } from \"./master-password-policy.response\";\n\nexport class IdentityTwoFactorResponse extends BaseResponse {\n twoFactorProviders: TwoFactorProviderType[];\n twoFactorProviders2 = new Map();\n captchaToken: string;\n ssoEmail2faSessionToken: string;\n email?: string;\n masterPasswordPolicy?: MasterPasswordPolicyResponse;\n\n constructor(response: any) {\n super(response);\n this.captchaToken = this.getResponseProperty(\"CaptchaBypassToken\");\n this.twoFactorProviders = this.getResponseProperty(\"TwoFactorProviders\");\n const twoFactorProviders2 = this.getResponseProperty(\"TwoFactorProviders2\");\n if (twoFactorProviders2 != null) {\n for (const prop in twoFactorProviders2) {\n // eslint-disable-next-line\n if (twoFactorProviders2.hasOwnProperty(prop)) {\n this.twoFactorProviders2.set(parseInt(prop, null), twoFactorProviders2[prop]);\n }\n }\n }\n this.masterPasswordPolicy = new MasterPasswordPolicyResponse(\n this.getResponseProperty(\"MasterPasswordPolicy\"),\n );\n\n this.ssoEmail2faSessionToken = this.getResponseProperty(\"SsoEmail2faSessionToken\");\n this.email = this.getResponseProperty(\"Email\");\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\n\nexport class MasterPasswordPolicyResponse extends BaseResponse {\n minComplexity: number;\n minLength: number;\n requireUpper: boolean;\n requireLower: boolean;\n requireNumbers: boolean;\n requireSpecial: boolean;\n\n /**\n * Flag to indicate if the policy should be enforced on login.\n * If true, and the user's password does not meet the policy requirements,\n * the user will be forced to update their password.\n */\n enforceOnLogin: boolean;\n\n constructor(response: any) {\n super(response);\n\n this.minComplexity = this.getResponseProperty(\"MinComplexity\");\n this.minLength = this.getResponseProperty(\"MinLength\");\n this.requireUpper = this.getResponseProperty(\"RequireUpper\");\n this.requireLower = this.getResponseProperty(\"RequireLower\");\n this.requireNumbers = this.getResponseProperty(\"RequireNumbers\");\n this.requireSpecial = this.getResponseProperty(\"RequireSpecial\");\n this.enforceOnLogin = this.getResponseProperty(\"EnforceOnLogin\");\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\nimport { Utils } from \"../../../platform/misc/utils\";\n\nexport class TwoFactorWebAuthnResponse extends BaseResponse {\n enabled: boolean;\n keys: KeyResponse[];\n\n constructor(response: any) {\n super(response);\n this.enabled = this.getResponseProperty(\"Enabled\");\n const keys = this.getResponseProperty(\"Keys\");\n this.keys = keys == null ? null : keys.map((k: any) => new KeyResponse(k));\n }\n}\n\nexport class KeyResponse extends BaseResponse {\n name: string;\n id: number;\n migrated: boolean;\n\n constructor(response: any) {\n super(response);\n this.name = this.getResponseProperty(\"Name\");\n this.id = this.getResponseProperty(\"Id\");\n this.migrated = this.getResponseProperty(\"Migrated\");\n }\n}\n\nexport class ChallengeResponse extends BaseResponse implements PublicKeyCredentialCreationOptions {\n attestation?: AttestationConveyancePreference;\n authenticatorSelection?: AuthenticatorSelectionCriteria;\n challenge: BufferSource;\n excludeCredentials?: PublicKeyCredentialDescriptor[];\n extensions?: AuthenticationExtensionsClientInputs;\n pubKeyCredParams: PublicKeyCredentialParameters[];\n rp: PublicKeyCredentialRpEntity;\n timeout?: number;\n user: PublicKeyCredentialUserEntity;\n\n constructor(response: any) {\n super(response);\n this.attestation = this.getResponseProperty(\"attestation\");\n this.authenticatorSelection = this.getResponseProperty(\"authenticatorSelection\");\n this.challenge = Utils.fromUrlB64ToArray(this.getResponseProperty(\"challenge\"));\n this.excludeCredentials = this.getResponseProperty(\"excludeCredentials\").map((c: any) => {\n c.id = Utils.fromUrlB64ToArray(c.id).buffer;\n return c;\n });\n this.extensions = this.getResponseProperty(\"extensions\");\n this.pubKeyCredParams = this.getResponseProperty(\"pubKeyCredParams\");\n this.rp = this.getResponseProperty(\"rp\");\n this.timeout = this.getResponseProperty(\"timeout\");\n\n const user = this.getResponseProperty(\"user\");\n user.id = Utils.fromUrlB64ToArray(user.id);\n\n this.user = user;\n }\n}\n","import { AssertionOptionsResponse } from \"../../../services/webauthn-login/response/assertion-options.response\";\n\nexport class WebAuthnLoginCredentialAssertionOptionsView {\n constructor(\n readonly options: AssertionOptionsResponse,\n readonly token: string,\n ) {}\n}\n","import { I18nService } from \"../../platform/abstractions/i18n.service\";\nimport { PlatformUtilsService } from \"../../platform/abstractions/platform-utils.service\";\nimport {\n TwoFactorProviderDetails,\n TwoFactorService as TwoFactorServiceAbstraction,\n} from \"../abstractions/two-factor.service\";\nimport { TwoFactorProviderType } from \"../enums/two-factor-provider-type\";\nimport { IdentityTwoFactorResponse } from \"../models/response/identity-two-factor.response\";\n\nexport const TwoFactorProviders: Partial> =\n {\n [TwoFactorProviderType.Authenticator]: {\n type: TwoFactorProviderType.Authenticator,\n name: null as string,\n description: null as string,\n priority: 1,\n sort: 1,\n premium: false,\n },\n [TwoFactorProviderType.Yubikey]: {\n type: TwoFactorProviderType.Yubikey,\n name: null as string,\n description: null as string,\n priority: 3,\n sort: 2,\n premium: true,\n },\n [TwoFactorProviderType.Duo]: {\n type: TwoFactorProviderType.Duo,\n name: \"Duo\",\n description: null as string,\n priority: 2,\n sort: 3,\n premium: true,\n },\n [TwoFactorProviderType.OrganizationDuo]: {\n type: TwoFactorProviderType.OrganizationDuo,\n name: \"Duo (Organization)\",\n description: null as string,\n priority: 10,\n sort: 4,\n premium: false,\n },\n [TwoFactorProviderType.Email]: {\n type: TwoFactorProviderType.Email,\n name: null as string,\n description: null as string,\n priority: 0,\n sort: 6,\n premium: false,\n },\n [TwoFactorProviderType.WebAuthn]: {\n type: TwoFactorProviderType.WebAuthn,\n name: null as string,\n description: null as string,\n priority: 4,\n sort: 5,\n premium: false,\n },\n };\n\nexport class TwoFactorService implements TwoFactorServiceAbstraction {\n private twoFactorProvidersData: Map;\n private selectedTwoFactorProviderType: TwoFactorProviderType = null;\n\n constructor(\n private i18nService: I18nService,\n private platformUtilsService: PlatformUtilsService,\n ) {}\n\n init() {\n TwoFactorProviders[TwoFactorProviderType.Email].name = this.i18nService.t(\"emailTitle\");\n TwoFactorProviders[TwoFactorProviderType.Email].description = this.i18nService.t(\"emailDesc\");\n\n TwoFactorProviders[TwoFactorProviderType.Authenticator].name =\n this.i18nService.t(\"authenticatorAppTitle\");\n TwoFactorProviders[TwoFactorProviderType.Authenticator].description =\n this.i18nService.t(\"authenticatorAppDesc\");\n\n TwoFactorProviders[TwoFactorProviderType.Duo].description = this.i18nService.t(\"duoDesc\");\n\n TwoFactorProviders[TwoFactorProviderType.OrganizationDuo].name =\n \"Duo (\" + this.i18nService.t(\"organization\") + \")\";\n TwoFactorProviders[TwoFactorProviderType.OrganizationDuo].description =\n this.i18nService.t(\"duoOrganizationDesc\");\n\n TwoFactorProviders[TwoFactorProviderType.WebAuthn].name = this.i18nService.t(\"webAuthnTitle\");\n TwoFactorProviders[TwoFactorProviderType.WebAuthn].description =\n this.i18nService.t(\"webAuthnDesc\");\n\n TwoFactorProviders[TwoFactorProviderType.Yubikey].name = this.i18nService.t(\"yubiKeyTitle\");\n TwoFactorProviders[TwoFactorProviderType.Yubikey].description =\n this.i18nService.t(\"yubiKeyDesc\");\n }\n\n getSupportedProviders(win: Window): TwoFactorProviderDetails[] {\n const providers: any[] = [];\n if (this.twoFactorProvidersData == null) {\n return providers;\n }\n\n if (\n this.twoFactorProvidersData.has(TwoFactorProviderType.OrganizationDuo) &&\n this.platformUtilsService.supportsDuo()\n ) {\n providers.push(TwoFactorProviders[TwoFactorProviderType.OrganizationDuo]);\n }\n\n if (this.twoFactorProvidersData.has(TwoFactorProviderType.Authenticator)) {\n providers.push(TwoFactorProviders[TwoFactorProviderType.Authenticator]);\n }\n\n if (this.twoFactorProvidersData.has(TwoFactorProviderType.Yubikey)) {\n providers.push(TwoFactorProviders[TwoFactorProviderType.Yubikey]);\n }\n\n if (\n this.twoFactorProvidersData.has(TwoFactorProviderType.Duo) &&\n this.platformUtilsService.supportsDuo()\n ) {\n providers.push(TwoFactorProviders[TwoFactorProviderType.Duo]);\n }\n\n if (\n this.twoFactorProvidersData.has(TwoFactorProviderType.WebAuthn) &&\n this.platformUtilsService.supportsWebAuthn(win)\n ) {\n providers.push(TwoFactorProviders[TwoFactorProviderType.WebAuthn]);\n }\n\n if (this.twoFactorProvidersData.has(TwoFactorProviderType.Email)) {\n providers.push(TwoFactorProviders[TwoFactorProviderType.Email]);\n }\n\n return providers;\n }\n\n getDefaultProvider(webAuthnSupported: boolean): TwoFactorProviderType {\n if (this.twoFactorProvidersData == null) {\n return null;\n }\n\n if (\n this.selectedTwoFactorProviderType != null &&\n this.twoFactorProvidersData.has(this.selectedTwoFactorProviderType)\n ) {\n return this.selectedTwoFactorProviderType;\n }\n\n let providerType: TwoFactorProviderType = null;\n let providerPriority = -1;\n this.twoFactorProvidersData.forEach((_value, type) => {\n const provider = (TwoFactorProviders as any)[type];\n if (provider != null && provider.priority > providerPriority) {\n if (type === TwoFactorProviderType.WebAuthn && !webAuthnSupported) {\n return;\n }\n\n providerType = type;\n providerPriority = provider.priority;\n }\n });\n\n return providerType;\n }\n\n setSelectedProvider(type: TwoFactorProviderType) {\n this.selectedTwoFactorProviderType = type;\n }\n\n clearSelectedProvider() {\n this.selectedTwoFactorProviderType = null;\n }\n\n setProviders(response: IdentityTwoFactorResponse) {\n this.twoFactorProvidersData = response.twoFactorProviders2;\n }\n\n clearProviders() {\n this.twoFactorProvidersData = null;\n }\n\n getProviders() {\n return this.twoFactorProvidersData;\n }\n}\n","import { Utils } from \"../../../../platform/misc/utils\";\n\nexport abstract class WebAuthnLoginResponseRequest {\n id: string;\n rawId: string;\n type: string;\n extensions: Record;\n\n constructor(credential: PublicKeyCredential) {\n this.id = credential.id;\n this.rawId = Utils.fromBufferToUrlB64(credential.rawId);\n this.type = credential.type;\n\n // WARNING: do not add PRF information here by mapping\n // credential.getClientExtensionResults() into the extensions property,\n // as it will be sent to the server (leaking credentials).\n this.extensions = {}; // Extensions are handled client-side\n }\n}\n","import { Jsonify } from \"type-fest\";\n\nimport { Utils } from \"../../../../platform/misc/utils\";\n\nimport { WebAuthnLoginResponseRequest } from \"./webauthn-login-response.request\";\n\n// base 64 strings\nexport interface WebAuthnLoginAssertionResponseData {\n authenticatorData: string;\n signature: string;\n clientDataJSON: string;\n userHandle: string;\n}\n\nexport class WebAuthnLoginAssertionResponseRequest extends WebAuthnLoginResponseRequest {\n response: WebAuthnLoginAssertionResponseData;\n\n constructor(credential: PublicKeyCredential) {\n super(credential);\n\n if (!(credential.response instanceof AuthenticatorAssertionResponse)) {\n throw new Error(\"Invalid authenticator response\");\n }\n\n this.response = {\n authenticatorData: Utils.fromBufferToUrlB64(credential.response.authenticatorData),\n signature: Utils.fromBufferToUrlB64(credential.response.signature),\n clientDataJSON: Utils.fromBufferToUrlB64(credential.response.clientDataJSON),\n userHandle: Utils.fromBufferToUrlB64(credential.response.userHandle),\n };\n }\n\n static fromJSON(json: Jsonify) {\n return Object.assign(Object.create(WebAuthnLoginAssertionResponseRequest.prototype), json);\n }\n}\n","import { BaseResponse } from \"../../../../models/response/base.response\";\nimport { Utils } from \"../../../../platform/misc/utils\";\n\nexport class AssertionOptionsResponse\n extends BaseResponse\n implements PublicKeyCredentialRequestOptions\n{\n /** A list of credentials that the authenticator is allowed to use; only used for non-discoverable flow */\n allowCredentials?: PublicKeyCredentialDescriptor[];\n challenge: BufferSource;\n extensions?: AuthenticationExtensionsClientInputs;\n rpId?: string;\n timeout?: number;\n userVerification?: UserVerificationRequirement;\n\n constructor(response: unknown) {\n super(response);\n this.allowCredentials = this.getResponseProperty(\"allowCredentials\")?.map((c: any) => ({\n ...c,\n id: Utils.fromUrlB64ToArray(c.id).buffer,\n }));\n this.challenge = Utils.fromUrlB64ToArray(this.getResponseProperty(\"challenge\"));\n this.extensions = this.getResponseProperty(\"extensions\");\n this.rpId = this.getResponseProperty(\"rpId\");\n this.timeout = this.getResponseProperty(\"timeout\");\n this.userVerification = this.getResponseProperty(\"userVerification\");\n }\n}\n","import { BaseResponse } from \"../../../../models/response/base.response\";\n\nimport { AssertionOptionsResponse } from \"./assertion-options.response\";\n\nexport class CredentialAssertionOptionsResponse extends BaseResponse {\n options: AssertionOptionsResponse;\n token: string;\n\n constructor(response: unknown) {\n super(response);\n this.options = new AssertionOptionsResponse(this.getResponseProperty(\"options\"));\n this.token = this.getResponseProperty(\"token\");\n }\n}\n","import { map, Observable } from \"rxjs\";\n\nimport {\n NeverDomains,\n EquivalentDomains,\n UriMatchStrategySetting,\n UriMatchStrategy,\n} from \"../../models/domain/domain-service\";\nimport { Utils } from \"../../platform/misc/utils\";\nimport {\n DOMAIN_SETTINGS_DISK,\n ActiveUserState,\n GlobalState,\n KeyDefinition,\n StateProvider,\n UserKeyDefinition,\n} from \"../../platform/state\";\n\nconst SHOW_FAVICONS = new KeyDefinition(DOMAIN_SETTINGS_DISK, \"showFavicons\", {\n deserializer: (value: boolean) => value ?? true,\n});\n\nconst NEVER_DOMAINS = new KeyDefinition(DOMAIN_SETTINGS_DISK, \"neverDomains\", {\n deserializer: (value: NeverDomains) => value ?? null,\n});\n\nconst EQUIVALENT_DOMAINS = new UserKeyDefinition(DOMAIN_SETTINGS_DISK, \"equivalentDomains\", {\n deserializer: (value: EquivalentDomains) => value ?? null,\n clearOn: [\"logout\"],\n});\n\nconst DEFAULT_URI_MATCH_STRATEGY = new KeyDefinition(\n DOMAIN_SETTINGS_DISK,\n \"defaultUriMatchStrategy\",\n {\n deserializer: (value: UriMatchStrategySetting) => value ?? UriMatchStrategy.Domain,\n },\n);\n\nexport abstract class DomainSettingsService {\n showFavicons$: Observable;\n setShowFavicons: (newValue: boolean) => Promise;\n neverDomains$: Observable;\n setNeverDomains: (newValue: NeverDomains) => Promise;\n equivalentDomains$: Observable;\n setEquivalentDomains: (newValue: EquivalentDomains) => Promise;\n defaultUriMatchStrategy$: Observable;\n setDefaultUriMatchStrategy: (newValue: UriMatchStrategySetting) => Promise;\n getUrlEquivalentDomains: (url: string) => Observable>;\n}\n\nexport class DefaultDomainSettingsService implements DomainSettingsService {\n private showFaviconsState: GlobalState;\n readonly showFavicons$: Observable;\n\n private neverDomainsState: GlobalState;\n readonly neverDomains$: Observable;\n\n private equivalentDomainsState: ActiveUserState;\n readonly equivalentDomains$: Observable;\n\n private defaultUriMatchStrategyState: ActiveUserState;\n readonly defaultUriMatchStrategy$: Observable;\n\n constructor(private stateProvider: StateProvider) {\n this.showFaviconsState = this.stateProvider.getGlobal(SHOW_FAVICONS);\n this.showFavicons$ = this.showFaviconsState.state$.pipe(map((x) => x ?? true));\n\n this.neverDomainsState = this.stateProvider.getGlobal(NEVER_DOMAINS);\n this.neverDomains$ = this.neverDomainsState.state$.pipe(map((x) => x ?? null));\n\n this.equivalentDomainsState = this.stateProvider.getActive(EQUIVALENT_DOMAINS);\n this.equivalentDomains$ = this.equivalentDomainsState.state$.pipe(map((x) => x ?? null));\n\n this.defaultUriMatchStrategyState = this.stateProvider.getActive(DEFAULT_URI_MATCH_STRATEGY);\n this.defaultUriMatchStrategy$ = this.defaultUriMatchStrategyState.state$.pipe(\n map((x) => x ?? UriMatchStrategy.Domain),\n );\n }\n\n async setShowFavicons(newValue: boolean): Promise {\n await this.showFaviconsState.update(() => newValue);\n }\n\n async setNeverDomains(newValue: NeverDomains): Promise {\n await this.neverDomainsState.update(() => newValue);\n }\n\n async setEquivalentDomains(newValue: EquivalentDomains): Promise {\n await this.equivalentDomainsState.update(() => newValue);\n }\n\n async setDefaultUriMatchStrategy(newValue: UriMatchStrategySetting): Promise {\n await this.defaultUriMatchStrategyState.update(() => newValue);\n }\n\n getUrlEquivalentDomains(url: string): Observable> {\n const domains$ = this.equivalentDomains$.pipe(\n map((equivalentDomains) => {\n const domain = Utils.getDomain(url);\n if (domain == null || equivalentDomains == null) {\n return new Set() as Set;\n }\n\n const equivalents = equivalentDomains.filter((ed) => ed.includes(domain)).flat();\n\n return new Set(equivalents);\n }),\n );\n\n return domains$;\n }\n}\n","import { Observable } from \"rxjs\";\n\nexport type BillingAccountProfile = {\n hasPremiumPersonally: boolean;\n hasPremiumFromAnyOrganization: boolean;\n};\n\nexport abstract class BillingAccountProfileStateService {\n /**\n * Emits `true` when the active user's account has been granted premium from any of the\n * organizations it is a member of. Otherwise, emits `false`\n */\n hasPremiumFromAnyOrganization$: Observable;\n\n /**\n * Emits `true` when the active user's account has an active premium subscription at the\n * individual user level\n */\n hasPremiumPersonally$: Observable;\n\n /**\n * Emits `true` when either `hasPremiumPersonally` or `hasPremiumFromAnyOrganization` is `true`\n */\n hasPremiumFromAnySource$: Observable;\n\n /**\n * Sets the active user's premium status fields upon every full sync, either from their personal\n * subscription to premium, or an organization they're a part of that grants them premium.\n * @param hasPremiumPersonally\n * @param hasPremiumFromAnyOrganization\n */\n abstract setHasPremium(\n hasPremiumPersonally: boolean,\n hasPremiumFromAnyOrganization: boolean,\n ): Promise;\n}\n","import { SubscriptionCancellationRequest } from \"../../billing/models/request/subscription-cancellation.request\";\nimport { OrganizationBillingStatusResponse } from \"../../billing/models/response/organization-billing-status.response\";\n\nexport abstract class BillingApiServiceAbstraction {\n cancelOrganizationSubscription: (\n organizationId: string,\n request: SubscriptionCancellationRequest,\n ) => Promise;\n cancelPremiumUserSubscription: (request: SubscriptionCancellationRequest) => Promise;\n getBillingStatus: (id: string) => Promise;\n}\n","import { OrganizationResponse } from \"../../admin-console/models/response/organization.response\";\nimport { InitiationPath } from \"../../models/request/reference-event.request\";\nimport { PaymentMethodType, PlanType } from \"../enums\";\n\nexport type OrganizationInformation = {\n name: string;\n billingEmail: string;\n businessName?: string;\n initiationPath?: InitiationPath;\n};\n\nexport type PlanInformation = {\n type: PlanType;\n passwordManagerSeats?: number;\n subscribeToSecretsManager?: boolean;\n isFromSecretsManagerTrial?: boolean;\n secretsManagerSeats?: number;\n secretsManagerServiceAccounts?: number;\n storage?: number;\n};\n\nexport type BillingInformation = {\n postalCode: string;\n country: string;\n taxId?: string;\n addressLine1?: string;\n addressLine2?: string;\n city?: string;\n state?: string;\n};\n\nexport type PaymentInformation = {\n paymentMethod: [string, PaymentMethodType];\n billing: BillingInformation;\n};\n\nexport type SubscriptionInformation = {\n organization: OrganizationInformation;\n plan?: PlanInformation;\n payment?: PaymentInformation;\n};\n\nexport abstract class OrganizationBillingServiceAbstraction {\n purchaseSubscription: (subscription: SubscriptionInformation) => Promise;\n\n startFree: (subscription: SubscriptionInformation) => Promise;\n}\n","import { Observable } from \"rxjs\";\n\nimport { PaymentMethodWarning } from \"../models/domain/payment-method-warning\";\n\nexport abstract class PaymentMethodWarningsServiceAbstraction {\n /**\n * An {@link Observable} record in the {@link ActiveUserState} of the user's organization IDs each mapped to their respective {@link PaymentMethodWarning}.\n */\n paymentMethodWarnings$: Observable>;\n /**\n * Updates the {@link ActiveUserState} by setting `acknowledged` to `true` for the {@link PaymentMethodWarning} represented by the provided organization ID.\n * @param organizationId - The ID of the organization whose warning you'd like to acknowledge.\n */\n acknowledge: (organizationId: string) => Promise;\n /**\n * Updates the {@link ActiveUserState} by setting `risksSubscriptionFailure` to `false` for the {@link PaymentMethodWarning} represented by the provided organization ID.\n * @param organizationId - The ID of the organization whose subscription risk you'd like to remove.\n */\n removeSubscriptionRisk: (organizationId: string) => Promise;\n /**\n * Clears the {@link PaymentMethodWarning} record from the {@link ActiveUserState}.\n */\n clear: () => Promise;\n /**\n * Tries to retrieve the {@link PaymentMethodWarning} for the provided organization ID from the {@link ActiveUserState}.\n * If the warning does not exist, or if the warning has been in state for longer than a week, fetches the current {@link OrganizationBillingStatusResponse} for the organization\n * from the API and uses it to update the warning in state.\n * @param organizationId - The ID of the organization whose {@link PaymentMethodWarning} you'd like to update.\n */\n update: (organizationId: string) => Promise;\n}\n","export enum PaymentMethodType {\n Card = 0,\n BankAccount = 1,\n PayPal = 2,\n BitPay = 3,\n Credit = 4,\n WireTransfer = 5,\n Check = 8,\n}\n","export enum PlanSponsorshipType {\n FamiliesForEnterprise = 0,\n}\n","export enum PlanType {\n Free = 0,\n FamiliesAnnually2019 = 1,\n TeamsMonthly2019 = 2,\n TeamsAnnually2019 = 3,\n EnterpriseMonthly2019 = 4,\n EnterpriseAnnually2019 = 5,\n Custom = 6,\n FamiliesAnnually = 7,\n TeamsMonthly2020 = 8,\n TeamsAnnually2020 = 9,\n EnterpriseMonthly2020 = 10,\n EnterpriseAnnually2020 = 11,\n TeamsMonthly = 12,\n TeamsAnnually = 13,\n EnterpriseMonthly = 14,\n EnterpriseAnnually = 15,\n TeamsStarter = 16,\n}\n","export enum TransactionType {\n Charge = 0,\n Credit = 1,\n PromotionalCredit = 2,\n ReferralCredit = 3,\n Refund = 4,\n}\n","export enum BitwardenProductType {\n PasswordManager = 0,\n SecretsManager = 1,\n}\n","import { TaxInfoUpdateRequest } from \"./tax-info-update.request\";\n\nexport class OrganizationTaxInfoUpdateRequest extends TaxInfoUpdateRequest {\n taxId: string;\n line1: string;\n line2: string;\n city: string;\n state: string;\n}\n","import { PaymentMethodType } from \"../../enums\";\n\nimport { OrganizationTaxInfoUpdateRequest } from \"./organization-tax-info-update.request\";\n\nexport class PaymentRequest extends OrganizationTaxInfoUpdateRequest {\n paymentMethodType: PaymentMethodType;\n paymentToken: string;\n}\n","export class TaxInfoUpdateRequest {\n country: string;\n postalCode: string;\n}\n","export enum FeatureFlag {\n BrowserFilelessImport = \"browser-fileless-import\",\n ItemShare = \"item-share\",\n FlexibleCollectionsV1 = \"flexible-collections-v-1\", // v-1 is intentional\n BulkCollectionAccess = \"bulk-collection-access\",\n VaultOnboarding = \"vault-onboarding\",\n GeneratorToolsModernization = \"generator-tools-modernization\",\n KeyRotationImprovements = \"key-rotation-improvements\",\n FlexibleCollectionsMigration = \"flexible-collections-migration\",\n ShowPaymentMethodWarningBanners = \"show-payment-method-warning-banners\",\n}\n\n// Replace this with a type safe lookup of the feature flag values in PM-2282\nexport type FeatureFlagValue = number | string | boolean;\n","/**\n * Hypertext Transfer Protocol (HTTP) response status codes.\n *\n * @see {@link https://en.wikipedia.org/wiki/List_of_HTTP_status_codes}\n * src: https://gist.github.com/RWOverdijk/6cef816cfdf5722228e01cc05fd4b094\n */\nexport enum HttpStatusCode {\n /**\n * The server has received the request headers and the client should proceed to send the request body\n * (in the case of a request for which a body needs to be sent; for example, a POST request).\n * Sending a large request body to a server after a request has been rejected for inappropriate headers would be inefficient.\n * To have a server check the request's headers, a client must send Expect: 100-continue as a header in its initial request\n * and receive a 100 Continue status code in response before sending the body. The response 417 Expectation Failed indicates the request should not be continued.\n */\n Continue = 100,\n\n /**\n * The requester has asked the server to switch protocols and the server has agreed to do so.\n */\n SwitchingProtocols = 101,\n\n /**\n * A WebDAV request may contain many sub-requests involving file operations, requiring a long time to complete the request.\n * This code indicates that the server has received and is processing the request, but no response is available yet.\n * This prevents the client from timing out and assuming the request was lost.\n */\n Processing = 102,\n\n // **********************************************************************************************************\n // 200s - SUCCESS\n // **********************************************************************************************************\n\n /**\n * Standard response for successful HTTP requests.\n * The actual response will depend on the request method used.\n * In a GET request, the response will contain an entity corresponding to the requested resource.\n * In a POST request, the response will contain an entity describing or containing the result of the action.\n */\n Ok = 200,\n\n /**\n * The request has been fulfilled, resulting in the creation of a new resource.\n */\n Created = 201,\n\n /**\n * The request has been accepted for processing, but the processing has not been completed.\n * The request might or might not be eventually acted upon, and may be disallowed when processing occurs.\n */\n Accepted = 202,\n\n /**\n * SINCE HTTP/1.1\n * The server is a transforming proxy that received a 200 OK from its origin,\n * but is returning a modified version of the origin's response.\n */\n NonAuthoritativeInformation = 203,\n\n /**\n * The server successfully processed the request and is not returning any content.\n */\n NoContent = 204,\n\n /**\n * The server successfully processed the request, but is not returning any content.\n * Unlike a 204 response, this response requires that the requester reset the document view.\n */\n ResetContent = 205,\n\n /**\n * The server is delivering only part of the resource (byte serving) due to a range header sent by the client.\n * The range header is used by HTTP clients to enable resuming of interrupted downloads,\n * or split a download into multiple simultaneous streams.\n */\n PartialContent = 206,\n\n /**\n * The message body that follows is an XML message and can contain a number of separate response codes,\n * depending on how many sub-requests were made.\n */\n MultiStatus = 207,\n\n /**\n * The members of a DAV binding have already been enumerated in a preceding part of the (multistatus) response,\n * and are not being included again.\n */\n AlreadyReported = 208,\n\n /**\n * The server has fulfilled a request for the resource,\n * and the response is a representation of the result of one or more instance-manipulations applied to the current instance.\n */\n ImUsed = 226,\n\n // **********************************************************************************************************\n // 300s - Redirections\n // **********************************************************************************************************\n\n /**\n * Indicates multiple options for the resource from which the client may choose (via agent-driven content negotiation).\n * For example, this code could be used to present multiple video format options,\n * to list files with different filename extensions, or to suggest word-sense disambiguation.\n */\n MultipleChoices = 300,\n\n /**\n * This and all future requests should be directed to the given URI.\n */\n MovedPermanently = 301,\n\n /**\n * This is an example of industry practice contradicting the standard.\n * The HTTP/1.0 specification (RFC 1945) required the client to perform a temporary redirect\n * (the original describing phrase was \"Moved Temporarily\"), but popular browsers implemented 302\n * with the functionality of a 303 See Other. Therefore, HTTP/1.1 added status codes 303 and 307\n * to distinguish between the two behaviours. However, some Web applications and frameworks\n * use the 302 status code as if it were the 303.\n */\n Found = 302,\n\n /**\n * SINCE HTTP/1.1\n * The response to the request can be found under another URI using a GET method.\n * When received in response to a POST (or PUT/DELETE), the client should presume that\n * the server has received the data and should issue a redirect with a separate GET message.\n */\n SeeOther = 303,\n\n /**\n * Indicates that the resource has not been modified since the version specified by the request headers If-Modified-Since or If-None-Match.\n * In such case, there is no need to retransmit the resource since the client still has a previously-downloaded copy.\n */\n NotModified = 304,\n\n /**\n * SINCE HTTP/1.1\n * The requested resource is available only through a proxy, the address for which is provided in the response.\n * Many HTTP clients (such as Mozilla and Internet Explorer) do not correctly handle responses with this status code, primarily for security reasons.\n */\n UseProxy = 305,\n\n /**\n * No longer used. Originally meant \"Subsequent requests should use the specified proxy.\"\n */\n SwitchProxy = 306,\n\n /**\n * SINCE HTTP/1.1\n * In this case, the request should be repeated with another URI; however, future requests should still use the original URI.\n * In contrast to how 302 was historically implemented, the request method is not allowed to be changed when reissuing the original request.\n * For example, a POST request should be repeated using another POST request.\n */\n TemporaryRedirect = 307,\n\n /**\n * The request and all future requests should be repeated using another URI.\n * 307 and 308 parallel the behaviors of 302 and 301, but do not allow the HTTP method to change.\n * So, for example, submitting a form to a permanently redirected resource may continue smoothly.\n */\n PermanentRedirect = 308,\n\n // **********************************************************************************************************\n // 400s - Client / User messed up\n // **********************************************************************************************************\n\n /**\n * The server cannot or will not process the request due to an apparent client error\n * (e.g., malformed request syntax, too large size, invalid request message framing, or deceptive request routing).\n */\n BadRequest = 400,\n\n /**\n * Similar to 403 Forbidden, but specifically for use when authentication is required and has failed or has not yet\n * been provided. The response must include a WWW-Authenticate header field containing a challenge applicable to the\n * requested resource. See Basic access authentication and Digest access authentication. 401 semantically means\n * \"unauthenticated\",i.e. the user does not have the necessary credentials.\n */\n Unauthorized = 401,\n\n /**\n * Reserved for future use. The original intention was that this code might be used as part of some form of digital\n * cash or micro payment scheme, but that has not happened, and this code is not usually used.\n * Google Developers API uses this status if a particular developer has exceeded the daily limit on requests.\n */\n PaymentRequired = 402,\n\n /**\n * The request was valid, but the server is refusing action.\n * The user might not have the necessary permissions for a resource.\n */\n Forbidden = 403,\n\n /**\n * The requested resource could not be found but may be available in the future.\n * Subsequent requests by the client are permissible.\n */\n NotFound = 404,\n\n /**\n * A request method is not supported for the requested resource;\n * for example, a GET request on a form that requires data to be presented via POST, or a PUT request on a read-only resource.\n */\n MethodNotAllowed = 405,\n\n /**\n * The requested resource is capable of generating only content not acceptable according to the Accept headers sent in the request.\n */\n NotAcceptable = 406,\n\n /**\n * The client must first authenticate itself with the proxy.\n */\n ProxyAuthenticationRequired = 407,\n\n /**\n * The server timed out waiting for the request.\n * According to HTTP specifications:\n * \"The client did not produce a request within the time that the server was prepared to wait. The client MAY repeat the request without modifications at any later time.\"\n */\n RequestTimeout = 408,\n\n /**\n * Indicates that the request could not be processed because of conflict in the request,\n * such as an edit conflict between multiple simultaneous updates.\n */\n Conflict = 409,\n\n /**\n * Indicates that the resource requested is no longer available and will not be available again.\n * This should be used when a resource has been intentionally removed and the resource should be purged.\n * Upon receiving a 410 status code, the client should not request the resource in the future.\n * Clients such as search engines should remove the resource from their indices.\n * Most use cases do not require clients and search engines to purge the resource, and a \"404 Not Found\" may be used instead.\n */\n Gone = 410,\n\n /**\n * The request did not specify the length of its content, which is required by the requested resource.\n */\n LengthRequired = 411,\n\n /**\n * The server does not meet one of the preconditions that the requester put on the request.\n */\n PreconditionFailed = 412,\n\n /**\n * The request is larger than the server is willing or able to process. Previously called \"Request Entity Too Large\".\n */\n PayloadTooLarge = 413,\n\n /**\n * The URI provided was too long for the server to process. Often the result of too much data being encoded as a query-string of a GET request,\n * in which case it should be converted to a POST request.\n * Called \"Request-URI Too Long\" previously.\n */\n UriTooLong = 414,\n\n /**\n * The request entity has a media type which the server or resource does not support.\n * For example, the client uploads an image as image/svg+xml, but the server requires that images use a different format.\n */\n UnsupportedMediaType = 415,\n\n /**\n * The client has asked for a portion of the file (byte serving), but the server cannot supply that portion.\n * For example, if the client asked for a part of the file that lies beyond the end of the file.\n * Called \"Requested Range Not Satisfiable\" previously.\n */\n RangeNotSatisfiable = 416,\n\n /**\n * The server cannot meet the requirements of the Expect request-header field.\n */\n ExpectationFailed = 417,\n\n /**\n * This code was defined in 1998 as one of the traditional IETF April Fools' jokes, in RFC 2324, Hyper Text Coffee Pot Control Protocol,\n * and is not expected to be implemented by actual HTTP servers. The RFC specifies this code should be returned by\n * teapots requested to brew coffee. This HTTP status is used as an Easter egg in some websites, including Google.com.\n */\n IAmATeapot = 418,\n\n /**\n * The request was directed at a server that is not able to produce a response (for example because a connection reuse).\n */\n MisdirectedRequest = 421,\n\n /**\n * The request was well-formed but was unable to be followed due to semantic errors.\n */\n UnprocessableEntity = 422,\n\n /**\n * The resource that is being accessed is locked.\n */\n Locked = 423,\n\n /**\n * The request failed due to failure of a previous request (e.g., a PROPPATCH).\n */\n FailedDependency = 424,\n\n /**\n * The client should switch to a different protocol such as TLS/1.0, given in the Upgrade header field.\n */\n UpgradeRequired = 426,\n\n /**\n * The origin server requires the request to be conditional.\n * Intended to prevent \"the 'lost update' problem, where a client\n * GETs a resource's state, modifies it, and PUTs it back to the server,\n * when meanwhile a third party has modified the state on the server, leading to a conflict.\"\n */\n PreconditionRequired = 428,\n\n /**\n * The user has sent too many requests in a given amount of time. Intended for use with rate-limiting schemes.\n */\n TooManyRequests = 429,\n\n /**\n * The server is unwilling to process the request because either an individual header field,\n * or all the header fields collectively, are too large.\n */\n RequestHeaderFieldsTooLarge = 431,\n\n /**\n * A server operator has received a legal demand to deny access to a resource or to a set of resources\n * that includes the requested resource. The code 451 was chosen as a reference to the novel Fahrenheit 451.\n */\n UnavailableForLegalReasons = 451,\n\n // **********************************************************************************************************\n // 500s - Server messed up\n // **********************************************************************************************************\n\n /**\n * A generic error message, given when an unexpected condition was encountered and no more specific message is suitable.\n */\n InternalServerError = 500,\n\n /**\n * The server either does not recognize the request method, or it lacks the ability to fulfill the request.\n * Usually this implies future availability (e.g., a new feature of a web-service API).\n */\n NotImplemented = 501,\n\n /**\n * The server was acting as a gateway or proxy and received an invalid response from the upstream server.\n */\n BadGateway = 502,\n\n /**\n * The server is currently unavailable (because it is overloaded or down for maintenance).\n * Generally, this is a temporary state.\n */\n ServiceUnavailable = 503,\n\n /**\n * The server was acting as a gateway or proxy and did not receive a timely response from the upstream server.\n */\n GatewayTimeout = 504,\n\n /**\n * The server does not support the HTTP protocol version used in the request\n */\n HttpVersionNotSupported = 505,\n\n /**\n * Transparent content negotiation for the request results in a circular reference.\n */\n VariantAlsoNegotiates = 506,\n\n /**\n * The server is unable to store the representation needed to complete the request.\n */\n InsufficientStorage = 507,\n\n /**\n * The server detected an infinite loop while processing the request.\n */\n LoopDetected = 508,\n\n /**\n * Further extensions to the request are required for the server to fulfill it.\n */\n NotExtended = 510,\n\n /**\n * The client needs to authenticate to gain network access.\n * Intended for use by intercepting proxies used to control access to the network (e.g., \"captive portals\" used\n * to require agreement to Terms of Service before granting full Internet access via a Wi-Fi hotspot).\n */\n NetworkAuthenticationRequired = 511,\n}\n","export enum ClientType {\n Web = \"web\",\n Browser = \"browser\",\n Desktop = \"desktop\",\n // Mobile = \"mobile\",\n Cli = \"cli\",\n // DirectoryConnector = \"connector\",\n}\n","export enum DeviceType {\n Android = 0,\n iOS = 1,\n ChromeExtension = 2,\n FirefoxExtension = 3,\n OperaExtension = 4,\n EdgeExtension = 5,\n WindowsDesktop = 6,\n MacOsDesktop = 7,\n LinuxDesktop = 8,\n ChromeBrowser = 9,\n FirefoxBrowser = 10,\n OperaBrowser = 11,\n EdgeBrowser = 12,\n IEBrowser = 13,\n UnknownBrowser = 14,\n AndroidAmazon = 15,\n UWP = 16,\n SafariBrowser = 17,\n VivaldiBrowser = 18,\n VivaldiExtension = 19,\n SafariExtension = 20,\n SDK = 21,\n Server = 22,\n WindowsCLI = 23,\n MacOsCLI = 24,\n LinuxCLI = 25,\n}\n\nexport const MobileDeviceTypes: Set = new Set([\n DeviceType.Android,\n DeviceType.iOS,\n DeviceType.AndroidAmazon,\n]);\n\nexport const DesktopDeviceTypes: Set = new Set([\n DeviceType.WindowsDesktop,\n DeviceType.MacOsDesktop,\n DeviceType.LinuxDesktop,\n DeviceType.UWP,\n DeviceType.WindowsCLI,\n DeviceType.MacOsCLI,\n DeviceType.LinuxCLI,\n]);\n","// Note: the enum key is used to describe the EventSystemUser in the UI. Be careful about changing it.\nexport enum EventSystemUser {\n SCIM = 1,\n DomainVerification = 2,\n}\n","// Increment by 100 for each new set of events\nexport enum EventType {\n User_LoggedIn = 1000,\n User_ChangedPassword = 1001,\n User_Updated2fa = 1002,\n User_Disabled2fa = 1003,\n User_Recovered2fa = 1004,\n User_FailedLogIn = 1005,\n User_FailedLogIn2fa = 1006,\n User_ClientExportedVault = 1007,\n User_UpdatedTempPassword = 1008,\n User_MigratedKeyToKeyConnector = 1009,\n User_RequestedDeviceApproval = 1010,\n\n Cipher_Created = 1100,\n Cipher_Updated = 1101,\n Cipher_Deleted = 1102,\n Cipher_AttachmentCreated = 1103,\n Cipher_AttachmentDeleted = 1104,\n Cipher_Shared = 1105,\n Cipher_UpdatedCollections = 1106,\n Cipher_ClientViewed = 1107,\n Cipher_ClientToggledPasswordVisible = 1108,\n Cipher_ClientToggledHiddenFieldVisible = 1109,\n Cipher_ClientToggledCardCodeVisible = 1110,\n Cipher_ClientCopiedPassword = 1111,\n Cipher_ClientCopiedHiddenField = 1112,\n Cipher_ClientCopiedCardCode = 1113,\n Cipher_ClientAutofilled = 1114,\n Cipher_SoftDeleted = 1115,\n Cipher_Restored = 1116,\n Cipher_ClientToggledCardNumberVisible = 1117,\n Cipher_ClientToggledTOTPSeedVisible = 1118,\n\n Collection_Created = 1300,\n Collection_Updated = 1301,\n Collection_Deleted = 1302,\n\n Group_Created = 1400,\n Group_Updated = 1401,\n Group_Deleted = 1402,\n\n OrganizationUser_Invited = 1500,\n OrganizationUser_Confirmed = 1501,\n OrganizationUser_Updated = 1502,\n OrganizationUser_Removed = 1503,\n OrganizationUser_UpdatedGroups = 1504,\n OrganizationUser_UnlinkedSso = 1505,\n OrganizationUser_ResetPassword_Enroll = 1506,\n OrganizationUser_ResetPassword_Withdraw = 1507,\n OrganizationUser_AdminResetPassword = 1508,\n OrganizationUser_ResetSsoLink = 1509,\n OrganizationUser_FirstSsoLogin = 1510,\n OrganizationUser_Revoked = 1511,\n OrganizationUser_Restored = 1512,\n OrganizationUser_ApprovedAuthRequest = 1513,\n OrganizationUser_RejectedAuthRequest = 1514,\n\n Organization_Updated = 1600,\n Organization_PurgedVault = 1601,\n Organization_ClientExportedVault = 1602,\n Organization_VaultAccessed = 1603,\n Organization_EnabledSso = 1604,\n Organization_DisabledSso = 1605,\n Organization_EnabledKeyConnector = 1606,\n Organization_DisabledKeyConnector = 1607,\n Organization_SponsorshipsSynced = 1608,\n Organization_CollectionManagementUpdated = 1609,\n\n Policy_Updated = 1700,\n\n ProviderUser_Invited = 1800,\n ProviderUser_Confirmed = 1801,\n ProviderUser_Updated = 1802,\n ProviderUser_Removed = 1803,\n\n ProviderOrganization_Created = 1900,\n ProviderOrganization_Added = 1901,\n ProviderOrganization_Removed = 1902,\n ProviderOrganization_VaultAccessed = 1903,\n\n OrganizationDomain_Added = 2000,\n OrganizationDomain_Removed = 2001,\n OrganizationDomain_Verified = 2002,\n OrganizationDomain_NotVerified = 2003,\n\n Secret_Retrieved = 2100,\n}\n","export enum NativeMessagingVersion {\n One = 1, // Original implementation\n Latest = One,\n}\n","export enum NotificationType {\n SyncCipherUpdate = 0,\n SyncCipherCreate = 1,\n SyncLoginDelete = 2,\n SyncFolderDelete = 3,\n SyncCiphers = 4,\n\n SyncVault = 5,\n SyncOrgKeys = 6,\n SyncFolderCreate = 7,\n SyncFolderUpdate = 8,\n SyncCipherDelete = 9,\n SyncSettings = 10,\n\n LogOut = 11,\n\n SyncSendCreate = 12,\n SyncSendUpdate = 13,\n SyncSendDelete = 14,\n\n AuthRequest = 15,\n AuthRequestResponse = 16,\n\n SyncOrganizations = 17,\n}\n","export enum ProductType {\n Free = 0,\n Families = 1,\n Teams = 2,\n Enterprise = 3,\n TeamsStarter = 4,\n}\n","export enum VaultTimeoutAction {\n Lock = \"lock\",\n LogOut = \"logOut\",\n}\n","/*\n See full documentation at:\n https://bitwarden.com/help/uri-match-detection/#match-detection-options\n\n Domain: \"the top-level domain and second-level domain of the URI match the detected resource\",\n Host: \"the hostname and (if specified) port of the URI matches the detected resource\",\n StartsWith: \"the detected resource starts with the URI, regardless of what follows it\",\n Exact: \"the URI matches the detected resource exactly\",\n RegularExpression: \"the detected resource matches a specified regular expression\",\n Never: \"never offer auto-fill for the item\",\n*/\nexport const UriMatchStrategy = {\n Domain: 0,\n Host: 1,\n StartsWith: 2,\n Exact: 3,\n RegularExpression: 4,\n Never: 5,\n} as const;\n\nexport type UriMatchStrategySetting = (typeof UriMatchStrategy)[keyof typeof UriMatchStrategy];\n\nexport type NeverDomains = { [id: string]: unknown };\nexport type EquivalentDomains = string[][];\n","import { EncString } from \"../../platform/models/domain/enc-string\";\nimport { Card as CardDomain } from \"../../vault/models/domain/card\";\nimport { CardView } from \"../../vault/models/view/card.view\";\n\nexport class CardExport {\n static template(): CardExport {\n const req = new CardExport();\n req.cardholderName = \"John Doe\";\n req.brand = \"visa\";\n req.number = \"4242424242424242\";\n req.expMonth = \"04\";\n req.expYear = \"2023\";\n req.code = \"123\";\n return req;\n }\n\n static toView(req: CardExport, view = new CardView()) {\n view.cardholderName = req.cardholderName;\n view.brand = req.brand;\n view.number = req.number;\n view.expMonth = req.expMonth;\n view.expYear = req.expYear;\n view.code = req.code;\n return view;\n }\n\n static toDomain(req: CardExport, domain = new CardDomain()) {\n domain.cardholderName = req.cardholderName != null ? new EncString(req.cardholderName) : null;\n domain.brand = req.brand != null ? new EncString(req.brand) : null;\n domain.number = req.number != null ? new EncString(req.number) : null;\n domain.expMonth = req.expMonth != null ? new EncString(req.expMonth) : null;\n domain.expYear = req.expYear != null ? new EncString(req.expYear) : null;\n domain.code = req.code != null ? new EncString(req.code) : null;\n return domain;\n }\n\n cardholderName: string;\n brand: string;\n number: string;\n expMonth: string;\n expYear: string;\n code: string;\n\n constructor(o?: CardView | CardDomain) {\n if (o == null) {\n return;\n }\n\n if (o instanceof CardView) {\n this.cardholderName = o.cardholderName;\n this.brand = o.brand;\n this.number = o.number;\n this.expMonth = o.expMonth;\n this.expYear = o.expYear;\n this.code = o.code;\n } else {\n this.cardholderName = o.cardholderName?.encryptedString;\n this.brand = o.brand?.encryptedString;\n this.number = o.number?.encryptedString;\n this.expMonth = o.expMonth?.encryptedString;\n this.expYear = o.expYear?.encryptedString;\n this.code = o.code?.encryptedString;\n }\n }\n}\n","import { EncString } from \"../../platform/models/domain/enc-string\";\nimport { FieldType, LinkedIdType } from \"../../vault/enums\";\nimport { Field as FieldDomain } from \"../../vault/models/domain/field\";\nimport { FieldView } from \"../../vault/models/view/field.view\";\n\nexport class FieldExport {\n static template(): FieldExport {\n const req = new FieldExport();\n req.name = \"Field name\";\n req.value = \"Some value\";\n req.type = FieldType.Text;\n return req;\n }\n\n static toView(req: FieldExport, view = new FieldView()) {\n view.type = req.type;\n view.value = req.value;\n view.name = req.name;\n view.linkedId = req.linkedId;\n return view;\n }\n\n static toDomain(req: FieldExport, domain = new FieldDomain()) {\n domain.type = req.type;\n domain.value = req.value != null ? new EncString(req.value) : null;\n domain.name = req.name != null ? new EncString(req.name) : null;\n domain.linkedId = req.linkedId;\n return domain;\n }\n\n name: string;\n value: string;\n type: FieldType;\n linkedId: LinkedIdType;\n\n constructor(o?: FieldView | FieldDomain) {\n if (o == null) {\n return;\n }\n\n if (o instanceof FieldView) {\n this.name = o.name;\n this.value = o.value;\n } else {\n this.name = o.name?.encryptedString;\n this.value = o.value?.encryptedString;\n }\n this.type = o.type;\n this.linkedId = o.linkedId;\n }\n}\n","import { EncString } from \"../../platform/models/domain/enc-string\";\nimport { Identity as IdentityDomain } from \"../../vault/models/domain/identity\";\nimport { IdentityView } from \"../../vault/models/view/identity.view\";\n\nexport class IdentityExport {\n static template(): IdentityExport {\n const req = new IdentityExport();\n req.title = \"Mr\";\n req.firstName = \"John\";\n req.middleName = \"William\";\n req.lastName = \"Doe\";\n req.address1 = \"123 Any St\";\n req.address2 = \"Apt #123\";\n req.address3 = null;\n req.city = \"New York\";\n req.state = \"NY\";\n req.postalCode = \"10001\";\n req.country = \"US\";\n req.company = \"Acme Inc.\";\n req.email = \"john@company.com\";\n req.phone = \"5555551234\";\n req.ssn = \"000-123-4567\";\n req.username = \"jdoe\";\n req.passportNumber = \"US-123456789\";\n req.licenseNumber = \"D123-12-123-12333\";\n return req;\n }\n\n static toView(req: IdentityExport, view = new IdentityView()) {\n view.title = req.title;\n view.firstName = req.firstName;\n view.middleName = req.middleName;\n view.lastName = req.lastName;\n view.address1 = req.address1;\n view.address2 = req.address2;\n view.address3 = req.address3;\n view.city = req.city;\n view.state = req.state;\n view.postalCode = req.postalCode;\n view.country = req.country;\n view.company = req.company;\n view.email = req.email;\n view.phone = req.phone;\n view.ssn = req.ssn;\n view.username = req.username;\n view.passportNumber = req.passportNumber;\n view.licenseNumber = req.licenseNumber;\n return view;\n }\n\n static toDomain(req: IdentityExport, domain = new IdentityDomain()) {\n domain.title = req.title != null ? new EncString(req.title) : null;\n domain.firstName = req.firstName != null ? new EncString(req.firstName) : null;\n domain.middleName = req.middleName != null ? new EncString(req.middleName) : null;\n domain.lastName = req.lastName != null ? new EncString(req.lastName) : null;\n domain.address1 = req.address1 != null ? new EncString(req.address1) : null;\n domain.address2 = req.address2 != null ? new EncString(req.address2) : null;\n domain.address3 = req.address3 != null ? new EncString(req.address3) : null;\n domain.city = req.city != null ? new EncString(req.city) : null;\n domain.state = req.state != null ? new EncString(req.state) : null;\n domain.postalCode = req.postalCode != null ? new EncString(req.postalCode) : null;\n domain.country = req.country != null ? new EncString(req.country) : null;\n domain.company = req.company != null ? new EncString(req.company) : null;\n domain.email = req.email != null ? new EncString(req.email) : null;\n domain.phone = req.phone != null ? new EncString(req.phone) : null;\n domain.ssn = req.ssn != null ? new EncString(req.ssn) : null;\n domain.username = req.username != null ? new EncString(req.username) : null;\n domain.passportNumber = req.passportNumber != null ? new EncString(req.passportNumber) : null;\n domain.licenseNumber = req.licenseNumber != null ? new EncString(req.licenseNumber) : null;\n return domain;\n }\n\n title: string;\n firstName: string;\n middleName: string;\n lastName: string;\n address1: string;\n address2: string;\n address3: string;\n city: string;\n state: string;\n postalCode: string;\n country: string;\n company: string;\n email: string;\n phone: string;\n ssn: string;\n username: string;\n passportNumber: string;\n licenseNumber: string;\n\n constructor(o?: IdentityView | IdentityDomain) {\n if (o == null) {\n return;\n }\n\n if (o instanceof IdentityView) {\n this.title = o.title;\n this.firstName = o.firstName;\n this.middleName = o.middleName;\n this.lastName = o.lastName;\n this.address1 = o.address1;\n this.address2 = o.address2;\n this.address3 = o.address3;\n this.city = o.city;\n this.state = o.state;\n this.postalCode = o.postalCode;\n this.country = o.country;\n this.company = o.company;\n this.email = o.email;\n this.phone = o.phone;\n this.ssn = o.ssn;\n this.username = o.username;\n this.passportNumber = o.passportNumber;\n this.licenseNumber = o.licenseNumber;\n } else {\n this.title = o.title?.encryptedString;\n this.firstName = o.firstName?.encryptedString;\n this.middleName = o.middleName?.encryptedString;\n this.lastName = o.lastName?.encryptedString;\n this.address1 = o.address1?.encryptedString;\n this.address2 = o.address2?.encryptedString;\n this.address3 = o.address3?.encryptedString;\n this.city = o.city?.encryptedString;\n this.state = o.state?.encryptedString;\n this.postalCode = o.postalCode?.encryptedString;\n this.country = o.country?.encryptedString;\n this.company = o.company?.encryptedString;\n this.email = o.email?.encryptedString;\n this.phone = o.phone?.encryptedString;\n this.ssn = o.ssn?.encryptedString;\n this.username = o.username?.encryptedString;\n this.passportNumber = o.passportNumber?.encryptedString;\n this.licenseNumber = o.licenseNumber?.encryptedString;\n }\n }\n}\n","import { EncString } from \"../../platform/models/domain/enc-string\";\nimport { Fido2Credential } from \"../../vault/models/domain/fido2-credential\";\nimport { Fido2CredentialView } from \"../../vault/models/view/fido2-credential.view\";\n\n/**\n * Represents format of Fido2 Credentials in JSON exports.\n */\nexport class Fido2CredentialExport {\n /**\n * Generates a template for Fido2CredentialExport\n * @returns Instance of Fido2CredentialExport with predefined values.\n */\n static template(): Fido2CredentialExport {\n const req = new Fido2CredentialExport();\n req.credentialId = \"keyId\";\n req.keyType = \"keyType\";\n req.keyAlgorithm = \"keyAlgorithm\";\n req.keyCurve = \"keyCurve\";\n req.keyValue = \"keyValue\";\n req.rpId = \"rpId\";\n req.userHandle = \"userHandle\";\n req.userName = \"userName\";\n req.counter = \"counter\";\n req.rpName = \"rpName\";\n req.userDisplayName = \"userDisplayName\";\n req.discoverable = \"false\";\n req.creationDate = null;\n return req;\n }\n\n /**\n * Converts a Fido2CredentialExport object to its view representation.\n * @param req - The Fido2CredentialExport object to be converted.\n * @param view - (Optional) The Fido2CredentialView object to popualte with Fido2CredentialExport data\n * @returns Fido2CredentialView - The populated view, or a new instance if none was provided.\n */\n static toView(req: Fido2CredentialExport, view = new Fido2CredentialView()) {\n view.credentialId = req.credentialId;\n view.keyType = req.keyType as \"public-key\";\n view.keyAlgorithm = req.keyAlgorithm as \"ECDSA\";\n view.keyCurve = req.keyCurve as \"P-256\";\n view.keyValue = req.keyValue;\n view.rpId = req.rpId;\n view.userHandle = req.userHandle;\n view.userName = req.userName;\n view.counter = parseInt(req.counter);\n view.rpName = req.rpName;\n view.userDisplayName = req.userDisplayName;\n view.discoverable = req.discoverable === \"true\";\n view.creationDate = new Date(req.creationDate);\n return view;\n }\n\n /**\n * Converts a Fido2CredentialExport object to its domain representation.\n * @param req - The Fido2CredentialExport object to be converted.\n * @param domain - (Optional) The Fido2Credential object to popualte with Fido2CredentialExport data\n * @returns Fido2Credential - The populated domain, or a new instance if none was provided.\n */\n static toDomain(req: Fido2CredentialExport, domain = new Fido2Credential()) {\n domain.credentialId = req.credentialId != null ? new EncString(req.credentialId) : null;\n domain.keyType = req.keyType != null ? new EncString(req.keyType) : null;\n domain.keyAlgorithm = req.keyAlgorithm != null ? new EncString(req.keyAlgorithm) : null;\n domain.keyCurve = req.keyCurve != null ? new EncString(req.keyCurve) : null;\n domain.keyValue = req.keyValue != null ? new EncString(req.keyValue) : null;\n domain.rpId = req.rpId != null ? new EncString(req.rpId) : null;\n domain.userHandle = req.userHandle != null ? new EncString(req.userHandle) : null;\n domain.userName = req.userName != null ? new EncString(req.userName) : null;\n domain.counter = req.counter != null ? new EncString(req.counter) : null;\n domain.rpName = req.rpName != null ? new EncString(req.rpName) : null;\n domain.userDisplayName =\n req.userDisplayName != null ? new EncString(req.userDisplayName) : null;\n domain.discoverable = req.discoverable != null ? new EncString(req.discoverable) : null;\n domain.creationDate = req.creationDate;\n return domain;\n }\n\n credentialId: string;\n keyType: string;\n keyAlgorithm: string;\n keyCurve: string;\n keyValue: string;\n rpId: string;\n userHandle: string;\n userName: string;\n counter: string;\n rpName: string;\n userDisplayName: string;\n discoverable: string;\n creationDate: Date;\n\n /**\n * Constructs a new Fid2CredentialExport instance.\n *\n * @param o - The credential storing the data being exported. When not provided, an empty export is created instead.\n */\n constructor(o?: Fido2CredentialView | Fido2Credential) {\n if (o == null) {\n return;\n }\n\n if (o instanceof Fido2CredentialView) {\n this.credentialId = o.credentialId;\n this.keyType = o.keyType;\n this.keyAlgorithm = o.keyAlgorithm;\n this.keyCurve = o.keyCurve;\n this.keyValue = o.keyValue;\n this.rpId = o.rpId;\n this.userHandle = o.userHandle;\n this.userName = o.userName;\n this.counter = String(o.counter);\n this.rpName = o.rpName;\n this.userDisplayName = o.userDisplayName;\n this.discoverable = String(o.discoverable);\n } else {\n this.credentialId = o.credentialId?.encryptedString;\n this.keyType = o.keyType?.encryptedString;\n this.keyAlgorithm = o.keyAlgorithm?.encryptedString;\n this.keyCurve = o.keyCurve?.encryptedString;\n this.keyValue = o.keyValue?.encryptedString;\n this.rpId = o.rpId?.encryptedString;\n this.userHandle = o.userHandle?.encryptedString;\n this.userName = o.userName?.encryptedString;\n this.counter = o.counter?.encryptedString;\n this.rpName = o.rpName?.encryptedString;\n this.userDisplayName = o.userDisplayName?.encryptedString;\n this.discoverable = o.discoverable?.encryptedString;\n }\n this.creationDate = o.creationDate;\n }\n}\n","import { UriMatchStrategySetting } from \"../../models/domain/domain-service\";\nimport { EncString } from \"../../platform/models/domain/enc-string\";\nimport { LoginUri as LoginUriDomain } from \"../../vault/models/domain/login-uri\";\nimport { LoginUriView } from \"../../vault/models/view/login-uri.view\";\n\nexport class LoginUriExport {\n static template(): LoginUriExport {\n const req = new LoginUriExport();\n req.uri = \"https://google.com\";\n req.match = null;\n return req;\n }\n\n static toView(req: LoginUriExport, view = new LoginUriView()) {\n view.uri = req.uri;\n view.match = req.match;\n return view;\n }\n\n static toDomain(req: LoginUriExport, domain = new LoginUriDomain()) {\n domain.uri = req.uri != null ? new EncString(req.uri) : null;\n domain.uriChecksum = req.uriChecksum != null ? new EncString(req.uriChecksum) : null;\n domain.match = req.match;\n return domain;\n }\n\n uri: string;\n uriChecksum: string | undefined;\n match: UriMatchStrategySetting = null;\n\n constructor(o?: LoginUriView | LoginUriDomain) {\n if (o == null) {\n return;\n }\n\n if (o instanceof LoginUriView) {\n this.uri = o.uri;\n } else {\n this.uri = o.uri?.encryptedString;\n this.uriChecksum = o.uriChecksum?.encryptedString;\n }\n this.match = o.match;\n }\n}\n","import { EncString } from \"../../platform/models/domain/enc-string\";\nimport { Login as LoginDomain } from \"../../vault/models/domain/login\";\nimport { LoginView } from \"../../vault/models/view/login.view\";\n\nimport { Fido2CredentialExport } from \"./fido2-credential.export\";\nimport { LoginUriExport } from \"./login-uri.export\";\n\nexport class LoginExport {\n static template(): LoginExport {\n const req = new LoginExport();\n req.uris = [];\n req.username = \"jdoe\";\n req.password = \"myp@ssword123\";\n req.totp = \"JBSWY3DPEHPK3PXP\";\n req.fido2Credentials = [Fido2CredentialExport.template()];\n return req;\n }\n\n static toView(req: LoginExport, view = new LoginView()) {\n if (req.uris != null) {\n view.uris = req.uris.map((u) => LoginUriExport.toView(u));\n }\n view.username = req.username;\n view.password = req.password;\n view.totp = req.totp;\n if (req.fido2Credentials != null) {\n view.fido2Credentials = req.fido2Credentials.map((key) => Fido2CredentialExport.toView(key));\n }\n return view;\n }\n\n static toDomain(req: LoginExport, domain = new LoginDomain()) {\n if (req.uris != null) {\n domain.uris = req.uris.map((u) => LoginUriExport.toDomain(u));\n }\n domain.username = req.username != null ? new EncString(req.username) : null;\n domain.password = req.password != null ? new EncString(req.password) : null;\n domain.totp = req.totp != null ? new EncString(req.totp) : null;\n // Fido2credentials are currently not supported for exports.\n\n return domain;\n }\n\n uris: LoginUriExport[];\n username: string;\n password: string;\n totp: string;\n fido2Credentials: Fido2CredentialExport[] = [];\n\n constructor(o?: LoginView | LoginDomain) {\n if (o == null) {\n return;\n }\n\n if (o.uris != null) {\n if (o instanceof LoginView) {\n this.uris = o.uris.map((u) => new LoginUriExport(u));\n } else {\n this.uris = o.uris.map((u) => new LoginUriExport(u));\n }\n }\n\n if (o.fido2Credentials != null) {\n this.fido2Credentials = o.fido2Credentials.map((key) => new Fido2CredentialExport(key));\n }\n\n if (o instanceof LoginView) {\n this.username = o.username;\n this.password = o.password;\n this.totp = o.totp;\n } else {\n this.username = o.username?.encryptedString;\n this.password = o.password?.encryptedString;\n this.totp = o.totp?.encryptedString;\n }\n }\n}\n","import { EncString } from \"../../platform/models/domain/enc-string\";\nimport { Password } from \"../../vault/models/domain/password\";\nimport { PasswordHistoryView } from \"../../vault/models/view/password-history.view\";\n\nexport class PasswordHistoryExport {\n static template(): PasswordHistoryExport {\n const req = new PasswordHistoryExport();\n req.password = null;\n req.lastUsedDate = null;\n return req;\n }\n\n static toView(req: PasswordHistoryExport, view = new PasswordHistoryView()) {\n view.password = req.password;\n view.lastUsedDate = req.lastUsedDate;\n return view;\n }\n\n static toDomain(req: PasswordHistoryExport, domain = new Password()) {\n domain.password = req.password != null ? new EncString(req.password) : null;\n domain.lastUsedDate = req.lastUsedDate;\n return domain;\n }\n\n password: string;\n lastUsedDate: Date = null;\n\n constructor(o?: PasswordHistoryView | Password) {\n if (o == null) {\n return;\n }\n\n if (o instanceof PasswordHistoryView) {\n this.password = o.password;\n } else {\n this.password = o.password?.encryptedString;\n }\n this.lastUsedDate = o.lastUsedDate;\n }\n}\n","import { SecureNoteType } from \"../../vault/enums\";\nimport { SecureNote as SecureNoteDomain } from \"../../vault/models/domain/secure-note\";\nimport { SecureNoteView } from \"../../vault/models/view/secure-note.view\";\n\nexport class SecureNoteExport {\n static template(): SecureNoteExport {\n const req = new SecureNoteExport();\n req.type = SecureNoteType.Generic;\n return req;\n }\n\n static toView(req: SecureNoteExport, view = new SecureNoteView()) {\n view.type = req.type;\n return view;\n }\n\n static toDomain(req: SecureNoteExport, view = new SecureNoteDomain()) {\n view.type = req.type;\n return view;\n }\n\n type: SecureNoteType;\n\n constructor(o?: SecureNoteView | SecureNoteDomain) {\n if (o == null) {\n return;\n }\n\n this.type = o.type;\n }\n}\n","import { EncString } from \"../../platform/models/domain/enc-string\";\nimport { CipherRepromptType } from \"../../vault/enums/cipher-reprompt-type\";\nimport { CipherType } from \"../../vault/enums/cipher-type\";\nimport { Cipher as CipherDomain } from \"../../vault/models/domain/cipher\";\nimport { CipherView } from \"../../vault/models/view/cipher.view\";\n\nimport { CardExport } from \"./card.export\";\nimport { FieldExport } from \"./field.export\";\nimport { IdentityExport } from \"./identity.export\";\nimport { LoginExport } from \"./login.export\";\nimport { PasswordHistoryExport } from \"./password-history.export\";\nimport { SecureNoteExport } from \"./secure-note.export\";\n\nexport class CipherExport {\n static template(): CipherExport {\n const req = new CipherExport();\n req.organizationId = null;\n req.collectionIds = null;\n req.folderId = null;\n req.type = CipherType.Login;\n req.name = \"Item name\";\n req.notes = \"Some notes about this item.\";\n req.favorite = false;\n req.fields = [];\n req.login = null;\n req.secureNote = null;\n req.card = null;\n req.identity = null;\n req.reprompt = CipherRepromptType.None;\n req.passwordHistory = [];\n req.creationDate = null;\n req.revisionDate = null;\n req.deletedDate = null;\n return req;\n }\n\n static toView(req: CipherExport, view = new CipherView()) {\n view.type = req.type;\n view.folderId = req.folderId;\n if (view.organizationId == null) {\n view.organizationId = req.organizationId;\n }\n if (view.collectionIds || req.collectionIds) {\n const set = new Set((view.collectionIds ?? []).concat(req.collectionIds ?? []));\n view.collectionIds = Array.from(set.values());\n }\n view.name = req.name;\n view.notes = req.notes;\n view.favorite = req.favorite;\n view.reprompt = req.reprompt ?? CipherRepromptType.None;\n\n if (req.fields != null) {\n view.fields = req.fields.map((f) => FieldExport.toView(f));\n }\n\n switch (req.type) {\n case CipherType.Login:\n view.login = LoginExport.toView(req.login);\n break;\n case CipherType.SecureNote:\n view.secureNote = SecureNoteExport.toView(req.secureNote);\n break;\n case CipherType.Card:\n view.card = CardExport.toView(req.card);\n break;\n case CipherType.Identity:\n view.identity = IdentityExport.toView(req.identity);\n break;\n }\n\n if (req.passwordHistory != null) {\n view.passwordHistory = req.passwordHistory.map((ph) => PasswordHistoryExport.toView(ph));\n }\n\n view.creationDate = req.creationDate;\n view.revisionDate = req.revisionDate;\n view.deletedDate = req.deletedDate;\n return view;\n }\n\n static toDomain(req: CipherExport, domain = new CipherDomain()) {\n domain.type = req.type;\n domain.folderId = req.folderId;\n if (domain.organizationId == null) {\n domain.organizationId = req.organizationId;\n }\n domain.name = req.name != null ? new EncString(req.name) : null;\n domain.notes = req.notes != null ? new EncString(req.notes) : null;\n domain.favorite = req.favorite;\n domain.reprompt = req.reprompt ?? CipherRepromptType.None;\n domain.key = req.key != null ? new EncString(req.key) : null;\n\n if (req.fields != null) {\n domain.fields = req.fields.map((f) => FieldExport.toDomain(f));\n }\n\n switch (req.type) {\n case CipherType.Login:\n domain.login = LoginExport.toDomain(req.login);\n break;\n case CipherType.SecureNote:\n domain.secureNote = SecureNoteExport.toDomain(req.secureNote);\n break;\n case CipherType.Card:\n domain.card = CardExport.toDomain(req.card);\n break;\n case CipherType.Identity:\n domain.identity = IdentityExport.toDomain(req.identity);\n break;\n }\n\n if (req.passwordHistory != null) {\n domain.passwordHistory = req.passwordHistory.map((ph) => PasswordHistoryExport.toDomain(ph));\n }\n\n domain.creationDate = req.creationDate;\n domain.revisionDate = req.revisionDate;\n domain.deletedDate = req.deletedDate;\n return domain;\n }\n\n type: CipherType;\n folderId: string;\n organizationId: string;\n collectionIds: string[];\n name: string;\n notes: string;\n favorite: boolean;\n fields: FieldExport[];\n login: LoginExport;\n secureNote: SecureNoteExport;\n card: CardExport;\n identity: IdentityExport;\n reprompt: CipherRepromptType;\n passwordHistory: PasswordHistoryExport[] = null;\n revisionDate: Date = null;\n creationDate: Date = null;\n deletedDate: Date = null;\n key: string;\n\n // Use build method instead of ctor so that we can control order of JSON stringify for pretty print\n build(o: CipherView | CipherDomain) {\n this.organizationId = o.organizationId;\n this.folderId = o.folderId;\n this.type = o.type;\n this.reprompt = o.reprompt;\n\n if (o instanceof CipherView) {\n this.name = o.name;\n this.notes = o.notes;\n } else {\n this.name = o.name?.encryptedString;\n this.notes = o.notes?.encryptedString;\n this.key = o.key?.encryptedString;\n }\n\n this.favorite = o.favorite;\n\n if (o.fields != null) {\n if (o instanceof CipherView) {\n this.fields = o.fields.map((f) => new FieldExport(f));\n } else {\n this.fields = o.fields.map((f) => new FieldExport(f));\n }\n }\n\n switch (o.type) {\n case CipherType.Login:\n this.login = new LoginExport(o.login);\n break;\n case CipherType.SecureNote:\n this.secureNote = new SecureNoteExport(o.secureNote);\n break;\n case CipherType.Card:\n this.card = new CardExport(o.card);\n break;\n case CipherType.Identity:\n this.identity = new IdentityExport(o.identity);\n break;\n }\n\n if (o.passwordHistory != null) {\n if (o instanceof CipherView) {\n this.passwordHistory = o.passwordHistory.map((ph) => new PasswordHistoryExport(ph));\n } else {\n this.passwordHistory = o.passwordHistory.map((ph) => new PasswordHistoryExport(ph));\n }\n }\n\n this.creationDate = o.creationDate;\n this.revisionDate = o.revisionDate;\n this.deletedDate = o.deletedDate;\n }\n}\n","import { Cipher as CipherDomain } from \"../../vault/models/domain/cipher\";\nimport { CipherView } from \"../../vault/models/view/cipher.view\";\n\nimport { CipherExport } from \"./cipher.export\";\n\nexport class CipherWithIdExport extends CipherExport {\n id: string;\n collectionIds: string[];\n\n // Use build method instead of ctor so that we can control order of JSON stringify for pretty print\n build(o: CipherView | CipherDomain) {\n this.id = o.id;\n super.build(o);\n this.collectionIds = o.collectionIds;\n }\n}\n","import { EncString } from \"../../platform/models/domain/enc-string\";\nimport { Collection as CollectionDomain } from \"../../vault/models/domain/collection\";\nimport { CollectionView } from \"../../vault/models/view/collection.view\";\n\nexport class CollectionExport {\n static template(): CollectionExport {\n const req = new CollectionExport();\n req.organizationId = \"00000000-0000-0000-0000-000000000000\";\n req.name = \"Collection name\";\n req.externalId = null;\n return req;\n }\n\n static toView(req: CollectionExport, view = new CollectionView()) {\n view.name = req.name;\n view.externalId = req.externalId;\n if (view.organizationId == null) {\n view.organizationId = req.organizationId;\n }\n return view;\n }\n\n static toDomain(req: CollectionExport, domain = new CollectionDomain()) {\n domain.name = req.name != null ? new EncString(req.name) : null;\n domain.externalId = req.externalId;\n if (domain.organizationId == null) {\n domain.organizationId = req.organizationId;\n }\n return domain;\n }\n\n organizationId: string;\n name: string;\n externalId: string;\n\n // Use build method instead of ctor so that we can control order of JSON stringify for pretty print\n build(o: CollectionView | CollectionDomain) {\n this.organizationId = o.organizationId;\n if (o instanceof CollectionView) {\n this.name = o.name;\n } else {\n this.name = o.name?.encryptedString;\n }\n this.externalId = o.externalId;\n }\n}\n","import { Collection as CollectionDomain } from \"../../vault/models/domain/collection\";\nimport { CollectionView } from \"../../vault/models/view/collection.view\";\n\nimport { CollectionExport } from \"./collection.export\";\n\nexport class CollectionWithIdExport extends CollectionExport {\n id: string;\n\n static toView(req: CollectionWithIdExport, view = new CollectionView()) {\n view.id = req.id;\n return super.toView(req, view);\n }\n\n static toDomain(req: CollectionWithIdExport, domain = new CollectionDomain()) {\n domain.id = req.id;\n return super.toDomain(req, domain);\n }\n\n // Use build method instead of ctor so that we can control order of JSON stringify for pretty print\n build(o: CollectionView | CollectionDomain) {\n this.id = o.id;\n super.build(o);\n }\n}\n","import { EncString } from \"../../platform/models/domain/enc-string\";\nimport { Folder as FolderDomain } from \"../../vault/models/domain/folder\";\nimport { FolderView } from \"../../vault/models/view/folder.view\";\n\nexport class FolderExport {\n static template(): FolderExport {\n const req = new FolderExport();\n req.name = \"Folder name\";\n return req;\n }\n\n static toView(req: FolderExport, view = new FolderView()) {\n view.name = req.name;\n return view;\n }\n\n static toDomain(req: FolderExport, domain = new FolderDomain()) {\n domain.name = req.name != null ? new EncString(req.name) : null;\n return domain;\n }\n\n name: string;\n\n // Use build method instead of ctor so that we can control order of JSON stringify for pretty print\n build(o: FolderView | FolderDomain) {\n if (o instanceof FolderView) {\n this.name = o.name;\n } else {\n this.name = o.name?.encryptedString;\n }\n }\n}\n","import { Folder as FolderDomain } from \"../../vault/models/domain/folder\";\nimport { FolderView } from \"../../vault/models/view/folder.view\";\n\nimport { FolderExport } from \"./folder.export\";\n\nexport class FolderWithIdExport extends FolderExport {\n id: string;\n\n static toView(req: FolderWithIdExport, view = new FolderView()) {\n view.id = req.id;\n return super.toView(req, view);\n }\n\n static toDomain(req: FolderWithIdExport, domain = new FolderDomain()) {\n domain.id = req.id;\n return super.toDomain(req, domain);\n }\n\n // Use build method instead of ctor so that we can control order of JSON stringify for pretty print\n build(o: FolderView | FolderDomain) {\n this.id = o.id;\n super.build(o);\n }\n}\n","export class KeysRequest {\n publicKey: string;\n encryptedPrivateKey: string;\n\n constructor(publicKey: string, encryptedPrivateKey: string) {\n this.publicKey = publicKey;\n this.encryptedPrivateKey = encryptedPrivateKey;\n }\n}\n","export abstract class BaseResponse {\n private response: any;\n\n constructor(response: any) {\n this.response = response;\n }\n\n protected getResponseProperty(\n propertyName: string,\n response: any = null,\n exactName = false,\n ): any {\n if (propertyName == null || propertyName === \"\") {\n throw new Error(\"propertyName must not be null/empty.\");\n }\n if (response == null && this.response != null) {\n response = this.response;\n }\n if (response == null) {\n return null;\n }\n if (!exactName && response[propertyName] === undefined) {\n let otherCasePropertyName: string = null;\n if (propertyName.charAt(0) === propertyName.charAt(0).toUpperCase()) {\n otherCasePropertyName = propertyName.charAt(0).toLowerCase();\n } else {\n otherCasePropertyName = propertyName.charAt(0).toUpperCase();\n }\n if (propertyName.length > 1) {\n otherCasePropertyName += propertyName.slice(1);\n }\n\n propertyName = otherCasePropertyName;\n if (response[propertyName] === undefined) {\n propertyName = propertyName.toLowerCase();\n }\n if (response[propertyName] === undefined) {\n propertyName = propertyName.toUpperCase();\n }\n }\n return response[propertyName];\n }\n}\n","import { Utils } from \"../../platform/misc/utils\";\n\nimport { BaseResponse } from \"./base.response\";\n\nexport class ErrorResponse extends BaseResponse {\n message: string;\n validationErrors: { [key: string]: string[] };\n statusCode: number;\n captchaRequired: boolean;\n captchaSiteKey: string;\n\n constructor(response: any, status: number, identityResponse?: boolean) {\n super(response);\n let errorModel = null;\n if (response != null) {\n const responseErrorModel = this.getResponseProperty(\"ErrorModel\");\n if (responseErrorModel && identityResponse) {\n errorModel = responseErrorModel;\n } else {\n errorModel = response;\n }\n }\n\n if (status === 429) {\n this.message = \"Rate limit exceeded. Try again later.\";\n } else if (errorModel) {\n this.message = this.getResponseProperty(\"Message\", errorModel);\n this.validationErrors = this.getResponseProperty(\"ValidationErrors\", errorModel);\n this.captchaSiteKey = this.validationErrors?.HCaptcha_SiteKey?.[0];\n this.captchaRequired = !Utils.isNullOrWhitespace(this.captchaSiteKey);\n }\n this.statusCode = status;\n }\n\n getSingleMessage(): string {\n if (this.validationErrors == null) {\n return this.message;\n }\n for (const key in this.validationErrors) {\n // eslint-disable-next-line\n if (!this.validationErrors.hasOwnProperty(key)) {\n continue;\n }\n if (this.validationErrors[key].length) {\n return this.validationErrors[key][0];\n }\n }\n return this.message;\n }\n\n getAllMessages(): string[] {\n const messages: string[] = [];\n if (this.validationErrors == null) {\n return messages;\n }\n for (const key in this.validationErrors) {\n // eslint-disable-next-line\n if (!this.validationErrors.hasOwnProperty(key)) {\n continue;\n }\n this.validationErrors[key].forEach((item: string) => {\n let prefix = \"\";\n if (key.indexOf(\"[\") > -1 && key.indexOf(\"]\") > -1) {\n const lastSep = key.lastIndexOf(\".\");\n prefix = key.substr(0, lastSep > -1 ? lastSep : key.length) + \": \";\n }\n messages.push(prefix + item);\n });\n }\n return messages;\n }\n}\n","import { DeviceType, EventSystemUser, EventType } from \"../../enums\";\n\nimport { BaseResponse } from \"./base.response\";\n\nexport class EventResponse extends BaseResponse {\n type: EventType;\n userId: string;\n organizationId: string;\n providerId: string;\n cipherId: string;\n collectionId: string;\n groupId: string;\n policyId: string;\n organizationUserId: string;\n providerUserId: string;\n providerOrganizationId: string;\n actingUserId: string;\n date: string;\n deviceType: DeviceType;\n ipAddress: string;\n installationId: string;\n systemUser: EventSystemUser;\n domainName: string;\n secretId: string;\n serviceAccountId: string;\n\n constructor(response: any) {\n super(response);\n this.type = this.getResponseProperty(\"Type\");\n this.userId = this.getResponseProperty(\"UserId\");\n this.organizationId = this.getResponseProperty(\"OrganizationId\");\n this.providerId = this.getResponseProperty(\"ProviderId\");\n this.cipherId = this.getResponseProperty(\"CipherId\");\n this.collectionId = this.getResponseProperty(\"CollectionId\");\n this.groupId = this.getResponseProperty(\"GroupId\");\n this.policyId = this.getResponseProperty(\"PolicyId\");\n this.organizationUserId = this.getResponseProperty(\"OrganizationUserId\");\n this.providerUserId = this.getResponseProperty(\"ProviderUserId\");\n this.providerOrganizationId = this.getResponseProperty(\"ProviderOrganizationId\");\n this.actingUserId = this.getResponseProperty(\"ActingUserId\");\n this.date = this.getResponseProperty(\"Date\");\n this.deviceType = this.getResponseProperty(\"DeviceType\");\n this.ipAddress = this.getResponseProperty(\"IpAddress\");\n this.installationId = this.getResponseProperty(\"InstallationId\");\n this.systemUser = this.getResponseProperty(\"SystemUser\");\n this.domainName = this.getResponseProperty(\"DomainName\");\n this.secretId = this.getResponseProperty(\"SecretId\");\n this.serviceAccountId = this.getResponseProperty(\"ServiceAccountId\");\n }\n}\n","import { BaseResponse } from \"./base.response\";\n\nexport class ListResponse extends BaseResponse {\n data: T[];\n continuationToken: string;\n\n constructor(response: any, t: new (dataResponse: any) => T) {\n super(response);\n const data = this.getResponseProperty(\"Data\");\n this.data = data == null ? [] : data.map((dr: any) => new t(dr));\n this.continuationToken = this.getResponseProperty(\"ContinuationToken\");\n }\n}\n","import { EventSystemUser, EventType } from \"../../enums\";\n\nexport class EventView {\n message: string;\n humanReadableMessage: string;\n appIcon: string;\n appName: string;\n userId: string;\n userName: string;\n userEmail: string;\n date: string;\n ip: string;\n type: EventType;\n installationId: string;\n systemUser: EventSystemUser;\n serviceAccountId: string;\n\n constructor(data: Required) {\n this.message = data.message;\n this.humanReadableMessage = data.humanReadableMessage;\n this.appIcon = data.appIcon;\n this.appName = data.appName;\n this.userId = data.userId;\n this.userName = data.userName;\n this.userEmail = data.userEmail;\n this.date = data.date;\n this.ip = data.ip;\n this.type = data.type;\n this.installationId = data.installationId;\n this.systemUser = data.systemUser;\n this.serviceAccountId = data.serviceAccountId;\n }\n}\n","export class View {}\n","import { Observable } from \"rxjs\";\n\nexport abstract class AppIdService {\n appId$: Observable;\n anonymousAppId$: Observable;\n getAppId: () => Promise;\n getAnonymousAppId: () => Promise;\n}\n","export interface MessageBase {\n command: string;\n}\n\n/**\n * @deprecated Use the observable from the appropriate service instead.\n */\nexport abstract class BroadcasterService {\n /**\n * @deprecated Use the observable from the appropriate service instead.\n */\n send: (message: MessageBase, id?: string) => void;\n /**\n * @deprecated Use the observable from the appropriate service instead.\n */\n subscribe: (id: string, messageCallback: (message: MessageBase) => void) => void;\n /**\n * @deprecated Use the observable from the appropriate service instead.\n */\n unsubscribe: (id: string) => void;\n}\n","import { Observable } from \"rxjs\";\nimport { SemVer } from \"semver\";\n\nimport { FeatureFlag } from \"../../../enums/feature-flag.enum\";\nimport { Region } from \"../environment.service\";\n\nimport { ServerConfig } from \"./server-config\";\n\nexport abstract class ConfigServiceAbstraction {\n serverConfig$: Observable;\n cloudRegion$: Observable;\n getFeatureFlag$: (\n key: FeatureFlag,\n defaultValue?: T,\n ) => Observable;\n getFeatureFlag: (\n key: FeatureFlag,\n defaultValue?: T,\n ) => Promise;\n checkServerMeetsVersionRequirement$: (\n minimumRequiredServerVersion: SemVer,\n ) => Observable;\n\n /**\n * Force ConfigService to fetch an updated config from the server and emit it from serverConfig$\n * @deprecated The service implementation should subscribe to an observable and use that to trigger a new fetch from\n * server instead\n */\n triggerServerConfigFetch: () => void;\n}\n","import { CsprngArray } from \"../../types/csprng\";\nimport { DecryptParameters } from \"../models/domain/decrypt-parameters\";\nimport { SymmetricCryptoKey } from \"../models/domain/symmetric-crypto-key\";\n\nexport abstract class CryptoFunctionService {\n pbkdf2: (\n password: string | Uint8Array,\n salt: string | Uint8Array,\n algorithm: \"sha256\" | \"sha512\",\n iterations: number,\n ) => Promise;\n argon2: (\n password: string | Uint8Array,\n salt: string | Uint8Array,\n iterations: number,\n memory: number,\n parallelism: number,\n ) => Promise;\n hkdf: (\n ikm: Uint8Array,\n salt: string | Uint8Array,\n info: string | Uint8Array,\n outputByteSize: number,\n algorithm: \"sha256\" | \"sha512\",\n ) => Promise;\n hkdfExpand: (\n prk: Uint8Array,\n info: string | Uint8Array,\n outputByteSize: number,\n algorithm: \"sha256\" | \"sha512\",\n ) => Promise;\n hash: (\n value: string | Uint8Array,\n algorithm: \"sha1\" | \"sha256\" | \"sha512\" | \"md5\",\n ) => Promise;\n hmac: (\n value: Uint8Array,\n key: Uint8Array,\n algorithm: \"sha1\" | \"sha256\" | \"sha512\",\n ) => Promise;\n compare: (a: Uint8Array, b: Uint8Array) => Promise;\n hmacFast: (\n value: Uint8Array | string,\n key: Uint8Array | string,\n algorithm: \"sha1\" | \"sha256\" | \"sha512\",\n ) => Promise;\n compareFast: (a: Uint8Array | string, b: Uint8Array | string) => Promise;\n aesEncrypt: (data: Uint8Array, iv: Uint8Array, key: Uint8Array) => Promise;\n aesDecryptFastParameters: (\n data: string,\n iv: string,\n mac: string,\n key: SymmetricCryptoKey,\n ) => DecryptParameters;\n aesDecryptFast: (\n parameters: DecryptParameters,\n mode: \"cbc\" | \"ecb\",\n ) => Promise;\n aesDecrypt: (\n data: Uint8Array,\n iv: Uint8Array,\n key: Uint8Array,\n mode: \"cbc\" | \"ecb\",\n ) => Promise;\n rsaEncrypt: (\n data: Uint8Array,\n publicKey: Uint8Array,\n algorithm: \"sha1\" | \"sha256\",\n ) => Promise;\n rsaDecrypt: (\n data: Uint8Array,\n privateKey: Uint8Array,\n algorithm: \"sha1\" | \"sha256\",\n ) => Promise;\n rsaExtractPublicKey: (privateKey: Uint8Array) => Promise;\n rsaGenerateKeyPair: (length: 1024 | 2048 | 4096) => Promise<[Uint8Array, Uint8Array]>;\n /**\n * Generates a key of the given length suitable for use in AES encryption\n */\n aesGenerateKey: (bitLength: 128 | 192 | 256 | 512) => Promise;\n /**\n * Generates a random array of bytes of the given length. Uses a cryptographically secure random number generator.\n *\n * Do not use this for generating encryption keys. Use aesGenerateKey or rsaGenerateKeyPair instead.\n */\n randomBytes: (length: number) => Promise;\n}\n","import { Observable } from \"rxjs\";\n\nimport { ProfileOrganizationResponse } from \"../../admin-console/models/response/profile-organization.response\";\nimport { ProfileProviderOrganizationResponse } from \"../../admin-console/models/response/profile-provider-organization.response\";\nimport { ProfileProviderResponse } from \"../../admin-console/models/response/profile-provider.response\";\nimport { KdfConfig } from \"../../auth/models/domain/kdf-config\";\nimport { OrganizationId, ProviderId, UserId } from \"../../types/guid\";\nimport { UserKey, MasterKey, OrgKey, ProviderKey, PinKey, CipherKey } from \"../../types/key\";\nimport { KeySuffixOptions, KdfType, HashPurpose } from \"../enums\";\nimport { EncArrayBuffer } from \"../models/domain/enc-array-buffer\";\nimport { EncString } from \"../models/domain/enc-string\";\nimport { SymmetricCryptoKey } from \"../models/domain/symmetric-crypto-key\";\n\nexport abstract class CryptoService {\n activeUserKey$: Observable;\n /**\n * Sets the provided user key and stores\n * any other necessary versions (such as auto, biometrics,\n * or pin)\n *\n * @throws when key is null. Use {@link clearUserKey} instead\n * @param key The user key to set\n * @param userId The desired user\n */\n setUserKey: (key: UserKey, userId?: string) => Promise;\n /**\n * Gets the user key from memory and sets it again,\n * kicking off a refresh of any additional keys\n * (such as auto, biometrics, or pin)\n */\n refreshAdditionalKeys: () => Promise;\n /**\n * Observable value that returns whether or not the currently active user has ever had auser key,\n * i.e. has ever been unlocked/decrypted. This is key for differentiating between TDE locked and standard locked states.\n */\n everHadUserKey$: Observable;\n /**\n * Retrieves the user key\n * @param userId The desired user\n * @returns The user key\n */\n getUserKey: (userId?: string) => Promise;\n\n /**\n * Checks if the user is using an old encryption scheme that used the master key\n * for encryption of data instead of the user key.\n */\n isLegacyUser: (masterKey?: MasterKey, userId?: string) => Promise;\n /**\n * Use for encryption/decryption of data in order to support legacy\n * encryption models. It will return the user key if available,\n * if not it will return the master key.\n * @param userId The desired user\n */\n getUserKeyWithLegacySupport: (userId?: string) => Promise;\n /**\n * Retrieves the user key from storage\n * @param keySuffix The desired version of the user's key to retrieve\n * @param userId The desired user\n * @returns The user key\n */\n getUserKeyFromStorage: (keySuffix: KeySuffixOptions, userId?: string) => Promise;\n\n /**\n * Determines whether the user key is available for the given user.\n * @param userId The desired user. If not provided, the active user will be used. If no active user exists, the method will return false.\n * @returns True if the user key is available\n */\n hasUserKey: (userId?: UserId) => Promise;\n /**\n * Determines whether the user key is available for the given user in memory.\n * @param userId The desired user. If not provided, the active user will be used. If no active user exists, the method will return false.\n * @returns True if the user key is available\n */\n hasUserKeyInMemory: (userId?: string) => Promise;\n /**\n * @param keySuffix The desired version of the user's key to check\n * @param userId The desired user\n * @returns True if the provided version of the user key is stored\n */\n hasUserKeyStored: (keySuffix: KeySuffixOptions, userId?: string) => Promise;\n /**\n * Generates a new user key\n * @param masterKey The user's master key\n * @returns A new user key and the master key protected version of it\n */\n makeUserKey: (key: MasterKey) => Promise<[UserKey, EncString]>;\n /**\n * Clears the user key\n * @param clearStoredKeys Clears all stored versions of the user keys as well,\n * such as the biometrics key\n * @param userId The desired user\n */\n clearUserKey: (clearSecretStorage?: boolean, userId?: string) => Promise;\n /**\n * Clears the user's stored version of the user key\n * @param keySuffix The desired version of the key to clear\n * @param userId The desired user\n */\n clearStoredUserKey: (keySuffix: KeySuffixOptions, userId?: string) => Promise;\n /**\n * Stores the master key encrypted user key\n * @param userKeyMasterKey The master key encrypted user key to set\n * @param userId The desired user\n */\n setMasterKeyEncryptedUserKey: (UserKeyMasterKey: string, userId?: string) => Promise;\n /**\n * Sets the user's master key\n * @param key The user's master key to set\n * @param userId The desired user\n */\n setMasterKey: (key: MasterKey, userId?: string) => Promise;\n /**\n * @param userId The desired user\n * @returns The user's master key\n */\n getMasterKey: (userId?: string) => Promise;\n\n /**\n * @param password The user's master password that will be used to derive a master key if one isn't found\n * @param userId The desired user\n */\n getOrDeriveMasterKey: (password: string, userId?: string) => Promise;\n /**\n * Generates a master key from the provided password\n * @param password The user's master password\n * @param email The user's email\n * @param kdf The user's selected key derivation function to use\n * @param KdfConfig The user's key derivation function configuration\n * @returns A master key derived from the provided password\n */\n makeMasterKey: (\n password: string,\n email: string,\n kdf: KdfType,\n KdfConfig: KdfConfig,\n ) => Promise;\n /**\n * Clears the user's master key\n * @param userId The desired user\n */\n clearMasterKey: (userId?: string) => Promise;\n /**\n * Encrypts the existing (or provided) user key with the\n * provided master key\n * @param masterKey The user's master key\n * @param userKey The user key\n * @returns The user key and the master key protected version of it\n */\n encryptUserKeyWithMasterKey: (\n masterKey: MasterKey,\n userKey?: UserKey,\n ) => Promise<[UserKey, EncString]>;\n /**\n * Decrypts the user key with the provided master key\n * @param masterKey The user's master key\n * @param userKey The user's encrypted symmetric key\n * @param userId The desired user\n * @returns The user key\n */\n decryptUserKeyWithMasterKey: (\n masterKey: MasterKey,\n userKey?: EncString,\n userId?: string,\n ) => Promise;\n /**\n * Creates a master password hash from the user's master password. Can\n * be used for local authentication or for server authentication depending\n * on the hashPurpose provided.\n * @param password The user's master password\n * @param key The user's master key\n * @param hashPurpose The iterations to use for the hash\n * @returns The user's master password hash\n */\n hashMasterKey: (password: string, key: MasterKey, hashPurpose?: HashPurpose) => Promise;\n /**\n * Sets the user's master password hash\n * @param keyHash The user's master password hash to set\n */\n setMasterKeyHash: (keyHash: string) => Promise;\n /**\n * @returns The user's master password hash\n */\n getMasterKeyHash: () => Promise;\n /**\n * Clears the user's stored master password hash\n * @param userId The desired user\n */\n clearMasterKeyHash: (userId?: string) => Promise;\n /**\n * Compares the provided master password to the stored password hash and server password hash.\n * Updates the stored hash if outdated.\n * @param masterPassword The user's master password\n * @param key The user's master key\n * @returns True if the provided master password matches either the stored\n * key hash or the server key hash\n */\n compareAndUpdateKeyHash: (masterPassword: string, masterKey: MasterKey) => Promise;\n /**\n * Stores the encrypted organization keys and clears any decrypted\n * organization keys currently in memory\n * @param orgs The organizations to set keys for\n * @param providerOrgs The provider organizations to set keys for\n */\n setOrgKeys: (\n orgs: ProfileOrganizationResponse[],\n providerOrgs: ProfileProviderOrganizationResponse[],\n ) => Promise;\n activeUserOrgKeys$: Observable>;\n /**\n * Returns the organization's symmetric key\n * @deprecated Use the observable activeUserOrgKeys$ and `map` to the desired orgKey instead\n * @param orgId The desired organization\n * @returns The organization's symmetric key\n */\n getOrgKey: (orgId: string) => Promise;\n /**\n * @deprecated Use the observable activeUserOrgKeys$ instead\n * @returns A record of the organization Ids to their symmetric keys\n */\n getOrgKeys: () => Promise>;\n /**\n * Uses the org key to derive a new symmetric key for encrypting data\n * @param orgKey The organization's symmetric key\n */\n makeDataEncKey: (key: T) => Promise<[SymmetricCryptoKey, EncString]>;\n /**\n * Clears the user's stored organization keys\n * @param memoryOnly Clear only the in-memory keys\n * @param userId The desired user\n */\n clearOrgKeys: (memoryOnly?: boolean, userId?: string) => Promise;\n /**\n * Stores the encrypted provider keys and clears any decrypted\n * provider keys currently in memory\n * @param providers The providers to set keys for\n */\n activeUserProviderKeys$: Observable>;\n setProviderKeys: (orgs: ProfileProviderResponse[]) => Promise;\n /**\n * @param providerId The desired provider\n * @returns The provider's symmetric key\n */\n getProviderKey: (providerId: string) => Promise;\n /**\n * @returns A record of the provider Ids to their symmetric keys\n */\n getProviderKeys: () => Promise>;\n /**\n * @param memoryOnly Clear only the in-memory keys\n * @param userId The desired user\n */\n clearProviderKeys: (memoryOnly?: boolean, userId?: string) => Promise;\n /**\n * Returns the public key from memory. If not available, extracts it\n * from the private key and stores it in memory\n * @returns The user's public key\n */\n getPublicKey: () => Promise;\n /**\n * Creates a new organization key and encrypts it with the user's public key.\n * This method can also return Provider keys for creating new Provider users.\n * @returns The new encrypted org key and the decrypted key itself\n */\n makeOrgKey: () => Promise<[EncString, T]>;\n /**\n * Sets the the user's encrypted private key in storage and\n * clears the decrypted private key from memory\n * Note: does not clear the private key if null is provided\n * @param encPrivateKey An encrypted private key\n */\n setPrivateKey: (encPrivateKey: string) => Promise;\n /**\n * Returns the private key from memory. If not available, decrypts it\n * from storage and stores it in memory\n * @returns The user's private key\n */\n getPrivateKey: () => Promise;\n /**\n * Generates a fingerprint phrase for the user based on their public key\n * @param fingerprintMaterial Fingerprint material\n * @param publicKey The user's public key\n * @returns The user's fingerprint phrase\n */\n getFingerprint: (fingerprintMaterial: string, publicKey?: Uint8Array) => Promise;\n /**\n * Generates a new keypair\n * @param key A key to encrypt the private key with. If not provided,\n * defaults to the user key\n * @returns A new keypair: [publicKey in Base64, encrypted privateKey]\n */\n makeKeyPair: (key?: SymmetricCryptoKey) => Promise<[string, EncString]>;\n /**\n * Clears the user's key pair\n * @param memoryOnly Clear only the in-memory keys\n * @param userId The desired user\n */\n clearKeyPair: (memoryOnly?: boolean, userId?: string) => Promise;\n /**\n * @param pin The user's pin\n * @param salt The user's salt\n * @param kdf The user's kdf\n * @param kdfConfig The user's kdf config\n * @returns A key derived from the user's pin\n */\n makePinKey: (pin: string, salt: string, kdf: KdfType, kdfConfig: KdfConfig) => Promise;\n /**\n * Clears the user's pin keys from storage\n * Note: This will remove the stored pin and as a result,\n * disable pin protection for the user\n * @param userId The desired user\n */\n clearPinKeys: (userId?: string) => Promise;\n /**\n * Decrypts the user key with their pin\n * @param pin The user's PIN\n * @param salt The user's salt\n * @param kdf The user's KDF\n * @param kdfConfig The user's KDF config\n * @param pinProtectedUserKey The user's PIN protected symmetric key, if not provided\n * it will be retrieved from storage\n * @returns The decrypted user key\n */\n decryptUserKeyWithPin: (\n pin: string,\n salt: string,\n kdf: KdfType,\n kdfConfig: KdfConfig,\n protectedKeyCs?: EncString,\n ) => Promise;\n /**\n * Creates a new Pin key that encrypts the user key instead of the\n * master key. Clears the old Pin key from state.\n * @param masterPasswordOnRestart True if Master Password on Restart is enabled\n * @param pin User's PIN\n * @param email User's email\n * @param kdf User's KdfType\n * @param kdfConfig User's KdfConfig\n * @param oldPinKey The old Pin key from state (retrieved from different\n * places depending on if Master Password on Restart was enabled)\n * @returns The user key\n */\n decryptAndMigrateOldPinKey: (\n masterPasswordOnRestart: boolean,\n pin: string,\n email: string,\n kdf: KdfType,\n kdfConfig: KdfConfig,\n oldPinKey: EncString,\n ) => Promise;\n /**\n * Replaces old master auto keys with new user auto keys\n */\n migrateAutoKeyIfNeeded: (userId?: string) => Promise;\n /**\n * @param keyMaterial The key material to derive the send key from\n * @returns A new send key\n */\n makeSendKey: (keyMaterial: Uint8Array) => Promise;\n /**\n * Clears all of the user's keys from storage\n * @param userId The user's Id\n */\n clearKeys: (userId?: string) => Promise;\n /**\n * RSA encrypts a value.\n * @param data The data to encrypt\n * @param publicKey The public key to use for encryption, if not provided, the user's public key will be used\n * @returns The encrypted data\n */\n rsaEncrypt: (data: Uint8Array, publicKey?: Uint8Array) => Promise;\n /**\n * Decrypts a value using RSA.\n * @param encValue The encrypted value to decrypt\n * @param privateKeyValue The private key to use for decryption\n * @returns The decrypted value\n */\n rsaDecrypt: (encValue: string, privateKeyValue?: Uint8Array) => Promise;\n randomNumber: (min: number, max: number) => Promise;\n /**\n * Generates a new cipher key\n * @returns A new cipher key\n */\n makeCipherKey: () => Promise;\n\n /**\n * Initialize all necessary crypto keys needed for a new account.\n * Warning! This completely replaces any existing keys!\n * @returns The user's newly created public key, private key, and encrypted private key\n */\n initAccount: () => Promise<{\n userKey: UserKey;\n publicKey: string;\n privateKey: EncString;\n }>;\n\n /**\n * Validate that the KDF config follows the requirements for the given KDF type.\n *\n * @remarks\n * Should always be called before updating a users KDF config.\n */\n validateKdfConfig: (kdf: KdfType, kdfConfig: KdfConfig) => void;\n\n /**\n * @deprecated Left for migration purposes. Use decryptUserKeyWithPin instead.\n */\n decryptMasterKeyWithPin: (\n pin: string,\n salt: string,\n kdf: KdfType,\n kdfConfig: KdfConfig,\n protectedKeyCs?: EncString,\n ) => Promise;\n /**\n * Previously, the master key was used for any additional key like the biometrics or pin key.\n * We have switched to using the user key for these purposes. This method is for clearing the state\n * of the older keys on logout or post migration.\n * @param keySuffix The desired type of key to clear\n * @param userId The desired user\n */\n clearDeprecatedKeys: (keySuffix: KeySuffixOptions, userId?: string) => Promise;\n /**\n * @deprecated July 25 2022: Get the key you need from CryptoService (getKeyForUserEncryption or getOrgKey)\n * and then call encryptService.encrypt\n */\n encrypt: (plainValue: string | Uint8Array, key?: SymmetricCryptoKey) => Promise;\n /**\n * @deprecated July 25 2022: Get the key you need from CryptoService (getKeyForUserEncryption or getOrgKey)\n * and then call encryptService.encryptToBytes\n */\n encryptToBytes: (plainValue: Uint8Array, key?: SymmetricCryptoKey) => Promise;\n /**\n * @deprecated July 25 2022: Get the key you need from CryptoService (getKeyForUserEncryption or getOrgKey)\n * and then call encryptService.decryptToBytes\n */\n decryptToBytes: (encString: EncString, key?: SymmetricCryptoKey) => Promise;\n /**\n * @deprecated July 25 2022: Get the key you need from CryptoService (getKeyForUserEncryption or getOrgKey)\n * and then call encryptService.decryptToUtf8\n */\n decryptToUtf8: (encString: EncString, key?: SymmetricCryptoKey) => Promise;\n /**\n * @deprecated July 25 2022: Get the key you need from CryptoService (getKeyForUserEncryption or getOrgKey)\n * and then call encryptService.decryptToBytes\n */\n decryptFromBytes: (encBuffer: EncArrayBuffer, key: SymmetricCryptoKey) => Promise;\n}\n","import { Decryptable } from \"../interfaces/decryptable.interface\";\nimport { Encrypted } from \"../interfaces/encrypted\";\nimport { InitializerMetadata } from \"../interfaces/initializer-metadata.interface\";\nimport { EncArrayBuffer } from \"../models/domain/enc-array-buffer\";\nimport { EncString } from \"../models/domain/enc-string\";\nimport { SymmetricCryptoKey } from \"../models/domain/symmetric-crypto-key\";\n\nexport abstract class EncryptService {\n abstract encrypt(plainValue: string | Uint8Array, key: SymmetricCryptoKey): Promise;\n abstract encryptToBytes: (\n plainValue: Uint8Array,\n key?: SymmetricCryptoKey,\n ) => Promise;\n abstract decryptToUtf8: (encString: EncString, key: SymmetricCryptoKey) => Promise;\n abstract decryptToBytes: (encThing: Encrypted, key: SymmetricCryptoKey) => Promise;\n abstract rsaEncrypt: (data: Uint8Array, publicKey: Uint8Array) => Promise;\n abstract rsaDecrypt: (data: EncString, privateKey: Uint8Array) => Promise;\n abstract resolveLegacyKey: (key: SymmetricCryptoKey, encThing: Encrypted) => SymmetricCryptoKey;\n abstract decryptItems: (\n items: Decryptable[],\n key: SymmetricCryptoKey,\n ) => Promise;\n /**\n * Generates a base64-encoded hash of the given value\n * @param value The value to hash\n * @param algorithm The hashing algorithm to use\n */\n hash: (value: string | Uint8Array, algorithm: \"sha1\" | \"sha256\" | \"sha512\") => Promise;\n}\n","import { Observable } from \"rxjs\";\n\nimport { UserId } from \"../../types/guid\";\n\nexport type Urls = {\n base?: string;\n webVault?: string;\n api?: string;\n identity?: string;\n icons?: string;\n notifications?: string;\n events?: string;\n keyConnector?: string;\n scim?: string;\n};\n\n/**\n * A subset of available regions, additional regions can be loaded through configuration.\n */\nexport enum Region {\n US = \"US\",\n EU = \"EU\",\n SelfHosted = \"Self-hosted\",\n}\n\n/**\n * The possible cloud regions.\n */\nexport type CloudRegion = Exclude;\n\nexport type RegionConfig = {\n // Beware this isn't completely true, it's actually a string for custom environments,\n // which are currently only supported in web where it doesn't matter.\n key: Region;\n domain: string;\n urls: Urls;\n};\n\n/**\n * The Environment interface represents a server environment.\n *\n * It provides methods to retrieve the URLs of the different services.\n */\nexport interface Environment {\n /**\n * Retrieve the current region.\n */\n getRegion(): Region;\n /**\n * Retrieve the urls, should only be used when configuring the environment.\n */\n getUrls(): Urls;\n\n /**\n * Identify if the region is a cloud environment.\n *\n * @returns true if the environment is a cloud environment, false otherwise.\n */\n isCloud(): boolean;\n\n getApiUrl(): string;\n getEventsUrl(): string;\n getIconsUrl(): string;\n getIdentityUrl(): string;\n\n /**\n * @deprecated This is currently only used by the CLI. This functionality should be extracted since\n * the CLI relies on changing environment mid-login.\n *\n * @remarks\n * Expect this to be null unless the CLI has explicitly set it during the login flow.\n */\n getKeyConnectorUrl(): string | null;\n getNotificationsUrl(): string;\n getScimUrl(): string;\n getSendUrl(): string;\n getWebVaultUrl(): string;\n\n /**\n * Get a friendly hostname for the environment.\n *\n * - For self-hosted this is the web vault url without protocol prefix.\n * - For cloud environments it's the domain key.\n */\n getHostname(): string;\n\n // Not sure why we provide this, evaluate if we can remove it.\n hasBaseUrl(): boolean;\n}\n\n/**\n * The environment service. Provides access to set the current environment urls and region.\n */\nexport abstract class EnvironmentService {\n abstract environment$: Observable;\n abstract cloudWebVaultUrl$: Observable;\n\n /**\n * Retrieve all the available regions for environment selectors.\n *\n * This currently relies on compile time provided constants, and will not change at runtime.\n * Expect all builds to include production environments, QA builds to also include QA\n * environments and dev builds to include localhost.\n */\n abstract availableRegions(): RegionConfig[];\n\n /**\n * Set the global environment.\n */\n abstract setEnvironment(region: Region, urls?: Urls): Promise;\n\n /**\n * Seed the environment state for a given user based on the global environment.\n *\n * @remarks\n * Expected to be called only by the StateService when adding a new account.\n */\n abstract seedUserEnvironment(userId: UserId): Promise;\n\n /**\n * Sets the URL of the cloud web vault app based on the region parameter.\n *\n * @param userId - The user id to set the cloud web vault app URL for. If null or undefined the global environment is set.\n * @param region - The region of the cloud web vault app.\n */\n abstract setCloudRegion(userId: UserId, region: Region): Promise;\n\n /**\n * Get the environment from state. Useful if you need to get the environment for another user.\n */\n abstract getEnvironment(userId?: string): Promise;\n}\n","import { FileDownloadRequest } from \"./file-download.request\";\n\nexport abstract class FileDownloadService {\n download: (request: FileDownloadRequest) => void;\n}\n","export abstract class TranslationService {\n supportedTranslationLocales: string[];\n translationLocale: string;\n collator: Intl.Collator;\n localeNames: Map;\n t: (id: string, p1?: string | number, p2?: string | number, p3?: string | number) => string;\n translate: (id: string, p1?: string, p2?: string, p3?: string) => string;\n}\n","import { Observable } from \"rxjs\";\n\nimport { TranslationService } from \"./translation.service\";\n\nexport abstract class I18nService extends TranslationService {\n userSetLocale$: Observable;\n locale$: Observable;\n abstract setLocale(locale: string): Promise;\n abstract init(): Promise;\n}\n","import { KdfConfig } from \"../../auth/models/domain/kdf-config\";\nimport { CsprngArray } from \"../../types/csprng\";\nimport { KdfType } from \"../enums\";\nimport { SymmetricCryptoKey } from \"../models/domain/symmetric-crypto-key\";\n\nexport abstract class KeyGenerationService {\n /**\n * Generates a key of the given length suitable for use in AES encryption\n * @param bitLength Length of key.\n * 256 bits = 32 bytes\n * 512 bits = 64 bytes\n * @returns Generated key.\n */\n createKey: (bitLength: 256 | 512) => Promise;\n /**\n * Generates key material from CSPRNG and derives a 64 byte key from it.\n * Uses HKDF, see {@link https://datatracker.ietf.org/doc/html/rfc5869 RFC 5869}\n * for details.\n * @param bitLength Length of key material.\n * @param purpose Purpose for the key derivation function.\n * Different purposes results in different keys, even with the same material.\n * @param salt Optional. If not provided will be generated from CSPRNG.\n * @returns An object containing the salt, key material, and derived key.\n */\n createKeyWithPurpose: (\n bitLength: 128 | 192 | 256 | 512,\n purpose: string,\n salt?: string,\n ) => Promise<{ salt: string; material: CsprngArray; derivedKey: SymmetricCryptoKey }>;\n /**\n * Derives a 64 byte key from key material.\n * @remark The key material should be generated from {@link createKey}, or {@link createKeyWithPurpose}.\n * Uses HKDF, see {@link https://datatracker.ietf.org/doc/html/rfc5869 RFC 5869} for details.\n * @param material key material.\n * @param salt Salt for the key derivation function.\n * @param purpose Purpose for the key derivation function.\n * Different purposes results in different keys, even with the same material.\n * @returns 64 byte derived key.\n */\n deriveKeyFromMaterial: (\n material: CsprngArray,\n salt: string,\n purpose: string,\n ) => Promise;\n /**\n * Derives a 32 byte key from a password using a key derivation function.\n * @param password Password to derive the key from.\n * @param salt Salt for the key derivation function.\n * @param kdf Key derivation function to use.\n * @param kdfConfig Configuration for the key derivation function.\n * @returns 32 byte derived key.\n */\n deriveKeyFromPassword: (\n password: string | Uint8Array,\n salt: string | Uint8Array,\n kdf: KdfType,\n kdfConfig: KdfConfig,\n ) => Promise;\n}\n","import { LogLevelType } from \"../enums/log-level-type.enum\";\n\nexport abstract class LogService {\n debug: (message: string) => void;\n info: (message: string) => void;\n warning: (message: string) => void;\n error: (message: string) => void;\n write: (level: LogLevelType, message: string) => void;\n}\n","export abstract class MessagingService {\n send: (subscriber: string, arg?: any) => void;\n}\n","import { ClientType, DeviceType } from \"../../enums\";\n\ninterface ToastOptions {\n timeout?: number;\n}\n\nexport type ClipboardOptions = {\n allowHistory?: boolean;\n clearing?: boolean;\n clearMs?: number;\n window?: Window;\n};\n\nexport abstract class PlatformUtilsService {\n getDevice: () => DeviceType;\n getDeviceString: () => string;\n getClientType: () => ClientType;\n isFirefox: () => boolean;\n isChrome: () => boolean;\n isEdge: () => boolean;\n isOpera: () => boolean;\n isVivaldi: () => boolean;\n isSafari: () => boolean;\n isMacAppStore: () => boolean;\n isViewOpen: () => Promise;\n launchUri: (uri: string, options?: any) => void;\n getApplicationVersion: () => Promise;\n getApplicationVersionNumber: () => Promise;\n supportsWebAuthn: (win: Window) => boolean;\n supportsDuo: () => boolean;\n showToast: (\n type: \"error\" | \"success\" | \"warning\" | \"info\",\n title: string,\n text: string | string[],\n options?: ToastOptions,\n ) => void;\n isDev: () => boolean;\n isSelfHost: () => boolean;\n copyToClipboard: (text: string, options?: ClipboardOptions) => void | boolean;\n readFromClipboard: () => Promise;\n supportsBiometric: () => Promise;\n authenticateBiometric: () => Promise;\n supportsSecureStorage: () => boolean;\n getAutofillKeyboardShortcut: () => Promise;\n}\n","import { Observable } from \"rxjs\";\n\nimport { AdminAuthRequestStorable } from \"../../auth/models/domain/admin-auth-req-storable\";\nimport { ForceSetPasswordReason } from \"../../auth/models/domain/force-set-password-reason\";\nimport { KdfConfig } from \"../../auth/models/domain/kdf-config\";\nimport { BiometricKey } from \"../../auth/types/biometric-key\";\nimport { GeneratorOptions } from \"../../tools/generator/generator-options\";\nimport { GeneratedPasswordHistory, PasswordGeneratorOptions } from \"../../tools/generator/password\";\nimport { UsernameGeneratorOptions } from \"../../tools/generator/username\";\nimport { SendData } from \"../../tools/send/models/data/send.data\";\nimport { SendView } from \"../../tools/send/models/view/send.view\";\nimport { UserId } from \"../../types/guid\";\nimport { DeviceKey, MasterKey } from \"../../types/key\";\nimport { CipherData } from \"../../vault/models/data/cipher.data\";\nimport { LocalData } from \"../../vault/models/data/local.data\";\nimport { CipherView } from \"../../vault/models/view/cipher.view\";\nimport { AddEditCipherInfo } from \"../../vault/types/add-edit-cipher-info\";\nimport { KdfType } from \"../enums\";\nimport { ServerConfigData } from \"../models/data/server-config.data\";\nimport { Account } from \"../models/domain/account\";\nimport { EncString } from \"../models/domain/enc-string\";\nimport { StorageOptions } from \"../models/domain/storage-options\";\nimport { SymmetricCryptoKey } from \"../models/domain/symmetric-crypto-key\";\n\n/**\n * Options for customizing the initiation behavior.\n */\nexport type InitOptions = {\n /**\n * Whether or not to run state migrations as part of the init process. Defaults to true.\n *\n * If false, the init method will instead wait for migrations to complete before doing its\n * other init operations. Make sure migrations have either already completed, or will complete\n * before calling {@link StateService.init} with `runMigrations: false`.\n */\n runMigrations?: boolean;\n};\n\nexport abstract class StateService {\n accounts$: Observable<{ [userId: string]: T }>;\n activeAccount$: Observable;\n /**\n * @deprecated use accountService.activeAccount$ instead\n */\n activeAccountUnlocked$: Observable;\n\n addAccount: (account: T) => Promise;\n setActiveUser: (userId: string) => Promise;\n clean: (options?: StorageOptions) => Promise;\n init: (initOptions?: InitOptions) => Promise;\n\n getAddEditCipherInfo: (options?: StorageOptions) => Promise;\n setAddEditCipherInfo: (value: AddEditCipherInfo, options?: StorageOptions) => Promise;\n getBiometricFingerprintValidated: (options?: StorageOptions) => Promise;\n setBiometricFingerprintValidated: (value: boolean, options?: StorageOptions) => Promise;\n getConvertAccountToKeyConnector: (options?: StorageOptions) => Promise;\n setConvertAccountToKeyConnector: (value: boolean, options?: StorageOptions) => Promise;\n /**\n * Gets the user's master key\n */\n getMasterKey: (options?: StorageOptions) => Promise;\n /**\n * Sets the user's master key\n */\n setMasterKey: (value: MasterKey, options?: StorageOptions) => Promise;\n /**\n * Gets the user key encrypted by the master key\n */\n getMasterKeyEncryptedUserKey: (options?: StorageOptions) => Promise;\n /**\n * Sets the user key encrypted by the master key\n */\n setMasterKeyEncryptedUserKey: (value: string, options?: StorageOptions) => Promise;\n /**\n * Gets the user's auto key\n */\n getUserKeyAutoUnlock: (options?: StorageOptions) => Promise;\n /**\n * Sets the user's auto key\n */\n setUserKeyAutoUnlock: (value: string, options?: StorageOptions) => Promise;\n /**\n * Gets the user's biometric key\n */\n getUserKeyBiometric: (options?: StorageOptions) => Promise;\n /**\n * Checks if the user has a biometric key available\n */\n hasUserKeyBiometric: (options?: StorageOptions) => Promise;\n /**\n * Sets the user's biometric key\n */\n setUserKeyBiometric: (value: BiometricKey, options?: StorageOptions) => Promise;\n /**\n * Gets the user key encrypted by the Pin key.\n * Used when Lock with MP on Restart is disabled\n */\n getPinKeyEncryptedUserKey: (options?: StorageOptions) => Promise;\n /**\n * Sets the user key encrypted by the Pin key.\n * Used when Lock with MP on Restart is disabled\n */\n setPinKeyEncryptedUserKey: (value: EncString, options?: StorageOptions) => Promise;\n /**\n * Gets the ephemeral version of the user key encrypted by the Pin key.\n * Used when Lock with MP on Restart is enabled\n */\n getPinKeyEncryptedUserKeyEphemeral: (options?: StorageOptions) => Promise;\n /**\n * Sets the ephemeral version of the user key encrypted by the Pin key.\n * Used when Lock with MP on Restart is enabled\n */\n setPinKeyEncryptedUserKeyEphemeral: (value: EncString, options?: StorageOptions) => Promise;\n /**\n * @deprecated For migration purposes only, use getUserKeyMasterKey instead\n */\n getEncryptedCryptoSymmetricKey: (options?: StorageOptions) => Promise;\n /**\n * @deprecated For legacy purposes only, use getMasterKey instead\n */\n getCryptoMasterKey: (options?: StorageOptions) => Promise;\n /**\n * @deprecated For migration purposes only, use getUserKeyAuto instead\n */\n getCryptoMasterKeyAuto: (options?: StorageOptions) => Promise;\n /**\n * @deprecated For migration purposes only, use setUserKeyAuto instead\n */\n setCryptoMasterKeyAuto: (value: string, options?: StorageOptions) => Promise;\n /**\n * @deprecated For migration purposes only, use getUserKeyBiometric instead\n */\n getCryptoMasterKeyBiometric: (options?: StorageOptions) => Promise;\n /**\n * @deprecated For migration purposes only, use hasUserKeyBiometric instead\n */\n hasCryptoMasterKeyBiometric: (options?: StorageOptions) => Promise;\n /**\n * @deprecated For migration purposes only, use setUserKeyBiometric instead\n */\n setCryptoMasterKeyBiometric: (value: BiometricKey, options?: StorageOptions) => Promise;\n getDecryptedCiphers: (options?: StorageOptions) => Promise;\n setDecryptedCiphers: (value: CipherView[], options?: StorageOptions) => Promise;\n getDecryptedPasswordGenerationHistory: (\n options?: StorageOptions,\n ) => Promise;\n setDecryptedPasswordGenerationHistory: (\n value: GeneratedPasswordHistory[],\n options?: StorageOptions,\n ) => Promise;\n /**\n * @deprecated For migration purposes only, use getDecryptedUserKeyPin instead\n */\n getDecryptedPinProtected: (options?: StorageOptions) => Promise;\n /**\n * @deprecated For migration purposes only, use setDecryptedUserKeyPin instead\n */\n setDecryptedPinProtected: (value: EncString, options?: StorageOptions) => Promise;\n /**\n * @deprecated Do not call this directly, use SendService\n */\n getDecryptedSends: (options?: StorageOptions) => Promise;\n /**\n * @deprecated Do not call this directly, use SendService\n */\n setDecryptedSends: (value: SendView[], options?: StorageOptions) => Promise;\n getDisableGa: (options?: StorageOptions) => Promise;\n setDisableGa: (value: boolean, options?: StorageOptions) => Promise;\n getDuckDuckGoSharedKey: (options?: StorageOptions) => Promise;\n setDuckDuckGoSharedKey: (value: string, options?: StorageOptions) => Promise;\n getDeviceKey: (options?: StorageOptions) => Promise;\n setDeviceKey: (value: DeviceKey | null, options?: StorageOptions) => Promise;\n getAdminAuthRequest: (options?: StorageOptions) => Promise;\n setAdminAuthRequest: (\n adminAuthRequest: AdminAuthRequestStorable,\n options?: StorageOptions,\n ) => Promise;\n getShouldTrustDevice: (options?: StorageOptions) => Promise;\n setShouldTrustDevice: (value: boolean, options?: StorageOptions) => Promise;\n getEmail: (options?: StorageOptions) => Promise;\n setEmail: (value: string, options?: StorageOptions) => Promise;\n getEmailVerified: (options?: StorageOptions) => Promise;\n setEmailVerified: (value: boolean, options?: StorageOptions) => Promise;\n getEnableBrowserIntegration: (options?: StorageOptions) => Promise;\n setEnableBrowserIntegration: (value: boolean, options?: StorageOptions) => Promise;\n getEnableBrowserIntegrationFingerprint: (options?: StorageOptions) => Promise;\n setEnableBrowserIntegrationFingerprint: (\n value: boolean,\n options?: StorageOptions,\n ) => Promise;\n getEncryptedCiphers: (options?: StorageOptions) => Promise<{ [id: string]: CipherData }>;\n setEncryptedCiphers: (\n value: { [id: string]: CipherData },\n options?: StorageOptions,\n ) => Promise;\n getEncryptedPasswordGenerationHistory: (\n options?: StorageOptions,\n ) => Promise;\n setEncryptedPasswordGenerationHistory: (\n value: GeneratedPasswordHistory[],\n options?: StorageOptions,\n ) => Promise;\n /**\n * @deprecated For migration purposes only, use getEncryptedUserKeyPin instead\n */\n getEncryptedPinProtected: (options?: StorageOptions) => Promise;\n /**\n * @deprecated For migration purposes only, use setEncryptedUserKeyPin instead\n */\n setEncryptedPinProtected: (value: string, options?: StorageOptions) => Promise;\n /**\n * @deprecated Do not call this directly, use SendService\n */\n getEncryptedSends: (options?: StorageOptions) => Promise<{ [id: string]: SendData }>;\n /**\n * @deprecated Do not call this directly, use SendService\n */\n setEncryptedSends: (value: { [id: string]: SendData }, options?: StorageOptions) => Promise;\n getEverBeenUnlocked: (options?: StorageOptions) => Promise;\n setEverBeenUnlocked: (value: boolean, options?: StorageOptions) => Promise;\n getForceSetPasswordReason: (options?: StorageOptions) => Promise;\n setForceSetPasswordReason: (\n value: ForceSetPasswordReason,\n options?: StorageOptions,\n ) => Promise;\n getInstalledVersion: (options?: StorageOptions) => Promise;\n setInstalledVersion: (value: string, options?: StorageOptions) => Promise;\n getIsAuthenticated: (options?: StorageOptions) => Promise;\n getKdfConfig: (options?: StorageOptions) => Promise;\n setKdfConfig: (kdfConfig: KdfConfig, options?: StorageOptions) => Promise;\n getKdfType: (options?: StorageOptions) => Promise;\n setKdfType: (value: KdfType, options?: StorageOptions) => Promise;\n getKeyHash: (options?: StorageOptions) => Promise;\n setKeyHash: (value: string, options?: StorageOptions) => Promise;\n getLastActive: (options?: StorageOptions) => Promise;\n setLastActive: (value: number, options?: StorageOptions) => Promise;\n getLastSync: (options?: StorageOptions) => Promise;\n setLastSync: (value: string, options?: StorageOptions) => Promise;\n getLocalData: (options?: StorageOptions) => Promise<{ [cipherId: string]: LocalData }>;\n setLocalData: (\n value: { [cipherId: string]: LocalData },\n options?: StorageOptions,\n ) => Promise;\n getMinimizeOnCopyToClipboard: (options?: StorageOptions) => Promise;\n setMinimizeOnCopyToClipboard: (value: boolean, options?: StorageOptions) => Promise;\n getOrganizationInvitation: (options?: StorageOptions) => Promise;\n setOrganizationInvitation: (value: any, options?: StorageOptions) => Promise;\n getPasswordGenerationOptions: (options?: StorageOptions) => Promise;\n setPasswordGenerationOptions: (\n value: PasswordGeneratorOptions,\n options?: StorageOptions,\n ) => Promise;\n getUsernameGenerationOptions: (options?: StorageOptions) => Promise;\n setUsernameGenerationOptions: (\n value: UsernameGeneratorOptions,\n options?: StorageOptions,\n ) => Promise;\n getGeneratorOptions: (options?: StorageOptions) => Promise;\n setGeneratorOptions: (value: GeneratorOptions, options?: StorageOptions) => Promise;\n /**\n * Gets the user's Pin, encrypted by the user key\n */\n getProtectedPin: (options?: StorageOptions) => Promise;\n /**\n * Sets the user's Pin, encrypted by the user key\n */\n setProtectedPin: (value: string, options?: StorageOptions) => Promise;\n getRememberedEmail: (options?: StorageOptions) => Promise;\n setRememberedEmail: (value: string, options?: StorageOptions) => Promise;\n getSecurityStamp: (options?: StorageOptions) => Promise;\n setSecurityStamp: (value: string, options?: StorageOptions) => Promise;\n getUserId: (options?: StorageOptions) => Promise;\n getUsesKeyConnector: (options?: StorageOptions) => Promise;\n setUsesKeyConnector: (value: boolean, options?: StorageOptions) => Promise;\n getVaultTimeout: (options?: StorageOptions) => Promise;\n setVaultTimeout: (value: number, options?: StorageOptions) => Promise;\n getVaultTimeoutAction: (options?: StorageOptions) => Promise;\n setVaultTimeoutAction: (value: string, options?: StorageOptions) => Promise;\n getApproveLoginRequests: (options?: StorageOptions) => Promise;\n setApproveLoginRequests: (value: boolean, options?: StorageOptions) => Promise;\n /**\n * @deprecated Do not call this directly, use ConfigService\n */\n getServerConfig: (options?: StorageOptions) => Promise;\n /**\n * @deprecated Do not call this directly, use ConfigService\n */\n setServerConfig: (value: ServerConfigData, options?: StorageOptions) => Promise;\n /**\n * fetches string value of URL user tried to navigate to while unauthenticated.\n * @param options Defines the storage options for the URL; Defaults to session Storage.\n * @returns route called prior to successful login.\n */\n getDeepLinkRedirectUrl: (options?: StorageOptions) => Promise;\n /**\n * Store URL in session storage by default, but can be configured. Developed to handle\n * unauthN interrupted navigation.\n * @param url URL of route\n * @param options Defines the storage options for the URL; Defaults to session Storage.\n */\n setDeepLinkRedirectUrl: (url: string, options?: StorageOptions) => Promise;\n nextUpActiveUser: () => Promise;\n}\n","export abstract class ValidationService {\n showError: (data: any) => string[];\n}\n","import { UserId } from \"../../types/guid\";\nimport { EncryptedString } from \"../models/domain/enc-string\";\nimport { KeyDefinition, BIOMETRIC_SETTINGS_DISK } from \"../state\";\n\n/**\n * Indicates whether the user elected to store a biometric key to unlock their vault.\n */\nexport const BIOMETRIC_UNLOCK_ENABLED = new KeyDefinition(\n BIOMETRIC_SETTINGS_DISK,\n \"biometricUnlockEnabled\",\n {\n deserializer: (obj) => obj,\n },\n);\n\n/**\n * Boolean indicating the user has elected to require a password to use their biometric key upon starting the application.\n *\n * A true setting controls whether {@link ENCRYPTED_CLIENT_KEY_HALF} is set.\n */\nexport const REQUIRE_PASSWORD_ON_START = new KeyDefinition(\n BIOMETRIC_SETTINGS_DISK,\n \"requirePasswordOnStart\",\n {\n deserializer: (value) => value,\n },\n);\n\n/**\n * If the user has elected to require a password on first unlock of an application instance, this key will store the\n * encrypted client key half used to unlock the vault.\n *\n * For operating systems without application-level key storage, this key half is concatenated with a signature\n * provided by the OS and used to encrypt the biometric key prior to storage.\n */\nexport const ENCRYPTED_CLIENT_KEY_HALF = new KeyDefinition(\n BIOMETRIC_SETTINGS_DISK,\n \"clientKeyHalf\",\n {\n deserializer: (obj) => obj,\n },\n);\n\n/**\n * Indicates the user has been warned about the security implications of using biometrics and, depending on the OS,\n * recommended to require a password on first unlock of an application instance.\n */\nexport const DISMISSED_REQUIRE_PASSWORD_ON_START_CALLOUT = new KeyDefinition(\n BIOMETRIC_SETTINGS_DISK,\n \"dismissedBiometricRequirePasswordOnStartCallout\",\n {\n deserializer: (obj) => obj,\n },\n);\n\n/**\n * Stores whether the user has elected to cancel the biometric prompt. This is stored on disk due to process-reload\n * wiping memory state. We don't want to prompt the user again if they've elected to cancel.\n */\nexport const PROMPT_CANCELLED = KeyDefinition.record(\n BIOMETRIC_SETTINGS_DISK,\n \"promptCancelled\",\n {\n deserializer: (obj) => obj,\n },\n);\n\n/**\n * Stores whether the user has elected to automatically prompt for biometric unlock on application start.\n */\nexport const PROMPT_AUTOMATICALLY = new KeyDefinition(\n BIOMETRIC_SETTINGS_DISK,\n \"promptAutomatically\",\n {\n deserializer: (obj) => obj,\n },\n);\n\n/**\n * Stores whether or not IPC handshake has been validated this session.\n */\nexport const FINGERPRINT_VALIDATED = new KeyDefinition(\n BIOMETRIC_SETTINGS_DISK,\n \"fingerprintValidated\",\n {\n deserializer: (obj) => obj,\n },\n);\n","import { Observable, firstValueFrom, map, combineLatest } from \"rxjs\";\n\nimport { UserId } from \"../../types/guid\";\nimport { EncryptedString, EncString } from \"../models/domain/enc-string\";\nimport { ActiveUserState, GlobalState, StateProvider } from \"../state\";\n\nimport {\n BIOMETRIC_UNLOCK_ENABLED,\n ENCRYPTED_CLIENT_KEY_HALF,\n REQUIRE_PASSWORD_ON_START,\n DISMISSED_REQUIRE_PASSWORD_ON_START_CALLOUT,\n PROMPT_AUTOMATICALLY,\n PROMPT_CANCELLED,\n FINGERPRINT_VALIDATED,\n} from \"./biometric.state\";\n\nexport abstract class BiometricStateService {\n /**\n * `true` if the currently active user has elected to store a biometric key to unlock their vault.\n */\n biometricUnlockEnabled$: Observable; // used to be biometricUnlock\n /**\n * If the user has elected to require a password on first unlock of an application instance, this key will store the\n * encrypted client key half used to unlock the vault.\n *\n * Tracks the currently active user\n */\n encryptedClientKeyHalf$: Observable;\n /**\n * whether or not a password is required on first unlock after opening the application\n *\n * tracks the currently active user\n */\n requirePasswordOnStart$: Observable;\n /**\n * Indicates the user has been warned about the security implications of using biometrics and, depending on the OS,\n *\n * tracks the currently active user.\n */\n dismissedRequirePasswordOnStartCallout$: Observable;\n /**\n * Whether the user has cancelled the biometric prompt.\n *\n * tracks the currently active user\n */\n promptCancelled$: Observable;\n /**\n * Whether the user has elected to automatically prompt for biometrics.\n *\n * tracks the currently active user\n */\n promptAutomatically$: Observable;\n /**\n * Whether or not IPC fingerprint has been validated by the user this session.\n */\n fingerprintValidated$: Observable;\n\n /**\n * Updates the require password on start state for the currently active user.\n *\n * If false, the encrypted client key half will be removed.\n * @param value whether or not a password is required on first unlock after opening the application\n */\n abstract setRequirePasswordOnStart(value: boolean): Promise;\n /**\n * Updates the biometric unlock enabled state for the currently active user.\n * @param enabled whether or not to store a biometric key to unlock the vault\n */\n abstract setBiometricUnlockEnabled(enabled: boolean): Promise;\n /**\n * Gets the biometric unlock enabled state for the given user.\n * @param userId user Id to check\n */\n abstract getBiometricUnlockEnabled(userId: UserId): Promise;\n abstract setEncryptedClientKeyHalf(encryptedKeyHalf: EncString, userId?: UserId): Promise;\n abstract getEncryptedClientKeyHalf(userId: UserId): Promise;\n abstract getRequirePasswordOnStart(userId: UserId): Promise;\n abstract removeEncryptedClientKeyHalf(userId: UserId): Promise;\n /**\n * Updates the active user's state to reflect that they've been warned about requiring password on start.\n */\n abstract setDismissedRequirePasswordOnStartCallout(): Promise;\n /**\n * Updates the active user's state to reflect that they've cancelled the biometric prompt.\n */\n abstract setUserPromptCancelled(): Promise;\n /**\n * Resets the given user's state to reflect that they haven't cancelled the biometric prompt.\n * @param userId the user to reset the prompt cancelled state for. If not provided, the currently active user will be used.\n */\n abstract resetUserPromptCancelled(userId?: UserId): Promise;\n /**\n * Resets all user's state to reflect that they haven't cancelled the biometric prompt.\n */\n abstract resetAllPromptCancelled(): Promise;\n /**\n * Updates the currently active user's setting for auto prompting for biometrics on application start and lock\n * @param prompt Whether or not to prompt for biometrics on application start.\n */\n abstract setPromptAutomatically(prompt: boolean): Promise;\n /**\n * Updates whether or not IPC has been validated by the user this session\n * @param validated the value to save\n */\n abstract setFingerprintValidated(validated: boolean): Promise;\n\n abstract logout(userId: UserId): Promise;\n}\n\nexport class DefaultBiometricStateService implements BiometricStateService {\n private biometricUnlockEnabledState: ActiveUserState;\n private requirePasswordOnStartState: ActiveUserState;\n private encryptedClientKeyHalfState: ActiveUserState;\n private dismissedRequirePasswordOnStartCalloutState: ActiveUserState;\n private promptCancelledState: GlobalState>;\n private promptAutomaticallyState: ActiveUserState;\n private fingerprintValidatedState: GlobalState;\n biometricUnlockEnabled$: Observable;\n encryptedClientKeyHalf$: Observable;\n requirePasswordOnStart$: Observable;\n dismissedRequirePasswordOnStartCallout$: Observable;\n promptCancelled$: Observable;\n promptAutomatically$: Observable;\n fingerprintValidated$: Observable;\n\n constructor(private stateProvider: StateProvider) {\n this.biometricUnlockEnabledState = this.stateProvider.getActive(BIOMETRIC_UNLOCK_ENABLED);\n this.biometricUnlockEnabled$ = this.biometricUnlockEnabledState.state$.pipe(map(Boolean));\n\n this.requirePasswordOnStartState = this.stateProvider.getActive(REQUIRE_PASSWORD_ON_START);\n this.requirePasswordOnStart$ = this.requirePasswordOnStartState.state$.pipe(\n map((value) => !!value),\n );\n\n this.encryptedClientKeyHalfState = this.stateProvider.getActive(ENCRYPTED_CLIENT_KEY_HALF);\n this.encryptedClientKeyHalf$ = this.encryptedClientKeyHalfState.state$.pipe(\n map(encryptedClientKeyHalfToEncString),\n );\n\n this.dismissedRequirePasswordOnStartCalloutState = this.stateProvider.getActive(\n DISMISSED_REQUIRE_PASSWORD_ON_START_CALLOUT,\n );\n this.dismissedRequirePasswordOnStartCallout$ =\n this.dismissedRequirePasswordOnStartCalloutState.state$.pipe(map(Boolean));\n\n this.promptCancelledState = this.stateProvider.getGlobal(PROMPT_CANCELLED);\n this.promptCancelled$ = combineLatest([\n this.stateProvider.activeUserId$,\n this.promptCancelledState.state$,\n ]).pipe(\n map(([userId, record]) => {\n return record?.[userId] ?? false;\n }),\n );\n this.promptAutomaticallyState = this.stateProvider.getActive(PROMPT_AUTOMATICALLY);\n this.promptAutomatically$ = this.promptAutomaticallyState.state$.pipe(map(Boolean));\n\n this.fingerprintValidatedState = this.stateProvider.getGlobal(FINGERPRINT_VALIDATED);\n this.fingerprintValidated$ = this.fingerprintValidatedState.state$.pipe(map(Boolean));\n }\n\n async setBiometricUnlockEnabled(enabled: boolean): Promise {\n await this.biometricUnlockEnabledState.update(() => enabled);\n }\n\n async getBiometricUnlockEnabled(userId: UserId): Promise {\n return await firstValueFrom(\n this.stateProvider.getUser(userId, BIOMETRIC_UNLOCK_ENABLED).state$.pipe(map(Boolean)),\n );\n }\n\n async setRequirePasswordOnStart(value: boolean): Promise {\n let currentActiveId: UserId;\n await this.requirePasswordOnStartState.update(\n (_, [userId]) => {\n currentActiveId = userId;\n return value;\n },\n {\n combineLatestWith: this.requirePasswordOnStartState.combinedState$,\n },\n );\n if (!value) {\n await this.removeEncryptedClientKeyHalf(currentActiveId);\n }\n }\n\n async setEncryptedClientKeyHalf(encryptedKeyHalf: EncString, userId?: UserId): Promise {\n const value = encryptedKeyHalf?.encryptedString ?? null;\n if (userId) {\n await this.stateProvider.getUser(userId, ENCRYPTED_CLIENT_KEY_HALF).update(() => value);\n } else {\n await this.encryptedClientKeyHalfState.update(() => value);\n }\n }\n\n async removeEncryptedClientKeyHalf(userId: UserId): Promise {\n await this.stateProvider.getUser(userId, ENCRYPTED_CLIENT_KEY_HALF).update(() => null);\n }\n\n async getRequirePasswordOnStart(userId: UserId): Promise {\n return !!(await firstValueFrom(\n this.stateProvider.getUser(userId, REQUIRE_PASSWORD_ON_START).state$,\n ));\n }\n\n async getEncryptedClientKeyHalf(userId: UserId): Promise {\n return await firstValueFrom(\n this.stateProvider\n .getUser(userId, ENCRYPTED_CLIENT_KEY_HALF)\n .state$.pipe(map(encryptedClientKeyHalfToEncString)),\n );\n }\n\n async logout(userId: UserId): Promise {\n await this.stateProvider.getUser(userId, ENCRYPTED_CLIENT_KEY_HALF).update(() => null);\n await this.resetUserPromptCancelled(userId);\n // Persist auto prompt setting through logout\n // Persist dismissed require password on start callout through logout\n }\n\n async setDismissedRequirePasswordOnStartCallout(): Promise {\n await this.dismissedRequirePasswordOnStartCalloutState.update(() => true);\n }\n\n async resetUserPromptCancelled(userId: UserId): Promise {\n await this.stateProvider.getGlobal(PROMPT_CANCELLED).update(\n (data, activeUserId) => {\n delete data[userId ?? activeUserId];\n return data;\n },\n {\n combineLatestWith: this.stateProvider.activeUserId$,\n shouldUpdate: (data, activeUserId) => data?.[userId ?? activeUserId] != null,\n },\n );\n }\n\n async setUserPromptCancelled(): Promise {\n await this.promptCancelledState.update(\n (record, userId) => {\n record ??= {};\n record[userId] = true;\n return record;\n },\n {\n combineLatestWith: this.stateProvider.activeUserId$,\n shouldUpdate: (_, userId) => {\n if (userId == null) {\n throw new Error(\n \"Cannot update biometric prompt cancelled state without an active user\",\n );\n }\n return true;\n },\n },\n );\n }\n\n async resetAllPromptCancelled(): Promise {\n await this.promptCancelledState.update(() => null);\n }\n\n async setPromptAutomatically(prompt: boolean): Promise {\n await this.promptAutomaticallyState.update(() => prompt);\n }\n\n async setFingerprintValidated(validated: boolean): Promise {\n await this.fingerprintValidatedState.update(() => validated);\n }\n}\n\nfunction encryptedClientKeyHalfToEncString(\n encryptedKeyHalf: EncryptedString | undefined,\n): EncString {\n return encryptedKeyHalf == null ? null : new EncString(encryptedKeyHalf);\n}\n","export enum EncryptionType {\n AesCbc256_B64 = 0,\n AesCbc128_HmacSha256_B64 = 1,\n AesCbc256_HmacSha256_B64 = 2,\n Rsa2048_OaepSha256_B64 = 3,\n Rsa2048_OaepSha1_B64 = 4,\n Rsa2048_OaepSha256_HmacSha256_B64 = 5,\n Rsa2048_OaepSha1_HmacSha256_B64 = 6,\n}\n\n/** The expected number of parts to a serialized EncString of the given encryption type.\n * For example, an EncString of type AesCbc256_B64 will have 2 parts, and an EncString of type\n * AesCbc128_HmacSha256_B64 will have 3 parts.\n *\n * Example of annotated serialized EncStrings:\n * 0.iv|data\n * 1.iv|data|mac\n * 2.iv|data|mac\n * 3.data\n * 4.data\n *\n * @see EncString\n * @see EncryptionType\n * @see EncString.parseEncryptedString\n */\nexport const EXPECTED_NUM_PARTS_BY_ENCRYPTION_TYPE = {\n [EncryptionType.AesCbc256_B64]: 2,\n [EncryptionType.AesCbc128_HmacSha256_B64]: 3,\n [EncryptionType.AesCbc256_HmacSha256_B64]: 3,\n [EncryptionType.Rsa2048_OaepSha256_B64]: 1,\n [EncryptionType.Rsa2048_OaepSha1_B64]: 1,\n [EncryptionType.Rsa2048_OaepSha256_HmacSha256_B64]: 2,\n [EncryptionType.Rsa2048_OaepSha1_HmacSha256_B64]: 2,\n};\n","export enum FileUploadType {\n Direct = 0,\n Azure = 1,\n}\n","export enum HashPurpose {\n ServerAuthorization = 1,\n LocalAuthorization = 2,\n}\n","export enum HtmlStorageLocation {\n Local = \"local\",\n Memory = \"memory\",\n Session = \"session\",\n}\n","import { KdfConfig } from \"../../auth/models/domain/kdf-config\";\nimport { RangeWithDefault } from \"../misc/range-with-default\";\n\nexport enum KdfType {\n PBKDF2_SHA256 = 0,\n Argon2id = 1,\n}\n\nexport const ARGON2_MEMORY = new RangeWithDefault(16, 1024, 64);\nexport const ARGON2_PARALLELISM = new RangeWithDefault(1, 16, 4);\nexport const ARGON2_ITERATIONS = new RangeWithDefault(2, 10, 3);\n\nexport const DEFAULT_KDF_TYPE = KdfType.PBKDF2_SHA256;\nexport const PBKDF2_ITERATIONS = new RangeWithDefault(600_000, 2_000_000, 600_000);\nexport const DEFAULT_KDF_CONFIG = new KdfConfig(PBKDF2_ITERATIONS.defaultValue);\n","export enum KeySuffixOptions {\n Auto = \"auto\",\n Biometric = \"biometric\",\n Pin = \"pin\",\n}\n","export enum LogLevelType {\n Debug,\n Info,\n Warning,\n Error,\n}\n","export enum StorageLocation {\n Both = \"both\",\n Disk = \"disk\",\n Memory = \"memory\",\n}\n","export enum ThemeType {\n System = \"system\",\n Light = \"light\",\n Dark = \"dark\",\n Nord = \"nord\",\n SolarizedDark = \"solarizedDark\",\n}\n","// required to avoid linting errors when there are no flags\n/* eslint-disable @typescript-eslint/ban-types */\nexport type SharedFlags = {\n multithreadDecryption: boolean;\n showPasswordless?: boolean;\n enableCipherKeyEncryption?: boolean;\n};\n\n// required to avoid linting errors when there are no flags\n/* eslint-disable @typescript-eslint/ban-types */\nexport type SharedDevFlags = {\n noopNotifications: boolean;\n};\n\nfunction getFlags(envFlags: string | T): T {\n if (typeof envFlags === \"string\") {\n return JSON.parse(envFlags) as T;\n } else {\n return envFlags as T;\n }\n}\n\n/**\n * Gets the value of a feature flag from environment.\n * All flags default to \"on\" (true).\n * Only use for shared code in `libs`, otherwise use the client-specific function.\n * @param flag The name of the feature flag to check\n * @returns The value of the flag\n */\nexport function flagEnabled(flag: keyof Flags): boolean {\n const flags = getFlags(process.env.FLAGS);\n return flags[flag] == null || !!flags[flag];\n}\n\n/**\n * Gets the value of a dev flag from environment.\n * Will always return false unless in development.\n * Only use for shared code in `libs`, otherwise use the client-specific function.\n * @param flag The name of the dev flag to check\n * @returns The value of the flag\n */\nexport function devFlagEnabled(flag: keyof DevFlags): boolean {\n if (process.env.ENV !== \"development\") {\n return false;\n }\n\n const devFlags = getFlags(process.env.DEV_FLAGS);\n return devFlags?.[flag] == null ? false : !!devFlags[flag];\n}\n\n/**\n * Gets the value of a dev flag from environment.\n * Will always return false unless in development.\n * @param flag The name of the dev flag to check\n * @returns The value of the flag\n * @throws Error if the flag is not enabled\n */\nexport function devFlagValue(\n flag: keyof DevFlags,\n): DevFlags[keyof DevFlags] {\n if (!devFlagEnabled(flag)) {\n throw new Error(`This method should not be called, it is protected by a disabled dev flag.`);\n }\n\n const devFlags = getFlags(process.env.DEV_FLAGS);\n return devFlags[flag];\n}\n","/**\n * A range with a default value.\n *\n * Enforces constraints to ensure min > default > max.\n */\nexport class RangeWithDefault {\n constructor(\n readonly min: number,\n readonly max: number,\n readonly defaultValue: number,\n ) {\n if (min > max) {\n throw new Error(`${min} is greater than ${max}.`);\n }\n\n if (this.inRange(defaultValue) === false) {\n throw new Error(\"Default value is not in range.\");\n }\n }\n\n inRange(value: number): boolean {\n return value >= this.min && value <= this.max;\n }\n}\n","import { Utils } from \"./utils\";\n\nconst CanLaunchWhitelist = [\n \"https://\",\n \"http://\",\n \"ssh://\",\n \"ftp://\",\n \"sftp://\",\n \"irc://\",\n \"vnc://\",\n // https://docs.microsoft.com/en-us/windows-server/remote/remote-desktop-services/clients/remote-desktop-uri\n \"rdp://\", // Legacy RDP URI scheme\n \"ms-rd:\", // Preferred RDP URI scheme\n \"chrome://\",\n \"iosapp://\",\n \"androidapp://\",\n];\n\nexport class SafeUrls {\n static canLaunch(uri: string): boolean {\n if (Utils.isNullOrWhitespace(uri)) {\n return false;\n }\n\n for (let i = 0; i < CanLaunchWhitelist.length; i++) {\n if (uri.indexOf(CanLaunchWhitelist[i]) === 0) {\n return true;\n }\n }\n\n return false;\n }\n}\n","/* eslint-disable no-useless-escape */\nimport * as path from \"path\";\n\nimport { Buffer as BufferLib } from \"buffer/\";\nimport { Observable, of, switchMap } from \"rxjs\";\nimport { getHostname, parse } from \"tldts\";\nimport { Merge } from \"type-fest\";\n\nimport { CryptoService } from \"../abstractions/crypto.service\";\nimport { EncryptService } from \"../abstractions/encrypt.service\";\nimport { I18nService } from \"../abstractions/i18n.service\";\n\nconst nodeURL = typeof window === \"undefined\" ? require(\"url\") : null;\n\ndeclare global {\n /* eslint-disable-next-line no-var */\n var bitwardenContainerService: BitwardenContainerService;\n}\n\ninterface BitwardenContainerService {\n getCryptoService: () => CryptoService;\n getEncryptService: () => EncryptService;\n}\n\nexport class Utils {\n static inited = false;\n static isNode = false;\n static isBrowser = true;\n static isMobileBrowser = false;\n static isAppleMobileBrowser = false;\n static global: typeof global = null;\n // Transpiled version of /\\p{Emoji_Presentation}/gu using https://mothereff.in/regexpu. Used for compatability in older browsers.\n static regexpEmojiPresentation =\n /(?:[\\u231A\\u231B\\u23E9-\\u23EC\\u23F0\\u23F3\\u25FD\\u25FE\\u2614\\u2615\\u2648-\\u2653\\u267F\\u2693\\u26A1\\u26AA\\u26AB\\u26BD\\u26BE\\u26C4\\u26C5\\u26CE\\u26D4\\u26EA\\u26F2\\u26F3\\u26F5\\u26FA\\u26FD\\u2705\\u270A\\u270B\\u2728\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2795-\\u2797\\u27B0\\u27BF\\u2B1B\\u2B1C\\u2B50\\u2B55]|\\uD83C[\\uDC04\\uDCCF\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE1A\\uDE2F\\uDE32-\\uDE36\\uDE38-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF20\\uDF2D-\\uDF35\\uDF37-\\uDF7C\\uDF7E-\\uDF93\\uDFA0-\\uDFCA\\uDFCF-\\uDFD3\\uDFE0-\\uDFF0\\uDFF4\\uDFF8-\\uDFFF]|\\uD83D[\\uDC00-\\uDC3E\\uDC40\\uDC42-\\uDCFC\\uDCFF-\\uDD3D\\uDD4B-\\uDD4E\\uDD50-\\uDD67\\uDD7A\\uDD95\\uDD96\\uDDA4\\uDDFB-\\uDE4F\\uDE80-\\uDEC5\\uDECC\\uDED0-\\uDED2\\uDED5-\\uDED7\\uDEEB\\uDEEC\\uDEF4-\\uDEFC\\uDFE0-\\uDFEB]|\\uD83E[\\uDD0C-\\uDD3A\\uDD3C-\\uDD45\\uDD47-\\uDD78\\uDD7A-\\uDDCB\\uDDCD-\\uDDFF\\uDE70-\\uDE74\\uDE78-\\uDE7A\\uDE80-\\uDE86\\uDE90-\\uDEA8\\uDEB0-\\uDEB6\\uDEC0-\\uDEC2\\uDED0-\\uDED6])/g;\n static readonly validHosts: string[] = [\"localhost\"];\n static readonly originalMinimumPasswordLength = 8;\n static readonly minimumPasswordLength = 12;\n static readonly DomainMatchBlacklist = new Map>([\n [\"google.com\", new Set([\"script.google.com\"])],\n ]);\n\n static init() {\n if (Utils.inited) {\n return;\n }\n\n Utils.inited = true;\n Utils.isNode =\n typeof process !== \"undefined\" &&\n (process as any).release != null &&\n (process as any).release.name === \"node\";\n Utils.isBrowser = typeof window !== \"undefined\";\n\n Utils.isMobileBrowser = Utils.isBrowser && this.isMobile(window);\n Utils.isAppleMobileBrowser = Utils.isBrowser && this.isAppleMobile(window);\n\n if (Utils.isNode) {\n Utils.global = global;\n } else if (Utils.isBrowser) {\n Utils.global = window;\n } else {\n // If it's not browser or node then it must be a service worker\n Utils.global = self;\n }\n }\n\n static fromB64ToArray(str: string): Uint8Array {\n if (str == null) {\n return null;\n }\n\n if (Utils.isNode) {\n return new Uint8Array(Buffer.from(str, \"base64\"));\n } else {\n const binaryString = Utils.global.atob(str);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes;\n }\n }\n\n static fromUrlB64ToArray(str: string): Uint8Array {\n return Utils.fromB64ToArray(Utils.fromUrlB64ToB64(str));\n }\n\n static fromHexToArray(str: string): Uint8Array {\n if (Utils.isNode) {\n return new Uint8Array(Buffer.from(str, \"hex\"));\n } else {\n const bytes = new Uint8Array(str.length / 2);\n for (let i = 0; i < str.length; i += 2) {\n bytes[i / 2] = parseInt(str.substr(i, 2), 16);\n }\n return bytes;\n }\n }\n\n static fromUtf8ToArray(str: string): Uint8Array {\n if (Utils.isNode) {\n return new Uint8Array(Buffer.from(str, \"utf8\"));\n } else {\n const strUtf8 = unescape(encodeURIComponent(str));\n const arr = new Uint8Array(strUtf8.length);\n for (let i = 0; i < strUtf8.length; i++) {\n arr[i] = strUtf8.charCodeAt(i);\n }\n return arr;\n }\n }\n\n static fromByteStringToArray(str: string): Uint8Array {\n if (str == null) {\n return null;\n }\n const arr = new Uint8Array(str.length);\n for (let i = 0; i < str.length; i++) {\n arr[i] = str.charCodeAt(i);\n }\n return arr;\n }\n\n static fromBufferToB64(buffer: ArrayBuffer): string {\n if (buffer == null) {\n return null;\n }\n if (Utils.isNode) {\n return Buffer.from(buffer).toString(\"base64\");\n } else {\n let binary = \"\";\n const bytes = new Uint8Array(buffer);\n for (let i = 0; i < bytes.byteLength; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return Utils.global.btoa(binary);\n }\n }\n\n static fromBufferToUrlB64(buffer: ArrayBuffer): string {\n return Utils.fromB64toUrlB64(Utils.fromBufferToB64(buffer));\n }\n\n static fromB64toUrlB64(b64Str: string) {\n return b64Str.replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=/g, \"\");\n }\n\n static fromBufferToUtf8(buffer: ArrayBuffer): string {\n return BufferLib.from(buffer).toString(\"utf8\");\n }\n\n static fromBufferToByteString(buffer: ArrayBuffer): string {\n return String.fromCharCode.apply(null, new Uint8Array(buffer));\n }\n\n // ref: https://stackoverflow.com/a/40031979/1090359\n static fromBufferToHex(buffer: ArrayBuffer): string {\n if (Utils.isNode) {\n return Buffer.from(buffer).toString(\"hex\");\n } else {\n const bytes = new Uint8Array(buffer);\n return Array.prototype.map\n .call(bytes, (x: number) => (\"00\" + x.toString(16)).slice(-2))\n .join(\"\");\n }\n }\n\n /**\n * Converts a hex string to an ArrayBuffer.\n * Note: this doesn't need any Node specific code as parseInt() / ArrayBuffer / Uint8Array\n * work the same in Node and the browser.\n * @param {string} hexString - A string of hexadecimal characters.\n * @returns {ArrayBuffer} The ArrayBuffer representation of the hex string.\n */\n static hexStringToArrayBuffer(hexString: string): ArrayBuffer {\n // Check if the hexString has an even length, as each hex digit represents half a byte (4 bits),\n // and it takes two hex digits to represent a full byte (8 bits).\n if (hexString.length % 2 !== 0) {\n throw \"HexString has to be an even length\";\n }\n\n // Create an ArrayBuffer with a length that is half the length of the hex string,\n // because each pair of hex digits will become a single byte.\n const arrayBuffer = new ArrayBuffer(hexString.length / 2);\n\n // Create a Uint8Array view on top of the ArrayBuffer (each position represents a byte)\n // as ArrayBuffers cannot be edited directly.\n const uint8Array = new Uint8Array(arrayBuffer);\n\n // Loop through the bytes\n for (let i = 0; i < uint8Array.length; i++) {\n // Extract two hex characters (1 byte)\n const hexByte = hexString.substr(i * 2, 2);\n\n // Convert hexByte into a decimal value from base 16. (ex: ff --> 255)\n const byteValue = parseInt(hexByte, 16);\n\n // Place the byte value into the uint8Array\n uint8Array[i] = byteValue;\n }\n\n return arrayBuffer;\n }\n\n static fromUrlB64ToB64(urlB64Str: string): string {\n let output = urlB64Str.replace(/-/g, \"+\").replace(/_/g, \"/\");\n switch (output.length % 4) {\n case 0:\n break;\n case 2:\n output += \"==\";\n break;\n case 3:\n output += \"=\";\n break;\n default:\n throw new Error(\"Illegal base64url string!\");\n }\n\n return output;\n }\n\n static fromUrlB64ToUtf8(urlB64Str: string): string {\n return Utils.fromB64ToUtf8(Utils.fromUrlB64ToB64(urlB64Str));\n }\n\n static fromUtf8ToB64(utfStr: string): string {\n if (Utils.isNode) {\n return Buffer.from(utfStr, \"utf8\").toString(\"base64\");\n } else {\n return decodeURIComponent(escape(Utils.global.btoa(utfStr)));\n }\n }\n\n static fromUtf8ToUrlB64(utfStr: string): string {\n return Utils.fromBufferToUrlB64(Utils.fromUtf8ToArray(utfStr));\n }\n\n static fromB64ToUtf8(b64Str: string): string {\n if (Utils.isNode) {\n return Buffer.from(b64Str, \"base64\").toString(\"utf8\");\n } else {\n return decodeURIComponent(escape(Utils.global.atob(b64Str)));\n }\n }\n\n // ref: http://stackoverflow.com/a/2117523/1090359\n static newGuid(): string {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n\n static guidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/;\n\n static isGuid(id: string) {\n return RegExp(Utils.guidRegex, \"i\").test(id);\n }\n\n static getHostname(uriString: string): string {\n if (Utils.isNullOrWhitespace(uriString)) {\n return null;\n }\n\n uriString = uriString.trim();\n\n if (uriString.startsWith(\"data:\")) {\n return null;\n }\n\n if (uriString.startsWith(\"about:\")) {\n return null;\n }\n\n if (uriString.startsWith(\"file:\")) {\n return null;\n }\n\n // Does uriString contain invalid characters\n // TODO Needs to possibly be extended, although '!' is a reserved character\n if (uriString.indexOf(\"!\") > 0) {\n return null;\n }\n\n try {\n const hostname = getHostname(uriString, { validHosts: this.validHosts });\n if (hostname != null) {\n return hostname;\n }\n } catch {\n return null;\n }\n return null;\n }\n\n static getHost(uriString: string): string {\n const url = Utils.getUrl(uriString);\n try {\n return url != null && url.host !== \"\" ? url.host : null;\n } catch {\n return null;\n }\n }\n\n static getDomain(uriString: string): string {\n if (Utils.isNullOrWhitespace(uriString)) {\n return null;\n }\n\n uriString = uriString.trim();\n\n if (uriString.startsWith(\"data:\")) {\n return null;\n }\n\n if (uriString.startsWith(\"about:\")) {\n return null;\n }\n\n try {\n const parseResult = parse(uriString, {\n validHosts: this.validHosts,\n allowPrivateDomains: true,\n });\n if (parseResult != null && parseResult.hostname != null) {\n if (parseResult.hostname === \"localhost\" || parseResult.isIp) {\n return parseResult.hostname;\n }\n\n if (parseResult.domain != null) {\n return parseResult.domain;\n }\n return null;\n }\n } catch {\n return null;\n }\n return null;\n }\n\n static getQueryParams(uriString: string): Map {\n const url = Utils.getUrl(uriString);\n if (url == null || url.search == null || url.search === \"\") {\n return null;\n }\n const map = new Map();\n const pairs = (url.search[0] === \"?\" ? url.search.substr(1) : url.search).split(\"&\");\n pairs.forEach((pair) => {\n const parts = pair.split(\"=\");\n if (parts.length < 1) {\n return;\n }\n map.set(\n decodeURIComponent(parts[0]).toLowerCase(),\n parts[1] == null ? \"\" : decodeURIComponent(parts[1]),\n );\n });\n return map;\n }\n\n static getSortFunction(\n i18nService: I18nService,\n prop: { [K in keyof T]: T[K] extends string ? K : never }[keyof T],\n ): (a: T, b: T) => number {\n return (a, b) => {\n if (a[prop] == null && b[prop] != null) {\n return -1;\n }\n if (a[prop] != null && b[prop] == null) {\n return 1;\n }\n if (a[prop] == null && b[prop] == null) {\n return 0;\n }\n\n // The `as unknown as string` here is unfortunate because typescript doesn't property understand that the return of T[prop] will be a string\n return i18nService.collator\n ? i18nService.collator.compare(a[prop] as unknown as string, b[prop] as unknown as string)\n : (a[prop] as unknown as string).localeCompare(b[prop] as unknown as string);\n };\n }\n\n static isNullOrWhitespace(str: string): boolean {\n return str == null || typeof str !== \"string\" || str.trim() === \"\";\n }\n\n static isNullOrEmpty(str: string): boolean {\n return str == null || typeof str !== \"string\" || str == \"\";\n }\n\n static isPromise(obj: any): obj is Promise {\n return (\n obj != undefined && typeof obj[\"then\"] === \"function\" && typeof obj[\"catch\"] === \"function\"\n );\n }\n\n static nameOf(name: string & keyof T) {\n return name;\n }\n\n static assign(target: T, source: Partial): T {\n return Object.assign(target, source);\n }\n\n static iterateEnum(obj: O) {\n return (Object.keys(obj).filter((k) => Number.isNaN(+k)) as K[]).map((k) => obj[k]);\n }\n\n static getUrl(uriString: string): URL {\n if (this.isNullOrWhitespace(uriString)) {\n return null;\n }\n\n uriString = uriString.trim();\n\n return Utils.getUrlObject(uriString);\n }\n\n static camelToPascalCase(s: string) {\n return s.charAt(0).toUpperCase() + s.slice(1);\n }\n\n /**\n * There are a few ways to calculate text color for contrast, this one seems to fit accessibility guidelines best.\n * https://stackoverflow.com/a/3943023/6869691\n *\n * @param {string} bgColor\n * @param {number} [threshold] see stackoverflow link above\n * @param {boolean} [svgTextFill]\n * Indicates if this method is performed on an SVG 'fill' attribute (e.g. ).\n * This check is necessary because the '!important' tag cannot be used in a 'fill' attribute.\n */\n static pickTextColorBasedOnBgColor(bgColor: string, threshold = 186, svgTextFill = false) {\n const bgColorHexNums = bgColor.charAt(0) === \"#\" ? bgColor.substring(1, 7) : bgColor;\n const r = parseInt(bgColorHexNums.substring(0, 2), 16); // hexToR\n const g = parseInt(bgColorHexNums.substring(2, 4), 16); // hexToG\n const b = parseInt(bgColorHexNums.substring(4, 6), 16); // hexToB\n const blackColor = svgTextFill ? \"black\" : \"black !important\";\n const whiteColor = svgTextFill ? \"white\" : \"white !important\";\n return r * 0.299 + g * 0.587 + b * 0.114 > threshold ? blackColor : whiteColor;\n }\n\n static stringToColor(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = str.charCodeAt(i) + ((hash << 5) - hash);\n }\n let color = \"#\";\n for (let i = 0; i < 3; i++) {\n const value = (hash >> (i * 8)) & 0xff;\n color += (\"00\" + value.toString(16)).substr(-2);\n }\n return color;\n }\n\n /**\n * @throws Will throw an error if the ContainerService has not been attached to the window object\n */\n static getContainerService(): BitwardenContainerService {\n if (this.global.bitwardenContainerService == null) {\n throw new Error(\"global bitwardenContainerService not initialized.\");\n }\n return this.global.bitwardenContainerService;\n }\n\n static validateHexColor(color: string) {\n return /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/.test(color);\n }\n\n /**\n * Converts map to a Record with the same data. Inverse of recordToMap\n * Useful in toJSON methods, since Maps are not serializable\n * @param map\n * @returns\n */\n static mapToRecord(map: Map): Record {\n if (map == null) {\n return null;\n }\n if (!(map instanceof Map)) {\n return map;\n }\n return Object.fromEntries(map);\n }\n\n /**\n * Converts record to a Map with the same data. Inverse of mapToRecord\n * Useful in fromJSON methods, since Maps are not serializable\n *\n * Warning: If the record has string keys that are numbers, they will be converted to numbers in the map\n * @param record\n * @returns\n */\n static recordToMap(record: Record): Map {\n if (record == null) {\n return null;\n } else if (record instanceof Map) {\n return record;\n }\n\n const entries = Object.entries(record);\n if (entries.length === 0) {\n return new Map();\n }\n\n if (isNaN(Number(entries[0][0]))) {\n return new Map(entries) as Map;\n } else {\n return new Map(entries.map((e) => [Number(e[0]), e[1]])) as Map;\n }\n }\n\n /** Applies Object.assign, but converts the type nicely using Type-Fest Merge */\n static merge(\n destination: Destination,\n source: Source,\n ): Merge {\n return Object.assign(destination, source) as unknown as Merge;\n }\n\n /**\n * encodeURIComponent escapes all characters except the following:\n * alphabetic, decimal digits, - _ . ! ~ * ' ( )\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent#encoding_for_rfc3986\n */\n static encodeRFC3986URIComponent(str: string): string {\n return encodeURIComponent(str).replace(\n /[!'()*]/g,\n (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`,\n );\n }\n\n /**\n * Normalizes a path for defense against attacks like traversals\n * @param denormalizedPath\n * @returns\n */\n static normalizePath(denormalizedPath: string): string {\n return path.normalize(decodeURIComponent(denormalizedPath)).replace(/^(\\.\\.(\\/|\\\\|$))+/, \"\");\n }\n\n private static isMobile(win: Window) {\n let mobile = false;\n ((a) => {\n if (\n /(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(\n a,\n ) ||\n /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(\n a.substr(0, 4),\n )\n ) {\n mobile = true;\n }\n })(win.navigator.userAgent || win.navigator.vendor || (win as any).opera);\n return mobile || win.navigator.userAgent.match(/iPad/i) != null;\n }\n\n static delay(ms: number): Promise {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Generate an observable from a function that returns a promise.\n * Similar to the rxjs function {@link from} with one big exception:\n * {@link from} will not re-execute the function when observers resubscribe.\n * {@link Util.asyncToObservable} will execute `generator` for every\n * subscribe, making it ideal if the value ever needs to be refreshed.\n * */\n static asyncToObservable(generator: () => Promise): Observable {\n return of(undefined).pipe(switchMap(() => generator()));\n }\n\n /**\n * Return the number of days remaining before a target date arrives.\n * Returns 0 if the day has already passed.\n */\n static daysRemaining(targetDate: Date): number {\n const diffTime = targetDate.getTime() - Date.now();\n const msPerDay = 86400000;\n return Math.max(0, Math.floor(diffTime / msPerDay));\n }\n\n private static isAppleMobile(win: Window) {\n return (\n win.navigator.userAgent.match(/iPhone/i) != null ||\n win.navigator.userAgent.match(/iPad/i) != null\n );\n }\n\n private static getUrlObject(uriString: string): URL {\n // All the methods below require a protocol to properly parse a URL string\n // Assume http if no other protocol is present\n const hasProtocol = uriString.indexOf(\"://\") > -1;\n if (!hasProtocol && uriString.indexOf(\".\") > -1) {\n uriString = \"http://\" + uriString;\n } else if (!hasProtocol) {\n return null;\n }\n\n try {\n if (nodeURL != null) {\n return new nodeURL.URL(uriString);\n }\n\n return new URL(uriString);\n } catch (e) {\n // Ignore error\n }\n\n return null;\n }\n}\n\nUtils.init();\n","// EFF's Long Wordlist from https://www.eff.org/dice\nexport const EFFLongWordList = [\n \"abacus\",\n \"abdomen\",\n \"abdominal\",\n \"abide\",\n \"abiding\",\n \"ability\",\n \"ablaze\",\n \"able\",\n \"abnormal\",\n \"abrasion\",\n \"abrasive\",\n \"abreast\",\n \"abridge\",\n \"abroad\",\n \"abruptly\",\n \"absence\",\n \"absentee\",\n \"absently\",\n \"absinthe\",\n \"absolute\",\n \"absolve\",\n \"abstain\",\n \"abstract\",\n \"absurd\",\n \"accent\",\n \"acclaim\",\n \"acclimate\",\n \"accompany\",\n \"account\",\n \"accuracy\",\n \"accurate\",\n \"accustom\",\n \"acetone\",\n \"achiness\",\n \"aching\",\n \"acid\",\n \"acorn\",\n \"acquaint\",\n \"acquire\",\n \"acre\",\n \"acrobat\",\n \"acronym\",\n \"acting\",\n \"action\",\n \"activate\",\n \"activator\",\n \"active\",\n \"activism\",\n \"activist\",\n \"activity\",\n \"actress\",\n \"acts\",\n \"acutely\",\n \"acuteness\",\n \"aeration\",\n \"aerobics\",\n \"aerosol\",\n \"aerospace\",\n \"afar\",\n \"affair\",\n \"affected\",\n \"affecting\",\n \"affection\",\n \"affidavit\",\n \"affiliate\",\n \"affirm\",\n \"affix\",\n \"afflicted\",\n \"affluent\",\n \"afford\",\n \"affront\",\n \"aflame\",\n \"afloat\",\n \"aflutter\",\n \"afoot\",\n \"afraid\",\n \"afterglow\",\n \"afterlife\",\n \"aftermath\",\n \"aftermost\",\n \"afternoon\",\n \"aged\",\n \"ageless\",\n \"agency\",\n \"agenda\",\n \"agent\",\n \"aggregate\",\n \"aghast\",\n \"agile\",\n \"agility\",\n \"aging\",\n \"agnostic\",\n \"agonize\",\n \"agonizing\",\n \"agony\",\n \"agreeable\",\n \"agreeably\",\n \"agreed\",\n \"agreeing\",\n \"agreement\",\n \"aground\",\n \"ahead\",\n \"ahoy\",\n \"aide\",\n \"aids\",\n \"aim\",\n \"ajar\",\n \"alabaster\",\n \"alarm\",\n \"albatross\",\n \"album\",\n \"alfalfa\",\n \"algebra\",\n \"algorithm\",\n \"alias\",\n \"alibi\",\n \"alienable\",\n \"alienate\",\n \"aliens\",\n \"alike\",\n \"alive\",\n \"alkaline\",\n \"alkalize\",\n \"almanac\",\n \"almighty\",\n \"almost\",\n \"aloe\",\n \"aloft\",\n \"aloha\",\n \"alone\",\n \"alongside\",\n \"aloof\",\n \"alphabet\",\n \"alright\",\n \"although\",\n \"altitude\",\n \"alto\",\n \"aluminum\",\n \"alumni\",\n \"always\",\n \"amaretto\",\n \"amaze\",\n \"amazingly\",\n \"amber\",\n \"ambiance\",\n \"ambiguity\",\n \"ambiguous\",\n \"ambition\",\n \"ambitious\",\n \"ambulance\",\n \"ambush\",\n \"amendable\",\n \"amendment\",\n \"amends\",\n \"amenity\",\n \"amiable\",\n \"amicably\",\n \"amid\",\n \"amigo\",\n \"amino\",\n \"amiss\",\n \"ammonia\",\n \"ammonium\",\n \"amnesty\",\n \"amniotic\",\n \"among\",\n \"amount\",\n \"amperage\",\n \"ample\",\n \"amplifier\",\n \"amplify\",\n \"amply\",\n \"amuck\",\n \"amulet\",\n \"amusable\",\n \"amused\",\n \"amusement\",\n \"amuser\",\n \"amusing\",\n \"anaconda\",\n \"anaerobic\",\n \"anagram\",\n \"anatomist\",\n \"anatomy\",\n \"anchor\",\n \"anchovy\",\n \"ancient\",\n \"android\",\n \"anemia\",\n \"anemic\",\n \"aneurism\",\n \"anew\",\n \"angelfish\",\n \"angelic\",\n \"anger\",\n \"angled\",\n \"angler\",\n \"angles\",\n \"angling\",\n \"angrily\",\n \"angriness\",\n \"anguished\",\n \"angular\",\n \"animal\",\n \"animate\",\n \"animating\",\n \"animation\",\n \"animator\",\n \"anime\",\n \"animosity\",\n \"ankle\",\n \"annex\",\n \"annotate\",\n \"announcer\",\n \"annoying\",\n \"annually\",\n \"annuity\",\n \"anointer\",\n \"another\",\n \"answering\",\n \"antacid\",\n \"antarctic\",\n \"anteater\",\n \"antelope\",\n \"antennae\",\n \"anthem\",\n \"anthill\",\n \"anthology\",\n \"antibody\",\n \"antics\",\n \"antidote\",\n \"antihero\",\n \"antiquely\",\n \"antiques\",\n \"antiquity\",\n \"antirust\",\n \"antitoxic\",\n \"antitrust\",\n \"antiviral\",\n \"antivirus\",\n \"antler\",\n \"antonym\",\n \"antsy\",\n \"anvil\",\n \"anybody\",\n \"anyhow\",\n \"anymore\",\n \"anyone\",\n \"anyplace\",\n \"anything\",\n \"anytime\",\n \"anyway\",\n \"anywhere\",\n \"aorta\",\n \"apache\",\n \"apostle\",\n \"appealing\",\n \"appear\",\n \"appease\",\n \"appeasing\",\n \"appendage\",\n \"appendix\",\n \"appetite\",\n \"appetizer\",\n \"applaud\",\n \"applause\",\n \"apple\",\n \"appliance\",\n \"applicant\",\n \"applied\",\n \"apply\",\n \"appointee\",\n \"appraisal\",\n \"appraiser\",\n \"apprehend\",\n \"approach\",\n \"approval\",\n \"approve\",\n \"apricot\",\n \"april\",\n \"apron\",\n \"aptitude\",\n \"aptly\",\n \"aqua\",\n \"aqueduct\",\n \"arbitrary\",\n \"arbitrate\",\n \"ardently\",\n \"area\",\n \"arena\",\n \"arguable\",\n \"arguably\",\n \"argue\",\n \"arise\",\n \"armadillo\",\n \"armband\",\n \"armchair\",\n \"armed\",\n \"armful\",\n \"armhole\",\n \"arming\",\n \"armless\",\n \"armoire\",\n \"armored\",\n \"armory\",\n \"armrest\",\n \"army\",\n \"aroma\",\n \"arose\",\n \"around\",\n \"arousal\",\n \"arrange\",\n \"array\",\n \"arrest\",\n \"arrival\",\n \"arrive\",\n \"arrogance\",\n \"arrogant\",\n \"arson\",\n \"art\",\n \"ascend\",\n \"ascension\",\n \"ascent\",\n \"ascertain\",\n \"ashamed\",\n \"ashen\",\n \"ashes\",\n \"ashy\",\n \"aside\",\n \"askew\",\n \"asleep\",\n \"asparagus\",\n \"aspect\",\n \"aspirate\",\n \"aspire\",\n \"aspirin\",\n \"astonish\",\n \"astound\",\n \"astride\",\n \"astrology\",\n \"astronaut\",\n \"astronomy\",\n \"astute\",\n \"atlantic\",\n \"atlas\",\n \"atom\",\n \"atonable\",\n \"atop\",\n \"atrium\",\n \"atrocious\",\n \"atrophy\",\n \"attach\",\n \"attain\",\n \"attempt\",\n \"attendant\",\n \"attendee\",\n \"attention\",\n \"attentive\",\n \"attest\",\n \"attic\",\n \"attire\",\n \"attitude\",\n \"attractor\",\n \"attribute\",\n \"atypical\",\n \"auction\",\n \"audacious\",\n \"audacity\",\n \"audible\",\n \"audibly\",\n \"audience\",\n \"audio\",\n \"audition\",\n \"augmented\",\n \"august\",\n \"authentic\",\n \"author\",\n \"autism\",\n \"autistic\",\n \"autograph\",\n \"automaker\",\n \"automated\",\n \"automatic\",\n \"autopilot\",\n \"available\",\n \"avalanche\",\n \"avatar\",\n \"avenge\",\n \"avenging\",\n \"avenue\",\n \"average\",\n \"aversion\",\n \"avert\",\n \"aviation\",\n \"aviator\",\n \"avid\",\n \"avoid\",\n \"await\",\n \"awaken\",\n \"award\",\n \"aware\",\n \"awhile\",\n \"awkward\",\n \"awning\",\n \"awoke\",\n \"awry\",\n \"axis\",\n \"babble\",\n \"babbling\",\n \"babied\",\n \"baboon\",\n \"backache\",\n \"backboard\",\n \"backboned\",\n \"backdrop\",\n \"backed\",\n \"backer\",\n \"backfield\",\n \"backfire\",\n \"backhand\",\n \"backing\",\n \"backlands\",\n \"backlash\",\n \"backless\",\n \"backlight\",\n \"backlit\",\n \"backlog\",\n \"backpack\",\n \"backpedal\",\n \"backrest\",\n \"backroom\",\n \"backshift\",\n \"backside\",\n \"backslid\",\n \"backspace\",\n \"backspin\",\n \"backstab\",\n \"backstage\",\n \"backtalk\",\n \"backtrack\",\n \"backup\",\n \"backward\",\n \"backwash\",\n \"backwater\",\n \"backyard\",\n \"bacon\",\n \"bacteria\",\n \"bacterium\",\n \"badass\",\n \"badge\",\n \"badland\",\n \"badly\",\n \"badness\",\n \"baffle\",\n \"baffling\",\n \"bagel\",\n \"bagful\",\n \"baggage\",\n \"bagged\",\n \"baggie\",\n \"bagginess\",\n \"bagging\",\n \"baggy\",\n \"bagpipe\",\n \"baguette\",\n \"baked\",\n \"bakery\",\n \"bakeshop\",\n \"baking\",\n \"balance\",\n \"balancing\",\n \"balcony\",\n \"balmy\",\n \"balsamic\",\n \"bamboo\",\n \"banana\",\n \"banish\",\n \"banister\",\n \"banjo\",\n \"bankable\",\n \"bankbook\",\n \"banked\",\n \"banker\",\n \"banking\",\n \"banknote\",\n \"bankroll\",\n \"banner\",\n \"bannister\",\n \"banshee\",\n \"banter\",\n \"barbecue\",\n \"barbed\",\n \"barbell\",\n \"barber\",\n \"barcode\",\n \"barge\",\n \"bargraph\",\n \"barista\",\n \"baritone\",\n \"barley\",\n \"barmaid\",\n \"barman\",\n \"barn\",\n \"barometer\",\n \"barrack\",\n \"barracuda\",\n \"barrel\",\n \"barrette\",\n \"barricade\",\n \"barrier\",\n \"barstool\",\n \"bartender\",\n \"barterer\",\n \"bash\",\n \"basically\",\n \"basics\",\n \"basil\",\n \"basin\",\n \"basis\",\n \"basket\",\n \"batboy\",\n \"batch\",\n \"bath\",\n \"baton\",\n \"bats\",\n \"battalion\",\n \"battered\",\n \"battering\",\n \"battery\",\n \"batting\",\n \"battle\",\n \"bauble\",\n \"bazooka\",\n \"blabber\",\n \"bladder\",\n \"blade\",\n \"blah\",\n \"blame\",\n \"blaming\",\n \"blanching\",\n \"blandness\",\n \"blank\",\n \"blaspheme\",\n \"blasphemy\",\n \"blast\",\n \"blatancy\",\n \"blatantly\",\n \"blazer\",\n \"blazing\",\n \"bleach\",\n \"bleak\",\n \"bleep\",\n \"blemish\",\n \"blend\",\n \"bless\",\n \"blighted\",\n \"blimp\",\n \"bling\",\n \"blinked\",\n \"blinker\",\n \"blinking\",\n \"blinks\",\n \"blip\",\n \"blissful\",\n \"blitz\",\n \"blizzard\",\n \"bloated\",\n \"bloating\",\n \"blob\",\n \"blog\",\n \"bloomers\",\n \"blooming\",\n \"blooper\",\n \"blot\",\n \"blouse\",\n \"blubber\",\n \"bluff\",\n \"bluish\",\n \"blunderer\",\n \"blunt\",\n \"blurb\",\n \"blurred\",\n \"blurry\",\n \"blurt\",\n \"blush\",\n \"blustery\",\n \"boaster\",\n \"boastful\",\n \"boasting\",\n \"boat\",\n \"bobbed\",\n \"bobbing\",\n \"bobble\",\n \"bobcat\",\n \"bobsled\",\n \"bobtail\",\n \"bodacious\",\n \"body\",\n \"bogged\",\n \"boggle\",\n \"bogus\",\n \"boil\",\n \"bok\",\n \"bolster\",\n \"bolt\",\n \"bonanza\",\n \"bonded\",\n \"bonding\",\n \"bondless\",\n \"boned\",\n \"bonehead\",\n \"boneless\",\n \"bonelike\",\n \"boney\",\n \"bonfire\",\n \"bonnet\",\n \"bonsai\",\n \"bonus\",\n \"bony\",\n \"boogeyman\",\n \"boogieman\",\n \"book\",\n \"boondocks\",\n \"booted\",\n \"booth\",\n \"bootie\",\n \"booting\",\n \"bootlace\",\n \"bootleg\",\n \"boots\",\n \"boozy\",\n \"borax\",\n \"boring\",\n \"borough\",\n \"borrower\",\n \"borrowing\",\n \"boss\",\n \"botanical\",\n \"botanist\",\n \"botany\",\n \"botch\",\n \"both\",\n \"bottle\",\n \"bottling\",\n \"bottom\",\n \"bounce\",\n \"bouncing\",\n \"bouncy\",\n \"bounding\",\n \"boundless\",\n \"bountiful\",\n \"bovine\",\n \"boxcar\",\n \"boxer\",\n \"boxing\",\n \"boxlike\",\n \"boxy\",\n \"breach\",\n \"breath\",\n \"breeches\",\n \"breeching\",\n \"breeder\",\n \"breeding\",\n \"breeze\",\n \"breezy\",\n \"brethren\",\n \"brewery\",\n \"brewing\",\n \"briar\",\n \"bribe\",\n \"brick\",\n \"bride\",\n \"bridged\",\n \"brigade\",\n \"bright\",\n \"brilliant\",\n \"brim\",\n \"bring\",\n \"brink\",\n \"brisket\",\n \"briskly\",\n \"briskness\",\n \"bristle\",\n \"brittle\",\n \"broadband\",\n \"broadcast\",\n \"broaden\",\n \"broadly\",\n \"broadness\",\n \"broadside\",\n \"broadways\",\n \"broiler\",\n \"broiling\",\n \"broken\",\n \"broker\",\n \"bronchial\",\n \"bronco\",\n \"bronze\",\n \"bronzing\",\n \"brook\",\n \"broom\",\n \"brought\",\n \"browbeat\",\n \"brownnose\",\n \"browse\",\n \"browsing\",\n \"bruising\",\n \"brunch\",\n \"brunette\",\n \"brunt\",\n \"brush\",\n \"brussels\",\n \"brute\",\n \"brutishly\",\n \"bubble\",\n \"bubbling\",\n \"bubbly\",\n \"buccaneer\",\n \"bucked\",\n \"bucket\",\n \"buckle\",\n \"buckshot\",\n \"buckskin\",\n \"bucktooth\",\n \"buckwheat\",\n \"buddhism\",\n \"buddhist\",\n \"budding\",\n \"buddy\",\n \"budget\",\n \"buffalo\",\n \"buffed\",\n \"buffer\",\n \"buffing\",\n \"buffoon\",\n \"buggy\",\n \"bulb\",\n \"bulge\",\n \"bulginess\",\n \"bulgur\",\n \"bulk\",\n \"bulldog\",\n \"bulldozer\",\n \"bullfight\",\n \"bullfrog\",\n \"bullhorn\",\n \"bullion\",\n \"bullish\",\n \"bullpen\",\n \"bullring\",\n \"bullseye\",\n \"bullwhip\",\n \"bully\",\n \"bunch\",\n \"bundle\",\n \"bungee\",\n \"bunion\",\n \"bunkbed\",\n \"bunkhouse\",\n \"bunkmate\",\n \"bunny\",\n \"bunt\",\n \"busboy\",\n \"bush\",\n \"busily\",\n \"busload\",\n \"bust\",\n \"busybody\",\n \"buzz\",\n \"cabana\",\n \"cabbage\",\n \"cabbie\",\n \"cabdriver\",\n \"cable\",\n \"caboose\",\n \"cache\",\n \"cackle\",\n \"cacti\",\n \"cactus\",\n \"caddie\",\n \"caddy\",\n \"cadet\",\n \"cadillac\",\n \"cadmium\",\n \"cage\",\n \"cahoots\",\n \"cake\",\n \"calamari\",\n \"calamity\",\n \"calcium\",\n \"calculate\",\n \"calculus\",\n \"caliber\",\n \"calibrate\",\n \"calm\",\n \"caloric\",\n \"calorie\",\n \"calzone\",\n \"camcorder\",\n \"cameo\",\n \"camera\",\n \"camisole\",\n \"camper\",\n \"campfire\",\n \"camping\",\n \"campsite\",\n \"campus\",\n \"canal\",\n \"canary\",\n \"cancel\",\n \"candied\",\n \"candle\",\n \"candy\",\n \"cane\",\n \"canine\",\n \"canister\",\n \"cannabis\",\n \"canned\",\n \"canning\",\n \"cannon\",\n \"cannot\",\n \"canola\",\n \"canon\",\n \"canopener\",\n \"canopy\",\n \"canteen\",\n \"canyon\",\n \"capable\",\n \"capably\",\n \"capacity\",\n \"cape\",\n \"capillary\",\n \"capital\",\n \"capitol\",\n \"capped\",\n \"capricorn\",\n \"capsize\",\n \"capsule\",\n \"caption\",\n \"captivate\",\n \"captive\",\n \"captivity\",\n \"capture\",\n \"caramel\",\n \"carat\",\n \"caravan\",\n \"carbon\",\n \"cardboard\",\n \"carded\",\n \"cardiac\",\n \"cardigan\",\n \"cardinal\",\n \"cardstock\",\n \"carefully\",\n \"caregiver\",\n \"careless\",\n \"caress\",\n \"caretaker\",\n \"cargo\",\n \"caring\",\n \"carless\",\n \"carload\",\n \"carmaker\",\n \"carnage\",\n \"carnation\",\n \"carnival\",\n \"carnivore\",\n \"carol\",\n \"carpenter\",\n \"carpentry\",\n \"carpool\",\n \"carport\",\n \"carried\",\n \"carrot\",\n \"carrousel\",\n \"carry\",\n \"cartel\",\n \"cartload\",\n \"carton\",\n \"cartoon\",\n \"cartridge\",\n \"cartwheel\",\n \"carve\",\n \"carving\",\n \"carwash\",\n \"cascade\",\n \"case\",\n \"cash\",\n \"casing\",\n \"casino\",\n \"casket\",\n \"cassette\",\n \"casually\",\n \"casualty\",\n \"catacomb\",\n \"catalog\",\n \"catalyst\",\n \"catalyze\",\n \"catapult\",\n \"cataract\",\n \"catatonic\",\n \"catcall\",\n \"catchable\",\n \"catcher\",\n \"catching\",\n \"catchy\",\n \"caterer\",\n \"catering\",\n \"catfight\",\n \"catfish\",\n \"cathedral\",\n \"cathouse\",\n \"catlike\",\n \"catnap\",\n \"catnip\",\n \"catsup\",\n \"cattail\",\n \"cattishly\",\n \"cattle\",\n \"catty\",\n \"catwalk\",\n \"caucasian\",\n \"caucus\",\n \"causal\",\n \"causation\",\n \"cause\",\n \"causing\",\n \"cauterize\",\n \"caution\",\n \"cautious\",\n \"cavalier\",\n \"cavalry\",\n \"caviar\",\n \"cavity\",\n \"cedar\",\n \"celery\",\n \"celestial\",\n \"celibacy\",\n \"celibate\",\n \"celtic\",\n \"cement\",\n \"census\",\n \"ceramics\",\n \"ceremony\",\n \"certainly\",\n \"certainty\",\n \"certified\",\n \"certify\",\n \"cesarean\",\n \"cesspool\",\n \"chafe\",\n \"chaffing\",\n \"chain\",\n \"chair\",\n \"chalice\",\n \"challenge\",\n \"chamber\",\n \"chamomile\",\n \"champion\",\n \"chance\",\n \"change\",\n \"channel\",\n \"chant\",\n \"chaos\",\n \"chaperone\",\n \"chaplain\",\n \"chapped\",\n \"chaps\",\n \"chapter\",\n \"character\",\n \"charbroil\",\n \"charcoal\",\n \"charger\",\n \"charging\",\n \"chariot\",\n \"charity\",\n \"charm\",\n \"charred\",\n \"charter\",\n \"charting\",\n \"chase\",\n \"chasing\",\n \"chaste\",\n \"chastise\",\n \"chastity\",\n \"chatroom\",\n \"chatter\",\n \"chatting\",\n \"chatty\",\n \"cheating\",\n \"cheddar\",\n \"cheek\",\n \"cheer\",\n \"cheese\",\n \"cheesy\",\n \"chef\",\n \"chemicals\",\n \"chemist\",\n \"chemo\",\n \"cherisher\",\n \"cherub\",\n \"chess\",\n \"chest\",\n \"chevron\",\n \"chevy\",\n \"chewable\",\n \"chewer\",\n \"chewing\",\n \"chewy\",\n \"chief\",\n \"chihuahua\",\n \"childcare\",\n \"childhood\",\n \"childish\",\n \"childless\",\n \"childlike\",\n \"chili\",\n \"chill\",\n \"chimp\",\n \"chip\",\n \"chirping\",\n \"chirpy\",\n \"chitchat\",\n \"chivalry\",\n \"chive\",\n \"chloride\",\n \"chlorine\",\n \"choice\",\n \"chokehold\",\n \"choking\",\n \"chomp\",\n \"chooser\",\n \"choosing\",\n \"choosy\",\n \"chop\",\n \"chosen\",\n \"chowder\",\n \"chowtime\",\n \"chrome\",\n \"chubby\",\n \"chuck\",\n \"chug\",\n \"chummy\",\n \"chump\",\n \"chunk\",\n \"churn\",\n \"chute\",\n \"cider\",\n \"cilantro\",\n \"cinch\",\n \"cinema\",\n \"cinnamon\",\n \"circle\",\n \"circling\",\n \"circular\",\n \"circulate\",\n \"circus\",\n \"citable\",\n \"citadel\",\n \"citation\",\n \"citizen\",\n \"citric\",\n \"citrus\",\n \"city\",\n \"civic\",\n \"civil\",\n \"clad\",\n \"claim\",\n \"clambake\",\n \"clammy\",\n \"clamor\",\n \"clamp\",\n \"clamshell\",\n \"clang\",\n \"clanking\",\n \"clapped\",\n \"clapper\",\n \"clapping\",\n \"clarify\",\n \"clarinet\",\n \"clarity\",\n \"clash\",\n \"clasp\",\n \"class\",\n \"clatter\",\n \"clause\",\n \"clavicle\",\n \"claw\",\n \"clay\",\n \"clean\",\n \"clear\",\n \"cleat\",\n \"cleaver\",\n \"cleft\",\n \"clench\",\n \"clergyman\",\n \"clerical\",\n \"clerk\",\n \"clever\",\n \"clicker\",\n \"client\",\n \"climate\",\n \"climatic\",\n \"cling\",\n \"clinic\",\n \"clinking\",\n \"clip\",\n \"clique\",\n \"cloak\",\n \"clobber\",\n \"clock\",\n \"clone\",\n \"cloning\",\n \"closable\",\n \"closure\",\n \"clothes\",\n \"clothing\",\n \"cloud\",\n \"clover\",\n \"clubbed\",\n \"clubbing\",\n \"clubhouse\",\n \"clump\",\n \"clumsily\",\n \"clumsy\",\n \"clunky\",\n \"clustered\",\n \"clutch\",\n \"clutter\",\n \"coach\",\n \"coagulant\",\n \"coastal\",\n \"coaster\",\n \"coasting\",\n \"coastland\",\n \"coastline\",\n \"coat\",\n \"coauthor\",\n \"cobalt\",\n \"cobbler\",\n \"cobweb\",\n \"cocoa\",\n \"coconut\",\n \"cod\",\n \"coeditor\",\n \"coerce\",\n \"coexist\",\n \"coffee\",\n \"cofounder\",\n \"cognition\",\n \"cognitive\",\n \"cogwheel\",\n \"coherence\",\n \"coherent\",\n \"cohesive\",\n \"coil\",\n \"coke\",\n \"cola\",\n \"cold\",\n \"coleslaw\",\n \"coliseum\",\n \"collage\",\n \"collapse\",\n \"collar\",\n \"collected\",\n \"collector\",\n \"collide\",\n \"collie\",\n \"collision\",\n \"colonial\",\n \"colonist\",\n \"colonize\",\n \"colony\",\n \"colossal\",\n \"colt\",\n \"coma\",\n \"come\",\n \"comfort\",\n \"comfy\",\n \"comic\",\n \"coming\",\n \"comma\",\n \"commence\",\n \"commend\",\n \"comment\",\n \"commerce\",\n \"commode\",\n \"commodity\",\n \"commodore\",\n \"common\",\n \"commotion\",\n \"commute\",\n \"commuting\",\n \"compacted\",\n \"compacter\",\n \"compactly\",\n \"compactor\",\n \"companion\",\n \"company\",\n \"compare\",\n \"compel\",\n \"compile\",\n \"comply\",\n \"component\",\n \"composed\",\n \"composer\",\n \"composite\",\n \"compost\",\n \"composure\",\n \"compound\",\n \"compress\",\n \"comprised\",\n \"computer\",\n \"computing\",\n \"comrade\",\n \"concave\",\n \"conceal\",\n \"conceded\",\n \"concept\",\n \"concerned\",\n \"concert\",\n \"conch\",\n \"concierge\",\n \"concise\",\n \"conclude\",\n \"concrete\",\n \"concur\",\n \"condense\",\n \"condiment\",\n \"condition\",\n \"condone\",\n \"conducive\",\n \"conductor\",\n \"conduit\",\n \"cone\",\n \"confess\",\n \"confetti\",\n \"confidant\",\n \"confident\",\n \"confider\",\n \"confiding\",\n \"configure\",\n \"confined\",\n \"confining\",\n \"confirm\",\n \"conflict\",\n \"conform\",\n \"confound\",\n \"confront\",\n \"confused\",\n \"confusing\",\n \"confusion\",\n \"congenial\",\n \"congested\",\n \"congrats\",\n \"congress\",\n \"conical\",\n \"conjoined\",\n \"conjure\",\n \"conjuror\",\n \"connected\",\n \"connector\",\n \"consensus\",\n \"consent\",\n \"console\",\n \"consoling\",\n \"consonant\",\n \"constable\",\n \"constant\",\n \"constrain\",\n \"constrict\",\n \"construct\",\n \"consult\",\n \"consumer\",\n \"consuming\",\n \"contact\",\n \"container\",\n \"contempt\",\n \"contend\",\n \"contented\",\n \"contently\",\n \"contents\",\n \"contest\",\n \"context\",\n \"contort\",\n \"contour\",\n \"contrite\",\n \"control\",\n \"contusion\",\n \"convene\",\n \"convent\",\n \"copartner\",\n \"cope\",\n \"copied\",\n \"copier\",\n \"copilot\",\n \"coping\",\n \"copious\",\n \"copper\",\n \"copy\",\n \"coral\",\n \"cork\",\n \"cornball\",\n \"cornbread\",\n \"corncob\",\n \"cornea\",\n \"corned\",\n \"corner\",\n \"cornfield\",\n \"cornflake\",\n \"cornhusk\",\n \"cornmeal\",\n \"cornstalk\",\n \"corny\",\n \"coronary\",\n \"coroner\",\n \"corporal\",\n \"corporate\",\n \"corral\",\n \"correct\",\n \"corridor\",\n \"corrode\",\n \"corroding\",\n \"corrosive\",\n \"corsage\",\n \"corset\",\n \"cortex\",\n \"cosigner\",\n \"cosmetics\",\n \"cosmic\",\n \"cosmos\",\n \"cosponsor\",\n \"cost\",\n \"cottage\",\n \"cotton\",\n \"couch\",\n \"cough\",\n \"could\",\n \"countable\",\n \"countdown\",\n \"counting\",\n \"countless\",\n \"country\",\n \"county\",\n \"courier\",\n \"covenant\",\n \"cover\",\n \"coveted\",\n \"coveting\",\n \"coyness\",\n \"cozily\",\n \"coziness\",\n \"cozy\",\n \"crabbing\",\n \"crabgrass\",\n \"crablike\",\n \"crabmeat\",\n \"cradle\",\n \"cradling\",\n \"crafter\",\n \"craftily\",\n \"craftsman\",\n \"craftwork\",\n \"crafty\",\n \"cramp\",\n \"cranberry\",\n \"crane\",\n \"cranial\",\n \"cranium\",\n \"crank\",\n \"crate\",\n \"crave\",\n \"craving\",\n \"crawfish\",\n \"crawlers\",\n \"crawling\",\n \"crayfish\",\n \"crayon\",\n \"crazed\",\n \"crazily\",\n \"craziness\",\n \"crazy\",\n \"creamed\",\n \"creamer\",\n \"creamlike\",\n \"crease\",\n \"creasing\",\n \"creatable\",\n \"create\",\n \"creation\",\n \"creative\",\n \"creature\",\n \"credible\",\n \"credibly\",\n \"credit\",\n \"creed\",\n \"creme\",\n \"creole\",\n \"crepe\",\n \"crept\",\n \"crescent\",\n \"crested\",\n \"cresting\",\n \"crestless\",\n \"crevice\",\n \"crewless\",\n \"crewman\",\n \"crewmate\",\n \"crib\",\n \"cricket\",\n \"cried\",\n \"crier\",\n \"crimp\",\n \"crimson\",\n \"cringe\",\n \"cringing\",\n \"crinkle\",\n \"crinkly\",\n \"crisped\",\n \"crisping\",\n \"crisply\",\n \"crispness\",\n \"crispy\",\n \"criteria\",\n \"critter\",\n \"croak\",\n \"crock\",\n \"crook\",\n \"croon\",\n \"crop\",\n \"cross\",\n \"crouch\",\n \"crouton\",\n \"crowbar\",\n \"crowd\",\n \"crown\",\n \"crucial\",\n \"crudely\",\n \"crudeness\",\n \"cruelly\",\n \"cruelness\",\n \"cruelty\",\n \"crumb\",\n \"crummiest\",\n \"crummy\",\n \"crumpet\",\n \"crumpled\",\n \"cruncher\",\n \"crunching\",\n \"crunchy\",\n \"crusader\",\n \"crushable\",\n \"crushed\",\n \"crusher\",\n \"crushing\",\n \"crust\",\n \"crux\",\n \"crying\",\n \"cryptic\",\n \"crystal\",\n \"cubbyhole\",\n \"cube\",\n \"cubical\",\n \"cubicle\",\n \"cucumber\",\n \"cuddle\",\n \"cuddly\",\n \"cufflink\",\n \"culinary\",\n \"culminate\",\n \"culpable\",\n \"culprit\",\n \"cultivate\",\n \"cultural\",\n \"culture\",\n \"cupbearer\",\n \"cupcake\",\n \"cupid\",\n \"cupped\",\n \"cupping\",\n \"curable\",\n \"curator\",\n \"curdle\",\n \"cure\",\n \"curfew\",\n \"curing\",\n \"curled\",\n \"curler\",\n \"curliness\",\n \"curling\",\n \"curly\",\n \"curry\",\n \"curse\",\n \"cursive\",\n \"cursor\",\n \"curtain\",\n \"curtly\",\n \"curtsy\",\n \"curvature\",\n \"curve\",\n \"curvy\",\n \"cushy\",\n \"cusp\",\n \"cussed\",\n \"custard\",\n \"custodian\",\n \"custody\",\n \"customary\",\n \"customer\",\n \"customize\",\n \"customs\",\n \"cut\",\n \"cycle\",\n \"cyclic\",\n \"cycling\",\n \"cyclist\",\n \"cylinder\",\n \"cymbal\",\n \"cytoplasm\",\n \"cytoplast\",\n \"dab\",\n \"dad\",\n \"daffodil\",\n \"dagger\",\n \"daily\",\n \"daintily\",\n \"dainty\",\n \"dairy\",\n \"daisy\",\n \"dallying\",\n \"dance\",\n \"dancing\",\n \"dandelion\",\n \"dander\",\n \"dandruff\",\n \"dandy\",\n \"danger\",\n \"dangle\",\n \"dangling\",\n \"daredevil\",\n \"dares\",\n \"daringly\",\n \"darkened\",\n \"darkening\",\n \"darkish\",\n \"darkness\",\n \"darkroom\",\n \"darling\",\n \"darn\",\n \"dart\",\n \"darwinism\",\n \"dash\",\n \"dastardly\",\n \"data\",\n \"datebook\",\n \"dating\",\n \"daughter\",\n \"daunting\",\n \"dawdler\",\n \"dawn\",\n \"daybed\",\n \"daybreak\",\n \"daycare\",\n \"daydream\",\n \"daylight\",\n \"daylong\",\n \"dayroom\",\n \"daytime\",\n \"dazzler\",\n \"dazzling\",\n \"deacon\",\n \"deafening\",\n \"deafness\",\n \"dealer\",\n \"dealing\",\n \"dealmaker\",\n \"dealt\",\n \"dean\",\n \"debatable\",\n \"debate\",\n \"debating\",\n \"debit\",\n \"debrief\",\n \"debtless\",\n \"debtor\",\n \"debug\",\n \"debunk\",\n \"decade\",\n \"decaf\",\n \"decal\",\n \"decathlon\",\n \"decay\",\n \"deceased\",\n \"deceit\",\n \"deceiver\",\n \"deceiving\",\n \"december\",\n \"decency\",\n \"decent\",\n \"deception\",\n \"deceptive\",\n \"decibel\",\n \"decidable\",\n \"decimal\",\n \"decimeter\",\n \"decipher\",\n \"deck\",\n \"declared\",\n \"decline\",\n \"decode\",\n \"decompose\",\n \"decorated\",\n \"decorator\",\n \"decoy\",\n \"decrease\",\n \"decree\",\n \"dedicate\",\n \"dedicator\",\n \"deduce\",\n \"deduct\",\n \"deed\",\n \"deem\",\n \"deepen\",\n \"deeply\",\n \"deepness\",\n \"deface\",\n \"defacing\",\n \"defame\",\n \"default\",\n \"defeat\",\n \"defection\",\n \"defective\",\n \"defendant\",\n \"defender\",\n \"defense\",\n \"defensive\",\n \"deferral\",\n \"deferred\",\n \"defiance\",\n \"defiant\",\n \"defile\",\n \"defiling\",\n \"define\",\n \"definite\",\n \"deflate\",\n \"deflation\",\n \"deflator\",\n \"deflected\",\n \"deflector\",\n \"defog\",\n \"deforest\",\n \"defraud\",\n \"defrost\",\n \"deftly\",\n \"defuse\",\n \"defy\",\n \"degraded\",\n \"degrading\",\n \"degrease\",\n \"degree\",\n \"dehydrate\",\n \"deity\",\n \"dejected\",\n \"delay\",\n \"delegate\",\n \"delegator\",\n \"delete\",\n \"deletion\",\n \"delicacy\",\n \"delicate\",\n \"delicious\",\n \"delighted\",\n \"delirious\",\n \"delirium\",\n \"deliverer\",\n \"delivery\",\n \"delouse\",\n \"delta\",\n \"deluge\",\n \"delusion\",\n \"deluxe\",\n \"demanding\",\n \"demeaning\",\n \"demeanor\",\n \"demise\",\n \"democracy\",\n \"democrat\",\n \"demote\",\n \"demotion\",\n \"demystify\",\n \"denatured\",\n \"deniable\",\n \"denial\",\n \"denim\",\n \"denote\",\n \"dense\",\n \"density\",\n \"dental\",\n \"dentist\",\n \"denture\",\n \"deny\",\n \"deodorant\",\n \"deodorize\",\n \"departed\",\n \"departure\",\n \"depict\",\n \"deplete\",\n \"depletion\",\n \"deplored\",\n \"deploy\",\n \"deport\",\n \"depose\",\n \"depraved\",\n \"depravity\",\n \"deprecate\",\n \"depress\",\n \"deprive\",\n \"depth\",\n \"deputize\",\n \"deputy\",\n \"derail\",\n \"deranged\",\n \"derby\",\n \"derived\",\n \"desecrate\",\n \"deserve\",\n \"deserving\",\n \"designate\",\n \"designed\",\n \"designer\",\n \"designing\",\n \"deskbound\",\n \"desktop\",\n \"deskwork\",\n \"desolate\",\n \"despair\",\n \"despise\",\n \"despite\",\n \"destiny\",\n \"destitute\",\n \"destruct\",\n \"detached\",\n \"detail\",\n \"detection\",\n \"detective\",\n \"detector\",\n \"detention\",\n \"detergent\",\n \"detest\",\n \"detonate\",\n \"detonator\",\n \"detoxify\",\n \"detract\",\n \"deuce\",\n \"devalue\",\n \"deviancy\",\n \"deviant\",\n \"deviate\",\n \"deviation\",\n \"deviator\",\n \"device\",\n \"devious\",\n \"devotedly\",\n \"devotee\",\n \"devotion\",\n \"devourer\",\n \"devouring\",\n \"devoutly\",\n \"dexterity\",\n \"dexterous\",\n \"diabetes\",\n \"diabetic\",\n \"diabolic\",\n \"diagnoses\",\n \"diagnosis\",\n \"diagram\",\n \"dial\",\n \"diameter\",\n \"diaper\",\n \"diaphragm\",\n \"diary\",\n \"dice\",\n \"dicing\",\n \"dictate\",\n \"dictation\",\n \"dictator\",\n \"difficult\",\n \"diffused\",\n \"diffuser\",\n \"diffusion\",\n \"diffusive\",\n \"dig\",\n \"dilation\",\n \"diligence\",\n \"diligent\",\n \"dill\",\n \"dilute\",\n \"dime\",\n \"diminish\",\n \"dimly\",\n \"dimmed\",\n \"dimmer\",\n \"dimness\",\n \"dimple\",\n \"diner\",\n \"dingbat\",\n \"dinghy\",\n \"dinginess\",\n \"dingo\",\n \"dingy\",\n \"dining\",\n \"dinner\",\n \"diocese\",\n \"dioxide\",\n \"diploma\",\n \"dipped\",\n \"dipper\",\n \"dipping\",\n \"directed\",\n \"direction\",\n \"directive\",\n \"directly\",\n \"directory\",\n \"direness\",\n \"dirtiness\",\n \"disabled\",\n \"disagree\",\n \"disallow\",\n \"disarm\",\n \"disarray\",\n \"disaster\",\n \"disband\",\n \"disbelief\",\n \"disburse\",\n \"discard\",\n \"discern\",\n \"discharge\",\n \"disclose\",\n \"discolor\",\n \"discount\",\n \"discourse\",\n \"discover\",\n \"discuss\",\n \"disdain\",\n \"disengage\",\n \"disfigure\",\n \"disgrace\",\n \"dish\",\n \"disinfect\",\n \"disjoin\",\n \"disk\",\n \"dislike\",\n \"disliking\",\n \"dislocate\",\n \"dislodge\",\n \"disloyal\",\n \"dismantle\",\n \"dismay\",\n \"dismiss\",\n \"dismount\",\n \"disobey\",\n \"disorder\",\n \"disown\",\n \"disparate\",\n \"disparity\",\n \"dispatch\",\n \"dispense\",\n \"dispersal\",\n \"dispersed\",\n \"disperser\",\n \"displace\",\n \"display\",\n \"displease\",\n \"disposal\",\n \"dispose\",\n \"disprove\",\n \"dispute\",\n \"disregard\",\n \"disrupt\",\n \"dissuade\",\n \"distance\",\n \"distant\",\n \"distaste\",\n \"distill\",\n \"distinct\",\n \"distort\",\n \"distract\",\n \"distress\",\n \"district\",\n \"distrust\",\n \"ditch\",\n \"ditto\",\n \"ditzy\",\n \"dividable\",\n \"divided\",\n \"dividend\",\n \"dividers\",\n \"dividing\",\n \"divinely\",\n \"diving\",\n \"divinity\",\n \"divisible\",\n \"divisibly\",\n \"division\",\n \"divisive\",\n \"divorcee\",\n \"dizziness\",\n \"dizzy\",\n \"doable\",\n \"docile\",\n \"dock\",\n \"doctrine\",\n \"document\",\n \"dodge\",\n \"dodgy\",\n \"doily\",\n \"doing\",\n \"dole\",\n \"dollar\",\n \"dollhouse\",\n \"dollop\",\n \"dolly\",\n \"dolphin\",\n \"domain\",\n \"domelike\",\n \"domestic\",\n \"dominion\",\n \"dominoes\",\n \"donated\",\n \"donation\",\n \"donator\",\n \"donor\",\n \"donut\",\n \"doodle\",\n \"doorbell\",\n \"doorframe\",\n \"doorknob\",\n \"doorman\",\n \"doormat\",\n \"doornail\",\n \"doorpost\",\n \"doorstep\",\n \"doorstop\",\n \"doorway\",\n \"doozy\",\n \"dork\",\n \"dormitory\",\n \"dorsal\",\n \"dosage\",\n \"dose\",\n \"dotted\",\n \"doubling\",\n \"douche\",\n \"dove\",\n \"down\",\n \"dowry\",\n \"doze\",\n \"drab\",\n \"dragging\",\n \"dragonfly\",\n \"dragonish\",\n \"dragster\",\n \"drainable\",\n \"drainage\",\n \"drained\",\n \"drainer\",\n \"drainpipe\",\n \"dramatic\",\n \"dramatize\",\n \"drank\",\n \"drapery\",\n \"drastic\",\n \"draw\",\n \"dreaded\",\n \"dreadful\",\n \"dreadlock\",\n \"dreamboat\",\n \"dreamily\",\n \"dreamland\",\n \"dreamless\",\n \"dreamlike\",\n \"dreamt\",\n \"dreamy\",\n \"drearily\",\n \"dreary\",\n \"drench\",\n \"dress\",\n \"drew\",\n \"dribble\",\n \"dried\",\n \"drier\",\n \"drift\",\n \"driller\",\n \"drilling\",\n \"drinkable\",\n \"drinking\",\n \"dripping\",\n \"drippy\",\n \"drivable\",\n \"driven\",\n \"driver\",\n \"driveway\",\n \"driving\",\n \"drizzle\",\n \"drizzly\",\n \"drone\",\n \"drool\",\n \"droop\",\n \"drop-down\",\n \"dropbox\",\n \"dropkick\",\n \"droplet\",\n \"dropout\",\n \"dropper\",\n \"drove\",\n \"drown\",\n \"drowsily\",\n \"drudge\",\n \"drum\",\n \"dry\",\n \"dubbed\",\n \"dubiously\",\n \"duchess\",\n \"duckbill\",\n \"ducking\",\n \"duckling\",\n \"ducktail\",\n \"ducky\",\n \"duct\",\n \"dude\",\n \"duffel\",\n \"dugout\",\n \"duh\",\n \"duke\",\n \"duller\",\n \"dullness\",\n \"duly\",\n \"dumping\",\n \"dumpling\",\n \"dumpster\",\n \"duo\",\n \"dupe\",\n \"duplex\",\n \"duplicate\",\n \"duplicity\",\n \"durable\",\n \"durably\",\n \"duration\",\n \"duress\",\n \"during\",\n \"dusk\",\n \"dust\",\n \"dutiful\",\n \"duty\",\n \"duvet\",\n \"dwarf\",\n \"dweeb\",\n \"dwelled\",\n \"dweller\",\n \"dwelling\",\n \"dwindle\",\n \"dwindling\",\n \"dynamic\",\n \"dynamite\",\n \"dynasty\",\n \"dyslexia\",\n \"dyslexic\",\n \"each\",\n \"eagle\",\n \"earache\",\n \"eardrum\",\n \"earflap\",\n \"earful\",\n \"earlobe\",\n \"early\",\n \"earmark\",\n \"earmuff\",\n \"earphone\",\n \"earpiece\",\n \"earplugs\",\n \"earring\",\n \"earshot\",\n \"earthen\",\n \"earthlike\",\n \"earthling\",\n \"earthly\",\n \"earthworm\",\n \"earthy\",\n \"earwig\",\n \"easeful\",\n \"easel\",\n \"easiest\",\n \"easily\",\n \"easiness\",\n \"easing\",\n \"eastbound\",\n \"eastcoast\",\n \"easter\",\n \"eastward\",\n \"eatable\",\n \"eaten\",\n \"eatery\",\n \"eating\",\n \"eats\",\n \"ebay\",\n \"ebony\",\n \"ebook\",\n \"ecard\",\n \"eccentric\",\n \"echo\",\n \"eclair\",\n \"eclipse\",\n \"ecologist\",\n \"ecology\",\n \"economic\",\n \"economist\",\n \"economy\",\n \"ecosphere\",\n \"ecosystem\",\n \"edge\",\n \"edginess\",\n \"edging\",\n \"edgy\",\n \"edition\",\n \"editor\",\n \"educated\",\n \"education\",\n \"educator\",\n \"eel\",\n \"effective\",\n \"effects\",\n \"efficient\",\n \"effort\",\n \"eggbeater\",\n \"egging\",\n \"eggnog\",\n \"eggplant\",\n \"eggshell\",\n \"egomaniac\",\n \"egotism\",\n \"egotistic\",\n \"either\",\n \"eject\",\n \"elaborate\",\n \"elastic\",\n \"elated\",\n \"elbow\",\n \"eldercare\",\n \"elderly\",\n \"eldest\",\n \"electable\",\n \"election\",\n \"elective\",\n \"elephant\",\n \"elevate\",\n \"elevating\",\n \"elevation\",\n \"elevator\",\n \"eleven\",\n \"elf\",\n \"eligible\",\n \"eligibly\",\n \"eliminate\",\n \"elite\",\n \"elitism\",\n \"elixir\",\n \"elk\",\n \"ellipse\",\n \"elliptic\",\n \"elm\",\n \"elongated\",\n \"elope\",\n \"eloquence\",\n \"eloquent\",\n \"elsewhere\",\n \"elude\",\n \"elusive\",\n \"elves\",\n \"email\",\n \"embargo\",\n \"embark\",\n \"embassy\",\n \"embattled\",\n \"embellish\",\n \"ember\",\n \"embezzle\",\n \"emblaze\",\n \"emblem\",\n \"embody\",\n \"embolism\",\n \"emboss\",\n \"embroider\",\n \"emcee\",\n \"emerald\",\n \"emergency\",\n \"emission\",\n \"emit\",\n \"emote\",\n \"emoticon\",\n \"emotion\",\n \"empathic\",\n \"empathy\",\n \"emperor\",\n \"emphases\",\n \"emphasis\",\n \"emphasize\",\n \"emphatic\",\n \"empirical\",\n \"employed\",\n \"employee\",\n \"employer\",\n \"emporium\",\n \"empower\",\n \"emptier\",\n \"emptiness\",\n \"empty\",\n \"emu\",\n \"enable\",\n \"enactment\",\n \"enamel\",\n \"enchanted\",\n \"enchilada\",\n \"encircle\",\n \"enclose\",\n \"enclosure\",\n \"encode\",\n \"encore\",\n \"encounter\",\n \"encourage\",\n \"encroach\",\n \"encrust\",\n \"encrypt\",\n \"endanger\",\n \"endeared\",\n \"endearing\",\n \"ended\",\n \"ending\",\n \"endless\",\n \"endnote\",\n \"endocrine\",\n \"endorphin\",\n \"endorse\",\n \"endowment\",\n \"endpoint\",\n \"endurable\",\n \"endurance\",\n \"enduring\",\n \"energetic\",\n \"energize\",\n \"energy\",\n \"enforced\",\n \"enforcer\",\n \"engaged\",\n \"engaging\",\n \"engine\",\n \"engorge\",\n \"engraved\",\n \"engraver\",\n \"engraving\",\n \"engross\",\n \"engulf\",\n \"enhance\",\n \"enigmatic\",\n \"enjoyable\",\n \"enjoyably\",\n \"enjoyer\",\n \"enjoying\",\n \"enjoyment\",\n \"enlarged\",\n \"enlarging\",\n \"enlighten\",\n \"enlisted\",\n \"enquirer\",\n \"enrage\",\n \"enrich\",\n \"enroll\",\n \"enslave\",\n \"ensnare\",\n \"ensure\",\n \"entail\",\n \"entangled\",\n \"entering\",\n \"entertain\",\n \"enticing\",\n \"entire\",\n \"entitle\",\n \"entity\",\n \"entomb\",\n \"entourage\",\n \"entrap\",\n \"entree\",\n \"entrench\",\n \"entrust\",\n \"entryway\",\n \"entwine\",\n \"enunciate\",\n \"envelope\",\n \"enviable\",\n \"enviably\",\n \"envious\",\n \"envision\",\n \"envoy\",\n \"envy\",\n \"enzyme\",\n \"epic\",\n \"epidemic\",\n \"epidermal\",\n \"epidermis\",\n \"epidural\",\n \"epilepsy\",\n \"epileptic\",\n \"epilogue\",\n \"epiphany\",\n \"episode\",\n \"equal\",\n \"equate\",\n \"equation\",\n \"equator\",\n \"equinox\",\n \"equipment\",\n \"equity\",\n \"equivocal\",\n \"eradicate\",\n \"erasable\",\n \"erased\",\n \"eraser\",\n \"erasure\",\n \"ergonomic\",\n \"errand\",\n \"errant\",\n \"erratic\",\n \"error\",\n \"erupt\",\n \"escalate\",\n \"escalator\",\n \"escapable\",\n \"escapade\",\n \"escapist\",\n \"escargot\",\n \"eskimo\",\n \"esophagus\",\n \"espionage\",\n \"espresso\",\n \"esquire\",\n \"essay\",\n \"essence\",\n \"essential\",\n \"establish\",\n \"estate\",\n \"esteemed\",\n \"estimate\",\n \"estimator\",\n \"estranged\",\n \"estrogen\",\n \"etching\",\n \"eternal\",\n \"eternity\",\n \"ethanol\",\n \"ether\",\n \"ethically\",\n \"ethics\",\n \"euphemism\",\n \"evacuate\",\n \"evacuee\",\n \"evade\",\n \"evaluate\",\n \"evaluator\",\n \"evaporate\",\n \"evasion\",\n \"evasive\",\n \"even\",\n \"everglade\",\n \"evergreen\",\n \"everybody\",\n \"everyday\",\n \"everyone\",\n \"evict\",\n \"evidence\",\n \"evident\",\n \"evil\",\n \"evoke\",\n \"evolution\",\n \"evolve\",\n \"exact\",\n \"exalted\",\n \"example\",\n \"excavate\",\n \"excavator\",\n \"exceeding\",\n \"exception\",\n \"excess\",\n \"exchange\",\n \"excitable\",\n \"exciting\",\n \"exclaim\",\n \"exclude\",\n \"excluding\",\n \"exclusion\",\n \"exclusive\",\n \"excretion\",\n \"excretory\",\n \"excursion\",\n \"excusable\",\n \"excusably\",\n \"excuse\",\n \"exemplary\",\n \"exemplify\",\n \"exemption\",\n \"exerciser\",\n \"exert\",\n \"exes\",\n \"exfoliate\",\n \"exhale\",\n \"exhaust\",\n \"exhume\",\n \"exile\",\n \"existing\",\n \"exit\",\n \"exodus\",\n \"exonerate\",\n \"exorcism\",\n \"exorcist\",\n \"expand\",\n \"expanse\",\n \"expansion\",\n \"expansive\",\n \"expectant\",\n \"expedited\",\n \"expediter\",\n \"expel\",\n \"expend\",\n \"expenses\",\n \"expensive\",\n \"expert\",\n \"expire\",\n \"expiring\",\n \"explain\",\n \"expletive\",\n \"explicit\",\n \"explode\",\n \"exploit\",\n \"explore\",\n \"exploring\",\n \"exponent\",\n \"exporter\",\n \"exposable\",\n \"expose\",\n \"exposure\",\n \"express\",\n \"expulsion\",\n \"exquisite\",\n \"extended\",\n \"extending\",\n \"extent\",\n \"extenuate\",\n \"exterior\",\n \"external\",\n \"extinct\",\n \"extortion\",\n \"extradite\",\n \"extras\",\n \"extrovert\",\n \"extrude\",\n \"extruding\",\n \"exuberant\",\n \"fable\",\n \"fabric\",\n \"fabulous\",\n \"facebook\",\n \"facecloth\",\n \"facedown\",\n \"faceless\",\n \"facelift\",\n \"faceplate\",\n \"faceted\",\n \"facial\",\n \"facility\",\n \"facing\",\n \"facsimile\",\n \"faction\",\n \"factoid\",\n \"factor\",\n \"factsheet\",\n \"factual\",\n \"faculty\",\n \"fade\",\n \"fading\",\n \"failing\",\n \"falcon\",\n \"fall\",\n \"false\",\n \"falsify\",\n \"fame\",\n \"familiar\",\n \"family\",\n \"famine\",\n \"famished\",\n \"fanatic\",\n \"fancied\",\n \"fanciness\",\n \"fancy\",\n \"fanfare\",\n \"fang\",\n \"fanning\",\n \"fantasize\",\n \"fantastic\",\n \"fantasy\",\n \"fascism\",\n \"fastball\",\n \"faster\",\n \"fasting\",\n \"fastness\",\n \"faucet\",\n \"favorable\",\n \"favorably\",\n \"favored\",\n \"favoring\",\n \"favorite\",\n \"fax\",\n \"feast\",\n \"federal\",\n \"fedora\",\n \"feeble\",\n \"feed\",\n \"feel\",\n \"feisty\",\n \"feline\",\n \"felt-tip\",\n \"feminine\",\n \"feminism\",\n \"feminist\",\n \"feminize\",\n \"femur\",\n \"fence\",\n \"fencing\",\n \"fender\",\n \"ferment\",\n \"fernlike\",\n \"ferocious\",\n \"ferocity\",\n \"ferret\",\n \"ferris\",\n \"ferry\",\n \"fervor\",\n \"fester\",\n \"festival\",\n \"festive\",\n \"festivity\",\n \"fetal\",\n \"fetch\",\n \"fever\",\n \"fiber\",\n \"fiction\",\n \"fiddle\",\n \"fiddling\",\n \"fidelity\",\n \"fidgeting\",\n \"fidgety\",\n \"fifteen\",\n \"fifth\",\n \"fiftieth\",\n \"fifty\",\n \"figment\",\n \"figure\",\n \"figurine\",\n \"filing\",\n \"filled\",\n \"filler\",\n \"filling\",\n \"film\",\n \"filter\",\n \"filth\",\n \"filtrate\",\n \"finale\",\n \"finalist\",\n \"finalize\",\n \"finally\",\n \"finance\",\n \"financial\",\n \"finch\",\n \"fineness\",\n \"finer\",\n \"finicky\",\n \"finished\",\n \"finisher\",\n \"finishing\",\n \"finite\",\n \"finless\",\n \"finlike\",\n \"fiscally\",\n \"fit\",\n \"five\",\n \"flaccid\",\n \"flagman\",\n \"flagpole\",\n \"flagship\",\n \"flagstick\",\n \"flagstone\",\n \"flail\",\n \"flakily\",\n \"flaky\",\n \"flame\",\n \"flammable\",\n \"flanked\",\n \"flanking\",\n \"flannels\",\n \"flap\",\n \"flaring\",\n \"flashback\",\n \"flashbulb\",\n \"flashcard\",\n \"flashily\",\n \"flashing\",\n \"flashy\",\n \"flask\",\n \"flatbed\",\n \"flatfoot\",\n \"flatly\",\n \"flatness\",\n \"flatten\",\n \"flattered\",\n \"flatterer\",\n \"flattery\",\n \"flattop\",\n \"flatware\",\n \"flatworm\",\n \"flavored\",\n \"flavorful\",\n \"flavoring\",\n \"flaxseed\",\n \"fled\",\n \"fleshed\",\n \"fleshy\",\n \"flick\",\n \"flier\",\n \"flight\",\n \"flinch\",\n \"fling\",\n \"flint\",\n \"flip\",\n \"flirt\",\n \"float\",\n \"flock\",\n \"flogging\",\n \"flop\",\n \"floral\",\n \"florist\",\n \"floss\",\n \"flounder\",\n \"flyable\",\n \"flyaway\",\n \"flyer\",\n \"flying\",\n \"flyover\",\n \"flypaper\",\n \"foam\",\n \"foe\",\n \"fog\",\n \"foil\",\n \"folic\",\n \"folk\",\n \"follicle\",\n \"follow\",\n \"fondling\",\n \"fondly\",\n \"fondness\",\n \"fondue\",\n \"font\",\n \"food\",\n \"fool\",\n \"footage\",\n \"football\",\n \"footbath\",\n \"footboard\",\n \"footer\",\n \"footgear\",\n \"foothill\",\n \"foothold\",\n \"footing\",\n \"footless\",\n \"footman\",\n \"footnote\",\n \"footpad\",\n \"footpath\",\n \"footprint\",\n \"footrest\",\n \"footsie\",\n \"footsore\",\n \"footwear\",\n \"footwork\",\n \"fossil\",\n \"foster\",\n \"founder\",\n \"founding\",\n \"fountain\",\n \"fox\",\n \"foyer\",\n \"fraction\",\n \"fracture\",\n \"fragile\",\n \"fragility\",\n \"fragment\",\n \"fragrance\",\n \"fragrant\",\n \"frail\",\n \"frame\",\n \"framing\",\n \"frantic\",\n \"fraternal\",\n \"frayed\",\n \"fraying\",\n \"frays\",\n \"freckled\",\n \"freckles\",\n \"freebase\",\n \"freebee\",\n \"freebie\",\n \"freedom\",\n \"freefall\",\n \"freehand\",\n \"freeing\",\n \"freeload\",\n \"freely\",\n \"freemason\",\n \"freeness\",\n \"freestyle\",\n \"freeware\",\n \"freeway\",\n \"freewill\",\n \"freezable\",\n \"freezing\",\n \"freight\",\n \"french\",\n \"frenzied\",\n \"frenzy\",\n \"frequency\",\n \"frequent\",\n \"fresh\",\n \"fretful\",\n \"fretted\",\n \"friction\",\n \"friday\",\n \"fridge\",\n \"fried\",\n \"friend\",\n \"frighten\",\n \"frightful\",\n \"frigidity\",\n \"frigidly\",\n \"frill\",\n \"fringe\",\n \"frisbee\",\n \"frisk\",\n \"fritter\",\n \"frivolous\",\n \"frolic\",\n \"from\",\n \"front\",\n \"frostbite\",\n \"frosted\",\n \"frostily\",\n \"frosting\",\n \"frostlike\",\n \"frosty\",\n \"froth\",\n \"frown\",\n \"frozen\",\n \"fructose\",\n \"frugality\",\n \"frugally\",\n \"fruit\",\n \"frustrate\",\n \"frying\",\n \"gab\",\n \"gaffe\",\n \"gag\",\n \"gainfully\",\n \"gaining\",\n \"gains\",\n \"gala\",\n \"gallantly\",\n \"galleria\",\n \"gallery\",\n \"galley\",\n \"gallon\",\n \"gallows\",\n \"gallstone\",\n \"galore\",\n \"galvanize\",\n \"gambling\",\n \"game\",\n \"gaming\",\n \"gamma\",\n \"gander\",\n \"gangly\",\n \"gangrene\",\n \"gangway\",\n \"gap\",\n \"garage\",\n \"garbage\",\n \"garden\",\n \"gargle\",\n \"garland\",\n \"garlic\",\n \"garment\",\n \"garnet\",\n \"garnish\",\n \"garter\",\n \"gas\",\n \"gatherer\",\n \"gathering\",\n \"gating\",\n \"gauging\",\n \"gauntlet\",\n \"gauze\",\n \"gave\",\n \"gawk\",\n \"gazing\",\n \"gear\",\n \"gecko\",\n \"geek\",\n \"geiger\",\n \"gem\",\n \"gender\",\n \"generic\",\n \"generous\",\n \"genetics\",\n \"genre\",\n \"gentile\",\n \"gentleman\",\n \"gently\",\n \"gents\",\n \"geography\",\n \"geologic\",\n \"geologist\",\n \"geology\",\n \"geometric\",\n \"geometry\",\n \"geranium\",\n \"gerbil\",\n \"geriatric\",\n \"germicide\",\n \"germinate\",\n \"germless\",\n \"germproof\",\n \"gestate\",\n \"gestation\",\n \"gesture\",\n \"getaway\",\n \"getting\",\n \"getup\",\n \"giant\",\n \"gibberish\",\n \"giblet\",\n \"giddily\",\n \"giddiness\",\n \"giddy\",\n \"gift\",\n \"gigabyte\",\n \"gigahertz\",\n \"gigantic\",\n \"giggle\",\n \"giggling\",\n \"giggly\",\n \"gigolo\",\n \"gilled\",\n \"gills\",\n \"gimmick\",\n \"girdle\",\n \"giveaway\",\n \"given\",\n \"giver\",\n \"giving\",\n \"gizmo\",\n \"gizzard\",\n \"glacial\",\n \"glacier\",\n \"glade\",\n \"gladiator\",\n \"gladly\",\n \"glamorous\",\n \"glamour\",\n \"glance\",\n \"glancing\",\n \"glandular\",\n \"glare\",\n \"glaring\",\n \"glass\",\n \"glaucoma\",\n \"glazing\",\n \"gleaming\",\n \"gleeful\",\n \"glider\",\n \"gliding\",\n \"glimmer\",\n \"glimpse\",\n \"glisten\",\n \"glitch\",\n \"glitter\",\n \"glitzy\",\n \"gloater\",\n \"gloating\",\n \"gloomily\",\n \"gloomy\",\n \"glorified\",\n \"glorifier\",\n \"glorify\",\n \"glorious\",\n \"glory\",\n \"gloss\",\n \"glove\",\n \"glowing\",\n \"glowworm\",\n \"glucose\",\n \"glue\",\n \"gluten\",\n \"glutinous\",\n \"glutton\",\n \"gnarly\",\n \"gnat\",\n \"goal\",\n \"goatskin\",\n \"goes\",\n \"goggles\",\n \"going\",\n \"goldfish\",\n \"goldmine\",\n \"goldsmith\",\n \"golf\",\n \"goliath\",\n \"gonad\",\n \"gondola\",\n \"gone\",\n \"gong\",\n \"good\",\n \"gooey\",\n \"goofball\",\n \"goofiness\",\n \"goofy\",\n \"google\",\n \"goon\",\n \"gopher\",\n \"gore\",\n \"gorged\",\n \"gorgeous\",\n \"gory\",\n \"gosling\",\n \"gossip\",\n \"gothic\",\n \"gotten\",\n \"gout\",\n \"gown\",\n \"grab\",\n \"graceful\",\n \"graceless\",\n \"gracious\",\n \"gradation\",\n \"graded\",\n \"grader\",\n \"gradient\",\n \"grading\",\n \"gradually\",\n \"graduate\",\n \"graffiti\",\n \"grafted\",\n \"grafting\",\n \"grain\",\n \"granddad\",\n \"grandkid\",\n \"grandly\",\n \"grandma\",\n \"grandpa\",\n \"grandson\",\n \"granite\",\n \"granny\",\n \"granola\",\n \"grant\",\n \"granular\",\n \"grape\",\n \"graph\",\n \"grapple\",\n \"grappling\",\n \"grasp\",\n \"grass\",\n \"gratified\",\n \"gratify\",\n \"grating\",\n \"gratitude\",\n \"gratuity\",\n \"gravel\",\n \"graveness\",\n \"graves\",\n \"graveyard\",\n \"gravitate\",\n \"gravity\",\n \"gravy\",\n \"gray\",\n \"grazing\",\n \"greasily\",\n \"greedily\",\n \"greedless\",\n \"greedy\",\n \"green\",\n \"greeter\",\n \"greeting\",\n \"grew\",\n \"greyhound\",\n \"grid\",\n \"grief\",\n \"grievance\",\n \"grieving\",\n \"grievous\",\n \"grill\",\n \"grimace\",\n \"grimacing\",\n \"grime\",\n \"griminess\",\n \"grimy\",\n \"grinch\",\n \"grinning\",\n \"grip\",\n \"gristle\",\n \"grit\",\n \"groggily\",\n \"groggy\",\n \"groin\",\n \"groom\",\n \"groove\",\n \"grooving\",\n \"groovy\",\n \"grope\",\n \"ground\",\n \"grouped\",\n \"grout\",\n \"grove\",\n \"grower\",\n \"growing\",\n \"growl\",\n \"grub\",\n \"grudge\",\n \"grudging\",\n \"grueling\",\n \"gruffly\",\n \"grumble\",\n \"grumbling\",\n \"grumbly\",\n \"grumpily\",\n \"grunge\",\n \"grunt\",\n \"guacamole\",\n \"guidable\",\n \"guidance\",\n \"guide\",\n \"guiding\",\n \"guileless\",\n \"guise\",\n \"gulf\",\n \"gullible\",\n \"gully\",\n \"gulp\",\n \"gumball\",\n \"gumdrop\",\n \"gumminess\",\n \"gumming\",\n \"gummy\",\n \"gurgle\",\n \"gurgling\",\n \"guru\",\n \"gush\",\n \"gusto\",\n \"gusty\",\n \"gutless\",\n \"guts\",\n \"gutter\",\n \"guy\",\n \"guzzler\",\n \"gyration\",\n \"habitable\",\n \"habitant\",\n \"habitat\",\n \"habitual\",\n \"hacked\",\n \"hacker\",\n \"hacking\",\n \"hacksaw\",\n \"had\",\n \"haggler\",\n \"haiku\",\n \"half\",\n \"halogen\",\n \"halt\",\n \"halved\",\n \"halves\",\n \"hamburger\",\n \"hamlet\",\n \"hammock\",\n \"hamper\",\n \"hamster\",\n \"hamstring\",\n \"handbag\",\n \"handball\",\n \"handbook\",\n \"handbrake\",\n \"handcart\",\n \"handclap\",\n \"handclasp\",\n \"handcraft\",\n \"handcuff\",\n \"handed\",\n \"handful\",\n \"handgrip\",\n \"handgun\",\n \"handheld\",\n \"handiness\",\n \"handiwork\",\n \"handlebar\",\n \"handled\",\n \"handler\",\n \"handling\",\n \"handmade\",\n \"handoff\",\n \"handpick\",\n \"handprint\",\n \"handrail\",\n \"handsaw\",\n \"handset\",\n \"handsfree\",\n \"handshake\",\n \"handstand\",\n \"handwash\",\n \"handwork\",\n \"handwoven\",\n \"handwrite\",\n \"handyman\",\n \"hangnail\",\n \"hangout\",\n \"hangover\",\n \"hangup\",\n \"hankering\",\n \"hankie\",\n \"hanky\",\n \"haphazard\",\n \"happening\",\n \"happier\",\n \"happiest\",\n \"happily\",\n \"happiness\",\n \"happy\",\n \"harbor\",\n \"hardcopy\",\n \"hardcore\",\n \"hardcover\",\n \"harddisk\",\n \"hardened\",\n \"hardener\",\n \"hardening\",\n \"hardhat\",\n \"hardhead\",\n \"hardiness\",\n \"hardly\",\n \"hardness\",\n \"hardship\",\n \"hardware\",\n \"hardwired\",\n \"hardwood\",\n \"hardy\",\n \"harmful\",\n \"harmless\",\n \"harmonica\",\n \"harmonics\",\n \"harmonize\",\n \"harmony\",\n \"harness\",\n \"harpist\",\n \"harsh\",\n \"harvest\",\n \"hash\",\n \"hassle\",\n \"haste\",\n \"hastily\",\n \"hastiness\",\n \"hasty\",\n \"hatbox\",\n \"hatchback\",\n \"hatchery\",\n \"hatchet\",\n \"hatching\",\n \"hatchling\",\n \"hate\",\n \"hatless\",\n \"hatred\",\n \"haunt\",\n \"haven\",\n \"hazard\",\n \"hazelnut\",\n \"hazily\",\n \"haziness\",\n \"hazing\",\n \"hazy\",\n \"headache\",\n \"headband\",\n \"headboard\",\n \"headcount\",\n \"headdress\",\n \"headed\",\n \"header\",\n \"headfirst\",\n \"headgear\",\n \"heading\",\n \"headlamp\",\n \"headless\",\n \"headlock\",\n \"headphone\",\n \"headpiece\",\n \"headrest\",\n \"headroom\",\n \"headscarf\",\n \"headset\",\n \"headsman\",\n \"headstand\",\n \"headstone\",\n \"headway\",\n \"headwear\",\n \"heap\",\n \"heat\",\n \"heave\",\n \"heavily\",\n \"heaviness\",\n \"heaving\",\n \"hedge\",\n \"hedging\",\n \"heftiness\",\n \"hefty\",\n \"helium\",\n \"helmet\",\n \"helper\",\n \"helpful\",\n \"helping\",\n \"helpless\",\n \"helpline\",\n \"hemlock\",\n \"hemstitch\",\n \"hence\",\n \"henchman\",\n \"henna\",\n \"herald\",\n \"herbal\",\n \"herbicide\",\n \"herbs\",\n \"heritage\",\n \"hermit\",\n \"heroics\",\n \"heroism\",\n \"herring\",\n \"herself\",\n \"hertz\",\n \"hesitancy\",\n \"hesitant\",\n \"hesitate\",\n \"hexagon\",\n \"hexagram\",\n \"hubcap\",\n \"huddle\",\n \"huddling\",\n \"huff\",\n \"hug\",\n \"hula\",\n \"hulk\",\n \"hull\",\n \"human\",\n \"humble\",\n \"humbling\",\n \"humbly\",\n \"humid\",\n \"humiliate\",\n \"humility\",\n \"humming\",\n \"hummus\",\n \"humongous\",\n \"humorist\",\n \"humorless\",\n \"humorous\",\n \"humpback\",\n \"humped\",\n \"humvee\",\n \"hunchback\",\n \"hundredth\",\n \"hunger\",\n \"hungrily\",\n \"hungry\",\n \"hunk\",\n \"hunter\",\n \"hunting\",\n \"huntress\",\n \"huntsman\",\n \"hurdle\",\n \"hurled\",\n \"hurler\",\n \"hurling\",\n \"hurray\",\n \"hurricane\",\n \"hurried\",\n \"hurry\",\n \"hurt\",\n \"husband\",\n \"hush\",\n \"husked\",\n \"huskiness\",\n \"hut\",\n \"hybrid\",\n \"hydrant\",\n \"hydrated\",\n \"hydration\",\n \"hydrogen\",\n \"hydroxide\",\n \"hyperlink\",\n \"hypertext\",\n \"hyphen\",\n \"hypnoses\",\n \"hypnosis\",\n \"hypnotic\",\n \"hypnotism\",\n \"hypnotist\",\n \"hypnotize\",\n \"hypocrisy\",\n \"hypocrite\",\n \"ibuprofen\",\n \"ice\",\n \"iciness\",\n \"icing\",\n \"icky\",\n \"icon\",\n \"icy\",\n \"idealism\",\n \"idealist\",\n \"idealize\",\n \"ideally\",\n \"idealness\",\n \"identical\",\n \"identify\",\n \"identity\",\n \"ideology\",\n \"idiocy\",\n \"idiom\",\n \"idly\",\n \"igloo\",\n \"ignition\",\n \"ignore\",\n \"iguana\",\n \"illicitly\",\n \"illusion\",\n \"illusive\",\n \"image\",\n \"imaginary\",\n \"imagines\",\n \"imaging\",\n \"imbecile\",\n \"imitate\",\n \"imitation\",\n \"immature\",\n \"immerse\",\n \"immersion\",\n \"imminent\",\n \"immobile\",\n \"immodest\",\n \"immorally\",\n \"immortal\",\n \"immovable\",\n \"immovably\",\n \"immunity\",\n \"immunize\",\n \"impaired\",\n \"impale\",\n \"impart\",\n \"impatient\",\n \"impeach\",\n \"impeding\",\n \"impending\",\n \"imperfect\",\n \"imperial\",\n \"impish\",\n \"implant\",\n \"implement\",\n \"implicate\",\n \"implicit\",\n \"implode\",\n \"implosion\",\n \"implosive\",\n \"imply\",\n \"impolite\",\n \"important\",\n \"importer\",\n \"impose\",\n \"imposing\",\n \"impotence\",\n \"impotency\",\n \"impotent\",\n \"impound\",\n \"imprecise\",\n \"imprint\",\n \"imprison\",\n \"impromptu\",\n \"improper\",\n \"improve\",\n \"improving\",\n \"improvise\",\n \"imprudent\",\n \"impulse\",\n \"impulsive\",\n \"impure\",\n \"impurity\",\n \"iodine\",\n \"iodize\",\n \"ion\",\n \"ipad\",\n \"iphone\",\n \"ipod\",\n \"irate\",\n \"irk\",\n \"iron\",\n \"irregular\",\n \"irrigate\",\n \"irritable\",\n \"irritably\",\n \"irritant\",\n \"irritate\",\n \"islamic\",\n \"islamist\",\n \"isolated\",\n \"isolating\",\n \"isolation\",\n \"isotope\",\n \"issue\",\n \"issuing\",\n \"italicize\",\n \"italics\",\n \"item\",\n \"itinerary\",\n \"itunes\",\n \"ivory\",\n \"ivy\",\n \"jab\",\n \"jackal\",\n \"jacket\",\n \"jackknife\",\n \"jackpot\",\n \"jailbird\",\n \"jailbreak\",\n \"jailer\",\n \"jailhouse\",\n \"jalapeno\",\n \"jam\",\n \"janitor\",\n \"january\",\n \"jargon\",\n \"jarring\",\n \"jasmine\",\n \"jaundice\",\n \"jaunt\",\n \"java\",\n \"jawed\",\n \"jawless\",\n \"jawline\",\n \"jaws\",\n \"jaybird\",\n \"jaywalker\",\n \"jazz\",\n \"jeep\",\n \"jeeringly\",\n \"jellied\",\n \"jelly\",\n \"jersey\",\n \"jester\",\n \"jet\",\n \"jiffy\",\n \"jigsaw\",\n \"jimmy\",\n \"jingle\",\n \"jingling\",\n \"jinx\",\n \"jitters\",\n \"jittery\",\n \"job\",\n \"jockey\",\n \"jockstrap\",\n \"jogger\",\n \"jogging\",\n \"john\",\n \"joining\",\n \"jokester\",\n \"jokingly\",\n \"jolliness\",\n \"jolly\",\n \"jolt\",\n \"jot\",\n \"jovial\",\n \"joyfully\",\n \"joylessly\",\n \"joyous\",\n \"joyride\",\n \"joystick\",\n \"jubilance\",\n \"jubilant\",\n \"judge\",\n \"judgingly\",\n \"judicial\",\n \"judiciary\",\n \"judo\",\n \"juggle\",\n \"juggling\",\n \"jugular\",\n \"juice\",\n \"juiciness\",\n \"juicy\",\n \"jujitsu\",\n \"jukebox\",\n \"july\",\n \"jumble\",\n \"jumbo\",\n \"jump\",\n \"junction\",\n \"juncture\",\n \"june\",\n \"junior\",\n \"juniper\",\n \"junkie\",\n \"junkman\",\n \"junkyard\",\n \"jurist\",\n \"juror\",\n \"jury\",\n \"justice\",\n \"justifier\",\n \"justify\",\n \"justly\",\n \"justness\",\n \"juvenile\",\n \"kabob\",\n \"kangaroo\",\n \"karaoke\",\n \"karate\",\n \"karma\",\n \"kebab\",\n \"keenly\",\n \"keenness\",\n \"keep\",\n \"keg\",\n \"kelp\",\n \"kennel\",\n \"kept\",\n \"kerchief\",\n \"kerosene\",\n \"kettle\",\n \"kick\",\n \"kiln\",\n \"kilobyte\",\n \"kilogram\",\n \"kilometer\",\n \"kilowatt\",\n \"kilt\",\n \"kimono\",\n \"kindle\",\n \"kindling\",\n \"kindly\",\n \"kindness\",\n \"kindred\",\n \"kinetic\",\n \"kinfolk\",\n \"king\",\n \"kinship\",\n \"kinsman\",\n \"kinswoman\",\n \"kissable\",\n \"kisser\",\n \"kissing\",\n \"kitchen\",\n \"kite\",\n \"kitten\",\n \"kitty\",\n \"kiwi\",\n \"kleenex\",\n \"knapsack\",\n \"knee\",\n \"knelt\",\n \"knickers\",\n \"knoll\",\n \"koala\",\n \"kooky\",\n \"kosher\",\n \"krypton\",\n \"kudos\",\n \"kung\",\n \"labored\",\n \"laborer\",\n \"laboring\",\n \"laborious\",\n \"labrador\",\n \"ladder\",\n \"ladies\",\n \"ladle\",\n \"ladybug\",\n \"ladylike\",\n \"lagged\",\n \"lagging\",\n \"lagoon\",\n \"lair\",\n \"lake\",\n \"lance\",\n \"landed\",\n \"landfall\",\n \"landfill\",\n \"landing\",\n \"landlady\",\n \"landless\",\n \"landline\",\n \"landlord\",\n \"landmark\",\n \"landmass\",\n \"landmine\",\n \"landowner\",\n \"landscape\",\n \"landside\",\n \"landslide\",\n \"language\",\n \"lankiness\",\n \"lanky\",\n \"lantern\",\n \"lapdog\",\n \"lapel\",\n \"lapped\",\n \"lapping\",\n \"laptop\",\n \"lard\",\n \"large\",\n \"lark\",\n \"lash\",\n \"lasso\",\n \"last\",\n \"latch\",\n \"late\",\n \"lather\",\n \"latitude\",\n \"latrine\",\n \"latter\",\n \"latticed\",\n \"launch\",\n \"launder\",\n \"laundry\",\n \"laurel\",\n \"lavender\",\n \"lavish\",\n \"laxative\",\n \"lazily\",\n \"laziness\",\n \"lazy\",\n \"lecturer\",\n \"left\",\n \"legacy\",\n \"legal\",\n \"legend\",\n \"legged\",\n \"leggings\",\n \"legible\",\n \"legibly\",\n \"legislate\",\n \"lego\",\n \"legroom\",\n \"legume\",\n \"legwarmer\",\n \"legwork\",\n \"lemon\",\n \"lend\",\n \"length\",\n \"lens\",\n \"lent\",\n \"leotard\",\n \"lesser\",\n \"letdown\",\n \"lethargic\",\n \"lethargy\",\n \"letter\",\n \"lettuce\",\n \"level\",\n \"leverage\",\n \"levers\",\n \"levitate\",\n \"levitator\",\n \"liability\",\n \"liable\",\n \"liberty\",\n \"librarian\",\n \"library\",\n \"licking\",\n \"licorice\",\n \"lid\",\n \"life\",\n \"lifter\",\n \"lifting\",\n \"liftoff\",\n \"ligament\",\n \"likely\",\n \"likeness\",\n \"likewise\",\n \"liking\",\n \"lilac\",\n \"lilly\",\n \"lily\",\n \"limb\",\n \"limeade\",\n \"limelight\",\n \"limes\",\n \"limit\",\n \"limping\",\n \"limpness\",\n \"line\",\n \"lingo\",\n \"linguini\",\n \"linguist\",\n \"lining\",\n \"linked\",\n \"linoleum\",\n \"linseed\",\n \"lint\",\n \"lion\",\n \"lip\",\n \"liquefy\",\n \"liqueur\",\n \"liquid\",\n \"lisp\",\n \"list\",\n \"litigate\",\n \"litigator\",\n \"litmus\",\n \"litter\",\n \"little\",\n \"livable\",\n \"lived\",\n \"lively\",\n \"liver\",\n \"livestock\",\n \"lividly\",\n \"living\",\n \"lizard\",\n \"lubricant\",\n \"lubricate\",\n \"lucid\",\n \"luckily\",\n \"luckiness\",\n \"luckless\",\n \"lucrative\",\n \"ludicrous\",\n \"lugged\",\n \"lukewarm\",\n \"lullaby\",\n \"lumber\",\n \"luminance\",\n \"luminous\",\n \"lumpiness\",\n \"lumping\",\n \"lumpish\",\n \"lunacy\",\n \"lunar\",\n \"lunchbox\",\n \"luncheon\",\n \"lunchroom\",\n \"lunchtime\",\n \"lung\",\n \"lurch\",\n \"lure\",\n \"luridness\",\n \"lurk\",\n \"lushly\",\n \"lushness\",\n \"luster\",\n \"lustfully\",\n \"lustily\",\n \"lustiness\",\n \"lustrous\",\n \"lusty\",\n \"luxurious\",\n \"luxury\",\n \"lying\",\n \"lyrically\",\n \"lyricism\",\n \"lyricist\",\n \"lyrics\",\n \"macarena\",\n \"macaroni\",\n \"macaw\",\n \"mace\",\n \"machine\",\n \"machinist\",\n \"magazine\",\n \"magenta\",\n \"maggot\",\n \"magical\",\n \"magician\",\n \"magma\",\n \"magnesium\",\n \"magnetic\",\n \"magnetism\",\n \"magnetize\",\n \"magnifier\",\n \"magnify\",\n \"magnitude\",\n \"magnolia\",\n \"mahogany\",\n \"maimed\",\n \"majestic\",\n \"majesty\",\n \"majorette\",\n \"majority\",\n \"makeover\",\n \"maker\",\n \"makeshift\",\n \"making\",\n \"malformed\",\n \"malt\",\n \"mama\",\n \"mammal\",\n \"mammary\",\n \"mammogram\",\n \"manager\",\n \"managing\",\n \"manatee\",\n \"mandarin\",\n \"mandate\",\n \"mandatory\",\n \"mandolin\",\n \"manger\",\n \"mangle\",\n \"mango\",\n \"mangy\",\n \"manhandle\",\n \"manhole\",\n \"manhood\",\n \"manhunt\",\n \"manicotti\",\n \"manicure\",\n \"manifesto\",\n \"manila\",\n \"mankind\",\n \"manlike\",\n \"manliness\",\n \"manly\",\n \"manmade\",\n \"manned\",\n \"mannish\",\n \"manor\",\n \"manpower\",\n \"mantis\",\n \"mantra\",\n \"manual\",\n \"many\",\n \"map\",\n \"marathon\",\n \"marauding\",\n \"marbled\",\n \"marbles\",\n \"marbling\",\n \"march\",\n \"mardi\",\n \"margarine\",\n \"margarita\",\n \"margin\",\n \"marigold\",\n \"marina\",\n \"marine\",\n \"marital\",\n \"maritime\",\n \"marlin\",\n \"marmalade\",\n \"maroon\",\n \"married\",\n \"marrow\",\n \"marry\",\n \"marshland\",\n \"marshy\",\n \"marsupial\",\n \"marvelous\",\n \"marxism\",\n \"mascot\",\n \"masculine\",\n \"mashed\",\n \"mashing\",\n \"massager\",\n \"masses\",\n \"massive\",\n \"mastiff\",\n \"matador\",\n \"matchbook\",\n \"matchbox\",\n \"matcher\",\n \"matching\",\n \"matchless\",\n \"material\",\n \"maternal\",\n \"maternity\",\n \"math\",\n \"mating\",\n \"matriarch\",\n \"matrimony\",\n \"matrix\",\n \"matron\",\n \"matted\",\n \"matter\",\n \"maturely\",\n \"maturing\",\n \"maturity\",\n \"mauve\",\n \"maverick\",\n \"maximize\",\n \"maximum\",\n \"maybe\",\n \"mayday\",\n \"mayflower\",\n \"moaner\",\n \"moaning\",\n \"mobile\",\n \"mobility\",\n \"mobilize\",\n \"mobster\",\n \"mocha\",\n \"mocker\",\n \"mockup\",\n \"modified\",\n \"modify\",\n \"modular\",\n \"modulator\",\n \"module\",\n \"moisten\",\n \"moistness\",\n \"moisture\",\n \"molar\",\n \"molasses\",\n \"mold\",\n \"molecular\",\n \"molecule\",\n \"molehill\",\n \"mollusk\",\n \"mom\",\n \"monastery\",\n \"monday\",\n \"monetary\",\n \"monetize\",\n \"moneybags\",\n \"moneyless\",\n \"moneywise\",\n \"mongoose\",\n \"mongrel\",\n \"monitor\",\n \"monkhood\",\n \"monogamy\",\n \"monogram\",\n \"monologue\",\n \"monopoly\",\n \"monorail\",\n \"monotone\",\n \"monotype\",\n \"monoxide\",\n \"monsieur\",\n \"monsoon\",\n \"monstrous\",\n \"monthly\",\n \"monument\",\n \"moocher\",\n \"moodiness\",\n \"moody\",\n \"mooing\",\n \"moonbeam\",\n \"mooned\",\n \"moonlight\",\n \"moonlike\",\n \"moonlit\",\n \"moonrise\",\n \"moonscape\",\n \"moonshine\",\n \"moonstone\",\n \"moonwalk\",\n \"mop\",\n \"morale\",\n \"morality\",\n \"morally\",\n \"morbidity\",\n \"morbidly\",\n \"morphine\",\n \"morphing\",\n \"morse\",\n \"mortality\",\n \"mortally\",\n \"mortician\",\n \"mortified\",\n \"mortify\",\n \"mortuary\",\n \"mosaic\",\n \"mossy\",\n \"most\",\n \"mothball\",\n \"mothproof\",\n \"motion\",\n \"motivate\",\n \"motivator\",\n \"motive\",\n \"motocross\",\n \"motor\",\n \"motto\",\n \"mountable\",\n \"mountain\",\n \"mounted\",\n \"mounting\",\n \"mourner\",\n \"mournful\",\n \"mouse\",\n \"mousiness\",\n \"moustache\",\n \"mousy\",\n \"mouth\",\n \"movable\",\n \"move\",\n \"movie\",\n \"moving\",\n \"mower\",\n \"mowing\",\n \"much\",\n \"muck\",\n \"mud\",\n \"mug\",\n \"mulberry\",\n \"mulch\",\n \"mule\",\n \"mulled\",\n \"mullets\",\n \"multiple\",\n \"multiply\",\n \"multitask\",\n \"multitude\",\n \"mumble\",\n \"mumbling\",\n \"mumbo\",\n \"mummified\",\n \"mummify\",\n \"mummy\",\n \"mumps\",\n \"munchkin\",\n \"mundane\",\n \"municipal\",\n \"muppet\",\n \"mural\",\n \"murkiness\",\n \"murky\",\n \"murmuring\",\n \"muscular\",\n \"museum\",\n \"mushily\",\n \"mushiness\",\n \"mushroom\",\n \"mushy\",\n \"music\",\n \"musket\",\n \"muskiness\",\n \"musky\",\n \"mustang\",\n \"mustard\",\n \"muster\",\n \"mustiness\",\n \"musty\",\n \"mutable\",\n \"mutate\",\n \"mutation\",\n \"mute\",\n \"mutilated\",\n \"mutilator\",\n \"mutiny\",\n \"mutt\",\n \"mutual\",\n \"muzzle\",\n \"myself\",\n \"myspace\",\n \"mystified\",\n \"mystify\",\n \"myth\",\n \"nacho\",\n \"nag\",\n \"nail\",\n \"name\",\n \"naming\",\n \"nanny\",\n \"nanometer\",\n \"nape\",\n \"napkin\",\n \"napped\",\n \"napping\",\n \"nappy\",\n \"narrow\",\n \"nastily\",\n \"nastiness\",\n \"national\",\n \"native\",\n \"nativity\",\n \"natural\",\n \"nature\",\n \"naturist\",\n \"nautical\",\n \"navigate\",\n \"navigator\",\n \"navy\",\n \"nearby\",\n \"nearest\",\n \"nearly\",\n \"nearness\",\n \"neatly\",\n \"neatness\",\n \"nebula\",\n \"nebulizer\",\n \"nectar\",\n \"negate\",\n \"negation\",\n \"negative\",\n \"neglector\",\n \"negligee\",\n \"negligent\",\n \"negotiate\",\n \"nemeses\",\n \"nemesis\",\n \"neon\",\n \"nephew\",\n \"nerd\",\n \"nervous\",\n \"nervy\",\n \"nest\",\n \"net\",\n \"neurology\",\n \"neuron\",\n \"neurosis\",\n \"neurotic\",\n \"neuter\",\n \"neutron\",\n \"never\",\n \"next\",\n \"nibble\",\n \"nickname\",\n \"nicotine\",\n \"niece\",\n \"nifty\",\n \"nimble\",\n \"nimbly\",\n \"nineteen\",\n \"ninetieth\",\n \"ninja\",\n \"nintendo\",\n \"ninth\",\n \"nuclear\",\n \"nuclei\",\n \"nucleus\",\n \"nugget\",\n \"nullify\",\n \"number\",\n \"numbing\",\n \"numbly\",\n \"numbness\",\n \"numeral\",\n \"numerate\",\n \"numerator\",\n \"numeric\",\n \"numerous\",\n \"nuptials\",\n \"nursery\",\n \"nursing\",\n \"nurture\",\n \"nutcase\",\n \"nutlike\",\n \"nutmeg\",\n \"nutrient\",\n \"nutshell\",\n \"nuttiness\",\n \"nutty\",\n \"nuzzle\",\n \"nylon\",\n \"oaf\",\n \"oak\",\n \"oasis\",\n \"oat\",\n \"obedience\",\n \"obedient\",\n \"obituary\",\n \"object\",\n \"obligate\",\n \"obliged\",\n \"oblivion\",\n \"oblivious\",\n \"oblong\",\n \"obnoxious\",\n \"oboe\",\n \"obscure\",\n \"obscurity\",\n \"observant\",\n \"observer\",\n \"observing\",\n \"obsessed\",\n \"obsession\",\n \"obsessive\",\n \"obsolete\",\n \"obstacle\",\n \"obstinate\",\n \"obstruct\",\n \"obtain\",\n \"obtrusive\",\n \"obtuse\",\n \"obvious\",\n \"occultist\",\n \"occupancy\",\n \"occupant\",\n \"occupier\",\n \"occupy\",\n \"ocean\",\n \"ocelot\",\n \"octagon\",\n \"octane\",\n \"october\",\n \"octopus\",\n \"ogle\",\n \"oil\",\n \"oink\",\n \"ointment\",\n \"okay\",\n \"old\",\n \"olive\",\n \"olympics\",\n \"omega\",\n \"omen\",\n \"ominous\",\n \"omission\",\n \"omit\",\n \"omnivore\",\n \"onboard\",\n \"oncoming\",\n \"ongoing\",\n \"onion\",\n \"online\",\n \"onlooker\",\n \"only\",\n \"onscreen\",\n \"onset\",\n \"onshore\",\n \"onslaught\",\n \"onstage\",\n \"onto\",\n \"onward\",\n \"onyx\",\n \"oops\",\n \"ooze\",\n \"oozy\",\n \"opacity\",\n \"opal\",\n \"open\",\n \"operable\",\n \"operate\",\n \"operating\",\n \"operation\",\n \"operative\",\n \"operator\",\n \"opium\",\n \"opossum\",\n \"opponent\",\n \"oppose\",\n \"opposing\",\n \"opposite\",\n \"oppressed\",\n \"oppressor\",\n \"opt\",\n \"opulently\",\n \"osmosis\",\n \"other\",\n \"otter\",\n \"ouch\",\n \"ought\",\n \"ounce\",\n \"outage\",\n \"outback\",\n \"outbid\",\n \"outboard\",\n \"outbound\",\n \"outbreak\",\n \"outburst\",\n \"outcast\",\n \"outclass\",\n \"outcome\",\n \"outdated\",\n \"outdoors\",\n \"outer\",\n \"outfield\",\n \"outfit\",\n \"outflank\",\n \"outgoing\",\n \"outgrow\",\n \"outhouse\",\n \"outing\",\n \"outlast\",\n \"outlet\",\n \"outline\",\n \"outlook\",\n \"outlying\",\n \"outmatch\",\n \"outmost\",\n \"outnumber\",\n \"outplayed\",\n \"outpost\",\n \"outpour\",\n \"output\",\n \"outrage\",\n \"outrank\",\n \"outreach\",\n \"outright\",\n \"outscore\",\n \"outsell\",\n \"outshine\",\n \"outshoot\",\n \"outsider\",\n \"outskirts\",\n \"outsmart\",\n \"outsource\",\n \"outspoken\",\n \"outtakes\",\n \"outthink\",\n \"outward\",\n \"outweigh\",\n \"outwit\",\n \"oval\",\n \"ovary\",\n \"oven\",\n \"overact\",\n \"overall\",\n \"overarch\",\n \"overbid\",\n \"overbill\",\n \"overbite\",\n \"overblown\",\n \"overboard\",\n \"overbook\",\n \"overbuilt\",\n \"overcast\",\n \"overcoat\",\n \"overcome\",\n \"overcook\",\n \"overcrowd\",\n \"overdraft\",\n \"overdrawn\",\n \"overdress\",\n \"overdrive\",\n \"overdue\",\n \"overeager\",\n \"overeater\",\n \"overexert\",\n \"overfed\",\n \"overfeed\",\n \"overfill\",\n \"overflow\",\n \"overfull\",\n \"overgrown\",\n \"overhand\",\n \"overhang\",\n \"overhaul\",\n \"overhead\",\n \"overhear\",\n \"overheat\",\n \"overhung\",\n \"overjoyed\",\n \"overkill\",\n \"overlabor\",\n \"overlaid\",\n \"overlap\",\n \"overlay\",\n \"overload\",\n \"overlook\",\n \"overlord\",\n \"overlying\",\n \"overnight\",\n \"overpass\",\n \"overpay\",\n \"overplant\",\n \"overplay\",\n \"overpower\",\n \"overprice\",\n \"overrate\",\n \"overreach\",\n \"overreact\",\n \"override\",\n \"overripe\",\n \"overrule\",\n \"overrun\",\n \"overshoot\",\n \"overshot\",\n \"oversight\",\n \"oversized\",\n \"oversleep\",\n \"oversold\",\n \"overspend\",\n \"overstate\",\n \"overstay\",\n \"overstep\",\n \"overstock\",\n \"overstuff\",\n \"oversweet\",\n \"overtake\",\n \"overthrow\",\n \"overtime\",\n \"overtly\",\n \"overtone\",\n \"overture\",\n \"overturn\",\n \"overuse\",\n \"overvalue\",\n \"overview\",\n \"overwrite\",\n \"owl\",\n \"oxford\",\n \"oxidant\",\n \"oxidation\",\n \"oxidize\",\n \"oxidizing\",\n \"oxygen\",\n \"oxymoron\",\n \"oyster\",\n \"ozone\",\n \"paced\",\n \"pacemaker\",\n \"pacific\",\n \"pacifier\",\n \"pacifism\",\n \"pacifist\",\n \"pacify\",\n \"padded\",\n \"padding\",\n \"paddle\",\n \"paddling\",\n \"padlock\",\n \"pagan\",\n \"pager\",\n \"paging\",\n \"pajamas\",\n \"palace\",\n \"palatable\",\n \"palm\",\n \"palpable\",\n \"palpitate\",\n \"paltry\",\n \"pampered\",\n \"pamperer\",\n \"pampers\",\n \"pamphlet\",\n \"panama\",\n \"pancake\",\n \"pancreas\",\n \"panda\",\n \"pandemic\",\n \"pang\",\n \"panhandle\",\n \"panic\",\n \"panning\",\n \"panorama\",\n \"panoramic\",\n \"panther\",\n \"pantomime\",\n \"pantry\",\n \"pants\",\n \"pantyhose\",\n \"paparazzi\",\n \"papaya\",\n \"paper\",\n \"paprika\",\n \"papyrus\",\n \"parabola\",\n \"parachute\",\n \"parade\",\n \"paradox\",\n \"paragraph\",\n \"parakeet\",\n \"paralegal\",\n \"paralyses\",\n \"paralysis\",\n \"paralyze\",\n \"paramedic\",\n \"parameter\",\n \"paramount\",\n \"parasail\",\n \"parasite\",\n \"parasitic\",\n \"parcel\",\n \"parched\",\n \"parchment\",\n \"pardon\",\n \"parish\",\n \"parka\",\n \"parking\",\n \"parkway\",\n \"parlor\",\n \"parmesan\",\n \"parole\",\n \"parrot\",\n \"parsley\",\n \"parsnip\",\n \"partake\",\n \"parted\",\n \"parting\",\n \"partition\",\n \"partly\",\n \"partner\",\n \"partridge\",\n \"party\",\n \"passable\",\n \"passably\",\n \"passage\",\n \"passcode\",\n \"passenger\",\n \"passerby\",\n \"passing\",\n \"passion\",\n \"passive\",\n \"passivism\",\n \"passover\",\n \"passport\",\n \"password\",\n \"pasta\",\n \"pasted\",\n \"pastel\",\n \"pastime\",\n \"pastor\",\n \"pastrami\",\n \"pasture\",\n \"pasty\",\n \"patchwork\",\n \"patchy\",\n \"paternal\",\n \"paternity\",\n \"path\",\n \"patience\",\n \"patient\",\n \"patio\",\n \"patriarch\",\n \"patriot\",\n \"patrol\",\n \"patronage\",\n \"patronize\",\n \"pauper\",\n \"pavement\",\n \"paver\",\n \"pavestone\",\n \"pavilion\",\n \"paving\",\n \"pawing\",\n \"payable\",\n \"payback\",\n \"paycheck\",\n \"payday\",\n \"payee\",\n \"payer\",\n \"paying\",\n \"payment\",\n \"payphone\",\n \"payroll\",\n \"pebble\",\n \"pebbly\",\n \"pecan\",\n \"pectin\",\n \"peculiar\",\n \"peddling\",\n \"pediatric\",\n \"pedicure\",\n \"pedigree\",\n \"pedometer\",\n \"pegboard\",\n \"pelican\",\n \"pellet\",\n \"pelt\",\n \"pelvis\",\n \"penalize\",\n \"penalty\",\n \"pencil\",\n \"pendant\",\n \"pending\",\n \"penholder\",\n \"penknife\",\n \"pennant\",\n \"penniless\",\n \"penny\",\n \"penpal\",\n \"pension\",\n \"pentagon\",\n \"pentagram\",\n \"pep\",\n \"perceive\",\n \"percent\",\n \"perch\",\n \"percolate\",\n \"perennial\",\n \"perfected\",\n \"perfectly\",\n \"perfume\",\n \"periscope\",\n \"perish\",\n \"perjurer\",\n \"perjury\",\n \"perkiness\",\n \"perky\",\n \"perm\",\n \"peroxide\",\n \"perpetual\",\n \"perplexed\",\n \"persecute\",\n \"persevere\",\n \"persuaded\",\n \"persuader\",\n \"pesky\",\n \"peso\",\n \"pessimism\",\n \"pessimist\",\n \"pester\",\n \"pesticide\",\n \"petal\",\n \"petite\",\n \"petition\",\n \"petri\",\n \"petroleum\",\n \"petted\",\n \"petticoat\",\n \"pettiness\",\n \"petty\",\n \"petunia\",\n \"phantom\",\n \"phobia\",\n \"phoenix\",\n \"phonebook\",\n \"phoney\",\n \"phonics\",\n \"phoniness\",\n \"phony\",\n \"phosphate\",\n \"photo\",\n \"phrase\",\n \"phrasing\",\n \"placard\",\n \"placate\",\n \"placidly\",\n \"plank\",\n \"planner\",\n \"plant\",\n \"plasma\",\n \"plaster\",\n \"plastic\",\n \"plated\",\n \"platform\",\n \"plating\",\n \"platinum\",\n \"platonic\",\n \"platter\",\n \"platypus\",\n \"plausible\",\n \"plausibly\",\n \"playable\",\n \"playback\",\n \"player\",\n \"playful\",\n \"playgroup\",\n \"playhouse\",\n \"playing\",\n \"playlist\",\n \"playmaker\",\n \"playmate\",\n \"playoff\",\n \"playpen\",\n \"playroom\",\n \"playset\",\n \"plaything\",\n \"playtime\",\n \"plaza\",\n \"pleading\",\n \"pleat\",\n \"pledge\",\n \"plentiful\",\n \"plenty\",\n \"plethora\",\n \"plexiglas\",\n \"pliable\",\n \"plod\",\n \"plop\",\n \"plot\",\n \"plow\",\n \"ploy\",\n \"pluck\",\n \"plug\",\n \"plunder\",\n \"plunging\",\n \"plural\",\n \"plus\",\n \"plutonium\",\n \"plywood\",\n \"poach\",\n \"pod\",\n \"poem\",\n \"poet\",\n \"pogo\",\n \"pointed\",\n \"pointer\",\n \"pointing\",\n \"pointless\",\n \"pointy\",\n \"poise\",\n \"poison\",\n \"poker\",\n \"poking\",\n \"polar\",\n \"police\",\n \"policy\",\n \"polio\",\n \"polish\",\n \"politely\",\n \"polka\",\n \"polo\",\n \"polyester\",\n \"polygon\",\n \"polygraph\",\n \"polymer\",\n \"poncho\",\n \"pond\",\n \"pony\",\n \"popcorn\",\n \"pope\",\n \"poplar\",\n \"popper\",\n \"poppy\",\n \"popsicle\",\n \"populace\",\n \"popular\",\n \"populate\",\n \"porcupine\",\n \"pork\",\n \"porous\",\n \"porridge\",\n \"portable\",\n \"portal\",\n \"portfolio\",\n \"porthole\",\n \"portion\",\n \"portly\",\n \"portside\",\n \"poser\",\n \"posh\",\n \"posing\",\n \"possible\",\n \"possibly\",\n \"possum\",\n \"postage\",\n \"postal\",\n \"postbox\",\n \"postcard\",\n \"posted\",\n \"poster\",\n \"posting\",\n \"postnasal\",\n \"posture\",\n \"postwar\",\n \"pouch\",\n \"pounce\",\n \"pouncing\",\n \"pound\",\n \"pouring\",\n \"pout\",\n \"powdered\",\n \"powdering\",\n \"powdery\",\n \"power\",\n \"powwow\",\n \"pox\",\n \"praising\",\n \"prance\",\n \"prancing\",\n \"pranker\",\n \"prankish\",\n \"prankster\",\n \"prayer\",\n \"praying\",\n \"preacher\",\n \"preaching\",\n \"preachy\",\n \"preamble\",\n \"precinct\",\n \"precise\",\n \"precision\",\n \"precook\",\n \"precut\",\n \"predator\",\n \"predefine\",\n \"predict\",\n \"preface\",\n \"prefix\",\n \"preflight\",\n \"preformed\",\n \"pregame\",\n \"pregnancy\",\n \"pregnant\",\n \"preheated\",\n \"prelaunch\",\n \"prelaw\",\n \"prelude\",\n \"premiere\",\n \"premises\",\n \"premium\",\n \"prenatal\",\n \"preoccupy\",\n \"preorder\",\n \"prepaid\",\n \"prepay\",\n \"preplan\",\n \"preppy\",\n \"preschool\",\n \"prescribe\",\n \"preseason\",\n \"preset\",\n \"preshow\",\n \"president\",\n \"presoak\",\n \"press\",\n \"presume\",\n \"presuming\",\n \"preteen\",\n \"pretended\",\n \"pretender\",\n \"pretense\",\n \"pretext\",\n \"pretty\",\n \"pretzel\",\n \"prevail\",\n \"prevalent\",\n \"prevent\",\n \"preview\",\n \"previous\",\n \"prewar\",\n \"prewashed\",\n \"prideful\",\n \"pried\",\n \"primal\",\n \"primarily\",\n \"primary\",\n \"primate\",\n \"primer\",\n \"primp\",\n \"princess\",\n \"print\",\n \"prior\",\n \"prism\",\n \"prison\",\n \"prissy\",\n \"pristine\",\n \"privacy\",\n \"private\",\n \"privatize\",\n \"prize\",\n \"proactive\",\n \"probable\",\n \"probably\",\n \"probation\",\n \"probe\",\n \"probing\",\n \"probiotic\",\n \"problem\",\n \"procedure\",\n \"process\",\n \"proclaim\",\n \"procreate\",\n \"procurer\",\n \"prodigal\",\n \"prodigy\",\n \"produce\",\n \"product\",\n \"profane\",\n \"profanity\",\n \"professed\",\n \"professor\",\n \"profile\",\n \"profound\",\n \"profusely\",\n \"progeny\",\n \"prognosis\",\n \"program\",\n \"progress\",\n \"projector\",\n \"prologue\",\n \"prolonged\",\n \"promenade\",\n \"prominent\",\n \"promoter\",\n \"promotion\",\n \"prompter\",\n \"promptly\",\n \"prone\",\n \"prong\",\n \"pronounce\",\n \"pronto\",\n \"proofing\",\n \"proofread\",\n \"proofs\",\n \"propeller\",\n \"properly\",\n \"property\",\n \"proponent\",\n \"proposal\",\n \"propose\",\n \"props\",\n \"prorate\",\n \"protector\",\n \"protegee\",\n \"proton\",\n \"prototype\",\n \"protozoan\",\n \"protract\",\n \"protrude\",\n \"proud\",\n \"provable\",\n \"proved\",\n \"proven\",\n \"provided\",\n \"provider\",\n \"providing\",\n \"province\",\n \"proving\",\n \"provoke\",\n \"provoking\",\n \"provolone\",\n \"prowess\",\n \"prowler\",\n \"prowling\",\n \"proximity\",\n \"proxy\",\n \"prozac\",\n \"prude\",\n \"prudishly\",\n \"prune\",\n \"pruning\",\n \"pry\",\n \"psychic\",\n \"public\",\n \"publisher\",\n \"pucker\",\n \"pueblo\",\n \"pug\",\n \"pull\",\n \"pulmonary\",\n \"pulp\",\n \"pulsate\",\n \"pulse\",\n \"pulverize\",\n \"puma\",\n \"pumice\",\n \"pummel\",\n \"punch\",\n \"punctual\",\n \"punctuate\",\n \"punctured\",\n \"pungent\",\n \"punisher\",\n \"punk\",\n \"pupil\",\n \"puppet\",\n \"puppy\",\n \"purchase\",\n \"pureblood\",\n \"purebred\",\n \"purely\",\n \"pureness\",\n \"purgatory\",\n \"purge\",\n \"purging\",\n \"purifier\",\n \"purify\",\n \"purist\",\n \"puritan\",\n \"purity\",\n \"purple\",\n \"purplish\",\n \"purposely\",\n \"purr\",\n \"purse\",\n \"pursuable\",\n \"pursuant\",\n \"pursuit\",\n \"purveyor\",\n \"pushcart\",\n \"pushchair\",\n \"pusher\",\n \"pushiness\",\n \"pushing\",\n \"pushover\",\n \"pushpin\",\n \"pushup\",\n \"pushy\",\n \"putdown\",\n \"putt\",\n \"puzzle\",\n \"puzzling\",\n \"pyramid\",\n \"pyromania\",\n \"python\",\n \"quack\",\n \"quadrant\",\n \"quail\",\n \"quaintly\",\n \"quake\",\n \"quaking\",\n \"qualified\",\n \"qualifier\",\n \"qualify\",\n \"quality\",\n \"qualm\",\n \"quantum\",\n \"quarrel\",\n \"quarry\",\n \"quartered\",\n \"quarterly\",\n \"quarters\",\n \"quartet\",\n \"quench\",\n \"query\",\n \"quicken\",\n \"quickly\",\n \"quickness\",\n \"quicksand\",\n \"quickstep\",\n \"quiet\",\n \"quill\",\n \"quilt\",\n \"quintet\",\n \"quintuple\",\n \"quirk\",\n \"quit\",\n \"quiver\",\n \"quizzical\",\n \"quotable\",\n \"quotation\",\n \"quote\",\n \"rabid\",\n \"race\",\n \"racing\",\n \"racism\",\n \"rack\",\n \"racoon\",\n \"radar\",\n \"radial\",\n \"radiance\",\n \"radiantly\",\n \"radiated\",\n \"radiation\",\n \"radiator\",\n \"radio\",\n \"radish\",\n \"raffle\",\n \"raft\",\n \"rage\",\n \"ragged\",\n \"raging\",\n \"ragweed\",\n \"raider\",\n \"railcar\",\n \"railing\",\n \"railroad\",\n \"railway\",\n \"raisin\",\n \"rake\",\n \"raking\",\n \"rally\",\n \"ramble\",\n \"rambling\",\n \"ramp\",\n \"ramrod\",\n \"ranch\",\n \"rancidity\",\n \"random\",\n \"ranged\",\n \"ranger\",\n \"ranging\",\n \"ranked\",\n \"ranking\",\n \"ransack\",\n \"ranting\",\n \"rants\",\n \"rare\",\n \"rarity\",\n \"rascal\",\n \"rash\",\n \"rasping\",\n \"ravage\",\n \"raven\",\n \"ravine\",\n \"raving\",\n \"ravioli\",\n \"ravishing\",\n \"reabsorb\",\n \"reach\",\n \"reacquire\",\n \"reaction\",\n \"reactive\",\n \"reactor\",\n \"reaffirm\",\n \"ream\",\n \"reanalyze\",\n \"reappear\",\n \"reapply\",\n \"reappoint\",\n \"reapprove\",\n \"rearrange\",\n \"rearview\",\n \"reason\",\n \"reassign\",\n \"reassure\",\n \"reattach\",\n \"reawake\",\n \"rebalance\",\n \"rebate\",\n \"rebel\",\n \"rebirth\",\n \"reboot\",\n \"reborn\",\n \"rebound\",\n \"rebuff\",\n \"rebuild\",\n \"rebuilt\",\n \"reburial\",\n \"rebuttal\",\n \"recall\",\n \"recant\",\n \"recapture\",\n \"recast\",\n \"recede\",\n \"recent\",\n \"recess\",\n \"recharger\",\n \"recipient\",\n \"recital\",\n \"recite\",\n \"reckless\",\n \"reclaim\",\n \"recliner\",\n \"reclining\",\n \"recluse\",\n \"reclusive\",\n \"recognize\",\n \"recoil\",\n \"recollect\",\n \"recolor\",\n \"reconcile\",\n \"reconfirm\",\n \"reconvene\",\n \"recopy\",\n \"record\",\n \"recount\",\n \"recoup\",\n \"recovery\",\n \"recreate\",\n \"rectal\",\n \"rectangle\",\n \"rectified\",\n \"rectify\",\n \"recycled\",\n \"recycler\",\n \"recycling\",\n \"reemerge\",\n \"reenact\",\n \"reenter\",\n \"reentry\",\n \"reexamine\",\n \"referable\",\n \"referee\",\n \"reference\",\n \"refill\",\n \"refinance\",\n \"refined\",\n \"refinery\",\n \"refining\",\n \"refinish\",\n \"reflected\",\n \"reflector\",\n \"reflex\",\n \"reflux\",\n \"refocus\",\n \"refold\",\n \"reforest\",\n \"reformat\",\n \"reformed\",\n \"reformer\",\n \"reformist\",\n \"refract\",\n \"refrain\",\n \"refreeze\",\n \"refresh\",\n \"refried\",\n \"refueling\",\n \"refund\",\n \"refurbish\",\n \"refurnish\",\n \"refusal\",\n \"refuse\",\n \"refusing\",\n \"refutable\",\n \"refute\",\n \"regain\",\n \"regalia\",\n \"regally\",\n \"reggae\",\n \"regime\",\n \"region\",\n \"register\",\n \"registrar\",\n \"registry\",\n \"regress\",\n \"regretful\",\n \"regroup\",\n \"regular\",\n \"regulate\",\n \"regulator\",\n \"rehab\",\n \"reheat\",\n \"rehire\",\n \"rehydrate\",\n \"reimburse\",\n \"reissue\",\n \"reiterate\",\n \"rejoice\",\n \"rejoicing\",\n \"rejoin\",\n \"rekindle\",\n \"relapse\",\n \"relapsing\",\n \"relatable\",\n \"related\",\n \"relation\",\n \"relative\",\n \"relax\",\n \"relay\",\n \"relearn\",\n \"release\",\n \"relenting\",\n \"reliable\",\n \"reliably\",\n \"reliance\",\n \"reliant\",\n \"relic\",\n \"relieve\",\n \"relieving\",\n \"relight\",\n \"relish\",\n \"relive\",\n \"reload\",\n \"relocate\",\n \"relock\",\n \"reluctant\",\n \"rely\",\n \"remake\",\n \"remark\",\n \"remarry\",\n \"rematch\",\n \"remedial\",\n \"remedy\",\n \"remember\",\n \"reminder\",\n \"remindful\",\n \"remission\",\n \"remix\",\n \"remnant\",\n \"remodeler\",\n \"remold\",\n \"remorse\",\n \"remote\",\n \"removable\",\n \"removal\",\n \"removed\",\n \"remover\",\n \"removing\",\n \"rename\",\n \"renderer\",\n \"rendering\",\n \"rendition\",\n \"renegade\",\n \"renewable\",\n \"renewably\",\n \"renewal\",\n \"renewed\",\n \"renounce\",\n \"renovate\",\n \"renovator\",\n \"rentable\",\n \"rental\",\n \"rented\",\n \"renter\",\n \"reoccupy\",\n \"reoccur\",\n \"reopen\",\n \"reorder\",\n \"repackage\",\n \"repacking\",\n \"repaint\",\n \"repair\",\n \"repave\",\n \"repaying\",\n \"repayment\",\n \"repeal\",\n \"repeated\",\n \"repeater\",\n \"repent\",\n \"rephrase\",\n \"replace\",\n \"replay\",\n \"replica\",\n \"reply\",\n \"reporter\",\n \"repose\",\n \"repossess\",\n \"repost\",\n \"repressed\",\n \"reprimand\",\n \"reprint\",\n \"reprise\",\n \"reproach\",\n \"reprocess\",\n \"reproduce\",\n \"reprogram\",\n \"reps\",\n \"reptile\",\n \"reptilian\",\n \"repugnant\",\n \"repulsion\",\n \"repulsive\",\n \"repurpose\",\n \"reputable\",\n \"reputably\",\n \"request\",\n \"require\",\n \"requisite\",\n \"reroute\",\n \"rerun\",\n \"resale\",\n \"resample\",\n \"rescuer\",\n \"reseal\",\n \"research\",\n \"reselect\",\n \"reseller\",\n \"resemble\",\n \"resend\",\n \"resent\",\n \"reset\",\n \"reshape\",\n \"reshoot\",\n \"reshuffle\",\n \"residence\",\n \"residency\",\n \"resident\",\n \"residual\",\n \"residue\",\n \"resigned\",\n \"resilient\",\n \"resistant\",\n \"resisting\",\n \"resize\",\n \"resolute\",\n \"resolved\",\n \"resonant\",\n \"resonate\",\n \"resort\",\n \"resource\",\n \"respect\",\n \"resubmit\",\n \"result\",\n \"resume\",\n \"resupply\",\n \"resurface\",\n \"resurrect\",\n \"retail\",\n \"retainer\",\n \"retaining\",\n \"retake\",\n \"retaliate\",\n \"retention\",\n \"rethink\",\n \"retinal\",\n \"retired\",\n \"retiree\",\n \"retiring\",\n \"retold\",\n \"retool\",\n \"retorted\",\n \"retouch\",\n \"retrace\",\n \"retract\",\n \"retrain\",\n \"retread\",\n \"retreat\",\n \"retrial\",\n \"retrieval\",\n \"retriever\",\n \"retry\",\n \"return\",\n \"retying\",\n \"retype\",\n \"reunion\",\n \"reunite\",\n \"reusable\",\n \"reuse\",\n \"reveal\",\n \"reveler\",\n \"revenge\",\n \"revenue\",\n \"reverb\",\n \"revered\",\n \"reverence\",\n \"reverend\",\n \"reversal\",\n \"reverse\",\n \"reversing\",\n \"reversion\",\n \"revert\",\n \"revisable\",\n \"revise\",\n \"revision\",\n \"revisit\",\n \"revivable\",\n \"revival\",\n \"reviver\",\n \"reviving\",\n \"revocable\",\n \"revoke\",\n \"revolt\",\n \"revolver\",\n \"revolving\",\n \"reward\",\n \"rewash\",\n \"rewind\",\n \"rewire\",\n \"reword\",\n \"rework\",\n \"rewrap\",\n \"rewrite\",\n \"rhyme\",\n \"ribbon\",\n \"ribcage\",\n \"rice\",\n \"riches\",\n \"richly\",\n \"richness\",\n \"rickety\",\n \"ricotta\",\n \"riddance\",\n \"ridden\",\n \"ride\",\n \"riding\",\n \"rifling\",\n \"rift\",\n \"rigging\",\n \"rigid\",\n \"rigor\",\n \"rimless\",\n \"rimmed\",\n \"rind\",\n \"rink\",\n \"rinse\",\n \"rinsing\",\n \"riot\",\n \"ripcord\",\n \"ripeness\",\n \"ripening\",\n \"ripping\",\n \"ripple\",\n \"rippling\",\n \"riptide\",\n \"rise\",\n \"rising\",\n \"risk\",\n \"risotto\",\n \"ritalin\",\n \"ritzy\",\n \"rival\",\n \"riverbank\",\n \"riverbed\",\n \"riverboat\",\n \"riverside\",\n \"riveter\",\n \"riveting\",\n \"roamer\",\n \"roaming\",\n \"roast\",\n \"robbing\",\n \"robe\",\n \"robin\",\n \"robotics\",\n \"robust\",\n \"rockband\",\n \"rocker\",\n \"rocket\",\n \"rockfish\",\n \"rockiness\",\n \"rocking\",\n \"rocklike\",\n \"rockslide\",\n \"rockstar\",\n \"rocky\",\n \"rogue\",\n \"roman\",\n \"romp\",\n \"rope\",\n \"roping\",\n \"roster\",\n \"rosy\",\n \"rotten\",\n \"rotting\",\n \"rotunda\",\n \"roulette\",\n \"rounding\",\n \"roundish\",\n \"roundness\",\n \"roundup\",\n \"roundworm\",\n \"routine\",\n \"routing\",\n \"rover\",\n \"roving\",\n \"royal\",\n \"rubbed\",\n \"rubber\",\n \"rubbing\",\n \"rubble\",\n \"rubdown\",\n \"ruby\",\n \"ruckus\",\n \"rudder\",\n \"rug\",\n \"ruined\",\n \"rule\",\n \"rumble\",\n \"rumbling\",\n \"rummage\",\n \"rumor\",\n \"runaround\",\n \"rundown\",\n \"runner\",\n \"running\",\n \"runny\",\n \"runt\",\n \"runway\",\n \"rupture\",\n \"rural\",\n \"ruse\",\n \"rush\",\n \"rust\",\n \"rut\",\n \"sabbath\",\n \"sabotage\",\n \"sacrament\",\n \"sacred\",\n \"sacrifice\",\n \"sadden\",\n \"saddlebag\",\n \"saddled\",\n \"saddling\",\n \"sadly\",\n \"sadness\",\n \"safari\",\n \"safeguard\",\n \"safehouse\",\n \"safely\",\n \"safeness\",\n \"saffron\",\n \"saga\",\n \"sage\",\n \"sagging\",\n \"saggy\",\n \"said\",\n \"saint\",\n \"sake\",\n \"salad\",\n \"salami\",\n \"salaried\",\n \"salary\",\n \"saline\",\n \"salon\",\n \"saloon\",\n \"salsa\",\n \"salt\",\n \"salutary\",\n \"salute\",\n \"salvage\",\n \"salvaging\",\n \"salvation\",\n \"same\",\n \"sample\",\n \"sampling\",\n \"sanction\",\n \"sanctity\",\n \"sanctuary\",\n \"sandal\",\n \"sandbag\",\n \"sandbank\",\n \"sandbar\",\n \"sandblast\",\n \"sandbox\",\n \"sanded\",\n \"sandfish\",\n \"sanding\",\n \"sandlot\",\n \"sandpaper\",\n \"sandpit\",\n \"sandstone\",\n \"sandstorm\",\n \"sandworm\",\n \"sandy\",\n \"sanitary\",\n \"sanitizer\",\n \"sank\",\n \"santa\",\n \"sapling\",\n \"sappiness\",\n \"sappy\",\n \"sarcasm\",\n \"sarcastic\",\n \"sardine\",\n \"sash\",\n \"sasquatch\",\n \"sassy\",\n \"satchel\",\n \"satiable\",\n \"satin\",\n \"satirical\",\n \"satisfied\",\n \"satisfy\",\n \"saturate\",\n \"saturday\",\n \"sauciness\",\n \"saucy\",\n \"sauna\",\n \"savage\",\n \"savanna\",\n \"saved\",\n \"savings\",\n \"savior\",\n \"savor\",\n \"saxophone\",\n \"say\",\n \"scabbed\",\n \"scabby\",\n \"scalded\",\n \"scalding\",\n \"scale\",\n \"scaling\",\n \"scallion\",\n \"scallop\",\n \"scalping\",\n \"scam\",\n \"scandal\",\n \"scanner\",\n \"scanning\",\n \"scant\",\n \"scapegoat\",\n \"scarce\",\n \"scarcity\",\n \"scarecrow\",\n \"scared\",\n \"scarf\",\n \"scarily\",\n \"scariness\",\n \"scarring\",\n \"scary\",\n \"scavenger\",\n \"scenic\",\n \"schedule\",\n \"schematic\",\n \"scheme\",\n \"scheming\",\n \"schilling\",\n \"schnapps\",\n \"scholar\",\n \"science\",\n \"scientist\",\n \"scion\",\n \"scoff\",\n \"scolding\",\n \"scone\",\n \"scoop\",\n \"scooter\",\n \"scope\",\n \"scorch\",\n \"scorebook\",\n \"scorecard\",\n \"scored\",\n \"scoreless\",\n \"scorer\",\n \"scoring\",\n \"scorn\",\n \"scorpion\",\n \"scotch\",\n \"scoundrel\",\n \"scoured\",\n \"scouring\",\n \"scouting\",\n \"scouts\",\n \"scowling\",\n \"scrabble\",\n \"scraggly\",\n \"scrambled\",\n \"scrambler\",\n \"scrap\",\n \"scratch\",\n \"scrawny\",\n \"screen\",\n \"scribble\",\n \"scribe\",\n \"scribing\",\n \"scrimmage\",\n \"script\",\n \"scroll\",\n \"scrooge\",\n \"scrounger\",\n \"scrubbed\",\n \"scrubber\",\n \"scruffy\",\n \"scrunch\",\n \"scrutiny\",\n \"scuba\",\n \"scuff\",\n \"sculptor\",\n \"sculpture\",\n \"scurvy\",\n \"scuttle\",\n \"secluded\",\n \"secluding\",\n \"seclusion\",\n \"second\",\n \"secrecy\",\n \"secret\",\n \"sectional\",\n \"sector\",\n \"secular\",\n \"securely\",\n \"security\",\n \"sedan\",\n \"sedate\",\n \"sedation\",\n \"sedative\",\n \"sediment\",\n \"seduce\",\n \"seducing\",\n \"segment\",\n \"seismic\",\n \"seizing\",\n \"seldom\",\n \"selected\",\n \"selection\",\n \"selective\",\n \"selector\",\n \"self\",\n \"seltzer\",\n \"semantic\",\n \"semester\",\n \"semicolon\",\n \"semifinal\",\n \"seminar\",\n \"semisoft\",\n \"semisweet\",\n \"senate\",\n \"senator\",\n \"send\",\n \"senior\",\n \"senorita\",\n \"sensation\",\n \"sensitive\",\n \"sensitize\",\n \"sensually\",\n \"sensuous\",\n \"sepia\",\n \"september\",\n \"septic\",\n \"septum\",\n \"sequel\",\n \"sequence\",\n \"sequester\",\n \"series\",\n \"sermon\",\n \"serotonin\",\n \"serpent\",\n \"serrated\",\n \"serve\",\n \"service\",\n \"serving\",\n \"sesame\",\n \"sessions\",\n \"setback\",\n \"setting\",\n \"settle\",\n \"settling\",\n \"setup\",\n \"sevenfold\",\n \"seventeen\",\n \"seventh\",\n \"seventy\",\n \"severity\",\n \"shabby\",\n \"shack\",\n \"shaded\",\n \"shadily\",\n \"shadiness\",\n \"shading\",\n \"shadow\",\n \"shady\",\n \"shaft\",\n \"shakable\",\n \"shakily\",\n \"shakiness\",\n \"shaking\",\n \"shaky\",\n \"shale\",\n \"shallot\",\n \"shallow\",\n \"shame\",\n \"shampoo\",\n \"shamrock\",\n \"shank\",\n \"shanty\",\n \"shape\",\n \"shaping\",\n \"share\",\n \"sharpener\",\n \"sharper\",\n \"sharpie\",\n \"sharply\",\n \"sharpness\",\n \"shawl\",\n \"sheath\",\n \"shed\",\n \"sheep\",\n \"sheet\",\n \"shelf\",\n \"shell\",\n \"shelter\",\n \"shelve\",\n \"shelving\",\n \"sherry\",\n \"shield\",\n \"shifter\",\n \"shifting\",\n \"shiftless\",\n \"shifty\",\n \"shimmer\",\n \"shimmy\",\n \"shindig\",\n \"shine\",\n \"shingle\",\n \"shininess\",\n \"shining\",\n \"shiny\",\n \"ship\",\n \"shirt\",\n \"shivering\",\n \"shock\",\n \"shone\",\n \"shoplift\",\n \"shopper\",\n \"shopping\",\n \"shoptalk\",\n \"shore\",\n \"shortage\",\n \"shortcake\",\n \"shortcut\",\n \"shorten\",\n \"shorter\",\n \"shorthand\",\n \"shortlist\",\n \"shortly\",\n \"shortness\",\n \"shorts\",\n \"shortwave\",\n \"shorty\",\n \"shout\",\n \"shove\",\n \"showbiz\",\n \"showcase\",\n \"showdown\",\n \"shower\",\n \"showgirl\",\n \"showing\",\n \"showman\",\n \"shown\",\n \"showoff\",\n \"showpiece\",\n \"showplace\",\n \"showroom\",\n \"showy\",\n \"shrank\",\n \"shrapnel\",\n \"shredder\",\n \"shredding\",\n \"shrewdly\",\n \"shriek\",\n \"shrill\",\n \"shrimp\",\n \"shrine\",\n \"shrink\",\n \"shrivel\",\n \"shrouded\",\n \"shrubbery\",\n \"shrubs\",\n \"shrug\",\n \"shrunk\",\n \"shucking\",\n \"shudder\",\n \"shuffle\",\n \"shuffling\",\n \"shun\",\n \"shush\",\n \"shut\",\n \"shy\",\n \"siamese\",\n \"siberian\",\n \"sibling\",\n \"siding\",\n \"sierra\",\n \"siesta\",\n \"sift\",\n \"sighing\",\n \"silenced\",\n \"silencer\",\n \"silent\",\n \"silica\",\n \"silicon\",\n \"silk\",\n \"silliness\",\n \"silly\",\n \"silo\",\n \"silt\",\n \"silver\",\n \"similarly\",\n \"simile\",\n \"simmering\",\n \"simple\",\n \"simplify\",\n \"simply\",\n \"sincere\",\n \"sincerity\",\n \"singer\",\n \"singing\",\n \"single\",\n \"singular\",\n \"sinister\",\n \"sinless\",\n \"sinner\",\n \"sinuous\",\n \"sip\",\n \"siren\",\n \"sister\",\n \"sitcom\",\n \"sitter\",\n \"sitting\",\n \"situated\",\n \"situation\",\n \"sixfold\",\n \"sixteen\",\n \"sixth\",\n \"sixties\",\n \"sixtieth\",\n \"sixtyfold\",\n \"sizable\",\n \"sizably\",\n \"size\",\n \"sizing\",\n \"sizzle\",\n \"sizzling\",\n \"skater\",\n \"skating\",\n \"skedaddle\",\n \"skeletal\",\n \"skeleton\",\n \"skeptic\",\n \"sketch\",\n \"skewed\",\n \"skewer\",\n \"skid\",\n \"skied\",\n \"skier\",\n \"skies\",\n \"skiing\",\n \"skilled\",\n \"skillet\",\n \"skillful\",\n \"skimmed\",\n \"skimmer\",\n \"skimming\",\n \"skimpily\",\n \"skincare\",\n \"skinhead\",\n \"skinless\",\n \"skinning\",\n \"skinny\",\n \"skintight\",\n \"skipper\",\n \"skipping\",\n \"skirmish\",\n \"skirt\",\n \"skittle\",\n \"skydiver\",\n \"skylight\",\n \"skyline\",\n \"skype\",\n \"skyrocket\",\n \"skyward\",\n \"slab\",\n \"slacked\",\n \"slacker\",\n \"slacking\",\n \"slackness\",\n \"slacks\",\n \"slain\",\n \"slam\",\n \"slander\",\n \"slang\",\n \"slapping\",\n \"slapstick\",\n \"slashed\",\n \"slashing\",\n \"slate\",\n \"slather\",\n \"slaw\",\n \"sled\",\n \"sleek\",\n \"sleep\",\n \"sleet\",\n \"sleeve\",\n \"slept\",\n \"sliceable\",\n \"sliced\",\n \"slicer\",\n \"slicing\",\n \"slick\",\n \"slider\",\n \"slideshow\",\n \"sliding\",\n \"slighted\",\n \"slighting\",\n \"slightly\",\n \"slimness\",\n \"slimy\",\n \"slinging\",\n \"slingshot\",\n \"slinky\",\n \"slip\",\n \"slit\",\n \"sliver\",\n \"slobbery\",\n \"slogan\",\n \"sloped\",\n \"sloping\",\n \"sloppily\",\n \"sloppy\",\n \"slot\",\n \"slouching\",\n \"slouchy\",\n \"sludge\",\n \"slug\",\n \"slum\",\n \"slurp\",\n \"slush\",\n \"sly\",\n \"small\",\n \"smartly\",\n \"smartness\",\n \"smasher\",\n \"smashing\",\n \"smashup\",\n \"smell\",\n \"smelting\",\n \"smile\",\n \"smilingly\",\n \"smirk\",\n \"smite\",\n \"smith\",\n \"smitten\",\n \"smock\",\n \"smog\",\n \"smoked\",\n \"smokeless\",\n \"smokiness\",\n \"smoking\",\n \"smoky\",\n \"smolder\",\n \"smooth\",\n \"smother\",\n \"smudge\",\n \"smudgy\",\n \"smuggler\",\n \"smuggling\",\n \"smugly\",\n \"smugness\",\n \"snack\",\n \"snagged\",\n \"snaking\",\n \"snap\",\n \"snare\",\n \"snarl\",\n \"snazzy\",\n \"sneak\",\n \"sneer\",\n \"sneeze\",\n \"sneezing\",\n \"snide\",\n \"sniff\",\n \"snippet\",\n \"snipping\",\n \"snitch\",\n \"snooper\",\n \"snooze\",\n \"snore\",\n \"snoring\",\n \"snorkel\",\n \"snort\",\n \"snout\",\n \"snowbird\",\n \"snowboard\",\n \"snowbound\",\n \"snowcap\",\n \"snowdrift\",\n \"snowdrop\",\n \"snowfall\",\n \"snowfield\",\n \"snowflake\",\n \"snowiness\",\n \"snowless\",\n \"snowman\",\n \"snowplow\",\n \"snowshoe\",\n \"snowstorm\",\n \"snowsuit\",\n \"snowy\",\n \"snub\",\n \"snuff\",\n \"snuggle\",\n \"snugly\",\n \"snugness\",\n \"speak\",\n \"spearfish\",\n \"spearhead\",\n \"spearman\",\n \"spearmint\",\n \"species\",\n \"specimen\",\n \"specked\",\n \"speckled\",\n \"specks\",\n \"spectacle\",\n \"spectator\",\n \"spectrum\",\n \"speculate\",\n \"speech\",\n \"speed\",\n \"spellbind\",\n \"speller\",\n \"spelling\",\n \"spendable\",\n \"spender\",\n \"spending\",\n \"spent\",\n \"spew\",\n \"sphere\",\n \"spherical\",\n \"sphinx\",\n \"spider\",\n \"spied\",\n \"spiffy\",\n \"spill\",\n \"spilt\",\n \"spinach\",\n \"spinal\",\n \"spindle\",\n \"spinner\",\n \"spinning\",\n \"spinout\",\n \"spinster\",\n \"spiny\",\n \"spiral\",\n \"spirited\",\n \"spiritism\",\n \"spirits\",\n \"spiritual\",\n \"splashed\",\n \"splashing\",\n \"splashy\",\n \"splatter\",\n \"spleen\",\n \"splendid\",\n \"splendor\",\n \"splice\",\n \"splicing\",\n \"splinter\",\n \"splotchy\",\n \"splurge\",\n \"spoilage\",\n \"spoiled\",\n \"spoiler\",\n \"spoiling\",\n \"spoils\",\n \"spoken\",\n \"spokesman\",\n \"sponge\",\n \"spongy\",\n \"sponsor\",\n \"spoof\",\n \"spookily\",\n \"spooky\",\n \"spool\",\n \"spoon\",\n \"spore\",\n \"sporting\",\n \"sports\",\n \"sporty\",\n \"spotless\",\n \"spotlight\",\n \"spotted\",\n \"spotter\",\n \"spotting\",\n \"spotty\",\n \"spousal\",\n \"spouse\",\n \"spout\",\n \"sprain\",\n \"sprang\",\n \"sprawl\",\n \"spray\",\n \"spree\",\n \"sprig\",\n \"spring\",\n \"sprinkled\",\n \"sprinkler\",\n \"sprint\",\n \"sprite\",\n \"sprout\",\n \"spruce\",\n \"sprung\",\n \"spry\",\n \"spud\",\n \"spur\",\n \"sputter\",\n \"spyglass\",\n \"squabble\",\n \"squad\",\n \"squall\",\n \"squander\",\n \"squash\",\n \"squatted\",\n \"squatter\",\n \"squatting\",\n \"squeak\",\n \"squealer\",\n \"squealing\",\n \"squeamish\",\n \"squeegee\",\n \"squeeze\",\n \"squeezing\",\n \"squid\",\n \"squiggle\",\n \"squiggly\",\n \"squint\",\n \"squire\",\n \"squirt\",\n \"squishier\",\n \"squishy\",\n \"stability\",\n \"stabilize\",\n \"stable\",\n \"stack\",\n \"stadium\",\n \"staff\",\n \"stage\",\n \"staging\",\n \"stagnant\",\n \"stagnate\",\n \"stainable\",\n \"stained\",\n \"staining\",\n \"stainless\",\n \"stalemate\",\n \"staleness\",\n \"stalling\",\n \"stallion\",\n \"stamina\",\n \"stammer\",\n \"stamp\",\n \"stand\",\n \"stank\",\n \"staple\",\n \"stapling\",\n \"starboard\",\n \"starch\",\n \"stardom\",\n \"stardust\",\n \"starfish\",\n \"stargazer\",\n \"staring\",\n \"stark\",\n \"starless\",\n \"starlet\",\n \"starlight\",\n \"starlit\",\n \"starring\",\n \"starry\",\n \"starship\",\n \"starter\",\n \"starting\",\n \"startle\",\n \"startling\",\n \"startup\",\n \"starved\",\n \"starving\",\n \"stash\",\n \"state\",\n \"static\",\n \"statistic\",\n \"statue\",\n \"stature\",\n \"status\",\n \"statute\",\n \"statutory\",\n \"staunch\",\n \"stays\",\n \"steadfast\",\n \"steadier\",\n \"steadily\",\n \"steadying\",\n \"steam\",\n \"steed\",\n \"steep\",\n \"steerable\",\n \"steering\",\n \"steersman\",\n \"stegosaur\",\n \"stellar\",\n \"stem\",\n \"stench\",\n \"stencil\",\n \"step\",\n \"stereo\",\n \"sterile\",\n \"sterility\",\n \"sterilize\",\n \"sterling\",\n \"sternness\",\n \"sternum\",\n \"stew\",\n \"stick\",\n \"stiffen\",\n \"stiffly\",\n \"stiffness\",\n \"stifle\",\n \"stifling\",\n \"stillness\",\n \"stilt\",\n \"stimulant\",\n \"stimulate\",\n \"stimuli\",\n \"stimulus\",\n \"stinger\",\n \"stingily\",\n \"stinging\",\n \"stingray\",\n \"stingy\",\n \"stinking\",\n \"stinky\",\n \"stipend\",\n \"stipulate\",\n \"stir\",\n \"stitch\",\n \"stock\",\n \"stoic\",\n \"stoke\",\n \"stole\",\n \"stomp\",\n \"stonewall\",\n \"stoneware\",\n \"stonework\",\n \"stoning\",\n \"stony\",\n \"stood\",\n \"stooge\",\n \"stool\",\n \"stoop\",\n \"stoplight\",\n \"stoppable\",\n \"stoppage\",\n \"stopped\",\n \"stopper\",\n \"stopping\",\n \"stopwatch\",\n \"storable\",\n \"storage\",\n \"storeroom\",\n \"storewide\",\n \"storm\",\n \"stout\",\n \"stove\",\n \"stowaway\",\n \"stowing\",\n \"straddle\",\n \"straggler\",\n \"strained\",\n \"strainer\",\n \"straining\",\n \"strangely\",\n \"stranger\",\n \"strangle\",\n \"strategic\",\n \"strategy\",\n \"stratus\",\n \"straw\",\n \"stray\",\n \"streak\",\n \"stream\",\n \"street\",\n \"strength\",\n \"strenuous\",\n \"strep\",\n \"stress\",\n \"stretch\",\n \"strewn\",\n \"stricken\",\n \"strict\",\n \"stride\",\n \"strife\",\n \"strike\",\n \"striking\",\n \"strive\",\n \"striving\",\n \"strobe\",\n \"strode\",\n \"stroller\",\n \"strongbox\",\n \"strongly\",\n \"strongman\",\n \"struck\",\n \"structure\",\n \"strudel\",\n \"struggle\",\n \"strum\",\n \"strung\",\n \"strut\",\n \"stubbed\",\n \"stubble\",\n \"stubbly\",\n \"stubborn\",\n \"stucco\",\n \"stuck\",\n \"student\",\n \"studied\",\n \"studio\",\n \"study\",\n \"stuffed\",\n \"stuffing\",\n \"stuffy\",\n \"stumble\",\n \"stumbling\",\n \"stump\",\n \"stung\",\n \"stunned\",\n \"stunner\",\n \"stunning\",\n \"stunt\",\n \"stupor\",\n \"sturdily\",\n \"sturdy\",\n \"styling\",\n \"stylishly\",\n \"stylist\",\n \"stylized\",\n \"stylus\",\n \"suave\",\n \"subarctic\",\n \"subatomic\",\n \"subdivide\",\n \"subdued\",\n \"subduing\",\n \"subfloor\",\n \"subgroup\",\n \"subheader\",\n \"subject\",\n \"sublease\",\n \"sublet\",\n \"sublevel\",\n \"sublime\",\n \"submarine\",\n \"submerge\",\n \"submersed\",\n \"submitter\",\n \"subpanel\",\n \"subpar\",\n \"subplot\",\n \"subprime\",\n \"subscribe\",\n \"subscript\",\n \"subsector\",\n \"subside\",\n \"subsiding\",\n \"subsidize\",\n \"subsidy\",\n \"subsoil\",\n \"subsonic\",\n \"substance\",\n \"subsystem\",\n \"subtext\",\n \"subtitle\",\n \"subtly\",\n \"subtotal\",\n \"subtract\",\n \"subtype\",\n \"suburb\",\n \"subway\",\n \"subwoofer\",\n \"subzero\",\n \"succulent\",\n \"such\",\n \"suction\",\n \"sudden\",\n \"sudoku\",\n \"suds\",\n \"sufferer\",\n \"suffering\",\n \"suffice\",\n \"suffix\",\n \"suffocate\",\n \"suffrage\",\n \"sugar\",\n \"suggest\",\n \"suing\",\n \"suitable\",\n \"suitably\",\n \"suitcase\",\n \"suitor\",\n \"sulfate\",\n \"sulfide\",\n \"sulfite\",\n \"sulfur\",\n \"sulk\",\n \"sullen\",\n \"sulphate\",\n \"sulphuric\",\n \"sultry\",\n \"superbowl\",\n \"superglue\",\n \"superhero\",\n \"superior\",\n \"superjet\",\n \"superman\",\n \"supermom\",\n \"supernova\",\n \"supervise\",\n \"supper\",\n \"supplier\",\n \"supply\",\n \"support\",\n \"supremacy\",\n \"supreme\",\n \"surcharge\",\n \"surely\",\n \"sureness\",\n \"surface\",\n \"surfacing\",\n \"surfboard\",\n \"surfer\",\n \"surgery\",\n \"surgical\",\n \"surging\",\n \"surname\",\n \"surpass\",\n \"surplus\",\n \"surprise\",\n \"surreal\",\n \"surrender\",\n \"surrogate\",\n \"surround\",\n \"survey\",\n \"survival\",\n \"survive\",\n \"surviving\",\n \"survivor\",\n \"sushi\",\n \"suspect\",\n \"suspend\",\n \"suspense\",\n \"sustained\",\n \"sustainer\",\n \"swab\",\n \"swaddling\",\n \"swagger\",\n \"swampland\",\n \"swan\",\n \"swapping\",\n \"swarm\",\n \"sway\",\n \"swear\",\n \"sweat\",\n \"sweep\",\n \"swell\",\n \"swept\",\n \"swerve\",\n \"swifter\",\n \"swiftly\",\n \"swiftness\",\n \"swimmable\",\n \"swimmer\",\n \"swimming\",\n \"swimsuit\",\n \"swimwear\",\n \"swinger\",\n \"swinging\",\n \"swipe\",\n \"swirl\",\n \"switch\",\n \"swivel\",\n \"swizzle\",\n \"swooned\",\n \"swoop\",\n \"swoosh\",\n \"swore\",\n \"sworn\",\n \"swung\",\n \"sycamore\",\n \"sympathy\",\n \"symphonic\",\n \"symphony\",\n \"symptom\",\n \"synapse\",\n \"syndrome\",\n \"synergy\",\n \"synopses\",\n \"synopsis\",\n \"synthesis\",\n \"synthetic\",\n \"syrup\",\n \"system\",\n \"t-shirt\",\n \"tabasco\",\n \"tabby\",\n \"tableful\",\n \"tables\",\n \"tablet\",\n \"tableware\",\n \"tabloid\",\n \"tackiness\",\n \"tacking\",\n \"tackle\",\n \"tackling\",\n \"tacky\",\n \"taco\",\n \"tactful\",\n \"tactical\",\n \"tactics\",\n \"tactile\",\n \"tactless\",\n \"tadpole\",\n \"taekwondo\",\n \"tag\",\n \"tainted\",\n \"take\",\n \"taking\",\n \"talcum\",\n \"talisman\",\n \"tall\",\n \"talon\",\n \"tamale\",\n \"tameness\",\n \"tamer\",\n \"tamper\",\n \"tank\",\n \"tanned\",\n \"tannery\",\n \"tanning\",\n \"tantrum\",\n \"tapeless\",\n \"tapered\",\n \"tapering\",\n \"tapestry\",\n \"tapioca\",\n \"tapping\",\n \"taps\",\n \"tarantula\",\n \"target\",\n \"tarmac\",\n \"tarnish\",\n \"tarot\",\n \"tartar\",\n \"tartly\",\n \"tartness\",\n \"task\",\n \"tassel\",\n \"taste\",\n \"tastiness\",\n \"tasting\",\n \"tasty\",\n \"tattered\",\n \"tattle\",\n \"tattling\",\n \"tattoo\",\n \"taunt\",\n \"tavern\",\n \"thank\",\n \"that\",\n \"thaw\",\n \"theater\",\n \"theatrics\",\n \"thee\",\n \"theft\",\n \"theme\",\n \"theology\",\n \"theorize\",\n \"thermal\",\n \"thermos\",\n \"thesaurus\",\n \"these\",\n \"thesis\",\n \"thespian\",\n \"thicken\",\n \"thicket\",\n \"thickness\",\n \"thieving\",\n \"thievish\",\n \"thigh\",\n \"thimble\",\n \"thing\",\n \"think\",\n \"thinly\",\n \"thinner\",\n \"thinness\",\n \"thinning\",\n \"thirstily\",\n \"thirsting\",\n \"thirsty\",\n \"thirteen\",\n \"thirty\",\n \"thong\",\n \"thorn\",\n \"those\",\n \"thousand\",\n \"thrash\",\n \"thread\",\n \"threaten\",\n \"threefold\",\n \"thrift\",\n \"thrill\",\n \"thrive\",\n \"thriving\",\n \"throat\",\n \"throbbing\",\n \"throng\",\n \"throttle\",\n \"throwaway\",\n \"throwback\",\n \"thrower\",\n \"throwing\",\n \"thud\",\n \"thumb\",\n \"thumping\",\n \"thursday\",\n \"thus\",\n \"thwarting\",\n \"thyself\",\n \"tiara\",\n \"tibia\",\n \"tidal\",\n \"tidbit\",\n \"tidiness\",\n \"tidings\",\n \"tidy\",\n \"tiger\",\n \"tighten\",\n \"tightly\",\n \"tightness\",\n \"tightrope\",\n \"tightwad\",\n \"tigress\",\n \"tile\",\n \"tiling\",\n \"till\",\n \"tilt\",\n \"timid\",\n \"timing\",\n \"timothy\",\n \"tinderbox\",\n \"tinfoil\",\n \"tingle\",\n \"tingling\",\n \"tingly\",\n \"tinker\",\n \"tinkling\",\n \"tinsel\",\n \"tinsmith\",\n \"tint\",\n \"tinwork\",\n \"tiny\",\n \"tipoff\",\n \"tipped\",\n \"tipper\",\n \"tipping\",\n \"tiptoeing\",\n \"tiptop\",\n \"tiring\",\n \"tissue\",\n \"trace\",\n \"tracing\",\n \"track\",\n \"traction\",\n \"tractor\",\n \"trade\",\n \"trading\",\n \"tradition\",\n \"traffic\",\n \"tragedy\",\n \"trailing\",\n \"trailside\",\n \"train\",\n \"traitor\",\n \"trance\",\n \"tranquil\",\n \"transfer\",\n \"transform\",\n \"translate\",\n \"transpire\",\n \"transport\",\n \"transpose\",\n \"trapdoor\",\n \"trapeze\",\n \"trapezoid\",\n \"trapped\",\n \"trapper\",\n \"trapping\",\n \"traps\",\n \"trash\",\n \"travel\",\n \"traverse\",\n \"travesty\",\n \"tray\",\n \"treachery\",\n \"treading\",\n \"treadmill\",\n \"treason\",\n \"treat\",\n \"treble\",\n \"tree\",\n \"trekker\",\n \"tremble\",\n \"trembling\",\n \"tremor\",\n \"trench\",\n \"trend\",\n \"trespass\",\n \"triage\",\n \"trial\",\n \"triangle\",\n \"tribesman\",\n \"tribunal\",\n \"tribune\",\n \"tributary\",\n \"tribute\",\n \"triceps\",\n \"trickery\",\n \"trickily\",\n \"tricking\",\n \"trickle\",\n \"trickster\",\n \"tricky\",\n \"tricolor\",\n \"tricycle\",\n \"trident\",\n \"tried\",\n \"trifle\",\n \"trifocals\",\n \"trillion\",\n \"trilogy\",\n \"trimester\",\n \"trimmer\",\n \"trimming\",\n \"trimness\",\n \"trinity\",\n \"trio\",\n \"tripod\",\n \"tripping\",\n \"triumph\",\n \"trivial\",\n \"trodden\",\n \"trolling\",\n \"trombone\",\n \"trophy\",\n \"tropical\",\n \"tropics\",\n \"trouble\",\n \"troubling\",\n \"trough\",\n \"trousers\",\n \"trout\",\n \"trowel\",\n \"truce\",\n \"truck\",\n \"truffle\",\n \"trump\",\n \"trunks\",\n \"trustable\",\n \"trustee\",\n \"trustful\",\n \"trusting\",\n \"trustless\",\n \"truth\",\n \"try\",\n \"tubby\",\n \"tubeless\",\n \"tubular\",\n \"tucking\",\n \"tuesday\",\n \"tug\",\n \"tuition\",\n \"tulip\",\n \"tumble\",\n \"tumbling\",\n \"tummy\",\n \"turban\",\n \"turbine\",\n \"turbofan\",\n \"turbojet\",\n \"turbulent\",\n \"turf\",\n \"turkey\",\n \"turmoil\",\n \"turret\",\n \"turtle\",\n \"tusk\",\n \"tutor\",\n \"tutu\",\n \"tux\",\n \"tweak\",\n \"tweed\",\n \"tweet\",\n \"tweezers\",\n \"twelve\",\n \"twentieth\",\n \"twenty\",\n \"twerp\",\n \"twice\",\n \"twiddle\",\n \"twiddling\",\n \"twig\",\n \"twilight\",\n \"twine\",\n \"twins\",\n \"twirl\",\n \"twistable\",\n \"twisted\",\n \"twister\",\n \"twisting\",\n \"twisty\",\n \"twitch\",\n \"twitter\",\n \"tycoon\",\n \"tying\",\n \"tyke\",\n \"udder\",\n \"ultimate\",\n \"ultimatum\",\n \"ultra\",\n \"umbilical\",\n \"umbrella\",\n \"umpire\",\n \"unabashed\",\n \"unable\",\n \"unadorned\",\n \"unadvised\",\n \"unafraid\",\n \"unaired\",\n \"unaligned\",\n \"unaltered\",\n \"unarmored\",\n \"unashamed\",\n \"unaudited\",\n \"unawake\",\n \"unaware\",\n \"unbaked\",\n \"unbalance\",\n \"unbeaten\",\n \"unbend\",\n \"unbent\",\n \"unbiased\",\n \"unbitten\",\n \"unblended\",\n \"unblessed\",\n \"unblock\",\n \"unbolted\",\n \"unbounded\",\n \"unboxed\",\n \"unbraided\",\n \"unbridle\",\n \"unbroken\",\n \"unbuckled\",\n \"unbundle\",\n \"unburned\",\n \"unbutton\",\n \"uncanny\",\n \"uncapped\",\n \"uncaring\",\n \"uncertain\",\n \"unchain\",\n \"unchanged\",\n \"uncharted\",\n \"uncheck\",\n \"uncivil\",\n \"unclad\",\n \"unclaimed\",\n \"unclamped\",\n \"unclasp\",\n \"uncle\",\n \"unclip\",\n \"uncloak\",\n \"unclog\",\n \"unclothed\",\n \"uncoated\",\n \"uncoiled\",\n \"uncolored\",\n \"uncombed\",\n \"uncommon\",\n \"uncooked\",\n \"uncork\",\n \"uncorrupt\",\n \"uncounted\",\n \"uncouple\",\n \"uncouth\",\n \"uncover\",\n \"uncross\",\n \"uncrown\",\n \"uncrushed\",\n \"uncured\",\n \"uncurious\",\n \"uncurled\",\n \"uncut\",\n \"undamaged\",\n \"undated\",\n \"undaunted\",\n \"undead\",\n \"undecided\",\n \"undefined\",\n \"underage\",\n \"underarm\",\n \"undercoat\",\n \"undercook\",\n \"undercut\",\n \"underdog\",\n \"underdone\",\n \"underfed\",\n \"underfeed\",\n \"underfoot\",\n \"undergo\",\n \"undergrad\",\n \"underhand\",\n \"underline\",\n \"underling\",\n \"undermine\",\n \"undermost\",\n \"underpaid\",\n \"underpass\",\n \"underpay\",\n \"underrate\",\n \"undertake\",\n \"undertone\",\n \"undertook\",\n \"undertow\",\n \"underuse\",\n \"underwear\",\n \"underwent\",\n \"underwire\",\n \"undesired\",\n \"undiluted\",\n \"undivided\",\n \"undocked\",\n \"undoing\",\n \"undone\",\n \"undrafted\",\n \"undress\",\n \"undrilled\",\n \"undusted\",\n \"undying\",\n \"unearned\",\n \"unearth\",\n \"unease\",\n \"uneasily\",\n \"uneasy\",\n \"uneatable\",\n \"uneaten\",\n \"unedited\",\n \"unelected\",\n \"unending\",\n \"unengaged\",\n \"unenvied\",\n \"unequal\",\n \"unethical\",\n \"uneven\",\n \"unexpired\",\n \"unexposed\",\n \"unfailing\",\n \"unfair\",\n \"unfasten\",\n \"unfazed\",\n \"unfeeling\",\n \"unfiled\",\n \"unfilled\",\n \"unfitted\",\n \"unfitting\",\n \"unfixable\",\n \"unfixed\",\n \"unflawed\",\n \"unfocused\",\n \"unfold\",\n \"unfounded\",\n \"unframed\",\n \"unfreeze\",\n \"unfrosted\",\n \"unfrozen\",\n \"unfunded\",\n \"unglazed\",\n \"ungloved\",\n \"unglue\",\n \"ungodly\",\n \"ungraded\",\n \"ungreased\",\n \"unguarded\",\n \"unguided\",\n \"unhappily\",\n \"unhappy\",\n \"unharmed\",\n \"unhealthy\",\n \"unheard\",\n \"unhearing\",\n \"unheated\",\n \"unhelpful\",\n \"unhidden\",\n \"unhinge\",\n \"unhitched\",\n \"unholy\",\n \"unhook\",\n \"unicorn\",\n \"unicycle\",\n \"unified\",\n \"unifier\",\n \"uniformed\",\n \"uniformly\",\n \"unify\",\n \"unimpeded\",\n \"uninjured\",\n \"uninstall\",\n \"uninsured\",\n \"uninvited\",\n \"union\",\n \"uniquely\",\n \"unisexual\",\n \"unison\",\n \"unissued\",\n \"unit\",\n \"universal\",\n \"universe\",\n \"unjustly\",\n \"unkempt\",\n \"unkind\",\n \"unknotted\",\n \"unknowing\",\n \"unknown\",\n \"unlaced\",\n \"unlatch\",\n \"unlawful\",\n \"unleaded\",\n \"unlearned\",\n \"unleash\",\n \"unless\",\n \"unleveled\",\n \"unlighted\",\n \"unlikable\",\n \"unlimited\",\n \"unlined\",\n \"unlinked\",\n \"unlisted\",\n \"unlit\",\n \"unlivable\",\n \"unloaded\",\n \"unloader\",\n \"unlocked\",\n \"unlocking\",\n \"unlovable\",\n \"unloved\",\n \"unlovely\",\n \"unloving\",\n \"unluckily\",\n \"unlucky\",\n \"unmade\",\n \"unmanaged\",\n \"unmanned\",\n \"unmapped\",\n \"unmarked\",\n \"unmasked\",\n \"unmasking\",\n \"unmatched\",\n \"unmindful\",\n \"unmixable\",\n \"unmixed\",\n \"unmolded\",\n \"unmoral\",\n \"unmovable\",\n \"unmoved\",\n \"unmoving\",\n \"unnamable\",\n \"unnamed\",\n \"unnatural\",\n \"unneeded\",\n \"unnerve\",\n \"unnerving\",\n \"unnoticed\",\n \"unopened\",\n \"unopposed\",\n \"unpack\",\n \"unpadded\",\n \"unpaid\",\n \"unpainted\",\n \"unpaired\",\n \"unpaved\",\n \"unpeeled\",\n \"unpicked\",\n \"unpiloted\",\n \"unpinned\",\n \"unplanned\",\n \"unplanted\",\n \"unpleased\",\n \"unpledged\",\n \"unplowed\",\n \"unplug\",\n \"unpopular\",\n \"unproven\",\n \"unquote\",\n \"unranked\",\n \"unrated\",\n \"unraveled\",\n \"unreached\",\n \"unread\",\n \"unreal\",\n \"unreeling\",\n \"unrefined\",\n \"unrelated\",\n \"unrented\",\n \"unrest\",\n \"unretired\",\n \"unrevised\",\n \"unrigged\",\n \"unripe\",\n \"unrivaled\",\n \"unroasted\",\n \"unrobed\",\n \"unroll\",\n \"unruffled\",\n \"unruly\",\n \"unrushed\",\n \"unsaddle\",\n \"unsafe\",\n \"unsaid\",\n \"unsalted\",\n \"unsaved\",\n \"unsavory\",\n \"unscathed\",\n \"unscented\",\n \"unscrew\",\n \"unsealed\",\n \"unseated\",\n \"unsecured\",\n \"unseeing\",\n \"unseemly\",\n \"unseen\",\n \"unselect\",\n \"unselfish\",\n \"unsent\",\n \"unsettled\",\n \"unshackle\",\n \"unshaken\",\n \"unshaved\",\n \"unshaven\",\n \"unsheathe\",\n \"unshipped\",\n \"unsightly\",\n \"unsigned\",\n \"unskilled\",\n \"unsliced\",\n \"unsmooth\",\n \"unsnap\",\n \"unsocial\",\n \"unsoiled\",\n \"unsold\",\n \"unsolved\",\n \"unsorted\",\n \"unspoiled\",\n \"unspoken\",\n \"unstable\",\n \"unstaffed\",\n \"unstamped\",\n \"unsteady\",\n \"unsterile\",\n \"unstirred\",\n \"unstitch\",\n \"unstopped\",\n \"unstuck\",\n \"unstuffed\",\n \"unstylish\",\n \"unsubtle\",\n \"unsubtly\",\n \"unsuited\",\n \"unsure\",\n \"unsworn\",\n \"untagged\",\n \"untainted\",\n \"untaken\",\n \"untamed\",\n \"untangled\",\n \"untapped\",\n \"untaxed\",\n \"unthawed\",\n \"unthread\",\n \"untidy\",\n \"untie\",\n \"until\",\n \"untimed\",\n \"untimely\",\n \"untitled\",\n \"untoasted\",\n \"untold\",\n \"untouched\",\n \"untracked\",\n \"untrained\",\n \"untreated\",\n \"untried\",\n \"untrimmed\",\n \"untrue\",\n \"untruth\",\n \"unturned\",\n \"untwist\",\n \"untying\",\n \"unusable\",\n \"unused\",\n \"unusual\",\n \"unvalued\",\n \"unvaried\",\n \"unvarying\",\n \"unveiled\",\n \"unveiling\",\n \"unvented\",\n \"unviable\",\n \"unvisited\",\n \"unvocal\",\n \"unwanted\",\n \"unwarlike\",\n \"unwary\",\n \"unwashed\",\n \"unwatched\",\n \"unweave\",\n \"unwed\",\n \"unwelcome\",\n \"unwell\",\n \"unwieldy\",\n \"unwilling\",\n \"unwind\",\n \"unwired\",\n \"unwitting\",\n \"unwomanly\",\n \"unworldly\",\n \"unworn\",\n \"unworried\",\n \"unworthy\",\n \"unwound\",\n \"unwoven\",\n \"unwrapped\",\n \"unwritten\",\n \"unzip\",\n \"upbeat\",\n \"upchuck\",\n \"upcoming\",\n \"upcountry\",\n \"update\",\n \"upfront\",\n \"upgrade\",\n \"upheaval\",\n \"upheld\",\n \"uphill\",\n \"uphold\",\n \"uplifted\",\n \"uplifting\",\n \"upload\",\n \"upon\",\n \"upper\",\n \"upright\",\n \"uprising\",\n \"upriver\",\n \"uproar\",\n \"uproot\",\n \"upscale\",\n \"upside\",\n \"upstage\",\n \"upstairs\",\n \"upstart\",\n \"upstate\",\n \"upstream\",\n \"upstroke\",\n \"upswing\",\n \"uptake\",\n \"uptight\",\n \"uptown\",\n \"upturned\",\n \"upward\",\n \"upwind\",\n \"uranium\",\n \"urban\",\n \"urchin\",\n \"urethane\",\n \"urgency\",\n \"urgent\",\n \"urging\",\n \"urologist\",\n \"urology\",\n \"usable\",\n \"usage\",\n \"useable\",\n \"used\",\n \"uselessly\",\n \"user\",\n \"usher\",\n \"usual\",\n \"utensil\",\n \"utility\",\n \"utilize\",\n \"utmost\",\n \"utopia\",\n \"utter\",\n \"vacancy\",\n \"vacant\",\n \"vacate\",\n \"vacation\",\n \"vagabond\",\n \"vagrancy\",\n \"vagrantly\",\n \"vaguely\",\n \"vagueness\",\n \"valiant\",\n \"valid\",\n \"valium\",\n \"valley\",\n \"valuables\",\n \"value\",\n \"vanilla\",\n \"vanish\",\n \"vanity\",\n \"vanquish\",\n \"vantage\",\n \"vaporizer\",\n \"variable\",\n \"variably\",\n \"varied\",\n \"variety\",\n \"various\",\n \"varmint\",\n \"varnish\",\n \"varsity\",\n \"varying\",\n \"vascular\",\n \"vaseline\",\n \"vastly\",\n \"vastness\",\n \"veal\",\n \"vegan\",\n \"veggie\",\n \"vehicular\",\n \"velcro\",\n \"velocity\",\n \"velvet\",\n \"vendetta\",\n \"vending\",\n \"vendor\",\n \"veneering\",\n \"vengeful\",\n \"venomous\",\n \"ventricle\",\n \"venture\",\n \"venue\",\n \"venus\",\n \"verbalize\",\n \"verbally\",\n \"verbose\",\n \"verdict\",\n \"verify\",\n \"verse\",\n \"version\",\n \"versus\",\n \"vertebrae\",\n \"vertical\",\n \"vertigo\",\n \"very\",\n \"vessel\",\n \"vest\",\n \"veteran\",\n \"veto\",\n \"vexingly\",\n \"viability\",\n \"viable\",\n \"vibes\",\n \"vice\",\n \"vicinity\",\n \"victory\",\n \"video\",\n \"viewable\",\n \"viewer\",\n \"viewing\",\n \"viewless\",\n \"viewpoint\",\n \"vigorous\",\n \"village\",\n \"villain\",\n \"vindicate\",\n \"vineyard\",\n \"vintage\",\n \"violate\",\n \"violation\",\n \"violator\",\n \"violet\",\n \"violin\",\n \"viper\",\n \"viral\",\n \"virtual\",\n \"virtuous\",\n \"virus\",\n \"visa\",\n \"viscosity\",\n \"viscous\",\n \"viselike\",\n \"visible\",\n \"visibly\",\n \"vision\",\n \"visiting\",\n \"visitor\",\n \"visor\",\n \"vista\",\n \"vitality\",\n \"vitalize\",\n \"vitally\",\n \"vitamins\",\n \"vivacious\",\n \"vividly\",\n \"vividness\",\n \"vixen\",\n \"vocalist\",\n \"vocalize\",\n \"vocally\",\n \"vocation\",\n \"voice\",\n \"voicing\",\n \"void\",\n \"volatile\",\n \"volley\",\n \"voltage\",\n \"volumes\",\n \"voter\",\n \"voting\",\n \"voucher\",\n \"vowed\",\n \"vowel\",\n \"voyage\",\n \"wackiness\",\n \"wad\",\n \"wafer\",\n \"waffle\",\n \"waged\",\n \"wager\",\n \"wages\",\n \"waggle\",\n \"wagon\",\n \"wake\",\n \"waking\",\n \"walk\",\n \"walmart\",\n \"walnut\",\n \"walrus\",\n \"waltz\",\n \"wand\",\n \"wannabe\",\n \"wanted\",\n \"wanting\",\n \"wasabi\",\n \"washable\",\n \"washbasin\",\n \"washboard\",\n \"washbowl\",\n \"washcloth\",\n \"washday\",\n \"washed\",\n \"washer\",\n \"washhouse\",\n \"washing\",\n \"washout\",\n \"washroom\",\n \"washstand\",\n \"washtub\",\n \"wasp\",\n \"wasting\",\n \"watch\",\n \"water\",\n \"waviness\",\n \"waving\",\n \"wavy\",\n \"whacking\",\n \"whacky\",\n \"wham\",\n \"wharf\",\n \"wheat\",\n \"whenever\",\n \"whiff\",\n \"whimsical\",\n \"whinny\",\n \"whiny\",\n \"whisking\",\n \"whoever\",\n \"whole\",\n \"whomever\",\n \"whoopee\",\n \"whooping\",\n \"whoops\",\n \"why\",\n \"wick\",\n \"widely\",\n \"widen\",\n \"widget\",\n \"widow\",\n \"width\",\n \"wieldable\",\n \"wielder\",\n \"wife\",\n \"wifi\",\n \"wikipedia\",\n \"wildcard\",\n \"wildcat\",\n \"wilder\",\n \"wildfire\",\n \"wildfowl\",\n \"wildland\",\n \"wildlife\",\n \"wildly\",\n \"wildness\",\n \"willed\",\n \"willfully\",\n \"willing\",\n \"willow\",\n \"willpower\",\n \"wilt\",\n \"wimp\",\n \"wince\",\n \"wincing\",\n \"wind\",\n \"wing\",\n \"winking\",\n \"winner\",\n \"winnings\",\n \"winter\",\n \"wipe\",\n \"wired\",\n \"wireless\",\n \"wiring\",\n \"wiry\",\n \"wisdom\",\n \"wise\",\n \"wish\",\n \"wisplike\",\n \"wispy\",\n \"wistful\",\n \"wizard\",\n \"wobble\",\n \"wobbling\",\n \"wobbly\",\n \"wok\",\n \"wolf\",\n \"wolverine\",\n \"womanhood\",\n \"womankind\",\n \"womanless\",\n \"womanlike\",\n \"womanly\",\n \"womb\",\n \"woof\",\n \"wooing\",\n \"wool\",\n \"woozy\",\n \"word\",\n \"work\",\n \"worried\",\n \"worrier\",\n \"worrisome\",\n \"worry\",\n \"worsening\",\n \"worshiper\",\n \"worst\",\n \"wound\",\n \"woven\",\n \"wow\",\n \"wrangle\",\n \"wrath\",\n \"wreath\",\n \"wreckage\",\n \"wrecker\",\n \"wrecking\",\n \"wrench\",\n \"wriggle\",\n \"wriggly\",\n \"wrinkle\",\n \"wrinkly\",\n \"wrist\",\n \"writing\",\n \"written\",\n \"wrongdoer\",\n \"wronged\",\n \"wrongful\",\n \"wrongly\",\n \"wrongness\",\n \"wrought\",\n \"xbox\",\n \"xerox\",\n \"yahoo\",\n \"yam\",\n \"yanking\",\n \"yapping\",\n \"yard\",\n \"yarn\",\n \"yeah\",\n \"yearbook\",\n \"yearling\",\n \"yearly\",\n \"yearning\",\n \"yeast\",\n \"yelling\",\n \"yelp\",\n \"yen\",\n \"yesterday\",\n \"yiddish\",\n \"yield\",\n \"yin\",\n \"yippee\",\n \"yo-yo\",\n \"yodel\",\n \"yoga\",\n \"yogurt\",\n \"yonder\",\n \"yoyo\",\n \"yummy\",\n \"zap\",\n \"zealous\",\n \"zebra\",\n \"zen\",\n \"zeppelin\",\n \"zero\",\n \"zestfully\",\n \"zesty\",\n \"zigzagged\",\n \"zipfile\",\n \"zipping\",\n \"zippy\",\n \"zips\",\n \"zit\",\n \"zodiac\",\n \"zombie\",\n \"zone\",\n \"zoning\",\n \"zookeeper\",\n \"zoologist\",\n \"zoology\",\n \"zoom\",\n];\n","import { Jsonify } from \"type-fest\";\n\nimport { Region } from \"../../abstractions/environment.service\";\nimport {\n ServerConfigResponse,\n ThirdPartyServerConfigResponse,\n EnvironmentServerConfigResponse,\n} from \"../response/server-config.response\";\n\nexport class ServerConfigData {\n version: string;\n gitHash: string;\n server?: ThirdPartyServerConfigData;\n environment?: EnvironmentServerConfigData;\n utcDate: string;\n featureStates: { [key: string]: string } = {};\n\n constructor(serverConfigResponse: Partial) {\n this.version = serverConfigResponse?.version;\n this.gitHash = serverConfigResponse?.gitHash;\n this.server = serverConfigResponse?.server\n ? new ThirdPartyServerConfigData(serverConfigResponse.server)\n : null;\n this.utcDate = new Date().toISOString();\n this.environment = serverConfigResponse?.environment\n ? new EnvironmentServerConfigData(serverConfigResponse.environment)\n : null;\n this.featureStates = serverConfigResponse?.featureStates;\n }\n\n static fromJSON(obj: Jsonify): ServerConfigData {\n return Object.assign(new ServerConfigData({}), obj, {\n server: obj?.server ? ThirdPartyServerConfigData.fromJSON(obj.server) : null,\n environment: obj?.environment ? EnvironmentServerConfigData.fromJSON(obj.environment) : null,\n });\n }\n}\n\nexport class ThirdPartyServerConfigData {\n name: string;\n url: string;\n\n constructor(response: Partial) {\n this.name = response.name;\n this.url = response.url;\n }\n\n static fromJSON(obj: Jsonify): ThirdPartyServerConfigData {\n return Object.assign(new ThirdPartyServerConfigData({}), obj);\n }\n}\n\nexport class EnvironmentServerConfigData {\n cloudRegion: Region;\n vault: string;\n api: string;\n identity: string;\n notifications: string;\n sso: string;\n\n constructor(response: Partial) {\n this.cloudRegion = response.cloudRegion;\n this.vault = response.vault;\n this.api = response.api;\n this.identity = response.identity;\n this.notifications = response.notifications;\n this.sso = response.sso;\n }\n\n static fromJSON(obj: Jsonify): EnvironmentServerConfigData {\n return Object.assign(new EnvironmentServerConfigData({}), obj);\n }\n}\n","import { Jsonify } from \"type-fest\";\n\nimport { AdminAuthRequestStorable } from \"../../../auth/models/domain/admin-auth-req-storable\";\nimport { ForceSetPasswordReason } from \"../../../auth/models/domain/force-set-password-reason\";\nimport { UriMatchStrategySetting } from \"../../../models/domain/domain-service\";\nimport { GeneratorOptions } from \"../../../tools/generator/generator-options\";\nimport {\n GeneratedPasswordHistory,\n PasswordGeneratorOptions,\n} from \"../../../tools/generator/password\";\nimport { UsernameGeneratorOptions } from \"../../../tools/generator/username/username-generation-options\";\nimport { SendData } from \"../../../tools/send/models/data/send.data\";\nimport { SendView } from \"../../../tools/send/models/view/send.view\";\nimport { DeepJsonify } from \"../../../types/deep-jsonify\";\nimport { MasterKey } from \"../../../types/key\";\nimport { CipherData } from \"../../../vault/models/data/cipher.data\";\nimport { CipherView } from \"../../../vault/models/view/cipher.view\";\nimport { AddEditCipherInfo } from \"../../../vault/types/add-edit-cipher-info\";\nimport { KdfType } from \"../../enums\";\nimport { Utils } from \"../../misc/utils\";\nimport { ServerConfigData } from \"../../models/data/server-config.data\";\n\nimport { EncryptedString, EncString } from \"./enc-string\";\nimport { SymmetricCryptoKey } from \"./symmetric-crypto-key\";\n\nexport class EncryptionPair {\n encrypted?: TEncrypted;\n decrypted?: TDecrypted;\n\n toJSON() {\n return {\n encrypted: this.encrypted,\n decrypted:\n this.decrypted instanceof ArrayBuffer\n ? Utils.fromBufferToByteString(this.decrypted)\n : this.decrypted,\n };\n }\n\n static fromJSON(\n obj: { encrypted?: Jsonify; decrypted?: string | Jsonify },\n decryptedFromJson?: (decObj: Jsonify | string) => TDecrypted,\n encryptedFromJson?: (encObj: Jsonify) => TEncrypted,\n ) {\n if (obj == null) {\n return null;\n }\n\n const pair = new EncryptionPair();\n if (obj?.encrypted != null) {\n pair.encrypted = encryptedFromJson\n ? encryptedFromJson(obj.encrypted)\n : (obj.encrypted as TEncrypted);\n }\n if (obj?.decrypted != null) {\n pair.decrypted = decryptedFromJson\n ? decryptedFromJson(obj.decrypted)\n : (obj.decrypted as TDecrypted);\n }\n return pair;\n }\n}\n\nexport class DataEncryptionPair {\n encrypted?: Record;\n decrypted?: TDecrypted[];\n}\n\n// This is a temporary structure to handle migrated `DataEncryptionPair` to\n// avoid needing a data migration at this stage. It should be replaced with\n// proper data migrations when `DataEncryptionPair` is deprecated.\nexport class TemporaryDataEncryption {\n encrypted?: { [id: string]: TEncrypted };\n}\n\nexport class AccountData {\n ciphers?: DataEncryptionPair = new DataEncryptionPair<\n CipherData,\n CipherView\n >();\n localData?: any;\n sends?: DataEncryptionPair = new DataEncryptionPair();\n passwordGenerationHistory?: EncryptionPair<\n GeneratedPasswordHistory[],\n GeneratedPasswordHistory[]\n > = new EncryptionPair();\n addEditCipherInfo?: AddEditCipherInfo;\n\n static fromJSON(obj: DeepJsonify): AccountData {\n if (obj == null) {\n return null;\n }\n\n return Object.assign(new AccountData(), obj, {\n addEditCipherInfo: {\n cipher: CipherView.fromJSON(obj?.addEditCipherInfo?.cipher),\n collectionIds: obj?.addEditCipherInfo?.collectionIds,\n },\n });\n }\n}\n\nexport class AccountKeys {\n masterKey?: MasterKey;\n masterKeyEncryptedUserKey?: string;\n deviceKey?: ReturnType;\n publicKey?: Uint8Array;\n\n /** @deprecated July 2023, left for migration purposes*/\n cryptoMasterKey?: SymmetricCryptoKey;\n /** @deprecated July 2023, left for migration purposes*/\n cryptoMasterKeyAuto?: string;\n /** @deprecated July 2023, left for migration purposes*/\n cryptoMasterKeyBiometric?: string;\n /** @deprecated July 2023, left for migration purposes*/\n cryptoSymmetricKey?: EncryptionPair = new EncryptionPair<\n string,\n SymmetricCryptoKey\n >();\n\n toJSON() {\n // If you pass undefined into fromBufferToByteString, you will get an empty string back\n // which will cause all sorts of headaches down the line when you try to getPublicKey\n // and expect a Uint8Array and get an empty string instead.\n return Utils.merge(this, {\n publicKey: this.publicKey ? Utils.fromBufferToByteString(this.publicKey) : undefined,\n });\n }\n\n static fromJSON(obj: DeepJsonify): AccountKeys {\n if (obj == null) {\n return null;\n }\n return Object.assign(new AccountKeys(), obj, {\n masterKey: SymmetricCryptoKey.fromJSON(obj?.masterKey),\n deviceKey: obj?.deviceKey,\n cryptoMasterKey: SymmetricCryptoKey.fromJSON(obj?.cryptoMasterKey),\n cryptoSymmetricKey: EncryptionPair.fromJSON(\n obj?.cryptoSymmetricKey,\n SymmetricCryptoKey.fromJSON,\n ),\n publicKey: Utils.fromByteStringToArray(obj?.publicKey),\n });\n }\n\n static initRecordEncryptionPairsFromJSON(obj: any) {\n return EncryptionPair.fromJSON(obj, (decObj: any) => {\n if (obj == null) {\n return null;\n }\n\n const record: Record = {};\n for (const id in decObj) {\n record[id] = SymmetricCryptoKey.fromJSON(decObj[id]);\n }\n return record;\n });\n }\n}\n\nexport class AccountProfile {\n convertAccountToKeyConnector?: boolean;\n name?: string;\n email?: string;\n emailVerified?: boolean;\n everBeenUnlocked?: boolean;\n forceSetPasswordReason?: ForceSetPasswordReason;\n lastSync?: string;\n userId?: string;\n usesKeyConnector?: boolean;\n keyHash?: string;\n kdfIterations?: number;\n kdfMemory?: number;\n kdfParallelism?: number;\n kdfType?: KdfType;\n\n static fromJSON(obj: Jsonify): AccountProfile {\n if (obj == null) {\n return null;\n }\n\n return Object.assign(new AccountProfile(), obj);\n }\n}\n\nexport class AccountSettings {\n defaultUriMatch?: UriMatchStrategySetting;\n disableGa?: boolean;\n enableBiometric?: boolean;\n minimizeOnCopyToClipboard?: boolean;\n passwordGenerationOptions?: PasswordGeneratorOptions;\n usernameGenerationOptions?: UsernameGeneratorOptions;\n generatorOptions?: GeneratorOptions;\n pinKeyEncryptedUserKey?: EncryptedString;\n pinKeyEncryptedUserKeyEphemeral?: EncryptedString;\n protectedPin?: string;\n vaultTimeout?: number;\n vaultTimeoutAction?: string = \"lock\";\n serverConfig?: ServerConfigData;\n approveLoginRequests?: boolean;\n avatarColor?: string;\n trustDeviceChoiceForDecryption?: boolean;\n\n /** @deprecated July 2023, left for migration purposes*/\n pinProtected?: EncryptionPair = new EncryptionPair();\n\n static fromJSON(obj: Jsonify): AccountSettings {\n if (obj == null) {\n return null;\n }\n\n return Object.assign(new AccountSettings(), obj, {\n pinProtected: EncryptionPair.fromJSON(\n obj?.pinProtected,\n EncString.fromJSON,\n ),\n serverConfig: ServerConfigData.fromJSON(obj?.serverConfig),\n });\n }\n}\n\nexport class AccountTokens {\n securityStamp?: string;\n\n static fromJSON(obj: Jsonify): AccountTokens {\n if (obj == null) {\n return null;\n }\n\n return Object.assign(new AccountTokens(), obj);\n }\n}\n\nexport class Account {\n data?: AccountData = new AccountData();\n keys?: AccountKeys = new AccountKeys();\n profile?: AccountProfile = new AccountProfile();\n settings?: AccountSettings = new AccountSettings();\n tokens?: AccountTokens = new AccountTokens();\n adminAuthRequest?: Jsonify = null;\n\n constructor(init: Partial) {\n Object.assign(this, {\n data: {\n ...new AccountData(),\n ...init?.data,\n },\n keys: {\n ...new AccountKeys(),\n ...init?.keys,\n },\n profile: {\n ...new AccountProfile(),\n ...init?.profile,\n },\n settings: {\n ...new AccountSettings(),\n ...init?.settings,\n },\n tokens: {\n ...new AccountTokens(),\n ...init?.tokens,\n },\n adminAuthRequest: init?.adminAuthRequest,\n });\n }\n\n static fromJSON(json: Jsonify): Account {\n if (json == null) {\n return null;\n }\n\n return Object.assign(new Account({}), json, {\n keys: AccountKeys.fromJSON(json?.keys),\n data: AccountData.fromJSON(json?.data),\n profile: AccountProfile.fromJSON(json?.profile),\n settings: AccountSettings.fromJSON(json?.settings),\n tokens: AccountTokens.fromJSON(json?.tokens),\n adminAuthRequest: AdminAuthRequestStorable.fromJSON(json?.adminAuthRequest),\n });\n }\n}\n","import { View } from \"../../../models/view/view\";\n\nimport { EncString } from \"./enc-string\";\nimport { SymmetricCryptoKey } from \"./symmetric-crypto-key\";\n\n// https://contributing.bitwarden.com/architecture/clients/data-model#domain\nexport default class Domain {\n protected buildDomainModel(\n domain: D,\n dataObj: any,\n map: any,\n notEncList: any[] = [],\n ) {\n for (const prop in map) {\n // eslint-disable-next-line\n if (!map.hasOwnProperty(prop)) {\n continue;\n }\n\n const objProp = dataObj[map[prop] || prop];\n if (notEncList.indexOf(prop) > -1) {\n (domain as any)[prop] = objProp ? objProp : null;\n } else {\n (domain as any)[prop] = objProp ? new EncString(objProp) : null;\n }\n }\n }\n protected buildDataModel(\n domain: D,\n dataObj: any,\n map: any,\n notEncStringList: any[] = [],\n ) {\n for (const prop in map) {\n // eslint-disable-next-line\n if (!map.hasOwnProperty(prop)) {\n continue;\n }\n\n const objProp = (domain as any)[map[prop] || prop];\n if (notEncStringList.indexOf(prop) > -1) {\n (dataObj as any)[prop] = objProp != null ? objProp : null;\n } else {\n (dataObj as any)[prop] = objProp != null ? (objProp as EncString).encryptedString : null;\n }\n }\n }\n\n protected async decryptObj(\n viewModel: T,\n map: any,\n orgId: string,\n key: SymmetricCryptoKey = null,\n ): Promise {\n const promises = [];\n const self: any = this;\n\n for (const prop in map) {\n // eslint-disable-next-line\n if (!map.hasOwnProperty(prop)) {\n continue;\n }\n\n (function (theProp) {\n const p = Promise.resolve()\n .then(() => {\n const mapProp = map[theProp] || theProp;\n if (self[mapProp]) {\n return self[mapProp].decrypt(orgId, key);\n }\n return null;\n })\n .then((val: any) => {\n (viewModel as any)[theProp] = val;\n });\n promises.push(p);\n })(prop);\n }\n\n await Promise.all(promises);\n return viewModel;\n }\n}\n","import { Utils } from \"../../../platform/misc/utils\";\nimport { EncryptionType } from \"../../enums\";\nimport { Encrypted } from \"../../interfaces/encrypted\";\n\nconst ENC_TYPE_LENGTH = 1;\nconst IV_LENGTH = 16;\nconst MAC_LENGTH = 32;\nconst MIN_DATA_LENGTH = 1;\n\nexport class EncArrayBuffer implements Encrypted {\n readonly encryptionType: EncryptionType = null;\n readonly dataBytes: Uint8Array = null;\n readonly ivBytes: Uint8Array = null;\n readonly macBytes: Uint8Array = null;\n\n constructor(readonly buffer: Uint8Array) {\n const encBytes = buffer;\n const encType = encBytes[0];\n\n switch (encType) {\n case EncryptionType.AesCbc128_HmacSha256_B64:\n case EncryptionType.AesCbc256_HmacSha256_B64: {\n const minimumLength = ENC_TYPE_LENGTH + IV_LENGTH + MAC_LENGTH + MIN_DATA_LENGTH;\n if (encBytes.length < minimumLength) {\n this.throwDecryptionError();\n }\n\n this.ivBytes = encBytes.slice(ENC_TYPE_LENGTH, ENC_TYPE_LENGTH + IV_LENGTH);\n this.macBytes = encBytes.slice(\n ENC_TYPE_LENGTH + IV_LENGTH,\n ENC_TYPE_LENGTH + IV_LENGTH + MAC_LENGTH,\n );\n this.dataBytes = encBytes.slice(ENC_TYPE_LENGTH + IV_LENGTH + MAC_LENGTH);\n break;\n }\n case EncryptionType.AesCbc256_B64: {\n const minimumLength = ENC_TYPE_LENGTH + IV_LENGTH + MIN_DATA_LENGTH;\n if (encBytes.length < minimumLength) {\n this.throwDecryptionError();\n }\n\n this.ivBytes = encBytes.slice(ENC_TYPE_LENGTH, ENC_TYPE_LENGTH + IV_LENGTH);\n this.dataBytes = encBytes.slice(ENC_TYPE_LENGTH + IV_LENGTH);\n break;\n }\n default:\n this.throwDecryptionError();\n }\n\n this.encryptionType = encType;\n }\n\n private throwDecryptionError() {\n throw new Error(\n \"Error parsing encrypted ArrayBuffer: data is corrupted or has an invalid format.\",\n );\n }\n\n static async fromResponse(response: {\n arrayBuffer: () => Promise;\n }): Promise {\n const buffer = await response.arrayBuffer();\n if (buffer == null) {\n throw new Error(\"Cannot create EncArrayBuffer from Response - Response is empty\");\n }\n return new EncArrayBuffer(new Uint8Array(buffer));\n }\n\n static fromB64(b64: string) {\n const buffer = Utils.fromB64ToArray(b64);\n return new EncArrayBuffer(buffer);\n }\n}\n","import { Jsonify, Opaque } from \"type-fest\";\n\nimport { EncryptionType, EXPECTED_NUM_PARTS_BY_ENCRYPTION_TYPE } from \"../../enums\";\nimport { Encrypted } from \"../../interfaces/encrypted\";\nimport { Utils } from \"../../misc/utils\";\n\nimport { SymmetricCryptoKey } from \"./symmetric-crypto-key\";\n\nexport class EncString implements Encrypted {\n encryptedString?: EncryptedString;\n encryptionType?: EncryptionType;\n decryptedValue?: string;\n data?: string;\n iv?: string;\n mac?: string;\n\n constructor(\n encryptedStringOrType: string | EncryptionType,\n data?: string,\n iv?: string,\n mac?: string,\n ) {\n if (data != null) {\n this.initFromData(encryptedStringOrType as EncryptionType, data, iv, mac);\n } else {\n this.initFromEncryptedString(encryptedStringOrType as string);\n }\n }\n\n get ivBytes(): Uint8Array {\n return this.iv == null ? null : Utils.fromB64ToArray(this.iv);\n }\n\n get macBytes(): Uint8Array {\n return this.mac == null ? null : Utils.fromB64ToArray(this.mac);\n }\n\n get dataBytes(): Uint8Array {\n return this.data == null ? null : Utils.fromB64ToArray(this.data);\n }\n\n toJSON() {\n return this.encryptedString as string;\n }\n\n static fromJSON(obj: Jsonify): EncString {\n if (obj == null) {\n return null;\n }\n\n return new EncString(obj);\n }\n\n private initFromData(encType: EncryptionType, data: string, iv: string, mac: string) {\n if (iv != null) {\n this.encryptedString = (encType + \".\" + iv + \"|\" + data) as EncryptedString;\n } else {\n this.encryptedString = (encType + \".\" + data) as EncryptedString;\n }\n\n // mac\n if (mac != null) {\n this.encryptedString = (this.encryptedString + \"|\" + mac) as EncryptedString;\n }\n\n this.encryptionType = encType;\n this.data = data;\n this.iv = iv;\n this.mac = mac;\n }\n\n private initFromEncryptedString(encryptedString: string) {\n this.encryptedString = encryptedString as EncryptedString;\n if (!this.encryptedString) {\n return;\n }\n\n const { encType, encPieces } = EncString.parseEncryptedString(this.encryptedString);\n this.encryptionType = encType;\n\n if (encPieces.length !== EXPECTED_NUM_PARTS_BY_ENCRYPTION_TYPE[encType]) {\n return;\n }\n\n switch (encType) {\n case EncryptionType.AesCbc128_HmacSha256_B64:\n case EncryptionType.AesCbc256_HmacSha256_B64:\n this.iv = encPieces[0];\n this.data = encPieces[1];\n this.mac = encPieces[2];\n break;\n case EncryptionType.AesCbc256_B64:\n this.iv = encPieces[0];\n this.data = encPieces[1];\n break;\n case EncryptionType.Rsa2048_OaepSha256_B64:\n case EncryptionType.Rsa2048_OaepSha1_B64:\n this.data = encPieces[0];\n break;\n default:\n return;\n }\n }\n\n private static parseEncryptedString(encryptedString: string): {\n encType: EncryptionType;\n encPieces: string[];\n } {\n const headerPieces = encryptedString.split(\".\");\n let encType: EncryptionType;\n let encPieces: string[] = null;\n\n if (headerPieces.length === 2) {\n try {\n encType = parseInt(headerPieces[0], null);\n encPieces = headerPieces[1].split(\"|\");\n } catch (e) {\n return;\n }\n } else {\n encPieces = encryptedString.split(\"|\");\n encType =\n encPieces.length === 3\n ? EncryptionType.AesCbc128_HmacSha256_B64\n : EncryptionType.AesCbc256_B64;\n }\n\n return {\n encType,\n encPieces,\n };\n }\n\n static isSerializedEncString(s: string): boolean {\n const { encType, encPieces } = this.parseEncryptedString(s);\n\n return EXPECTED_NUM_PARTS_BY_ENCRYPTION_TYPE[encType] === encPieces.length;\n }\n\n async decrypt(orgId: string, key: SymmetricCryptoKey = null): Promise {\n if (this.decryptedValue != null) {\n return this.decryptedValue;\n }\n\n try {\n if (key == null) {\n key = await this.getKeyForDecryption(orgId);\n }\n if (key == null) {\n throw new Error(\"No key to decrypt EncString with orgId \" + orgId);\n }\n\n const encryptService = Utils.getContainerService().getEncryptService();\n this.decryptedValue = await encryptService.decryptToUtf8(this, key);\n } catch (e) {\n this.decryptedValue = \"[error: cannot decrypt]\";\n }\n return this.decryptedValue;\n }\n\n private async getKeyForDecryption(orgId: string) {\n const cryptoService = Utils.getContainerService().getCryptoService();\n return orgId != null\n ? await cryptoService.getOrgKey(orgId)\n : await cryptoService.getUserKeyWithLegacySupport();\n }\n}\n\nexport type EncryptedString = Opaque;\n","import { Jsonify } from \"type-fest\";\n\nimport { Utils } from \"../../../platform/misc/utils\";\nimport { EncryptionType } from \"../../enums\";\n\nexport class SymmetricCryptoKey {\n key: Uint8Array;\n encKey?: Uint8Array;\n macKey?: Uint8Array;\n encType: EncryptionType;\n\n keyB64: string;\n encKeyB64: string;\n macKeyB64: string;\n\n meta: any;\n\n constructor(key: Uint8Array, encType?: EncryptionType) {\n if (key == null) {\n throw new Error(\"Must provide key\");\n }\n\n if (encType == null) {\n if (key.byteLength === 32) {\n encType = EncryptionType.AesCbc256_B64;\n } else if (key.byteLength === 64) {\n encType = EncryptionType.AesCbc256_HmacSha256_B64;\n } else {\n throw new Error(\"Unable to determine encType.\");\n }\n }\n\n this.key = key;\n this.encType = encType;\n\n if (encType === EncryptionType.AesCbc256_B64 && key.byteLength === 32) {\n this.encKey = key;\n this.macKey = null;\n } else if (encType === EncryptionType.AesCbc128_HmacSha256_B64 && key.byteLength === 32) {\n this.encKey = key.slice(0, 16);\n this.macKey = key.slice(16, 32);\n } else if (encType === EncryptionType.AesCbc256_HmacSha256_B64 && key.byteLength === 64) {\n this.encKey = key.slice(0, 32);\n this.macKey = key.slice(32, 64);\n } else {\n throw new Error(\"Unsupported encType/key length.\");\n }\n\n if (this.key != null) {\n this.keyB64 = Utils.fromBufferToB64(this.key);\n }\n if (this.encKey != null) {\n this.encKeyB64 = Utils.fromBufferToB64(this.encKey);\n }\n if (this.macKey != null) {\n this.macKeyB64 = Utils.fromBufferToB64(this.macKey);\n }\n }\n\n toJSON() {\n // The whole object is constructed from the initial key, so just store the B64 key\n return { keyB64: this.keyB64 };\n }\n\n static fromString(s: string): SymmetricCryptoKey {\n if (s == null) {\n return null;\n }\n\n const arrayBuffer = Utils.fromB64ToArray(s);\n return new SymmetricCryptoKey(arrayBuffer);\n }\n\n static fromJSON(obj: Jsonify): SymmetricCryptoKey {\n return SymmetricCryptoKey.fromString(obj?.keyB64);\n }\n}\n","import { LogService as LogServiceAbstraction } from \"../abstractions/log.service\";\nimport { LogLevelType } from \"../enums/log-level-type.enum\";\n\nexport class ConsoleLogService implements LogServiceAbstraction {\n protected timersMap: Map = new Map();\n\n constructor(\n protected isDev: boolean,\n protected filter: (level: LogLevelType) => boolean = null,\n ) {}\n\n debug(message: string) {\n if (!this.isDev) {\n return;\n }\n this.write(LogLevelType.Debug, message);\n }\n\n info(message: string) {\n this.write(LogLevelType.Info, message);\n }\n\n warning(message: string) {\n this.write(LogLevelType.Warning, message);\n }\n\n error(message: string) {\n this.write(LogLevelType.Error, message);\n }\n\n write(level: LogLevelType, message: string) {\n if (this.filter != null && this.filter(level)) {\n return;\n }\n\n switch (level) {\n case LogLevelType.Debug:\n // eslint-disable-next-line\n console.log(message);\n break;\n case LogLevelType.Info:\n // eslint-disable-next-line\n console.log(message);\n break;\n case LogLevelType.Warning:\n // eslint-disable-next-line\n console.warn(message);\n break;\n case LogLevelType.Error:\n // eslint-disable-next-line\n console.error(message);\n break;\n default:\n break;\n }\n }\n}\n","export enum InitializerKey {\n Cipher = 0,\n CipherView = 1,\n}\n","import { Jsonify } from \"type-fest\";\n\n/**\n *\n * @param elementDeserializer\n * @returns\n */\nexport function array(\n elementDeserializer: (element: Jsonify) => T,\n): (array: Jsonify) => T[] {\n return (array) => {\n if (array == null) {\n return null;\n }\n\n return array.map((element) => elementDeserializer(element));\n };\n}\n\n/**\n *\n * @param valueDeserializer\n */\nexport function record(\n valueDeserializer: (value: Jsonify) => T,\n): (record: Jsonify>) => Record {\n return (jsonValue: Jsonify | null>) => {\n if (jsonValue == null) {\n return null;\n }\n\n const output: Record = {};\n for (const key in jsonValue) {\n output[key] = valueDeserializer((jsonValue as Record>)[key]);\n }\n return output;\n };\n}\n","import { Jsonify } from \"type-fest\";\n\nimport { UserId } from \"../../types/guid\";\nimport { DerivedStateDependencies, StorageKey } from \"../../types/state\";\n\nimport { KeyDefinition } from \"./key-definition\";\nimport { StateDefinition } from \"./state-definition\";\n\ndeclare const depShapeMarker: unique symbol;\n/**\n * A set of options for customizing the behavior of a {@link DeriveDefinition}\n */\ntype DeriveDefinitionOptions = {\n /**\n * A function to use to convert values from TFrom to TTo. This is called on each emit of the parent state observable\n * and the resulting value will be emitted from the derived state observable.\n *\n * @param from Populated with the latest emission from the parent state observable.\n * @param deps Populated with the dependencies passed into the constructor of the derived state.\n * These are constant for the lifetime of the derived state.\n * @returns The derived state value or a Promise that resolves to the derived state value.\n */\n derive: (from: TFrom, deps: TDeps) => TTo | Promise;\n /**\n * A function to use to safely convert your type from json to your expected type.\n *\n * **Important:** Your data may be serialized/deserialized at any time and this\n * callback needs to be able to faithfully re-initialize from the JSON object representation of your type.\n *\n * @param jsonValue The JSON object representation of your state.\n * @returns The fully typed version of your state.\n */\n deserializer: (serialized: Jsonify) => TTo;\n /**\n * An object defining the dependencies of the derive function. The keys of the object are the names of the dependencies\n * and the values are the types of the dependencies.\n *\n * for example:\n * ```\n * {\n * myService: MyService,\n * myOtherService: MyOtherService,\n * }\n * ```\n */\n [depShapeMarker]?: TDeps;\n /**\n * The number of milliseconds to wait before cleaning up the state after the last subscriber has unsubscribed.\n * Defaults to 1000ms.\n */\n cleanupDelayMs?: number;\n /**\n * Whether or not to clear the derived state when cleanup occurs. Defaults to true.\n */\n clearOnCleanup?: boolean;\n};\n\n/**\n * DeriveDefinitions describe state derived from another observable, the value type of which is given by `TFrom`.\n *\n * The StateDefinition is used to describe the domain of the state, and the DeriveDefinition\n * sub-divides that domain into specific keys. These keys are used to cache data in memory and enables derived state to\n * be calculated once regardless of multiple execution contexts.\n */\n\nexport class DeriveDefinition {\n /**\n * Creates a new instance of a DeriveDefinition. Derived state is always stored in memory, so the storage location\n * defined in @link{StateDefinition} is ignored.\n *\n * @param stateDefinition The state definition for which this key belongs to.\n * @param uniqueDerivationName The name of the key, this should be unique per domain.\n * @param options A set of options to customize the behavior of {@link DeriveDefinition}.\n * @param options.derive A function to use to convert values from TFrom to TTo. This is called on each emit of the parent state observable\n * and the resulting value will be emitted from the derived state observable.\n * @param options.cleanupDelayMs The number of milliseconds to wait before cleaning up the state after the last subscriber has unsubscribed.\n * Defaults to 1000ms.\n * @param options.dependencyShape An object defining the dependencies of the derive function. The keys of the object are the names of the dependencies\n * and the values are the types of the dependencies.\n * for example:\n * ```\n * {\n * myService: MyService,\n * myOtherService: MyOtherService,\n * }\n * ```\n *\n * @param options.deserializer A function to use to safely convert your type from json to your expected type.\n * Your data may be serialized/deserialized at any time and this needs callback needs to be able to faithfully re-initialize\n * from the JSON object representation of your type.\n */\n constructor(\n readonly stateDefinition: StateDefinition,\n readonly uniqueDerivationName: string,\n readonly options: DeriveDefinitionOptions,\n ) {}\n\n /**\n * Factory that produces a {@link DeriveDefinition} from a {@link KeyDefinition} or {@link DeriveDefinition} and new name.\n *\n * If a `KeyDefinition` is passed in, the returned definition will have the same key as the given key definition, but\n * will not collide with it in storage, even if they both reside in memory.\n *\n * If a `DeriveDefinition` is passed in, the returned definition will instead use the name given in the second position\n * of the tuple. It is up to you to ensure this is unique within the domain of derived state.\n *\n * @param options A set of options to customize the behavior of {@link DeriveDefinition}.\n * @param options.derive A function to use to convert values from TFrom to TTo. This is called on each emit of the parent state observable\n * and the resulting value will be emitted from the derived state observable.\n * @param options.cleanupDelayMs The number of milliseconds to wait before cleaning up the state after the last subscriber has unsubscribed.\n * Defaults to 1000ms.\n * @param options.dependencyShape An object defining the dependencies of the derive function. The keys of the object are the names of the dependencies\n * and the values are the types of the dependencies.\n * for example:\n * ```\n * {\n * myService: MyService,\n * myOtherService: MyOtherService,\n * }\n * ```\n *\n * @param options.deserializer A function to use to safely convert your type from json to your expected type.\n * Your data may be serialized/deserialized at any time and this needs callback needs to be able to faithfully re-initialize\n * from the JSON object representation of your type.\n * @param definition\n * @param options\n * @returns\n */\n static from(\n definition:\n | KeyDefinition\n | [DeriveDefinition, string],\n options: DeriveDefinitionOptions,\n ) {\n if (isKeyDefinition(definition)) {\n return new DeriveDefinition(definition.stateDefinition, definition.key, options);\n } else {\n return new DeriveDefinition(definition[0].stateDefinition, definition[1], options);\n }\n }\n\n static fromWithUserId(\n definition:\n | KeyDefinition\n | [DeriveDefinition, string],\n options: DeriveDefinitionOptions<[UserId, TKeyDef], TTo, TDeps>,\n ) {\n if (isKeyDefinition(definition)) {\n return new DeriveDefinition(definition.stateDefinition, definition.key, options);\n } else {\n return new DeriveDefinition(definition[0].stateDefinition, definition[1], options);\n }\n }\n\n get derive() {\n return this.options.derive;\n }\n\n deserialize(serialized: Jsonify): TTo {\n return this.options.deserializer(serialized);\n }\n\n get cleanupDelayMs() {\n return this.options.cleanupDelayMs < 0 ? 0 : this.options.cleanupDelayMs ?? 1000;\n }\n\n get clearOnCleanup() {\n return this.options.clearOnCleanup ?? true;\n }\n\n buildCacheKey(): string {\n return `derived_${this.stateDefinition.name}_${this.uniqueDerivationName}`;\n }\n\n /**\n * Creates a {@link StorageKey} that points to the data for the given derived definition.\n * @returns A key that is ready to be used in a storage service to get data.\n */\n get storageKey(): StorageKey {\n return `derived_${this.stateDefinition.name}_${this.uniqueDerivationName}` as StorageKey;\n }\n}\n\nfunction isKeyDefinition(\n definition:\n | KeyDefinition\n | [DeriveDefinition, string],\n): definition is KeyDefinition {\n return Object.prototype.hasOwnProperty.call(definition, \"key\");\n}\n","import { Observable } from \"rxjs\";\n\nimport { DerivedStateDependencies } from \"../../types/state\";\n\nimport { DeriveDefinition } from \"./derive-definition\";\nimport { DerivedState } from \"./derived-state\";\n\n/**\n * State derived from an observable and a derive function\n */\nexport abstract class DerivedStateProvider {\n /**\n * Creates a derived state observable from a parent state observable, a deriveDefinition, and the dependencies\n * required by the deriveDefinition\n * @param parentState$ The parent state observable\n * @param deriveDefinition The deriveDefinition that defines conversion from the parent state to the derived state as\n * well as some memory persistent information.\n * @param dependencies The dependencies of the derive function\n */\n get: (\n parentState$: Observable,\n deriveDefinition: DeriveDefinition,\n dependencies: TDeps,\n ) => DerivedState;\n}\n","import { Observable } from \"rxjs\";\n\nimport { UserId } from \"../../types/guid\";\nimport { DerivedStateDependencies } from \"../../types/state\";\n\nimport { DeriveDefinition } from \"./derive-definition\";\nimport { DerivedState } from \"./derived-state\";\nimport { GlobalState } from \"./global-state\";\n// eslint-disable-next-line @typescript-eslint/no-unused-vars -- used in docs\nimport { GlobalStateProvider } from \"./global-state.provider\";\nimport { KeyDefinition } from \"./key-definition\";\nimport { UserKeyDefinition } from \"./user-key-definition\";\nimport { ActiveUserState, SingleUserState } from \"./user-state\";\n// eslint-disable-next-line @typescript-eslint/no-unused-vars -- used in docs\nimport { ActiveUserStateProvider, SingleUserStateProvider } from \"./user-state.provider\";\n\n/** Convenience wrapper class for {@link ActiveUserStateProvider}, {@link SingleUserStateProvider},\n * and {@link GlobalStateProvider}.\n */\nexport abstract class StateProvider {\n /** @see{@link ActiveUserStateProvider.activeUserId$} */\n activeUserId$: Observable;\n\n /**\n * Gets a state observable for a given key and userId.\n *\n * @remarks If userId is falsy the observable returned will attempt to point to the currently active user _and not update if the active user changes_.\n * This is different to how `getActive` works and more similar to `getUser` for whatever user happens to be active at the time of the call.\n * If no user happens to be active at the time this method is called with a falsy userId then this observable will not emit a value until\n * a user becomes active. If you are not confident a user is active at the time this method is called, you may want to pipe a call to `timeout`\n * or instead call {@link getUserStateOrDefault$} and supply a value you would rather have given in the case of no passed in userId and no active user.\n *\n * @note consider converting your {@link KeyDefinition} to a {@link UserKeyDefinition} for additional features.\n *\n * @param keyDefinition - The key definition for the state you want to get.\n * @param userId - The userId for which you want the state for. If not provided, the state for the currently active user will be returned.\n */\n abstract getUserState$(keyDefinition: KeyDefinition, userId?: UserId): Observable;\n\n /**\n * Gets a state observable for a given key and userId.\n *\n * @remarks If userId is falsy the observable returned will attempt to point to the currently active user _and not update if the active user changes_.\n * This is different to how `getActive` works and more similar to `getUser` for whatever user happens to be active at the time of the call.\n * If no user happens to be active at the time this method is called with a falsy userId then this observable will not emit a value until\n * a user becomes active. If you are not confident a user is active at the time this method is called, you may want to pipe a call to `timeout`\n * or instead call {@link getUserStateOrDefault$} and supply a value you would rather have given in the case of no passed in userId and no active user.\n *\n * @param keyDefinition - The key definition for the state you want to get.\n * @param userId - The userId for which you want the state for. If not provided, the state for the currently active user will be returned.\n */\n abstract getUserState$(keyDefinition: UserKeyDefinition, userId?: UserId): Observable;\n\n /**\n * Gets a state observable for a given key and userId\n *\n * @remarks If userId is falsy the observable return will first attempt to point to the currently active user but will not follow subsequent active user changes,\n * if there is no immediately available active user, then it will fallback to returning a default value in an observable that immediately completes.\n *\n * @note consider converting your {@link KeyDefinition} to a {@link UserKeyDefinition} for additional features.\n *\n * @param keyDefinition - The key definition for the state you want to get.\n * @param config.userId - The userId for which you want the state for. If not provided, the state for the currently active user will be returned.\n * @param config.defaultValue - The default value that should be wrapped in an observable if no active user is immediately available and no truthy userId is passed in.\n */\n abstract getUserStateOrDefault$(\n keyDefinition: KeyDefinition,\n config: { userId: UserId | undefined; defaultValue?: T },\n ): Observable;\n\n /**\n * Gets a state observable for a given key and userId\n *\n * @remarks If userId is falsy the observable return will first attempt to point to the currently active user but will not follow subsequent active user changes,\n * if there is no immediately available active user, then it will fallback to returning a default value in an observable that immediately completes.\n *\n * @param keyDefinition - The key definition for the state you want to get.\n * @param config.userId - The userId for which you want the state for. If not provided, the state for the currently active user will be returned.\n * @param config.defaultValue - The default value that should be wrapped in an observable if no active user is immediately available and no truthy userId is passed in.\n */\n abstract getUserStateOrDefault$(\n keyDefinition: UserKeyDefinition,\n config: { userId: UserId | undefined; defaultValue?: T },\n ): Observable;\n\n /**\n * Sets the state for a given key and userId.\n *\n * @overload\n * @param keyDefinition - The key definition for the state you want to set.\n * @param value - The value to set the state to.\n * @param userId - The userId for which you want to set the state for. If not provided, the state for the currently active user will be set.\n */\n abstract setUserState(\n keyDefinition: UserKeyDefinition,\n value: T,\n userId?: UserId,\n ): Promise<[UserId, T]>;\n\n /**\n * Sets the state for a given key and userId.\n *\n * **NOTE** Consider converting your {@link KeyDefinition} to a {@link UserKeyDefinition} for additional features.\n *\n * @overload\n * @param keyDefinition - The key definition for the state you want to set.\n * @param value - The value to set the state to.\n * @param userId - The userId for which you want to set the state for. If not provided, the state for the currently active user will be set.\n */\n abstract setUserState(\n keyDefinition: KeyDefinition,\n value: T,\n userId?: UserId,\n ): Promise<[UserId, T]>;\n\n abstract setUserState(\n keyDefinition: KeyDefinition | UserKeyDefinition,\n value: T,\n userId?: UserId,\n ): Promise<[UserId, T]>;\n\n /** @see{@link ActiveUserStateProvider.get} */\n abstract getActive(keyDefinition: UserKeyDefinition): ActiveUserState;\n\n /**\n * @see{@link ActiveUserStateProvider.get}\n *\n * **NOTE** Consider converting your {@link KeyDefinition} to a {@link UserKeyDefinition} for additional features.\n */\n abstract getActive(keyDefinition: KeyDefinition): ActiveUserState;\n\n /** @see{@link ActiveUserStateProvider.get} */\n abstract getActive(keyDefinition: KeyDefinition | UserKeyDefinition): ActiveUserState;\n\n /** @see{@link SingleUserStateProvider.get} */\n abstract getUser(userId: UserId, keyDefinition: UserKeyDefinition): SingleUserState;\n\n /**\n * @see{@link SingleUserStateProvider.get}\n *\n * **NOTE** Consider converting your {@link KeyDefinition} to a {@link UserKeyDefinition} for additional features.\n */\n abstract getUser(userId: UserId, keyDefinition: KeyDefinition): SingleUserState;\n\n /** @see{@link SingleUserStateProvider.get} */\n abstract getUser(\n userId: UserId,\n keyDefinition: KeyDefinition | UserKeyDefinition,\n ): SingleUserState;\n\n /** @see{@link GlobalStateProvider.get} */\n getGlobal: (keyDefinition: KeyDefinition) => GlobalState;\n getDerived: (\n parentState$: Observable,\n deriveDefinition: DeriveDefinition,\n dependencies: TDeps,\n ) => DerivedState;\n}\n","import { GlobalState } from \"./global-state\";\nimport { KeyDefinition } from \"./key-definition\";\n\n/**\n * A provider for geting an implementation of global state scoped to the given key.\n */\nexport abstract class GlobalStateProvider {\n /**\n * Gets a {@link GlobalState} scoped to the given {@link KeyDefinition}\n * @param keyDefinition - The {@link KeyDefinition} for which you want the state for.\n */\n get: (keyDefinition: KeyDefinition) => GlobalState;\n}\n","import { Observable } from \"rxjs\";\n\nimport { UserId } from \"../../types/guid\";\n\nimport { KeyDefinition } from \"./key-definition\";\nimport { UserKeyDefinition } from \"./user-key-definition\";\nimport { ActiveUserState, SingleUserState } from \"./user-state\";\n\n/** A provider for getting an implementation of state scoped to a given key and userId */\nexport abstract class SingleUserStateProvider {\n /**\n * Gets a {@link SingleUserState} scoped to the given {@link KeyDefinition} and {@link UserId}\n *\n * **NOTE** Consider converting your {@link KeyDefinition} to a {@link UserKeyDefinition} for additional features.\n *\n * @param userId - The {@link UserId} for which you want the user state for.\n * @param keyDefinition - The {@link KeyDefinition} for which you want the user state for.\n */\n abstract get(userId: UserId, keyDefinition: KeyDefinition): SingleUserState;\n\n /**\n * Gets a {@link SingleUserState} scoped to the given {@link UserKeyDefinition} and {@link UserId}\n *\n * @param userId - The {@link UserId} for which you want the user state for.\n * @param userKeyDefinition - The {@link UserKeyDefinition} for which you want the user state for.\n */\n abstract get(userId: UserId, userKeyDefinition: UserKeyDefinition): SingleUserState;\n\n abstract get(\n userId: UserId,\n keyDefinition: KeyDefinition | UserKeyDefinition,\n ): SingleUserState;\n}\n\n/** A provider for getting an implementation of state scoped to a given key, but always pointing\n * to the currently active user\n */\nexport abstract class ActiveUserStateProvider {\n /**\n * Convenience re-emission of active user ID from {@link AccountService.activeAccount$}\n */\n activeUserId$: Observable;\n\n /**\n * Gets a {@link ActiveUserState} scoped to the given {@link KeyDefinition}, but updates when active user changes such\n * that the emitted values always represents the state for the currently active user.\n *\n * @param keyDefinition - The {@link UserKeyDefinition} for which you want the user state for.\n */\n abstract get(userKeyDefinition: UserKeyDefinition): ActiveUserState;\n\n /**\n * Gets a {@link ActiveUserState} scoped to the given {@link KeyDefinition}, but updates when active user changes such\n * that the emitted values always represents the state for the currently active user.\n *\n * **NOTE** Consider converting your {@link KeyDefinition} to a {@link UserKeyDefinition} for additional features.\n *\n * @param keyDefinition - The {@link KeyDefinition} for which you want the user state for.\n */\n abstract get(keyDefinition: KeyDefinition): ActiveUserState;\n\n abstract get(keyDefinition: KeyDefinition | UserKeyDefinition): ActiveUserState;\n}\n","import { Jsonify } from \"type-fest\";\n\nimport { StorageKey } from \"../../types/state\";\n\nimport { array, record } from \"./deserialization-helpers\";\nimport { StateDefinition } from \"./state-definition\";\n\n/**\n * A set of options for customizing the behavior of a {@link KeyDefinition}\n */\nexport type KeyDefinitionOptions = {\n /**\n * A function to use to safely convert your type from json to your expected type.\n *\n * **Important:** Your data may be serialized/deserialized at any time and this\n * callback needs to be able to faithfully re-initialize from the JSON object representation of your type.\n *\n * @param jsonValue The JSON object representation of your state.\n * @returns The fully typed version of your state.\n */\n readonly deserializer: (jsonValue: Jsonify) => T;\n /**\n * The number of milliseconds to wait before cleaning up the state after the last subscriber has unsubscribed.\n * Defaults to 1000ms.\n */\n readonly cleanupDelayMs?: number;\n};\n\n/**\n * KeyDefinitions describe the precise location to store data for a given piece of state.\n * The StateDefinition is used to describe the domain of the state, and the KeyDefinition\n * sub-divides that domain into specific keys.\n */\nexport class KeyDefinition {\n /**\n * Creates a new instance of a KeyDefinition\n * @param stateDefinition The state definition for which this key belongs to.\n * @param key The name of the key, this should be unique per domain.\n * @param options A set of options to customize the behavior of {@link KeyDefinition}. All options are required.\n * @param options.deserializer A function to use to safely convert your type from json to your expected type.\n * Your data may be serialized/deserialized at any time and this needs callback needs to be able to faithfully re-initialize\n * from the JSON object representation of your type.\n */\n constructor(\n readonly stateDefinition: StateDefinition,\n readonly key: string,\n private readonly options: KeyDefinitionOptions,\n ) {\n if (options.deserializer == null) {\n throw new Error(`'deserializer' is a required property on key ${this.errorKeyName}`);\n }\n\n if (options.cleanupDelayMs <= 0) {\n throw new Error(\n `'cleanupDelayMs' must be greater than 0. Value of ${options.cleanupDelayMs} passed to key ${this.errorKeyName} `,\n );\n }\n }\n\n /**\n * Gets the deserializer configured for this {@link KeyDefinition}\n */\n get deserializer() {\n return this.options.deserializer;\n }\n\n /**\n * Gets the number of milliseconds to wait before cleaning up the state after the last subscriber has unsubscribed.\n */\n get cleanupDelayMs() {\n return this.options.cleanupDelayMs < 0 ? 0 : this.options.cleanupDelayMs ?? 1000;\n }\n\n /**\n * Creates a {@link KeyDefinition} for state that is an array.\n * @param stateDefinition The state definition to be added to the KeyDefinition\n * @param key The key to be added to the KeyDefinition\n * @param options The options to customize the final {@link KeyDefinition}.\n * @returns A {@link KeyDefinition} initialized for arrays, the options run\n * the deserializer on the provided options for each element of an array.\n *\n * @example\n * ```typescript\n * const MY_KEY = KeyDefinition.array(MY_STATE, \"key\", {\n * deserializer: (myJsonElement) => convertToElement(myJsonElement),\n * });\n * ```\n */\n static array(\n stateDefinition: StateDefinition,\n key: string,\n // We have them provide options for the element of the array, depending on future options we add, this could get a little weird.\n options: KeyDefinitionOptions, // The array helper forces an initialValue of an empty array\n ) {\n return new KeyDefinition(stateDefinition, key, {\n ...options,\n deserializer: array((e) => options.deserializer(e)),\n });\n }\n\n /**\n * Creates a {@link KeyDefinition} for state that is a record.\n * @param stateDefinition The state definition to be added to the KeyDefinition\n * @param key The key to be added to the KeyDefinition\n * @param options The options to customize the final {@link KeyDefinition}.\n * @returns A {@link KeyDefinition} that contains a serializer that will run the provided deserializer for each\n * value in a record and returns every key as a string.\n *\n * @example\n * ```typescript\n * const MY_KEY = KeyDefinition.record(MY_STATE, \"key\", {\n * deserializer: (myJsonValue) => convertToValue(myJsonValue),\n * });\n * ```\n */\n static record(\n stateDefinition: StateDefinition,\n key: string,\n // We have them provide options for the value of the record, depending on future options we add, this could get a little weird.\n options: KeyDefinitionOptions, // The array helper forces an initialValue of an empty record\n ) {\n return new KeyDefinition>(stateDefinition, key, {\n ...options,\n deserializer: record((v) => options.deserializer(v)),\n });\n }\n\n get fullName() {\n return `${this.stateDefinition.name}_${this.key}`;\n }\n\n protected get errorKeyName() {\n return `${this.stateDefinition.name} > ${this.key}`;\n }\n}\n\n/**\n * Creates a {@link StorageKey}\n * @param keyDefinition The key definition of which data the key should point to.\n * @returns A key that is ready to be used in a storage service to get data.\n */\nexport function globalKeyBuilder(keyDefinition: KeyDefinition): StorageKey {\n return `global_${keyDefinition.stateDefinition.name}_${keyDefinition.key}` as StorageKey;\n}\n","/**\n * Default storage location options.\n *\n * `disk` generally means state that is accessible between restarts of the application,\n * with the exception of the web client. In web this means `sessionStorage`. The data\n * persists through refreshes of the page but not available once that tab is closed or\n * from any other tabs.\n *\n * `memory` means that the information stored there goes away during application\n * restarts.\n */\nexport type StorageLocation = \"disk\" | \"memory\";\n\n/**\n * *Note*: The property names of this object should match exactly with the string values of the {@link ClientType} enum\n */\nexport type ClientLocations = {\n /**\n * Overriding storage location for the web client.\n *\n * Includes an extra storage location to store data in `localStorage`\n * that is available from different tabs and after a tab has closed.\n */\n web: StorageLocation | \"disk-local\";\n /**\n * Overriding storage location for browser clients.\n */\n //browser: StorageLocation;\n /**\n * Overriding storage location for desktop clients.\n */\n //desktop: StorageLocation;\n /**\n * Overriding storage location for CLI clients.\n */\n //cli: StorageLocation;\n};\n\n/**\n * Defines the base location and instruction of where this state is expected to be located.\n */\nexport class StateDefinition {\n readonly storageLocationOverrides: Partial;\n\n /**\n * Creates a new instance of {@link StateDefinition}, the creation of which is owned by the platform team.\n * @param name The name of the state, this needs to be unique from all other {@link StateDefinition}'s.\n * @param defaultStorageLocation The location of where this state should be stored.\n */\n constructor(\n readonly name: string,\n readonly defaultStorageLocation: StorageLocation,\n storageLocationOverrides?: Partial,\n ) {\n this.storageLocationOverrides = storageLocationOverrides ?? {};\n }\n}\n","import { StateDefinition } from \"./state-definition\";\n\n/**\n * `StateDefinition`s comes with some rules, to facilitate a quick review from\n * platform of this file, ensure you follow these rules, the ones marked with (tested)\n * have unit tests that you can run locally.\n *\n * 1. (tested) Names should not be null or undefined\n * 2. (tested) Name and storage location should be unique\n * 3. (tested) Name and storage location can't differ from another export by only casing\n * 4. (tested) Name should be longer than 3 characters. It should be descriptive, but brief.\n * 5. (tested) Name should not contain spaces or underscores\n * 6. Name should be human readable\n * 7. Name should be in camelCase format (unit tests ensure the first character is lowercase)\n * 8. Teams should only use state definitions they have created\n * 9. StateDefinitions should only be used for keys relating to the state name they chose\n *\n */\n\n// Admin Console\n\nexport const ORGANIZATIONS_DISK = new StateDefinition(\"organizations\", \"disk\");\nexport const POLICIES_DISK = new StateDefinition(\"policies\", \"disk\");\nexport const PROVIDERS_DISK = new StateDefinition(\"providers\", \"disk\");\nexport const ORGANIZATION_MANAGEMENT_PREFERENCES_DISK = new StateDefinition(\n \"organizationManagementPreferences\",\n \"disk\",\n {\n web: \"disk-local\",\n },\n);\n\n// Billing\nexport const BILLING_DISK = new StateDefinition(\"billing\", \"disk\");\n\n// Auth\n\nexport const ACCOUNT_MEMORY = new StateDefinition(\"account\", \"memory\");\nexport const AVATAR_DISK = new StateDefinition(\"avatar\", \"disk\", { web: \"disk-local\" });\nexport const SSO_DISK = new StateDefinition(\"ssoLogin\", \"disk\");\nexport const TOKEN_DISK = new StateDefinition(\"token\", \"disk\");\nexport const TOKEN_DISK_LOCAL = new StateDefinition(\"tokenDiskLocal\", \"disk\", {\n web: \"disk-local\",\n});\nexport const TOKEN_MEMORY = new StateDefinition(\"token\", \"memory\");\nexport const LOGIN_STRATEGY_MEMORY = new StateDefinition(\"loginStrategy\", \"memory\");\nexport const USER_DECRYPTION_OPTIONS_DISK = new StateDefinition(\"userDecryptionOptions\", \"disk\");\n\n// Autofill\n\nexport const BADGE_SETTINGS_DISK = new StateDefinition(\"badgeSettings\", \"disk\");\nexport const USER_NOTIFICATION_SETTINGS_DISK = new StateDefinition(\n \"userNotificationSettings\",\n \"disk\",\n);\n\nexport const DOMAIN_SETTINGS_DISK = new StateDefinition(\"domainSettings\", \"disk\");\nexport const AUTOFILL_SETTINGS_DISK = new StateDefinition(\"autofillSettings\", \"disk\");\nexport const AUTOFILL_SETTINGS_DISK_LOCAL = new StateDefinition(\"autofillSettingsLocal\", \"disk\", {\n web: \"disk-local\",\n});\n\n// Components\n\nexport const NEW_WEB_LAYOUT_BANNER_DISK = new StateDefinition(\"newWebLayoutBanner\", \"disk\", {\n web: \"disk-local\",\n});\n\n// Platform\n\nexport const APPLICATION_ID_DISK = new StateDefinition(\"applicationId\", \"disk\", {\n web: \"disk-local\",\n});\nexport const BIOMETRIC_SETTINGS_DISK = new StateDefinition(\"biometricSettings\", \"disk\");\nexport const CLEAR_EVENT_DISK = new StateDefinition(\"clearEvent\", \"disk\");\nexport const CRYPTO_DISK = new StateDefinition(\"crypto\", \"disk\");\nexport const CRYPTO_MEMORY = new StateDefinition(\"crypto\", \"memory\");\nexport const DESKTOP_SETTINGS_DISK = new StateDefinition(\"desktopSettings\", \"disk\");\nexport const ENVIRONMENT_DISK = new StateDefinition(\"environment\", \"disk\");\nexport const ENVIRONMENT_MEMORY = new StateDefinition(\"environment\", \"memory\");\nexport const THEMING_DISK = new StateDefinition(\"theming\", \"disk\", { web: \"disk-local\" });\nexport const TRANSLATION_DISK = new StateDefinition(\"translation\", \"disk\");\n\n// Secrets Manager\n\nexport const SM_ONBOARDING_DISK = new StateDefinition(\"smOnboarding\", \"disk\", {\n web: \"disk-local\",\n});\n\n// Tools\n\nexport const GENERATOR_DISK = new StateDefinition(\"generator\", \"disk\");\nexport const GENERATOR_MEMORY = new StateDefinition(\"generator\", \"memory\");\nexport const EVENT_COLLECTION_DISK = new StateDefinition(\"eventCollection\", \"disk\");\n\n// Vault\n\nexport const COLLECTION_DATA = new StateDefinition(\"collection\", \"disk\", {\n web: \"memory\",\n});\nexport const FOLDER_DISK = new StateDefinition(\"folder\", \"disk\", { web: \"memory\" });\nexport const VAULT_FILTER_DISK = new StateDefinition(\"vaultFilter\", \"disk\", {\n web: \"disk-local\",\n});\nexport const VAULT_ONBOARDING = new StateDefinition(\"vaultOnboarding\", \"disk\", {\n web: \"disk-local\",\n});\nexport const VAULT_SETTINGS_DISK = new StateDefinition(\"vaultSettings\", \"disk\", {\n web: \"disk-local\",\n});\n","import { PossibleLocation, StorageServiceProvider } from \"../services/storage-service.provider\";\n\nimport { GlobalState } from \"./global-state\";\nimport { GlobalStateProvider } from \"./global-state.provider\";\nimport { KeyDefinition } from \"./key-definition\";\nimport { CLEAR_EVENT_DISK } from \"./state-definitions\";\nimport { ClearEvent, UserKeyDefinition } from \"./user-key-definition\";\n\nexport type StateEventInfo = {\n state: string;\n key: string;\n location: PossibleLocation;\n};\n\nexport const STATE_LOCK_EVENT = KeyDefinition.array(CLEAR_EVENT_DISK, \"lock\", {\n deserializer: (e) => e,\n});\n\nexport const STATE_LOGOUT_EVENT = KeyDefinition.array(CLEAR_EVENT_DISK, \"logout\", {\n deserializer: (e) => e,\n});\n\nexport class StateEventRegistrarService {\n private readonly stateEventStateMap: { [Prop in ClearEvent]: GlobalState };\n\n constructor(\n globalStateProvider: GlobalStateProvider,\n private storageServiceProvider: StorageServiceProvider,\n ) {\n this.stateEventStateMap = {\n lock: globalStateProvider.get(STATE_LOCK_EVENT),\n logout: globalStateProvider.get(STATE_LOGOUT_EVENT),\n };\n }\n\n async registerEvents(keyDefinition: UserKeyDefinition) {\n for (const clearEvent of keyDefinition.clearOn) {\n const eventState = this.stateEventStateMap[clearEvent];\n // Determine the storage location for this\n const [storageLocation] = this.storageServiceProvider.get(\n keyDefinition.stateDefinition.defaultStorageLocation,\n keyDefinition.stateDefinition.storageLocationOverrides,\n );\n\n const newEvent: StateEventInfo = {\n state: keyDefinition.stateDefinition.name,\n key: keyDefinition.key,\n location: storageLocation,\n };\n\n // Only update the event state if the existing list doesn't have a matching entry\n await eventState.update(\n (existingTickets) => {\n existingTickets ??= [];\n existingTickets.push(newEvent);\n return existingTickets;\n },\n {\n shouldUpdate: (currentTickets) => {\n return (\n // If the current tickets are null, then it will for sure be added\n currentTickets == null ||\n // If an existing match couldn't be found, we also need to add one\n currentTickets.findIndex(\n (e) =>\n e.state === newEvent.state &&\n e.key === newEvent.key &&\n e.location === newEvent.location,\n ) === -1\n );\n },\n },\n );\n }\n }\n}\n","import { firstValueFrom } from \"rxjs\";\n\nimport { UserId } from \"../../types/guid\";\nimport { StorageServiceProvider } from \"../services/storage-service.provider\";\n\nimport { GlobalState } from \"./global-state\";\nimport { GlobalStateProvider } from \"./global-state.provider\";\nimport { StateDefinition, StorageLocation } from \"./state-definition\";\nimport {\n STATE_LOCK_EVENT,\n STATE_LOGOUT_EVENT,\n StateEventInfo,\n} from \"./state-event-registrar.service\";\nimport { ClearEvent, UserKeyDefinition } from \"./user-key-definition\";\n\nexport class StateEventRunnerService {\n private readonly stateEventMap: { [Prop in ClearEvent]: GlobalState };\n\n constructor(\n globalStateProvider: GlobalStateProvider,\n private storageServiceProvider: StorageServiceProvider,\n ) {\n this.stateEventMap = {\n lock: globalStateProvider.get(STATE_LOCK_EVENT),\n logout: globalStateProvider.get(STATE_LOGOUT_EVENT),\n };\n }\n\n async handleEvent(event: ClearEvent, userId: UserId) {\n let tickets = await firstValueFrom(this.stateEventMap[event].state$);\n tickets ??= [];\n\n const failures: string[] = [];\n\n for (const ticket of tickets) {\n try {\n const [, service] = this.storageServiceProvider.get(\n ticket.location,\n {}, // The storage location is already the computed storage location for this client\n );\n\n const ticketStorageKey = this.storageKeyFor(userId, ticket);\n\n // Evaluate current value so we can avoid writing to state if we don't need to\n const currentValue = await service.get(ticketStorageKey);\n if (currentValue != null) {\n await service.remove(ticketStorageKey);\n }\n } catch (err: unknown) {\n let errorMessage = \"Unknown Error\";\n if (typeof err === \"object\" && \"message\" in err && typeof err.message === \"string\") {\n errorMessage = err.message;\n }\n\n failures.push(\n `${errorMessage} in ${ticket.state} > ${ticket.key} located ${ticket.location}`,\n );\n }\n }\n\n if (failures.length > 0) {\n // Throw aggregated error\n throw new Error(\n `One or more errors occurred while handling event '${event}' for user ${userId}.\\n${failures.join(\"\\n\")}`,\n );\n }\n }\n\n private storageKeyFor(userId: UserId, ticket: StateEventInfo) {\n const userKey = new UserKeyDefinition(\n new StateDefinition(ticket.state, ticket.location as unknown as StorageLocation),\n ticket.key,\n {\n deserializer: (v) => v,\n clearOn: [],\n },\n );\n return userKey.buildKey(userId);\n }\n}\n","import { UserId } from \"../../types/guid\";\nimport { StorageKey } from \"../../types/state\";\nimport { Utils } from \"../misc/utils\";\n\nimport { array, record } from \"./deserialization-helpers\";\nimport { KeyDefinition, KeyDefinitionOptions } from \"./key-definition\";\nimport { StateDefinition } from \"./state-definition\";\n\nexport type ClearEvent = \"lock\" | \"logout\";\n\ntype UserKeyDefinitionOptions = KeyDefinitionOptions & {\n clearOn: ClearEvent[];\n};\n\nconst USER_KEY_DEFINITION_MARKER: unique symbol = Symbol(\"UserKeyDefinition\");\n\nexport function isUserKeyDefinition(\n keyDefinition: KeyDefinition | UserKeyDefinition,\n): keyDefinition is UserKeyDefinition {\n return (\n USER_KEY_DEFINITION_MARKER in keyDefinition &&\n keyDefinition[USER_KEY_DEFINITION_MARKER] === true\n );\n}\n\nexport class UserKeyDefinition {\n readonly [USER_KEY_DEFINITION_MARKER] = true;\n /**\n * A unique array of events that the state stored at this key should be cleared on.\n */\n readonly clearOn: ClearEvent[];\n\n constructor(\n readonly stateDefinition: StateDefinition,\n readonly key: string,\n private readonly options: UserKeyDefinitionOptions,\n ) {\n if (options.deserializer == null) {\n throw new Error(`'deserializer' is a required property on key ${this.errorKeyName}`);\n }\n\n if (options.cleanupDelayMs <= 0) {\n throw new Error(\n `'cleanupDelayMs' must be greater than 0. Value of ${options.cleanupDelayMs} passed to key ${this.errorKeyName} `,\n );\n }\n\n // Filter out repeat values\n this.clearOn = Array.from(new Set(options.clearOn));\n }\n\n /**\n * Gets the deserializer configured for this {@link KeyDefinition}\n */\n get deserializer() {\n return this.options.deserializer;\n }\n\n /**\n * Gets the number of milliseconds to wait before cleaning up the state after the last subscriber has unsubscribed.\n */\n get cleanupDelayMs() {\n return this.options.cleanupDelayMs < 0 ? 0 : this.options.cleanupDelayMs ?? 1000;\n }\n\n /**\n *\n * @param keyDefinition\n * @returns\n *\n * @deprecated You should not use this to convert, just create a {@link UserKeyDefinition}\n */\n static fromBaseKeyDefinition(keyDefinition: KeyDefinition) {\n return new UserKeyDefinition(keyDefinition.stateDefinition, keyDefinition.key, {\n ...keyDefinition[\"options\"],\n clearOn: [], // Default to not clearing\n });\n }\n\n /**\n * Creates a {@link UserKeyDefinition} for state that is an array.\n * @param stateDefinition The state definition to be added to the UserKeyDefinition\n * @param key The key to be added to the KeyDefinition\n * @param options The options to customize the final {@link UserKeyDefinition}.\n * @returns A {@link UserKeyDefinition} initialized for arrays, the options run\n * the deserializer on the provided options for each element of an array\n * **unless that array is null, in which case it will return an empty list.**\n *\n * @example\n * ```typescript\n * const MY_KEY = UserKeyDefinition.array(MY_STATE, \"key\", {\n * deserializer: (myJsonElement) => convertToElement(myJsonElement),\n * });\n * ```\n */\n static array(\n stateDefinition: StateDefinition,\n key: string,\n // We have them provide options for the element of the array, depending on future options we add, this could get a little weird.\n options: UserKeyDefinitionOptions,\n ) {\n return new UserKeyDefinition(stateDefinition, key, {\n ...options,\n deserializer: array((e) => options.deserializer(e)),\n });\n }\n\n /**\n * Creates a {@link UserKeyDefinition} for state that is a record.\n * @param stateDefinition The state definition to be added to the UserKeyDefinition\n * @param key The key to be added to the KeyDefinition\n * @param options The options to customize the final {@link UserKeyDefinition}.\n * @returns A {@link UserKeyDefinition} that contains a serializer that will run the provided deserializer for each\n * value in a record and returns every key as a string **unless that record is null, in which case it will return an record.**\n *\n * @example\n * ```typescript\n * const MY_KEY = UserKeyDefinition.record(MY_STATE, \"key\", {\n * deserializer: (myJsonValue) => convertToValue(myJsonValue),\n * });\n * ```\n */\n static record(\n stateDefinition: StateDefinition,\n key: string,\n // We have them provide options for the value of the record, depending on future options we add, this could get a little weird.\n options: UserKeyDefinitionOptions, // The array helper forces an initialValue of an empty record\n ) {\n return new UserKeyDefinition>(stateDefinition, key, {\n ...options,\n deserializer: record((v) => options.deserializer(v)),\n });\n }\n\n get fullName() {\n return `${this.stateDefinition.name}_${this.key}`;\n }\n\n buildKey(userId: UserId) {\n if (!Utils.isGuid(userId)) {\n throw new Error(\n `You cannot build a user key without a valid UserId, building for key ${this.fullName}`,\n );\n }\n return `user_${userId}_${this.stateDefinition.name}_${this.key}` as StorageKey;\n }\n\n private get errorKeyName() {\n return `${this.stateDefinition.name} > ${this.key}`;\n }\n}\n","import { Observable, map } from \"rxjs\";\n\nimport { ThemeType } from \"../enums\";\nimport { GlobalStateProvider, KeyDefinition, THEMING_DISK } from \"../state\";\n\nexport abstract class ThemeStateService {\n /**\n * The users selected theme.\n */\n selectedTheme$: Observable;\n\n /**\n * A method for updating the current users configured theme.\n * @param theme The chosen user theme.\n */\n setSelectedTheme: (theme: ThemeType) => Promise;\n}\n\nconst THEME_SELECTION = new KeyDefinition(THEMING_DISK, \"selection\", {\n deserializer: (s) => s,\n});\n\nexport class DefaultThemeStateService implements ThemeStateService {\n private readonly selectedThemeState = this.globalStateProvider.get(THEME_SELECTION);\n\n selectedTheme$ = this.selectedThemeState.state$.pipe(map((theme) => theme ?? this.defaultTheme));\n\n constructor(\n private globalStateProvider: GlobalStateProvider,\n private defaultTheme: ThemeType = ThemeType.System,\n ) {}\n\n async setSelectedTheme(theme: ThemeType): Promise {\n await this.selectedThemeState.update(() => theme, {\n shouldUpdate: (currentTheme) => currentTheme !== theme,\n });\n }\n}\n","import { GENERATOR_DISK, KeyDefinition } from \"../../platform/state\";\n\nimport { PassphraseGenerationOptions } from \"./passphrase/passphrase-generation-options\";\nimport { GeneratedPasswordHistory } from \"./password/generated-password-history\";\nimport { PasswordGenerationOptions } from \"./password/password-generation-options\";\nimport { CatchallGenerationOptions } from \"./username/catchall-generator-options\";\nimport { EffUsernameGenerationOptions } from \"./username/eff-username-generator-options\";\nimport {\n ApiOptions,\n EmailDomainOptions,\n EmailPrefixOptions,\n SelfHostedApiOptions,\n} from \"./username/options/forwarder-options\";\nimport { SubaddressGenerationOptions } from \"./username/subaddress-generator-options\";\n\n/** plaintext password generation options */\nexport const PASSWORD_SETTINGS = new KeyDefinition(\n GENERATOR_DISK,\n \"passwordGeneratorSettings\",\n {\n deserializer: (value) => value,\n },\n);\n\n/** plaintext passphrase generation options */\nexport const PASSPHRASE_SETTINGS = new KeyDefinition(\n GENERATOR_DISK,\n \"passphraseGeneratorSettings\",\n {\n deserializer: (value) => value,\n },\n);\n\n/** plaintext username generation options */\nexport const EFF_USERNAME_SETTINGS = new KeyDefinition(\n GENERATOR_DISK,\n \"effUsernameGeneratorSettings\",\n {\n deserializer: (value) => value,\n },\n);\n\n/** catchall email generation options */\nexport const CATCHALL_SETTINGS = new KeyDefinition(\n GENERATOR_DISK,\n \"catchallGeneratorSettings\",\n {\n deserializer: (value) => value,\n },\n);\n\n/** email subaddress generation options */\nexport const SUBADDRESS_SETTINGS = new KeyDefinition(\n GENERATOR_DISK,\n \"subaddressGeneratorSettings\",\n {\n deserializer: (value) => value,\n },\n);\n\nexport const ADDY_IO_FORWARDER = new KeyDefinition(\n GENERATOR_DISK,\n \"addyIoForwarder\",\n {\n deserializer: (value) => value,\n },\n);\n\nexport const DUCK_DUCK_GO_FORWARDER = new KeyDefinition(\n GENERATOR_DISK,\n \"duckDuckGoForwarder\",\n {\n deserializer: (value) => value,\n },\n);\n\nexport const FASTMAIL_FORWARDER = new KeyDefinition(\n GENERATOR_DISK,\n \"fastmailForwarder\",\n {\n deserializer: (value) => value,\n },\n);\n\nexport const FIREFOX_RELAY_FORWARDER = new KeyDefinition(\n GENERATOR_DISK,\n \"firefoxRelayForwarder\",\n {\n deserializer: (value) => value,\n },\n);\n\nexport const FORWARD_EMAIL_FORWARDER = new KeyDefinition(\n GENERATOR_DISK,\n \"forwardEmailForwarder\",\n {\n deserializer: (value) => value,\n },\n);\n\nexport const SIMPLE_LOGIN_FORWARDER = new KeyDefinition(\n GENERATOR_DISK,\n \"simpleLoginForwarder\",\n {\n deserializer: (value) => value,\n },\n);\n\n/** encrypted password generation history */\nexport const ENCRYPTED_HISTORY = new KeyDefinition(\n GENERATOR_DISK,\n \"passwordGeneratorHistory\",\n {\n deserializer: (value) => value,\n },\n);\n","import { DefaultBoundaries } from \"./password-generator-options-evaluator\";\n\n/** Request format for password credential generation.\n * All members of this type may be `undefined` when the user is\n * generating a passphrase.\n *\n * @remarks The name of this type is a bit of a misnomer. This type\n * it is used with the \"password generator\" types. The name\n * `PasswordGeneratorOptions` is already in use by legacy code.\n */\nexport type PasswordGenerationOptions = {\n /** The length of the password selected by the user */\n length?: number;\n\n /** The minimum length of the password. This defaults to 5, and increases\n * to ensure `minLength` is at least as large as the sum of the other minimums.\n */\n minLength?: number;\n\n /** `true` when ambiguous characters may be included in the output.\n * `false` when ambiguous characters should not be included in the output.\n */\n ambiguous?: boolean;\n\n /** `true` when uppercase ASCII characters should be included in the output\n * This value defaults to `false.\n */\n uppercase?: boolean;\n\n /** The minimum number of uppercase characters to include in the output.\n * The value is ignored when `uppercase` is `false`.\n * The value defaults to 1 when `uppercase` is `true`.\n */\n minUppercase?: number;\n\n /** `true` when lowercase ASCII characters should be included in the output.\n * This value defaults to `false`.\n */\n lowercase?: boolean;\n\n /** The minimum number of lowercase characters to include in the output.\n * The value defaults to 1 when `lowercase` is `true`.\n * The value defaults to 0 when `lowercase` is `false`.\n */\n minLowercase?: number;\n\n /** Whether or not to include ASCII digits in the output\n * This value defaults to `true` when `minNumber` is at least 1.\n * This value defaults to `false` when `minNumber` is less than 1.\n */\n number?: boolean;\n\n /** The minimum number of digits to include in the output.\n * The value defaults to 1 when `number` is `true`.\n * The value defaults to 0 when `number` is `false`.\n */\n minNumber?: number;\n\n /** Whether or not to include special characters in the output.\n * This value defaults to `true` when `minSpecial` is at least 1.\n * This value defaults to `false` when `minSpecial` is less than 1.\n */\n special?: boolean;\n\n /** The minimum number of special characters to include in the output.\n * This value defaults to 1 when `special` is `true`.\n * This value defaults to 0 when `special` is `false`.\n */\n minSpecial?: number;\n};\n\n/** The default options for password generation. */\nexport const DefaultPasswordGenerationOptions: Partial = Object.freeze({\n length: 14,\n minLength: DefaultBoundaries.length.min,\n ambiguous: true,\n uppercase: true,\n lowercase: true,\n number: true,\n minNumber: 1,\n special: false,\n minSpecial: 0,\n});\n","/** Policy options enforced during password generation. */\nexport type PasswordGeneratorPolicy = {\n /** The minimum length of generated passwords.\n * When this is less than or equal to zero, it is ignored.\n * If this is less than the total number of characters required by\n * the policy's other settings, then it is ignored.\n */\n minLength: number;\n\n /** When this is true, an uppercase character must be part of\n * the generated password.\n */\n useUppercase: boolean;\n\n /** When this is true, a lowercase character must be part of\n * the generated password.\n */\n useLowercase: boolean;\n\n /** When this is true, at least one digit must be part of the generated\n * password.\n */\n useNumbers: boolean;\n\n /** The quantity of digits to include in the generated password.\n * When this is less than or equal to zero, it is ignored.\n */\n numberCount: number;\n\n /** When this is true, at least one digit must be part of the generated\n * password.\n */\n useSpecial: boolean;\n\n /** The quantity of special characters to include in the generated\n * password. When this is less than or equal to zero, it is ignored.\n */\n specialCount: number;\n};\n\n/** The default options for password generation policy. */\nexport const DisabledPasswordGeneratorPolicy: PasswordGeneratorPolicy = Object.freeze({\n minLength: 0,\n useUppercase: false,\n useLowercase: false,\n useNumbers: false,\n numberCount: 0,\n useSpecial: false,\n specialCount: 0,\n});\n","import { PasswordGeneratorPolicyOptions } from \"../../../admin-console/models/domain/password-generator-policy-options\";\n\nimport { GeneratedPasswordHistory } from \"./generated-password-history\";\nimport { PasswordGeneratorOptions } from \"./password-generator-options\";\n\nexport abstract class PasswordGenerationServiceAbstraction {\n generatePassword: (options: PasswordGeneratorOptions) => Promise;\n generatePassphrase: (options: PasswordGeneratorOptions) => Promise;\n getOptions: () => Promise<[PasswordGeneratorOptions, PasswordGeneratorPolicyOptions]>;\n enforcePasswordGeneratorPoliciesOnOptions: (\n options: PasswordGeneratorOptions,\n ) => Promise<[PasswordGeneratorOptions, PasswordGeneratorPolicyOptions]>;\n getPasswordGeneratorPolicyOptions: () => Promise;\n saveOptions: (options: PasswordGeneratorOptions) => Promise;\n getHistory: () => Promise;\n addHistory: (password: string) => Promise;\n clear: (userId?: string) => Promise;\n normalizeOptions: (\n options: PasswordGeneratorOptions,\n enforcedPolicyOptions: PasswordGeneratorPolicyOptions,\n ) => void;\n}\n","import Domain from \"../../../platform/models/domain/domain-base\";\n\n/** Enterprise policy for the password generator.\n * @see PolicyType.PasswordGenerator\n */\nexport class PasswordGeneratorPolicyOptions extends Domain {\n /** The default kind of credential to generate */\n defaultType: \"password\" | \"passphrase\" | \"\" = \"\";\n\n /** The minimum length of generated passwords.\n * When this is less than or equal to zero, it is ignored.\n * If this is less than the total number of characters required by\n * the policy's other settings, then it is ignored.\n * This field is not used for passphrases.\n */\n minLength = 0;\n\n /** When this is true, an uppercase character must be part of\n * the generated password.\n * This field is not used for passphrases.\n */\n useUppercase = false;\n\n /** When this is true, a lowercase character must be part of\n * the generated password. This field is not used for passphrases.\n */\n useLowercase = false;\n\n /** When this is true, at least one digit must be part of the generated\n * password. This field is not used for passphrases.\n */\n useNumbers = false;\n\n /** The quantity of digits to include in the generated password.\n * When this is less than or equal to zero, it is ignored.\n * This field is not used for passphrases.\n */\n numberCount = 0;\n\n /** When this is true, at least one digit must be part of the generated\n * password. This field is not used for passphrases.\n */\n useSpecial = false;\n\n /** The quantity of special characters to include in the generated\n * password. When this is less than or equal to zero, it is ignored.\n * This field is not used for passphrases.\n */\n specialCount = 0;\n\n /** The minimum number of words required by generated passphrases.\n * This field is not used for passwords.\n */\n minNumberWords = 0;\n\n /** When this is true, the first letter of each word in the passphrase\n * is capitalized. This field is not used for passwords.\n */\n capitalize = false;\n\n /** When this is true, a number is included within the passphrase.\n * This field is not used for passwords.\n */\n includeNumber = false;\n\n /** Checks whether the policy affects the password generator.\n * @returns True if at least one password or passphrase requirement has been set.\n * If it returns False, then no requirements have been set and the policy should\n * not be enforced.\n */\n inEffect() {\n return (\n this.defaultType !== \"\" ||\n this.minLength > 0 ||\n this.numberCount > 0 ||\n this.specialCount > 0 ||\n this.useUppercase ||\n this.useLowercase ||\n this.useNumbers ||\n this.useSpecial ||\n this.minNumberWords > 0 ||\n this.capitalize ||\n this.includeNumber\n );\n }\n\n /** Creates a copy of the policy.\n */\n clone() {\n const policy = new PasswordGeneratorPolicyOptions();\n Object.assign(policy, this);\n return policy;\n }\n}\n","/** Request format for passphrase credential generation.\n * The members of this type may be `undefined` when the user is\n * generating a password.\n */\nexport type PassphraseGenerationOptions = {\n /** The number of words to include in the passphrase.\n * This value defaults to 3.\n */\n numWords?: number;\n\n /** The ASCII separator character to use between words in the passphrase.\n * This value defaults to a dash.\n * If multiple characters appear in the string, only the first character is used.\n */\n wordSeparator?: string;\n\n /** `true` when the first character of every word should be capitalized.\n * This value defaults to `false`.\n */\n capitalize?: boolean;\n\n /** `true` when a number should be included in the passphrase.\n * This value defaults to `false`.\n */\n includeNumber?: boolean;\n};\n\n/** The default options for passphrase generation. */\nexport const DefaultPassphraseGenerationOptions: Partial =\n Object.freeze({\n numWords: 3,\n wordSeparator: \"-\",\n capitalize: false,\n includeNumber: false,\n });\n","import { PolicyEvaluator } from \"../abstractions/policy-evaluator.abstraction\";\n\nimport {\n DefaultPassphraseGenerationOptions,\n PassphraseGenerationOptions,\n} from \"./passphrase-generation-options\";\nimport { PassphraseGeneratorPolicy } from \"./passphrase-generator-policy\";\n\ntype Boundary = {\n readonly min: number;\n readonly max: number;\n};\n\nfunction initializeBoundaries() {\n const numWords = Object.freeze({\n min: 3,\n max: 20,\n });\n\n return Object.freeze({\n numWords,\n });\n}\n\n/** Immutable default boundaries for passphrase generation.\n * These are used when the policy does not override a value.\n */\nexport const DefaultBoundaries = initializeBoundaries();\n\n/** Enforces policy for passphrase generation options.\n */\nexport class PassphraseGeneratorOptionsEvaluator\n implements PolicyEvaluator\n{\n // This design is not ideal, but it is a step towards a more robust passphrase\n // generator. Ideally, `sanitize` would be implemented on an options class,\n // and `applyPolicy` would be implemented on a policy class, \"mise en place\".\n //\n // The current design of the passphrase generator, unfortunately, would require\n // a substantial rewrite to make this feasible. Hopefully this change can be\n // applied when the passphrase generator is ported to rust.\n\n /** Policy applied by the evaluator.\n */\n readonly policy: PassphraseGeneratorPolicy;\n\n /** Boundaries for the number of words allowed in the password.\n */\n readonly numWords: Boundary;\n\n /** Instantiates the evaluator.\n * @param policy The policy applied by the evaluator. When this conflicts with\n * the defaults, the policy takes precedence.\n */\n constructor(policy: PassphraseGeneratorPolicy) {\n function createBoundary(value: number, defaultBoundary: Boundary): Boundary {\n const boundary = {\n min: Math.max(defaultBoundary.min, value),\n max: Math.max(defaultBoundary.max, value),\n };\n\n return boundary;\n }\n\n this.policy = structuredClone(policy);\n this.numWords = createBoundary(policy.minNumberWords, DefaultBoundaries.numWords);\n }\n\n /** {@link PolicyEvaluator.policyInEffect} */\n get policyInEffect(): boolean {\n const policies = [\n this.policy.capitalize,\n this.policy.includeNumber,\n this.policy.minNumberWords > DefaultBoundaries.numWords.min,\n ];\n\n return policies.includes(true);\n }\n\n /** Apply policy to the input options.\n * @param options The options to build from. These options are not altered.\n * @returns A new password generation request with policy applied.\n */\n applyPolicy(options: PassphraseGenerationOptions): PassphraseGenerationOptions {\n function fitToBounds(value: number, boundaries: Boundary) {\n const { min, max } = boundaries;\n\n const withUpperBound = Math.min(value ?? boundaries.min, max);\n const withLowerBound = Math.max(withUpperBound, min);\n\n return withLowerBound;\n }\n\n // apply policy overrides\n const capitalize = this.policy.capitalize || options.capitalize || false;\n const includeNumber = this.policy.includeNumber || options.includeNumber || false;\n\n // apply boundaries\n const numWords = fitToBounds(options.numWords, this.numWords);\n\n return {\n ...options,\n numWords,\n capitalize,\n includeNumber,\n };\n }\n\n /** Ensures internal options consistency.\n * @param options The options to cascade. These options are not altered.\n * @returns A passphrase generation request with cascade applied.\n */\n sanitize(options: PassphraseGenerationOptions): PassphraseGenerationOptions {\n // ensure words are separated by a single character or the empty string\n const wordSeparator =\n options.wordSeparator === \"\"\n ? \"\"\n : options.wordSeparator?.[0] ?? DefaultPassphraseGenerationOptions.wordSeparator;\n\n return {\n ...options,\n wordSeparator,\n };\n }\n}\n","export class GeneratedPasswordHistory {\n password: string;\n date: number;\n\n constructor(password: string, date: number) {\n this.password = password;\n this.date = date;\n }\n}\n","import { PolicyService } from \"../../../admin-console/abstractions/policy/policy.service.abstraction\";\nimport { PolicyType } from \"../../../admin-console/enums\";\nimport { PasswordGeneratorPolicyOptions } from \"../../../admin-console/models/domain/password-generator-policy-options\";\nimport { CryptoService } from \"../../../platform/abstractions/crypto.service\";\nimport { StateService } from \"../../../platform/abstractions/state.service\";\nimport { EFFLongWordList } from \"../../../platform/misc/wordlist\";\nimport { EncString } from \"../../../platform/models/domain/enc-string\";\nimport { PassphraseGeneratorOptionsEvaluator } from \"../passphrase/passphrase-generator-options-evaluator\";\n\nimport { GeneratedPasswordHistory } from \"./generated-password-history\";\nimport { PasswordGenerationServiceAbstraction } from \"./password-generation.service.abstraction\";\nimport { PasswordGeneratorOptions } from \"./password-generator-options\";\nimport { PasswordGeneratorOptionsEvaluator } from \"./password-generator-options-evaluator\";\n\nconst DefaultOptions: PasswordGeneratorOptions = {\n length: 14,\n minLength: 5,\n ambiguous: false,\n number: true,\n minNumber: 1,\n uppercase: true,\n minUppercase: 0,\n lowercase: true,\n minLowercase: 0,\n special: false,\n minSpecial: 0,\n type: \"password\",\n numWords: 3,\n wordSeparator: \"-\",\n capitalize: false,\n includeNumber: false,\n};\n\nconst DefaultPolicy = new PasswordGeneratorPolicyOptions();\n\nconst MaxPasswordsInHistory = 100;\n\nexport class PasswordGenerationService implements PasswordGenerationServiceAbstraction {\n constructor(\n private cryptoService: CryptoService,\n private policyService: PolicyService,\n private stateService: StateService,\n ) {}\n\n async generatePassword(options: PasswordGeneratorOptions): Promise {\n if ((options.type ?? DefaultOptions.type) === \"passphrase\") {\n return this.generatePassphrase({ ...DefaultOptions, ...options });\n }\n\n const evaluator = new PasswordGeneratorOptionsEvaluator(DefaultPolicy);\n const o = evaluator.sanitize({ ...DefaultOptions, ...options });\n\n const positions: string[] = [];\n if (o.lowercase && o.minLowercase > 0) {\n for (let i = 0; i < o.minLowercase; i++) {\n positions.push(\"l\");\n }\n }\n if (o.uppercase && o.minUppercase > 0) {\n for (let i = 0; i < o.minUppercase; i++) {\n positions.push(\"u\");\n }\n }\n if (o.number && o.minNumber > 0) {\n for (let i = 0; i < o.minNumber; i++) {\n positions.push(\"n\");\n }\n }\n if (o.special && o.minSpecial > 0) {\n for (let i = 0; i < o.minSpecial; i++) {\n positions.push(\"s\");\n }\n }\n while (positions.length < o.length) {\n positions.push(\"a\");\n }\n\n // shuffle\n await this.shuffleArray(positions);\n\n // build out the char sets\n let allCharSet = \"\";\n\n let lowercaseCharSet = \"abcdefghijkmnopqrstuvwxyz\";\n if (o.ambiguous) {\n lowercaseCharSet += \"l\";\n }\n if (o.lowercase) {\n allCharSet += lowercaseCharSet;\n }\n\n let uppercaseCharSet = \"ABCDEFGHJKLMNPQRSTUVWXYZ\";\n if (o.ambiguous) {\n uppercaseCharSet += \"IO\";\n }\n if (o.uppercase) {\n allCharSet += uppercaseCharSet;\n }\n\n let numberCharSet = \"23456789\";\n if (o.ambiguous) {\n numberCharSet += \"01\";\n }\n if (o.number) {\n allCharSet += numberCharSet;\n }\n\n const specialCharSet = \"!@#$%^&*\";\n if (o.special) {\n allCharSet += specialCharSet;\n }\n\n let password = \"\";\n for (let i = 0; i < o.length; i++) {\n let positionChars: string;\n switch (positions[i]) {\n case \"l\":\n positionChars = lowercaseCharSet;\n break;\n case \"u\":\n positionChars = uppercaseCharSet;\n break;\n case \"n\":\n positionChars = numberCharSet;\n break;\n case \"s\":\n positionChars = specialCharSet;\n break;\n case \"a\":\n positionChars = allCharSet;\n break;\n default:\n break;\n }\n\n const randomCharIndex = await this.cryptoService.randomNumber(0, positionChars.length - 1);\n password += positionChars.charAt(randomCharIndex);\n }\n\n return password;\n }\n\n async generatePassphrase(options: PasswordGeneratorOptions): Promise {\n const evaluator = new PassphraseGeneratorOptionsEvaluator(DefaultPolicy);\n const o = evaluator.sanitize({ ...DefaultOptions, ...options });\n\n if (o.numWords == null || o.numWords <= 2) {\n o.numWords = DefaultOptions.numWords;\n }\n if (o.capitalize == null) {\n o.capitalize = false;\n }\n if (o.includeNumber == null) {\n o.includeNumber = false;\n }\n\n const listLength = EFFLongWordList.length - 1;\n const wordList = new Array(o.numWords);\n for (let i = 0; i < o.numWords; i++) {\n const wordIndex = await this.cryptoService.randomNumber(0, listLength);\n if (o.capitalize) {\n wordList[i] = this.capitalize(EFFLongWordList[wordIndex]);\n } else {\n wordList[i] = EFFLongWordList[wordIndex];\n }\n }\n\n if (o.includeNumber) {\n await this.appendRandomNumberToRandomWord(wordList);\n }\n return wordList.join(o.wordSeparator);\n }\n\n async getOptions(): Promise<[PasswordGeneratorOptions, PasswordGeneratorPolicyOptions]> {\n let options = await this.stateService.getPasswordGenerationOptions();\n if (options == null) {\n options = Object.assign({}, DefaultOptions);\n } else {\n options = Object.assign({}, DefaultOptions, options);\n }\n await this.stateService.setPasswordGenerationOptions(options);\n const enforcedOptions = await this.enforcePasswordGeneratorPoliciesOnOptions(options);\n options = enforcedOptions[0];\n return [options, enforcedOptions[1]];\n }\n\n async enforcePasswordGeneratorPoliciesOnOptions(\n options: PasswordGeneratorOptions,\n ): Promise<[PasswordGeneratorOptions, PasswordGeneratorPolicyOptions]> {\n let policy = await this.getPasswordGeneratorPolicyOptions();\n policy = policy ?? new PasswordGeneratorPolicyOptions();\n\n // Force default type if password/passphrase selected via policy\n if (policy.defaultType === \"password\" || policy.defaultType === \"passphrase\") {\n options.type = policy.defaultType;\n }\n\n const evaluator =\n options.type == \"password\"\n ? new PasswordGeneratorOptionsEvaluator(policy)\n : new PassphraseGeneratorOptionsEvaluator(policy);\n\n // Ensure the options to pass the current rules\n const withPolicy = evaluator.applyPolicy(options);\n const sanitized = evaluator.sanitize(withPolicy);\n\n // callers assume this function updates the options parameter\n const result = Object.assign(options, sanitized);\n return [result, policy];\n }\n\n async getPasswordGeneratorPolicyOptions(): Promise {\n const policies = await this.policyService?.getAll(PolicyType.PasswordGenerator);\n let enforcedOptions: PasswordGeneratorPolicyOptions = null;\n\n if (policies == null || policies.length === 0) {\n return enforcedOptions;\n }\n\n policies.forEach((currentPolicy) => {\n if (!currentPolicy.enabled || currentPolicy.data == null) {\n return;\n }\n\n if (enforcedOptions == null) {\n enforcedOptions = new PasswordGeneratorPolicyOptions();\n }\n\n // Password wins in multi-org collisions\n if (currentPolicy.data.defaultType != null && enforcedOptions.defaultType !== \"password\") {\n enforcedOptions.defaultType = currentPolicy.data.defaultType;\n }\n\n if (\n currentPolicy.data.minLength != null &&\n currentPolicy.data.minLength > enforcedOptions.minLength\n ) {\n enforcedOptions.minLength = currentPolicy.data.minLength;\n }\n\n if (currentPolicy.data.useUpper) {\n enforcedOptions.useUppercase = true;\n }\n\n if (currentPolicy.data.useLower) {\n enforcedOptions.useLowercase = true;\n }\n\n if (currentPolicy.data.useNumbers) {\n enforcedOptions.useNumbers = true;\n }\n\n if (\n currentPolicy.data.minNumbers != null &&\n currentPolicy.data.minNumbers > enforcedOptions.numberCount\n ) {\n enforcedOptions.numberCount = currentPolicy.data.minNumbers;\n }\n\n if (currentPolicy.data.useSpecial) {\n enforcedOptions.useSpecial = true;\n }\n\n if (\n currentPolicy.data.minSpecial != null &&\n currentPolicy.data.minSpecial > enforcedOptions.specialCount\n ) {\n enforcedOptions.specialCount = currentPolicy.data.minSpecial;\n }\n\n if (\n currentPolicy.data.minNumberWords != null &&\n currentPolicy.data.minNumberWords > enforcedOptions.minNumberWords\n ) {\n enforcedOptions.minNumberWords = currentPolicy.data.minNumberWords;\n }\n\n if (currentPolicy.data.capitalize) {\n enforcedOptions.capitalize = true;\n }\n\n if (currentPolicy.data.includeNumber) {\n enforcedOptions.includeNumber = true;\n }\n });\n\n return enforcedOptions;\n }\n\n async saveOptions(options: PasswordGeneratorOptions) {\n await this.stateService.setPasswordGenerationOptions(options);\n }\n\n async getHistory(): Promise {\n const hasKey = await this.cryptoService.hasUserKey();\n if (!hasKey) {\n return new Array();\n }\n\n if ((await this.stateService.getDecryptedPasswordGenerationHistory()) == null) {\n const encrypted = await this.stateService.getEncryptedPasswordGenerationHistory();\n const decrypted = await this.decryptHistory(encrypted);\n await this.stateService.setDecryptedPasswordGenerationHistory(decrypted);\n }\n\n const passwordGenerationHistory =\n await this.stateService.getDecryptedPasswordGenerationHistory();\n return passwordGenerationHistory != null\n ? passwordGenerationHistory\n : new Array();\n }\n\n async addHistory(password: string): Promise {\n // Cannot add new history if no key is available\n const hasKey = await this.cryptoService.hasUserKey();\n if (!hasKey) {\n return;\n }\n\n const currentHistory = await this.getHistory();\n\n // Prevent duplicates\n if (this.matchesPrevious(password, currentHistory)) {\n return;\n }\n\n currentHistory.unshift(new GeneratedPasswordHistory(password, Date.now()));\n\n // Remove old items.\n if (currentHistory.length > MaxPasswordsInHistory) {\n currentHistory.pop();\n }\n\n const newHistory = await this.encryptHistory(currentHistory);\n await this.stateService.setDecryptedPasswordGenerationHistory(currentHistory);\n return await this.stateService.setEncryptedPasswordGenerationHistory(newHistory);\n }\n\n async clear(userId?: string): Promise {\n await this.stateService.setEncryptedPasswordGenerationHistory(null, { userId: userId });\n await this.stateService.setDecryptedPasswordGenerationHistory(null, { userId: userId });\n }\n\n normalizeOptions(\n options: PasswordGeneratorOptions,\n enforcedPolicyOptions: PasswordGeneratorPolicyOptions,\n ) {\n const evaluator =\n options.type == \"password\"\n ? new PasswordGeneratorOptionsEvaluator(enforcedPolicyOptions)\n : new PassphraseGeneratorOptionsEvaluator(enforcedPolicyOptions);\n\n const evaluatedOptions = evaluator.applyPolicy(options);\n const santizedOptions = evaluator.sanitize(evaluatedOptions);\n\n // callers assume this function updates the options parameter\n Object.assign(options, santizedOptions);\n\n return options;\n }\n\n private capitalize(str: string) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n }\n\n private async appendRandomNumberToRandomWord(wordList: string[]) {\n if (wordList == null || wordList.length <= 0) {\n return;\n }\n const index = await this.cryptoService.randomNumber(0, wordList.length - 1);\n const num = await this.cryptoService.randomNumber(0, 9);\n wordList[index] = wordList[index] + num;\n }\n\n private async encryptHistory(\n history: GeneratedPasswordHistory[],\n ): Promise {\n if (history == null || history.length === 0) {\n return Promise.resolve([]);\n }\n\n const promises = history.map(async (item) => {\n const encrypted = await this.cryptoService.encrypt(item.password);\n return new GeneratedPasswordHistory(encrypted.encryptedString, item.date);\n });\n\n return await Promise.all(promises);\n }\n\n private async decryptHistory(\n history: GeneratedPasswordHistory[],\n ): Promise {\n if (history == null || history.length === 0) {\n return Promise.resolve([]);\n }\n\n const promises = history.map(async (item) => {\n const decrypted = await this.cryptoService.decryptToUtf8(new EncString(item.password));\n return new GeneratedPasswordHistory(decrypted, item.date);\n });\n\n return await Promise.all(promises);\n }\n\n private matchesPrevious(password: string, history: GeneratedPasswordHistory[]): boolean {\n if (history == null || history.length === 0) {\n return false;\n }\n\n return history[history.length - 1].password === password;\n }\n\n // ref: https://stackoverflow.com/a/12646864/1090359\n private async shuffleArray(array: string[]) {\n for (let i = array.length - 1; i > 0; i--) {\n const j = await this.cryptoService.randomNumber(0, i);\n [array[i], array[j]] = [array[j], array[i]];\n }\n }\n}\n","import { PolicyEvaluator } from \"../abstractions/policy-evaluator.abstraction\";\n\nimport { PasswordGenerationOptions } from \"./password-generation-options\";\nimport { PasswordGeneratorPolicy } from \"./password-generator-policy\";\n\nfunction initializeBoundaries() {\n const length = Object.freeze({\n min: 5,\n max: 128,\n });\n\n const minDigits = Object.freeze({\n min: 0,\n max: 9,\n });\n\n const minSpecialCharacters = Object.freeze({\n min: 0,\n max: 9,\n });\n\n return Object.freeze({\n length,\n minDigits,\n minSpecialCharacters,\n });\n}\n\n/** Immutable default boundaries for password generation.\n * These are used when the policy does not override a value.\n */\nexport const DefaultBoundaries = initializeBoundaries();\n\ntype Boundary = {\n readonly min: number;\n readonly max: number;\n};\n\n/** Enforces policy for password generation.\n */\nexport class PasswordGeneratorOptionsEvaluator\n implements PolicyEvaluator\n{\n // This design is not ideal, but it is a step towards a more robust password\n // generator. Ideally, `sanitize` would be implemented on an options class,\n // and `applyPolicy` would be implemented on a policy class, \"mise en place\".\n //\n // The current design of the password generator, unfortunately, would require\n // a substantial rewrite to make this feasible. Hopefully this change can be\n // applied when the password generator is ported to rust.\n\n /** Boundaries for the password length. This is always large enough\n * to accommodate the minimum number of digits and special characters.\n */\n readonly length: Boundary;\n\n /** Boundaries for the minimum number of digits allowed in the password.\n */\n readonly minDigits: Boundary;\n\n /** Boundaries for the minimum number of special characters allowed\n * in the password.\n */\n readonly minSpecialCharacters: Boundary;\n\n /** Policy applied by the evaluator.\n */\n readonly policy: PasswordGeneratorPolicy;\n\n /** Instantiates the evaluator.\n * @param policy The policy applied by the evaluator. When this conflicts with\n * the defaults, the policy takes precedence.\n */\n constructor(policy: PasswordGeneratorPolicy) {\n function createBoundary(value: number, defaultBoundary: Boundary): Boundary {\n const boundary = {\n min: Math.max(defaultBoundary.min, value),\n max: Math.max(defaultBoundary.max, value),\n };\n\n return boundary;\n }\n\n this.policy = structuredClone(policy);\n this.minDigits = createBoundary(policy.numberCount, DefaultBoundaries.minDigits);\n this.minSpecialCharacters = createBoundary(\n policy.specialCount,\n DefaultBoundaries.minSpecialCharacters,\n );\n\n // the overall length should be at least as long as the sum of the minimums\n const minConsistentLength = this.minDigits.min + this.minSpecialCharacters.min;\n const minPolicyLength = policy.minLength > 0 ? policy.minLength : DefaultBoundaries.length.min;\n const minLength = Math.max(minPolicyLength, minConsistentLength, DefaultBoundaries.length.min);\n\n this.length = {\n min: minLength,\n max: Math.max(DefaultBoundaries.length.max, minLength),\n };\n }\n\n /** {@link PolicyEvaluator.policyInEffect} */\n get policyInEffect(): boolean {\n const policies = [\n this.policy.useUppercase,\n this.policy.useLowercase,\n this.policy.useNumbers,\n this.policy.useSpecial,\n this.policy.minLength > DefaultBoundaries.length.min,\n this.policy.numberCount > DefaultBoundaries.minDigits.min,\n this.policy.specialCount > DefaultBoundaries.minSpecialCharacters.min,\n ];\n\n return policies.includes(true);\n }\n\n /** {@link PolicyEvaluator.applyPolicy} */\n applyPolicy(options: PasswordGenerationOptions): PasswordGenerationOptions {\n function fitToBounds(value: number, boundaries: Boundary) {\n const { min, max } = boundaries;\n\n const withUpperBound = Math.min(value || 0, max);\n const withLowerBound = Math.max(withUpperBound, min);\n\n return withLowerBound;\n }\n\n // apply policy overrides\n const uppercase = this.policy.useUppercase || options.uppercase || false;\n const lowercase = this.policy.useLowercase || options.lowercase || false;\n\n // these overrides can cascade numeric fields to boolean fields\n const number = this.policy.useNumbers || options.number || options.minNumber > 0;\n const special = this.policy.useSpecial || options.special || options.minSpecial > 0;\n\n // apply boundaries; the boundaries can cascade boolean fields to numeric fields\n const length = fitToBounds(options.length, this.length);\n const minNumber = fitToBounds(options.minNumber, this.minDigits);\n const minSpecial = fitToBounds(options.minSpecial, this.minSpecialCharacters);\n\n return {\n ...options,\n length,\n uppercase,\n lowercase,\n number,\n minNumber,\n special,\n minSpecial,\n };\n }\n\n /** {@link PolicyEvaluator.sanitize} */\n sanitize(options: PasswordGenerationOptions): PasswordGenerationOptions {\n function cascade(enabled: boolean, value: number): [boolean, number] {\n const enabledResult = enabled ?? value > 0;\n const valueResult = enabledResult ? value || 1 : 0;\n\n return [enabledResult, valueResult];\n }\n\n const [lowercase, minLowercase] = cascade(options.lowercase, options.minLowercase);\n const [uppercase, minUppercase] = cascade(options.uppercase, options.minUppercase);\n const [number, minNumber] = cascade(options.number, options.minNumber);\n const [special, minSpecial] = cascade(options.special, options.minSpecial);\n\n // minimums can only increase the length\n const minConsistentLength = minLowercase + minUppercase + minNumber + minSpecial;\n const minLength = Math.max(minConsistentLength, this.length.min);\n const length = Math.max(options.length ?? minLength, minLength);\n\n return {\n ...options,\n length,\n minLength,\n lowercase,\n minLowercase,\n uppercase,\n minUppercase,\n number,\n minNumber,\n special,\n minSpecial,\n };\n }\n}\n","import { UsernameGeneratorOptions } from \"./username-generation-options\";\n\nexport abstract class UsernameGenerationServiceAbstraction {\n generateUsername: (options: UsernameGeneratorOptions) => Promise;\n generateWord: (options: UsernameGeneratorOptions) => Promise;\n generateSubaddress: (options: UsernameGeneratorOptions) => Promise;\n generateCatchall: (options: UsernameGeneratorOptions) => Promise;\n generateForwarded: (options: UsernameGeneratorOptions) => Promise;\n getOptions: () => Promise;\n saveOptions: (options: UsernameGeneratorOptions) => Promise;\n}\n","import { ApiService } from \"../../../../abstractions/api.service\";\n\nimport { Forwarder } from \"./forwarder\";\nimport { ForwarderOptions } from \"./forwarder-options\";\n\nexport class AnonAddyForwarder implements Forwarder {\n async generate(apiService: ApiService, options: ForwarderOptions): Promise {\n if (options.apiKey == null || options.apiKey === \"\") {\n throw \"Invalid addy.io API token.\";\n }\n if (options.anonaddy?.domain == null || options.anonaddy.domain === \"\") {\n throw \"Invalid addy.io domain.\";\n }\n if (options.anonaddy?.baseUrl == null || options.anonaddy.baseUrl === \"\") {\n throw \"Invalid addy.io url.\";\n }\n\n const requestInit: RequestInit = {\n redirect: \"manual\",\n cache: \"no-store\",\n method: \"POST\",\n headers: new Headers({\n Authorization: \"Bearer \" + options.apiKey,\n \"Content-Type\": \"application/json\",\n \"X-Requested-With\": \"XMLHttpRequest\",\n }),\n };\n const url = options.anonaddy.baseUrl + \"/api/v1/aliases\";\n requestInit.body = JSON.stringify({\n domain: options.anonaddy.domain,\n description:\n (options.website != null ? \"Website: \" + options.website + \". \" : \"\") +\n \"Generated by Bitwarden.\",\n });\n const request = new Request(url, requestInit);\n const response = await apiService.nativeFetch(request);\n if (response.status === 200 || response.status === 201) {\n const json = await response.json();\n return json?.data?.email;\n }\n if (response.status === 401) {\n throw \"Invalid addy.io API token.\";\n }\n if (response?.statusText != null) {\n throw \"addy.io error:\\n\" + response.statusText;\n }\n throw \"Unknown addy.io error occurred.\";\n }\n}\n","import { ApiService } from \"../../../../abstractions/api.service\";\n\nimport { Forwarder } from \"./forwarder\";\nimport { ForwarderOptions } from \"./forwarder-options\";\n\nexport class DuckDuckGoForwarder implements Forwarder {\n async generate(apiService: ApiService, options: ForwarderOptions): Promise {\n if (options.apiKey == null || options.apiKey === \"\") {\n throw \"Invalid DuckDuckGo API token.\";\n }\n const requestInit: RequestInit = {\n redirect: \"manual\",\n cache: \"no-store\",\n method: \"POST\",\n headers: new Headers({\n Authorization: \"Bearer \" + options.apiKey,\n \"Content-Type\": \"application/json\",\n }),\n };\n const url = \"https://quack.duckduckgo.com/api/email/addresses\";\n const request = new Request(url, requestInit);\n const response = await apiService.nativeFetch(request);\n if (response.status === 200 || response.status === 201) {\n const json = await response.json();\n if (json.address) {\n return `${json.address}@duck.com`;\n }\n } else if (response.status === 401) {\n throw \"Invalid DuckDuckGo API token.\";\n }\n throw \"Unknown DuckDuckGo error occurred.\";\n }\n}\n","import { ApiService } from \"../../../../abstractions/api.service\";\n\nimport { Forwarder } from \"./forwarder\";\nimport { ForwarderOptions } from \"./forwarder-options\";\n\nexport class FastmailForwarder implements Forwarder {\n async generate(apiService: ApiService, options: ForwarderOptions): Promise {\n if (options.apiKey == null || options.apiKey === \"\") {\n throw \"Invalid Fastmail API token.\";\n }\n\n const accountId = await this.getAccountId(apiService, options);\n if (accountId == null || accountId === \"\") {\n throw \"Unable to obtain Fastmail masked email account ID.\";\n }\n\n const requestInit: RequestInit = {\n redirect: \"manual\",\n cache: \"no-store\",\n method: \"POST\",\n headers: new Headers({\n Authorization: \"Bearer \" + options.apiKey,\n \"Content-Type\": \"application/json\",\n }),\n };\n const url = \"https://api.fastmail.com/jmap/api/\";\n requestInit.body = JSON.stringify({\n using: [\"https://www.fastmail.com/dev/maskedemail\", \"urn:ietf:params:jmap:core\"],\n methodCalls: [\n [\n \"MaskedEmail/set\",\n {\n accountId: accountId,\n create: {\n \"new-masked-email\": {\n state: \"enabled\",\n description: \"\",\n forDomain: options.website,\n emailPrefix: options.fastmail.prefix,\n },\n },\n },\n \"0\",\n ],\n ],\n });\n const request = new Request(url, requestInit);\n const response = await apiService.nativeFetch(request);\n if (response.status === 200) {\n const json = await response.json();\n if (\n json.methodResponses != null &&\n json.methodResponses.length > 0 &&\n json.methodResponses[0].length > 0\n ) {\n if (json.methodResponses[0][0] === \"MaskedEmail/set\") {\n if (json.methodResponses[0][1]?.created?.[\"new-masked-email\"] != null) {\n return json.methodResponses[0][1]?.created?.[\"new-masked-email\"]?.email;\n }\n if (json.methodResponses[0][1]?.notCreated?.[\"new-masked-email\"] != null) {\n throw (\n \"Fastmail error: \" +\n json.methodResponses[0][1]?.notCreated?.[\"new-masked-email\"]?.description\n );\n }\n } else if (json.methodResponses[0][0] === \"error\") {\n throw \"Fastmail error: \" + json.methodResponses[0][1]?.description;\n }\n }\n }\n if (response.status === 401 || response.status === 403) {\n throw \"Invalid Fastmail API token.\";\n }\n throw \"Unknown Fastmail error occurred.\";\n }\n\n private async getAccountId(apiService: ApiService, options: ForwarderOptions): Promise {\n const requestInit: RequestInit = {\n cache: \"no-store\",\n method: \"GET\",\n headers: new Headers({\n Authorization: \"Bearer \" + options.apiKey,\n }),\n };\n const url = \"https://api.fastmail.com/.well-known/jmap\";\n const request = new Request(url, requestInit);\n const response = await apiService.nativeFetch(request);\n if (response.status === 200) {\n const json = await response.json();\n if (json.primaryAccounts != null) {\n return json.primaryAccounts[\"https://www.fastmail.com/dev/maskedemail\"];\n }\n }\n return null;\n }\n}\n","import { ApiService } from \"../../../../abstractions/api.service\";\n\nimport { Forwarder } from \"./forwarder\";\nimport { ForwarderOptions } from \"./forwarder-options\";\n\nexport class FirefoxRelayForwarder implements Forwarder {\n async generate(apiService: ApiService, options: ForwarderOptions): Promise {\n if (options.apiKey == null || options.apiKey === \"\") {\n throw \"Invalid Firefox Relay API token.\";\n }\n const requestInit: RequestInit = {\n redirect: \"manual\",\n cache: \"no-store\",\n method: \"POST\",\n headers: new Headers({\n Authorization: \"Token \" + options.apiKey,\n \"Content-Type\": \"application/json\",\n }),\n };\n const url = \"https://relay.firefox.com/api/v1/relayaddresses/\";\n requestInit.body = JSON.stringify({\n enabled: true,\n generated_for: options.website,\n description:\n (options.website != null ? options.website + \" - \" : \"\") + \"Generated by Bitwarden.\",\n });\n const request = new Request(url, requestInit);\n const response = await apiService.nativeFetch(request);\n if (response.status === 200 || response.status === 201) {\n const json = await response.json();\n return json?.full_address;\n }\n if (response.status === 401) {\n throw \"Invalid Firefox Relay API token.\";\n }\n throw \"Unknown Firefox Relay error occurred.\";\n }\n}\n","export class ForwarderOptions {\n apiKey: string;\n website: string;\n fastmail = new FastmailForwarderOptions();\n anonaddy = new AnonAddyForwarderOptions();\n forwardemail = new ForwardEmailForwarderOptions();\n simplelogin = new SimpleLoginForwarderOptions();\n}\n\nexport class FastmailForwarderOptions {\n prefix: string;\n}\n\nexport class AnonAddyForwarderOptions {\n domain: string;\n baseUrl: string;\n}\n\nexport class ForwardEmailForwarderOptions {\n domain: string;\n}\n\nexport class SimpleLoginForwarderOptions {\n baseUrl: string;\n}\n","import { ApiService } from \"../../../../abstractions/api.service\";\n\nimport { Forwarder } from \"./forwarder\";\nimport { ForwarderOptions } from \"./forwarder-options\";\n\nexport class SimpleLoginForwarder implements Forwarder {\n async generate(apiService: ApiService, options: ForwarderOptions): Promise {\n if (options.apiKey == null || options.apiKey === \"\") {\n throw \"Invalid SimpleLogin API key.\";\n }\n const requestInit: RequestInit = {\n redirect: \"manual\",\n cache: \"no-store\",\n method: \"POST\",\n headers: new Headers({\n Authentication: options.apiKey,\n \"Content-Type\": \"application/json\",\n }),\n };\n let url = options.simplelogin.baseUrl + \"/api/alias/random/new\";\n if (options.website != null) {\n url += \"?hostname=\" + options.website;\n }\n requestInit.body = JSON.stringify({\n note:\n (options.website != null ? \"Website: \" + options.website + \". \" : \"\") +\n \"Generated by Bitwarden.\",\n });\n const request = new Request(url, requestInit);\n const response = await apiService.nativeFetch(request);\n if (response.status === 200 || response.status === 201) {\n const json = await response.json();\n return json.alias;\n }\n if (response.status === 401) {\n throw \"Invalid SimpleLogin API key.\";\n }\n const json = await response.json();\n if (json?.error != null) {\n throw \"SimpleLogin error:\" + json.error;\n }\n throw \"Unknown SimpleLogin error occurred.\";\n }\n}\n","import { ApiService } from \"../../../../abstractions/api.service\";\nimport { Utils } from \"../../../../platform/misc/utils\";\n\nimport { Forwarder } from \"./forwarder\";\nimport { ForwarderOptions } from \"./forwarder-options\";\n\nexport class ForwardEmailForwarder implements Forwarder {\n async generate(apiService: ApiService, options: ForwarderOptions): Promise {\n if (options.apiKey == null || options.apiKey === \"\") {\n throw \"Invalid Forward Email API key.\";\n }\n if (options.forwardemail?.domain == null || options.forwardemail.domain === \"\") {\n throw \"Invalid Forward Email domain.\";\n }\n const requestInit: RequestInit = {\n redirect: \"manual\",\n cache: \"no-store\",\n method: \"POST\",\n headers: new Headers({\n Authorization: \"Basic \" + Utils.fromUtf8ToB64(options.apiKey + \":\"),\n \"Content-Type\": \"application/json\",\n }),\n };\n const url = `https://api.forwardemail.net/v1/domains/${options.forwardemail.domain}/aliases`;\n requestInit.body = JSON.stringify({\n labels: options.website,\n description:\n (options.website != null ? \"Website: \" + options.website + \". \" : \"\") +\n \"Generated by Bitwarden.\",\n });\n const request = new Request(url, requestInit);\n const response = await apiService.nativeFetch(request);\n if (response.status === 200 || response.status === 201) {\n const json = await response.json();\n return json?.name + \"@\" + (json?.domain?.name || options.forwardemail.domain);\n }\n if (response.status === 401) {\n throw \"Invalid Forward Email API key.\";\n }\n const json = await response.json();\n if (json?.message != null) {\n throw \"Forward Email error:\\n\" + json.message;\n }\n if (json?.error != null) {\n throw \"Forward Email error:\\n\" + json.error;\n }\n throw \"Unknown Forward Email error occurred.\";\n }\n}\n","import { ApiService } from \"../../../abstractions/api.service\";\nimport { CryptoService } from \"../../../platform/abstractions/crypto.service\";\nimport { StateService } from \"../../../platform/abstractions/state.service\";\nimport { EFFLongWordList } from \"../../../platform/misc/wordlist\";\n\nimport {\n AnonAddyForwarder,\n DuckDuckGoForwarder,\n FastmailForwarder,\n FirefoxRelayForwarder,\n ForwardEmailForwarder,\n Forwarder,\n ForwarderOptions,\n SimpleLoginForwarder,\n} from \"./email-forwarders\";\nimport { UsernameGeneratorOptions } from \"./username-generation-options\";\nimport { UsernameGenerationServiceAbstraction } from \"./username-generation.service.abstraction\";\n\nconst DefaultOptions: UsernameGeneratorOptions = {\n type: \"word\",\n wordCapitalize: true,\n wordIncludeNumber: true,\n subaddressType: \"random\",\n catchallType: \"random\",\n forwardedService: \"\",\n forwardedAnonAddyDomain: \"anonaddy.me\",\n forwardedAnonAddyBaseUrl: \"https://app.addy.io\",\n forwardedForwardEmailDomain: \"hideaddress.net\",\n forwardedSimpleLoginBaseUrl: \"https://app.simplelogin.io\",\n};\n\nexport class UsernameGenerationService implements UsernameGenerationServiceAbstraction {\n constructor(\n private cryptoService: CryptoService,\n private stateService: StateService,\n private apiService: ApiService,\n ) {}\n\n generateUsername(options: UsernameGeneratorOptions): Promise {\n if (options.type === \"catchall\") {\n return this.generateCatchall(options);\n } else if (options.type === \"subaddress\") {\n return this.generateSubaddress(options);\n } else if (options.type === \"forwarded\") {\n return this.generateForwarded(options);\n } else {\n return this.generateWord(options);\n }\n }\n\n async generateWord(options: UsernameGeneratorOptions): Promise {\n const o = Object.assign({}, DefaultOptions, options);\n\n if (o.wordCapitalize == null) {\n o.wordCapitalize = true;\n }\n if (o.wordIncludeNumber == null) {\n o.wordIncludeNumber = true;\n }\n\n const wordIndex = await this.cryptoService.randomNumber(0, EFFLongWordList.length - 1);\n let word = EFFLongWordList[wordIndex];\n if (o.wordCapitalize) {\n word = word.charAt(0).toUpperCase() + word.slice(1);\n }\n if (o.wordIncludeNumber) {\n const num = await this.cryptoService.randomNumber(1, 9999);\n word = word + this.zeroPad(num.toString(), 4);\n }\n return word;\n }\n\n async generateSubaddress(options: UsernameGeneratorOptions): Promise {\n const o = Object.assign({}, DefaultOptions, options);\n\n const subaddressEmail = o.subaddressEmail;\n if (subaddressEmail == null || subaddressEmail.length < 3) {\n return o.subaddressEmail;\n }\n const atIndex = subaddressEmail.indexOf(\"@\");\n if (atIndex < 1 || atIndex >= subaddressEmail.length - 1) {\n return subaddressEmail;\n }\n if (o.subaddressType == null) {\n o.subaddressType = \"random\";\n }\n\n const emailBeginning = subaddressEmail.substr(0, atIndex);\n const emailEnding = subaddressEmail.substr(atIndex + 1, subaddressEmail.length);\n\n let subaddressString = \"\";\n if (o.subaddressType === \"random\") {\n subaddressString = await this.randomString(8);\n } else if (o.subaddressType === \"website-name\") {\n subaddressString = o.website;\n }\n return emailBeginning + \"+\" + subaddressString + \"@\" + emailEnding;\n }\n\n async generateCatchall(options: UsernameGeneratorOptions): Promise {\n const o = Object.assign({}, DefaultOptions, options);\n\n if (o.catchallDomain == null || o.catchallDomain === \"\") {\n return null;\n }\n if (o.catchallType == null) {\n o.catchallType = \"random\";\n }\n\n let startString = \"\";\n if (o.catchallType === \"random\") {\n startString = await this.randomString(8);\n } else if (o.catchallType === \"website-name\") {\n startString = o.website;\n }\n return startString + \"@\" + o.catchallDomain;\n }\n\n async generateForwarded(options: UsernameGeneratorOptions): Promise {\n const o = Object.assign({}, DefaultOptions, options);\n\n if (o.forwardedService == null) {\n return null;\n }\n\n let forwarder: Forwarder = null;\n const forwarderOptions = new ForwarderOptions();\n forwarderOptions.website = o.website;\n if (o.forwardedService === \"simplelogin\") {\n forwarder = new SimpleLoginForwarder();\n forwarderOptions.apiKey = o.forwardedSimpleLoginApiKey;\n forwarderOptions.simplelogin.baseUrl = o.forwardedSimpleLoginBaseUrl;\n } else if (o.forwardedService === \"anonaddy\") {\n forwarder = new AnonAddyForwarder();\n forwarderOptions.apiKey = o.forwardedAnonAddyApiToken;\n forwarderOptions.anonaddy.domain = o.forwardedAnonAddyDomain;\n forwarderOptions.anonaddy.baseUrl = o.forwardedAnonAddyBaseUrl;\n } else if (o.forwardedService === \"firefoxrelay\") {\n forwarder = new FirefoxRelayForwarder();\n forwarderOptions.apiKey = o.forwardedFirefoxApiToken;\n } else if (o.forwardedService === \"fastmail\") {\n forwarder = new FastmailForwarder();\n forwarderOptions.apiKey = o.forwardedFastmailApiToken;\n } else if (o.forwardedService === \"duckduckgo\") {\n forwarder = new DuckDuckGoForwarder();\n forwarderOptions.apiKey = o.forwardedDuckDuckGoToken;\n } else if (o.forwardedService === \"forwardemail\") {\n forwarder = new ForwardEmailForwarder();\n forwarderOptions.apiKey = o.forwardedForwardEmailApiToken;\n forwarderOptions.forwardemail.domain = o.forwardedForwardEmailDomain;\n }\n\n if (forwarder == null) {\n return null;\n }\n\n return forwarder.generate(this.apiService, forwarderOptions);\n }\n\n async getOptions(): Promise {\n let options = await this.stateService.getUsernameGenerationOptions();\n if (options == null) {\n options = Object.assign({}, DefaultOptions);\n } else {\n options = Object.assign({}, DefaultOptions, options);\n }\n await this.stateService.setUsernameGenerationOptions(options);\n return options;\n }\n\n async saveOptions(options: UsernameGeneratorOptions) {\n await this.stateService.setUsernameGenerationOptions(options);\n }\n\n private async randomString(length: number) {\n let str = \"\";\n const charSet = \"abcdefghijklmnopqrstuvwxyz1234567890\";\n for (let i = 0; i < length; i++) {\n const randomCharIndex = await this.cryptoService.randomNumber(0, charSet.length - 1);\n str += charSet.charAt(randomCharIndex);\n }\n return str;\n }\n\n // ref: https://stackoverflow.com/a/10073788\n private zeroPad(number: string, width: number) {\n return number.length >= width\n ? number\n : new Array(width - number.length + 1).join(\"0\") + number;\n }\n}\n","import { ZXCVBNResult } from \"zxcvbn\";\n\nexport abstract class PasswordStrengthServiceAbstraction {\n getPasswordStrength: (password: string, email?: string, userInputs?: string[]) => ZXCVBNResult;\n}\n","import * as zxcvbn from \"zxcvbn\";\n\nimport { PasswordStrengthServiceAbstraction } from \"./password-strength.service.abstraction\";\n\nexport class PasswordStrengthService implements PasswordStrengthServiceAbstraction {\n /**\n * Calculates a password strength score using zxcvbn.\n * @param password The password to calculate the strength of.\n * @param emailInput An unparsed email address to use as user input.\n * @param userInputs An array of additional user inputs to use when calculating the strength.\n */\n getPasswordStrength(\n password: string,\n emailInput: string = null,\n userInputs: string[] = null,\n ): zxcvbn.ZXCVBNResult {\n if (password == null || password.length === 0) {\n return null;\n }\n const globalUserInputs = [\n \"bitwarden\",\n \"bit\",\n \"warden\",\n ...(userInputs ?? []),\n ...this.emailToUserInputs(emailInput),\n ];\n // Use a hash set to get rid of any duplicate user inputs\n const finalUserInputs = Array.from(new Set(globalUserInputs));\n const result = zxcvbn(password, finalUserInputs);\n return result;\n }\n\n /**\n * Convert an email address into a list of user inputs for zxcvbn by\n * taking the local part of the email address and splitting it into words.\n * @param email\n * @private\n */\n private emailToUserInputs(email: string): string[] {\n if (email == null || email.length === 0) {\n return [];\n }\n const atPosition = email.indexOf(\"@\");\n if (atPosition < 0) {\n return [];\n }\n return email\n .substring(0, atPosition)\n .trim()\n .toLowerCase()\n .split(/[^A-Za-z0-9]/);\n }\n}\n","export enum SendType {\n Text = 0,\n File = 1,\n}\n","import { Jsonify } from \"type-fest\";\n\nimport Domain from \"../../../../platform/models/domain/domain-base\";\nimport { EncString } from \"../../../../platform/models/domain/enc-string\";\nimport { SymmetricCryptoKey } from \"../../../../platform/models/domain/symmetric-crypto-key\";\nimport { SendFileData } from \"../data/send-file.data\";\nimport { SendFileView } from \"../view/send-file.view\";\n\nexport class SendFile extends Domain {\n id: string;\n size: string;\n sizeName: string;\n fileName: EncString;\n\n constructor(obj?: SendFileData) {\n super();\n if (obj == null) {\n return;\n }\n\n this.size = obj.size;\n this.buildDomainModel(\n this,\n obj,\n {\n id: null,\n sizeName: null,\n fileName: null,\n },\n [\"id\", \"sizeName\"],\n );\n }\n\n async decrypt(key: SymmetricCryptoKey): Promise {\n const view = await this.decryptObj(\n new SendFileView(this),\n {\n fileName: null,\n },\n null,\n key,\n );\n return view;\n }\n\n static fromJSON(obj: Jsonify) {\n if (obj == null) {\n return null;\n }\n\n return Object.assign(new SendFile(), obj, {\n fileName: EncString.fromJSON(obj.fileName),\n });\n }\n}\n","import { Jsonify } from \"type-fest\";\n\nimport Domain from \"../../../../platform/models/domain/domain-base\";\nimport { EncString } from \"../../../../platform/models/domain/enc-string\";\nimport { SymmetricCryptoKey } from \"../../../../platform/models/domain/symmetric-crypto-key\";\nimport { SendTextData } from \"../data/send-text.data\";\nimport { SendTextView } from \"../view/send-text.view\";\n\nexport class SendText extends Domain {\n text: EncString;\n hidden: boolean;\n\n constructor(obj?: SendTextData) {\n super();\n if (obj == null) {\n return;\n }\n\n this.hidden = obj.hidden;\n this.buildDomainModel(\n this,\n obj,\n {\n text: null,\n },\n [],\n );\n }\n\n decrypt(key: SymmetricCryptoKey): Promise {\n return this.decryptObj(\n new SendTextView(this),\n {\n text: null,\n },\n null,\n key,\n );\n }\n\n static fromJSON(obj: Jsonify) {\n if (obj == null) {\n return null;\n }\n\n return Object.assign(new SendText(), obj, {\n text: EncString.fromJSON(obj.text),\n });\n }\n}\n","import { Jsonify } from \"type-fest\";\n\nimport { Utils } from \"../../../../platform/misc/utils\";\nimport Domain from \"../../../../platform/models/domain/domain-base\";\nimport { EncString } from \"../../../../platform/models/domain/enc-string\";\nimport { SendType } from \"../../enums/send-type\";\nimport { SendData } from \"../data/send.data\";\nimport { SendView } from \"../view/send.view\";\n\nimport { SendFile } from \"./send-file\";\nimport { SendText } from \"./send-text\";\n\nexport class Send extends Domain {\n id: string;\n accessId: string;\n type: SendType;\n name: EncString;\n notes: EncString;\n file: SendFile;\n text: SendText;\n key: EncString;\n maxAccessCount?: number;\n accessCount: number;\n revisionDate: Date;\n expirationDate: Date;\n deletionDate: Date;\n password: string;\n disabled: boolean;\n hideEmail: boolean;\n\n constructor(obj?: SendData) {\n super();\n if (obj == null) {\n return;\n }\n\n this.buildDomainModel(\n this,\n obj,\n {\n id: null,\n accessId: null,\n name: null,\n notes: null,\n key: null,\n },\n [\"id\", \"accessId\"],\n );\n\n this.type = obj.type;\n this.maxAccessCount = obj.maxAccessCount;\n this.accessCount = obj.accessCount;\n this.password = obj.password;\n this.disabled = obj.disabled;\n this.revisionDate = obj.revisionDate != null ? new Date(obj.revisionDate) : null;\n this.deletionDate = obj.deletionDate != null ? new Date(obj.deletionDate) : null;\n this.expirationDate = obj.expirationDate != null ? new Date(obj.expirationDate) : null;\n this.hideEmail = obj.hideEmail;\n\n switch (this.type) {\n case SendType.Text:\n this.text = new SendText(obj.text);\n break;\n case SendType.File:\n this.file = new SendFile(obj.file);\n break;\n default:\n break;\n }\n }\n\n async decrypt(): Promise {\n const model = new SendView(this);\n\n const cryptoService = Utils.getContainerService().getCryptoService();\n\n try {\n model.key = await cryptoService.decryptToBytes(this.key, null);\n model.cryptoKey = await cryptoService.makeSendKey(model.key);\n } catch (e) {\n // TODO: error?\n }\n\n await this.decryptObj(\n model,\n {\n name: null,\n notes: null,\n },\n null,\n model.cryptoKey,\n );\n\n switch (this.type) {\n case SendType.File:\n model.file = await this.file.decrypt(model.cryptoKey);\n break;\n case SendType.Text:\n model.text = await this.text.decrypt(model.cryptoKey);\n break;\n default:\n break;\n }\n\n return model;\n }\n\n static fromJSON(obj: Jsonify) {\n if (obj == null) {\n return null;\n }\n\n const revisionDate = obj.revisionDate == null ? null : new Date(obj.revisionDate);\n const expirationDate = obj.expirationDate == null ? null : new Date(obj.expirationDate);\n const deletionDate = obj.deletionDate == null ? null : new Date(obj.deletionDate);\n\n return Object.assign(new Send(), obj, {\n key: EncString.fromJSON(obj.key),\n name: EncString.fromJSON(obj.name),\n notes: EncString.fromJSON(obj.notes),\n text: SendText.fromJSON(obj.text),\n file: SendFile.fromJSON(obj.file),\n revisionDate,\n expirationDate,\n deletionDate,\n });\n }\n}\n","import { View } from \"../../../../models/view/view\";\nimport { DeepJsonify } from \"../../../../types/deep-jsonify\";\nimport { SendFile } from \"../domain/send-file\";\n\nexport class SendFileView implements View {\n id: string = null;\n size: string = null;\n sizeName: string = null;\n fileName: string = null;\n\n constructor(f?: SendFile) {\n if (!f) {\n return;\n }\n\n this.id = f.id;\n this.size = f.size;\n this.sizeName = f.sizeName;\n }\n\n get fileSize(): number {\n try {\n if (this.size != null) {\n return parseInt(this.size, null);\n }\n } catch {\n // Invalid file size.\n }\n return 0;\n }\n\n static fromJSON(json: DeepJsonify) {\n if (json == null) {\n return null;\n }\n\n return Object.assign(new SendFileView(), json);\n }\n}\n","import { View } from \"../../../../models/view/view\";\nimport { DeepJsonify } from \"../../../../types/deep-jsonify\";\nimport { SendText } from \"../domain/send-text\";\n\nexport class SendTextView implements View {\n text: string = null;\n hidden: boolean;\n\n constructor(t?: SendText) {\n if (!t) {\n return;\n }\n\n this.hidden = t.hidden;\n }\n\n get maskedText(): string {\n return this.text != null ? \"••••••••\" : null;\n }\n\n static fromJSON(json: DeepJsonify) {\n if (json == null) {\n return null;\n }\n\n return Object.assign(new SendTextView(), json);\n }\n}\n","import { View } from \"../../../../models/view/view\";\nimport { Utils } from \"../../../../platform/misc/utils\";\nimport { SymmetricCryptoKey } from \"../../../../platform/models/domain/symmetric-crypto-key\";\nimport { DeepJsonify } from \"../../../../types/deep-jsonify\";\nimport { SendType } from \"../../enums/send-type\";\nimport { Send } from \"../domain/send\";\n\nimport { SendFileView } from \"./send-file.view\";\nimport { SendTextView } from \"./send-text.view\";\n\nexport class SendView implements View {\n id: string = null;\n accessId: string = null;\n name: string = null;\n notes: string = null;\n key: Uint8Array;\n cryptoKey: SymmetricCryptoKey;\n type: SendType = null;\n text = new SendTextView();\n file = new SendFileView();\n maxAccessCount?: number = null;\n accessCount = 0;\n revisionDate: Date = null;\n deletionDate: Date = null;\n expirationDate: Date = null;\n password: string = null;\n disabled = false;\n hideEmail = false;\n\n constructor(s?: Send) {\n if (!s) {\n return;\n }\n\n this.id = s.id;\n this.accessId = s.accessId;\n this.type = s.type;\n this.maxAccessCount = s.maxAccessCount;\n this.accessCount = s.accessCount;\n this.revisionDate = s.revisionDate;\n this.deletionDate = s.deletionDate;\n this.expirationDate = s.expirationDate;\n this.disabled = s.disabled;\n this.password = s.password;\n this.hideEmail = s.hideEmail;\n }\n\n get urlB64Key(): string {\n return Utils.fromBufferToUrlB64(this.key);\n }\n\n get maxAccessCountReached(): boolean {\n if (this.maxAccessCount == null) {\n return false;\n }\n return this.accessCount >= this.maxAccessCount;\n }\n\n get expired(): boolean {\n if (this.expirationDate == null) {\n return false;\n }\n return this.expirationDate <= new Date();\n }\n\n get pendingDelete(): boolean {\n return this.deletionDate <= new Date();\n }\n\n toJSON() {\n return Utils.merge(\n { ...this },\n {\n key: Utils.fromBufferToB64(this.key),\n },\n );\n }\n\n static fromJSON(json: DeepJsonify) {\n if (json == null) {\n return null;\n }\n\n return Object.assign(new SendView(), json, {\n key: Utils.fromB64ToArray(json.key),\n cryptoKey: SymmetricCryptoKey.fromJSON(json.cryptoKey),\n text: SendTextView.fromJSON(json.text),\n file: SendFileView.fromJSON(json.file),\n revisionDate: json.revisionDate == null ? null : new Date(json.revisionDate),\n deletionDate: json.deletionDate == null ? null : new Date(json.deletionDate),\n expirationDate: json.expirationDate == null ? null : new Date(json.expirationDate),\n });\n }\n}\n","export const SEND_KDF_ITERATIONS = 100000;\n","import { ListResponse } from \"../../../models/response/list.response\";\nimport { EncArrayBuffer } from \"../../../platform/models/domain/enc-array-buffer\";\nimport { Send } from \"../models/domain/send\";\nimport { SendAccessRequest } from \"../models/request/send-access.request\";\nimport { SendRequest } from \"../models/request/send.request\";\nimport { SendAccessResponse } from \"../models/response/send-access.response\";\nimport { SendFileDownloadDataResponse } from \"../models/response/send-file-download-data.response\";\nimport { SendFileUploadDataResponse } from \"../models/response/send-file-upload-data.response\";\nimport { SendResponse } from \"../models/response/send.response\";\nimport { SendAccessView } from \"../models/view/send-access.view\";\n\nexport abstract class SendApiService {\n getSend: (id: string) => Promise;\n postSendAccess: (\n id: string,\n request: SendAccessRequest,\n apiUrl?: string,\n ) => Promise;\n getSends: () => Promise>;\n postSend: (request: SendRequest) => Promise;\n postFileTypeSend: (request: SendRequest) => Promise;\n postSendFile: (sendId: string, fileId: string, data: FormData) => Promise;\n /**\n * @deprecated Mar 25 2021: This method has been deprecated in favor of direct uploads.\n * This method still exists for backward compatibility with old server versions.\n */\n postSendFileLegacy: (data: FormData) => Promise;\n putSend: (id: string, request: SendRequest) => Promise;\n putSendRemovePassword: (id: string) => Promise;\n deleteSend: (id: string) => Promise;\n getSendFileDownloadData: (\n send: SendAccessView,\n request: SendAccessRequest,\n apiUrl?: string,\n ) => Promise;\n renewSendFileUploadUrl: (sendId: string, fileId: string) => Promise;\n removePassword: (id: string) => Promise;\n delete: (id: string) => Promise;\n save: (sendData: [Send, EncArrayBuffer]) => Promise;\n}\n","import { Observable } from \"rxjs\";\n\nimport { EncArrayBuffer } from \"../../../platform/models/domain/enc-array-buffer\";\nimport { SymmetricCryptoKey } from \"../../../platform/models/domain/symmetric-crypto-key\";\nimport { UserKey } from \"../../../types/key\";\nimport { SendData } from \"../models/data/send.data\";\nimport { Send } from \"../models/domain/send\";\nimport { SendWithIdRequest } from \"../models/request/send-with-id.request\";\nimport { SendView } from \"../models/view/send.view\";\n\nexport abstract class SendService {\n sends$: Observable;\n sendViews$: Observable;\n\n encrypt: (\n model: SendView,\n file: File | ArrayBuffer,\n password: string,\n key?: SymmetricCryptoKey,\n ) => Promise<[Send, EncArrayBuffer]>;\n /**\n * @deprecated Do not call this, use the get$ method\n */\n get: (id: string) => Send;\n /**\n * Provides a send for a determined id\n * updates after a change occurs to the send that matches the id\n * @param id The id of the desired send\n * @returns An observable that listens to the value of the desired send\n */\n get$: (id: string) => Observable;\n /**\n * Provides re-encrypted user sends for the key rotation process\n * @param newUserKey The new user key to use for re-encryption\n * @throws Error if the new user key is null or undefined\n * @returns A list of user sends that have been re-encrypted with the new user key\n */\n getRotatedKeys: (newUserKey: UserKey) => Promise;\n /**\n * @deprecated Do not call this, use the sends$ observable collection\n */\n getAll: () => Promise;\n /**\n * @deprecated Only use in CLI\n */\n getFromState: (id: string) => Promise;\n /**\n * @deprecated Only use in CLI\n */\n getAllDecryptedFromState: () => Promise;\n}\n\nexport abstract class InternalSendService extends SendService {\n upsert: (send: SendData | SendData[]) => Promise;\n replace: (sends: { [id: string]: SendData }) => Promise;\n clear: (userId: string) => Promise;\n delete: (id: string | string[]) => Promise;\n}\n","import { UriMatchStrategySetting } from \"../../models/domain/domain-service\";\nimport { SymmetricCryptoKey } from \"../../platform/models/domain/symmetric-crypto-key\";\nimport { CipherId, CollectionId, OrganizationId } from \"../../types/guid\";\nimport { CipherType } from \"../enums/cipher-type\";\nimport { CipherData } from \"../models/data/cipher.data\";\nimport { Cipher } from \"../models/domain/cipher\";\nimport { Field } from \"../models/domain/field\";\nimport { CipherView } from \"../models/view/cipher.view\";\nimport { FieldView } from \"../models/view/field.view\";\n\nexport abstract class CipherService {\n clearCache: (userId?: string) => Promise;\n encrypt: (\n model: CipherView,\n keyForEncryption?: SymmetricCryptoKey,\n keyForCipherKeyDecryption?: SymmetricCryptoKey,\n originalCipher?: Cipher,\n ) => Promise;\n encryptFields: (fieldsModel: FieldView[], key: SymmetricCryptoKey) => Promise;\n encryptField: (fieldModel: FieldView, key: SymmetricCryptoKey) => Promise;\n get: (id: string) => Promise;\n getAll: () => Promise;\n getAllDecrypted: () => Promise;\n getAllDecryptedForGrouping: (groupingId: string, folder?: boolean) => Promise;\n getAllDecryptedForUrl: (\n url: string,\n includeOtherTypes?: CipherType[],\n defaultMatch?: UriMatchStrategySetting,\n ) => Promise;\n getAllFromApiForOrganization: (organizationId: string) => Promise;\n /**\n * Gets ciphers belonging to the specified organization that the user has explicit collection level access to.\n * Ciphers that are not assigned to any collections are only included for users with admin access.\n */\n getManyFromApiForOrganization: (organizationId: string) => Promise;\n getLastUsedForUrl: (url: string, autofillOnPageLoad: boolean) => Promise;\n getLastLaunchedForUrl: (url: string, autofillOnPageLoad: boolean) => Promise;\n getNextCipherForUrl: (url: string) => Promise;\n updateLastUsedIndexForUrl: (url: string) => void;\n updateLastUsedDate: (id: string) => Promise;\n updateLastLaunchedDate: (id: string) => Promise;\n saveNeverDomain: (domain: string) => Promise;\n createWithServer: (cipher: Cipher, orgAdmin?: boolean) => Promise;\n updateWithServer: (cipher: Cipher, orgAdmin?: boolean, isNotClone?: boolean) => Promise;\n shareWithServer: (\n cipher: CipherView,\n organizationId: string,\n collectionIds: string[],\n ) => Promise;\n shareManyWithServer: (\n ciphers: CipherView[],\n organizationId: string,\n collectionIds: string[],\n ) => Promise;\n saveAttachmentWithServer: (\n cipher: Cipher,\n unencryptedFile: any,\n admin?: boolean,\n ) => Promise;\n saveAttachmentRawWithServer: (\n cipher: Cipher,\n filename: string,\n data: ArrayBuffer,\n admin?: boolean,\n ) => Promise;\n saveCollectionsWithServer: (cipher: Cipher) => Promise;\n /**\n * Bulk update collections for many ciphers with the server\n * @param orgId\n * @param cipherIds\n * @param collectionIds\n * @param removeCollections - If true, the collections will be removed from the ciphers, otherwise they will be added\n */\n bulkUpdateCollectionsWithServer: (\n orgId: OrganizationId,\n cipherIds: CipherId[],\n collectionIds: CollectionId[],\n removeCollections: boolean,\n ) => Promise;\n upsert: (cipher: CipherData | CipherData[]) => Promise;\n replace: (ciphers: { [id: string]: CipherData }) => Promise;\n clear: (userId: string) => Promise;\n moveManyWithServer: (ids: string[], folderId: string) => Promise;\n delete: (id: string | string[]) => Promise;\n deleteWithServer: (id: string, asAdmin?: boolean) => Promise;\n deleteManyWithServer: (ids: string[], asAdmin?: boolean) => Promise;\n deleteAttachment: (id: string, attachmentId: string) => Promise;\n deleteAttachmentWithServer: (id: string, attachmentId: string) => Promise;\n sortCiphersByLastUsed: (a: CipherView, b: CipherView) => number;\n sortCiphersByLastUsedThenName: (a: CipherView, b: CipherView) => number;\n getLocaleSortingFunction: () => (a: CipherView, b: CipherView) => number;\n softDelete: (id: string | string[]) => Promise;\n softDeleteWithServer: (id: string, asAdmin?: boolean) => Promise;\n softDeleteManyWithServer: (ids: string[], asAdmin?: boolean) => Promise;\n restore: (\n cipher: { id: string; revisionDate: string } | { id: string; revisionDate: string }[],\n ) => Promise;\n restoreWithServer: (id: string, asAdmin?: boolean) => Promise;\n restoreManyWithServer: (\n ids: string[],\n organizationId?: string,\n asAdmin?: boolean,\n ) => Promise;\n getKeyForCipherKeyDecryption: (cipher: Cipher) => Promise;\n}\n","import { Observable } from \"rxjs\";\n\nimport { CollectionId } from \"../../types/guid\";\nimport { CollectionData } from \"../models/data/collection.data\";\nimport { Collection } from \"../models/domain/collection\";\nimport { TreeNode } from \"../models/domain/tree-node\";\nimport { CollectionView } from \"../models/view/collection.view\";\n\nexport abstract class CollectionService {\n decryptedCollections$: Observable;\n\n clearActiveUserCache: () => Promise;\n encrypt: (model: CollectionView) => Promise;\n decryptedCollectionViews$: (ids: CollectionId[]) => Observable;\n /**\n * @deprecated This method will soon be made private, use `decryptedCollectionViews$` instead.\n */\n decryptMany: (collections: Collection[]) => Promise;\n get: (id: string) => Promise;\n getAll: () => Promise;\n getAllDecrypted: () => Promise;\n getAllNested: (collections?: CollectionView[]) => Promise[]>;\n getNested: (id: string) => Promise>;\n upsert: (collection: CollectionData | CollectionData[]) => Promise;\n replace: (collections: { [id: string]: CollectionData }) => Promise;\n clear: (userId: string) => Promise;\n delete: (id: string | string[]) => Promise;\n}\n","import { Folder } from \"../../models/domain/folder\";\nimport { FolderResponse } from \"../../models/response/folder.response\";\n\nexport class FolderApiServiceAbstraction {\n save: (folder: Folder) => Promise;\n delete: (id: string) => Promise;\n get: (id: string) => Promise;\n}\n","import { Observable } from \"rxjs\";\n\nimport { SymmetricCryptoKey } from \"../../../platform/models/domain/symmetric-crypto-key\";\nimport { FolderData } from \"../../models/data/folder.data\";\nimport { Folder } from \"../../models/domain/folder\";\nimport { FolderView } from \"../../models/view/folder.view\";\n\nexport abstract class FolderService {\n folders$: Observable;\n folderViews$: Observable;\n\n clearCache: () => Promise;\n encrypt: (model: FolderView, key?: SymmetricCryptoKey) => Promise;\n get: (id: string) => Promise;\n getAllFromState: () => Promise;\n /**\n * @deprecated Only use in CLI!\n */\n getFromState: (id: string) => Promise;\n /**\n * @deprecated Only use in CLI!\n */\n getAllDecryptedFromState: () => Promise;\n decryptFolders: (folders: Folder[]) => Promise;\n}\n\nexport abstract class InternalFolderService extends FolderService {\n upsert: (folder: FolderData | FolderData[]) => Promise;\n replace: (folders: { [id: string]: FolderData }) => Promise;\n clear: (userId: string) => Promise;\n delete: (id: string | string[]) => Promise;\n}\n","import {\n SyncCipherNotification,\n SyncFolderNotification,\n SyncSendNotification,\n} from \"../../../models/response/notification.response\";\n\nexport abstract class SyncService {\n syncInProgress: boolean;\n\n getLastSync: () => Promise;\n setLastSync: (date: Date, userId?: string) => Promise;\n fullSync: (forceSync: boolean, allowThrowOnError?: boolean) => Promise;\n syncUpsertFolder: (notification: SyncFolderNotification, isEdit: boolean) => Promise;\n syncDeleteFolder: (notification: SyncFolderNotification) => Promise;\n syncUpsertCipher: (notification: SyncCipherNotification, isEdit: boolean) => Promise;\n syncDeleteCipher: (notification: SyncFolderNotification) => Promise;\n syncUpsertSend: (notification: SyncSendNotification, isEdit: boolean) => Promise;\n syncDeleteSend: (notification: SyncSendNotification) => Promise;\n}\n","export abstract class TotpService {\n getCode: (key: string) => Promise;\n getTimeInterval: (key: string) => number;\n}\n","export enum CipherRepromptType {\n None = 0,\n Password = 1,\n}\n","export enum CipherType {\n Login = 1,\n SecureNote = 2,\n Card = 3,\n Identity = 4,\n}\n","export enum FieldType {\n Text = 0,\n Hidden = 1,\n Boolean = 2,\n Linked = 3,\n}\n","export type LinkedIdType = LoginLinkedId | CardLinkedId | IdentityLinkedId;\n\n// LoginView\nexport enum LoginLinkedId {\n Username = 100,\n Password = 101,\n}\n\n// CardView\nexport enum CardLinkedId {\n CardholderName = 300,\n ExpMonth = 301,\n ExpYear = 302,\n Code = 303,\n Brand = 304,\n Number = 305,\n}\n\n// IdentityView\nexport enum IdentityLinkedId {\n Title = 400,\n MiddleName = 401,\n Address1 = 402,\n Address2 = 403,\n Address3 = 404,\n City = 405,\n State = 406,\n PostalCode = 407,\n Country = 408,\n Company = 409,\n Email = 410,\n Phone = 411,\n Ssn = 412,\n Username = 413,\n PassportNumber = 414,\n LicenseNumber = 415,\n FirstName = 416,\n LastName = 417,\n FullName = 418,\n}\n","export enum SecureNoteType {\n Generic = 0,\n}\n","import { LinkedIdType } from \"./enums\";\nimport { ItemView } from \"./models/view/item.view\";\n\nexport class LinkedMetadata {\n constructor(\n readonly propertyKey: string,\n private readonly _i18nKey?: string,\n ) {}\n\n get i18nKey() {\n return this._i18nKey ?? this.propertyKey;\n }\n}\n\n/**\n * A decorator used to set metadata used by Linked custom fields. Apply it to a class property or getter to make it\n * available as a Linked custom field option.\n * @param id - A unique value that is saved in the Field model. It is used to look up the decorated class property.\n * @param i18nKey - The i18n key used to describe the decorated class property in the UI. If it is null, then the name\n * of the class property will be used as the i18n key.\n */\nexport function linkedFieldOption(id: LinkedIdType, i18nKey?: string) {\n return (prototype: ItemView, propertyKey: string) => {\n if (prototype.linkedFieldOptions == null) {\n prototype.linkedFieldOptions = new Map();\n }\n\n prototype.linkedFieldOptions.set(id, new LinkedMetadata(propertyKey, i18nKey));\n };\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\n\nexport class CardApi extends BaseResponse {\n cardholderName: string;\n brand: string;\n number: string;\n expMonth: string;\n expYear: string;\n code: string;\n\n constructor(data: any = null) {\n super(data);\n if (data == null) {\n return;\n }\n this.cardholderName = this.getResponseProperty(\"CardholderName\");\n this.brand = this.getResponseProperty(\"Brand\");\n this.number = this.getResponseProperty(\"Number\");\n this.expMonth = this.getResponseProperty(\"ExpMonth\");\n this.expYear = this.getResponseProperty(\"ExpYear\");\n this.code = this.getResponseProperty(\"Code\");\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\n\nexport class Fido2CredentialApi extends BaseResponse {\n credentialId: string;\n keyType: \"public-key\";\n keyAlgorithm: \"ECDSA\";\n keyCurve: \"P-256\";\n keyValue: string;\n rpId: string;\n userHandle: string;\n userName: string;\n counter: string;\n rpName: string;\n userDisplayName: string;\n discoverable: string;\n creationDate: string;\n\n constructor(data: any = null) {\n super(data);\n if (data == null) {\n return;\n }\n\n this.credentialId = this.getResponseProperty(\"CredentialId\");\n this.keyType = this.getResponseProperty(\"KeyType\");\n this.keyAlgorithm = this.getResponseProperty(\"KeyAlgorithm\");\n this.keyCurve = this.getResponseProperty(\"KeyCurve\");\n this.keyValue = this.getResponseProperty(\"keyValue\");\n this.rpId = this.getResponseProperty(\"RpId\");\n this.userHandle = this.getResponseProperty(\"UserHandle\");\n this.userName = this.getResponseProperty(\"UserName\");\n this.counter = this.getResponseProperty(\"Counter\");\n this.rpName = this.getResponseProperty(\"RpName\");\n this.userDisplayName = this.getResponseProperty(\"UserDisplayName\");\n this.discoverable = this.getResponseProperty(\"Discoverable\");\n this.creationDate = this.getResponseProperty(\"CreationDate\");\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\nimport { FieldType, LinkedIdType } from \"../../enums\";\n\nexport class FieldApi extends BaseResponse {\n name: string;\n value: string;\n type: FieldType;\n linkedId: LinkedIdType;\n\n constructor(data: any = null) {\n super(data);\n if (data == null) {\n return;\n }\n this.type = this.getResponseProperty(\"Type\");\n this.name = this.getResponseProperty(\"Name\");\n this.value = this.getResponseProperty(\"Value\");\n this.linkedId = this.getResponseProperty(\"linkedId\");\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\n\nexport class IdentityApi extends BaseResponse {\n title: string;\n firstName: string;\n middleName: string;\n lastName: string;\n address1: string;\n address2: string;\n address3: string;\n city: string;\n state: string;\n postalCode: string;\n country: string;\n company: string;\n email: string;\n phone: string;\n ssn: string;\n username: string;\n passportNumber: string;\n licenseNumber: string;\n\n constructor(data: any = null) {\n super(data);\n if (data == null) {\n return;\n }\n this.title = this.getResponseProperty(\"Title\");\n this.firstName = this.getResponseProperty(\"FirstName\");\n this.middleName = this.getResponseProperty(\"MiddleName\");\n this.lastName = this.getResponseProperty(\"LastName\");\n this.address1 = this.getResponseProperty(\"Address1\");\n this.address2 = this.getResponseProperty(\"Address2\");\n this.address3 = this.getResponseProperty(\"Address3\");\n this.city = this.getResponseProperty(\"City\");\n this.state = this.getResponseProperty(\"State\");\n this.postalCode = this.getResponseProperty(\"PostalCode\");\n this.country = this.getResponseProperty(\"Country\");\n this.company = this.getResponseProperty(\"Company\");\n this.email = this.getResponseProperty(\"Email\");\n this.phone = this.getResponseProperty(\"Phone\");\n this.ssn = this.getResponseProperty(\"SSN\");\n this.username = this.getResponseProperty(\"Username\");\n this.passportNumber = this.getResponseProperty(\"PassportNumber\");\n this.licenseNumber = this.getResponseProperty(\"LicenseNumber\");\n }\n}\n","import { UriMatchStrategySetting } from \"../../../models/domain/domain-service\";\nimport { BaseResponse } from \"../../../models/response/base.response\";\n\nexport class LoginUriApi extends BaseResponse {\n uri: string;\n uriChecksum: string;\n match: UriMatchStrategySetting = null;\n\n constructor(data: any = null) {\n super(data);\n if (data == null) {\n return;\n }\n this.uri = this.getResponseProperty(\"Uri\");\n this.uriChecksum = this.getResponseProperty(\"UriChecksum\");\n const match = this.getResponseProperty(\"Match\");\n this.match = match != null ? match : null;\n }\n}\n","import { JsonObject } from \"type-fest\";\n\nimport { BaseResponse } from \"../../../models/response/base.response\";\n\nimport { Fido2CredentialApi } from \"./fido2-credential.api\";\nimport { LoginUriApi } from \"./login-uri.api\";\n\nexport class LoginApi extends BaseResponse {\n uris: LoginUriApi[];\n username: string;\n password: string;\n passwordRevisionDate: string;\n totp: string;\n autofillOnPageLoad: boolean;\n fido2Credentials?: Fido2CredentialApi[];\n\n constructor(data: any = null) {\n super(data);\n if (data == null) {\n return;\n }\n this.username = this.getResponseProperty(\"Username\");\n this.password = this.getResponseProperty(\"Password\");\n this.passwordRevisionDate = this.getResponseProperty(\"PasswordRevisionDate\");\n this.totp = this.getResponseProperty(\"Totp\");\n this.autofillOnPageLoad = this.getResponseProperty(\"AutofillOnPageLoad\");\n\n const uris = this.getResponseProperty(\"Uris\");\n if (uris != null) {\n this.uris = uris.map((u: any) => new LoginUriApi(u));\n }\n\n const fido2Credentials = this.getResponseProperty(\"Fido2Credentials\");\n if (fido2Credentials != null) {\n this.fido2Credentials = fido2Credentials.map(\n (key: JsonObject) => new Fido2CredentialApi(key),\n );\n }\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\nimport { SecureNoteType } from \"../../enums\";\n\nexport class SecureNoteApi extends BaseResponse {\n type: SecureNoteType;\n\n constructor(data: any = null) {\n super(data);\n if (data == null) {\n return;\n }\n this.type = this.getResponseProperty(\"Type\");\n }\n}\n","import { AttachmentResponse } from \"../response/attachment.response\";\n\nexport class AttachmentData {\n id: string;\n url: string;\n fileName: string;\n key: string;\n size: string;\n sizeName: string;\n\n constructor(response?: AttachmentResponse) {\n if (response == null) {\n return;\n }\n this.id = response.id;\n this.url = response.url;\n this.fileName = response.fileName;\n this.key = response.key;\n this.size = response.size;\n this.sizeName = response.sizeName;\n }\n}\n","import { CardApi } from \"../api/card.api\";\n\nexport class CardData {\n cardholderName: string;\n brand: string;\n number: string;\n expMonth: string;\n expYear: string;\n code: string;\n\n constructor(data?: CardApi) {\n if (data == null) {\n return;\n }\n\n this.cardholderName = data.cardholderName;\n this.brand = data.brand;\n this.number = data.number;\n this.expMonth = data.expMonth;\n this.expYear = data.expYear;\n this.code = data.code;\n }\n}\n","import { CipherRepromptType } from \"../../enums/cipher-reprompt-type\";\nimport { CipherType } from \"../../enums/cipher-type\";\nimport { CipherResponse } from \"../response/cipher.response\";\n\nimport { AttachmentData } from \"./attachment.data\";\nimport { CardData } from \"./card.data\";\nimport { FieldData } from \"./field.data\";\nimport { IdentityData } from \"./identity.data\";\nimport { LoginData } from \"./login.data\";\nimport { PasswordHistoryData } from \"./password-history.data\";\nimport { SecureNoteData } from \"./secure-note.data\";\n\nexport class CipherData {\n id: string;\n organizationId: string;\n folderId: string;\n edit: boolean;\n viewPassword: boolean;\n organizationUseTotp: boolean;\n favorite: boolean;\n revisionDate: string;\n type: CipherType;\n name: string;\n notes: string;\n login?: LoginData;\n secureNote?: SecureNoteData;\n card?: CardData;\n identity?: IdentityData;\n fields?: FieldData[];\n attachments?: AttachmentData[];\n passwordHistory?: PasswordHistoryData[];\n collectionIds?: string[];\n creationDate: string;\n deletedDate: string;\n reprompt: CipherRepromptType;\n key: string;\n\n constructor(response?: CipherResponse, collectionIds?: string[]) {\n if (response == null) {\n return;\n }\n\n this.id = response.id;\n this.organizationId = response.organizationId;\n this.folderId = response.folderId;\n this.edit = response.edit;\n this.viewPassword = response.viewPassword;\n this.organizationUseTotp = response.organizationUseTotp;\n this.favorite = response.favorite;\n this.revisionDate = response.revisionDate;\n this.type = response.type;\n this.name = response.name;\n this.notes = response.notes;\n this.collectionIds = collectionIds != null ? collectionIds : response.collectionIds;\n this.creationDate = response.creationDate;\n this.deletedDate = response.deletedDate;\n this.reprompt = response.reprompt;\n this.key = response.key;\n\n switch (this.type) {\n case CipherType.Login:\n this.login = new LoginData(response.login);\n break;\n case CipherType.SecureNote:\n this.secureNote = new SecureNoteData(response.secureNote);\n break;\n case CipherType.Card:\n this.card = new CardData(response.card);\n break;\n case CipherType.Identity:\n this.identity = new IdentityData(response.identity);\n break;\n default:\n break;\n }\n\n if (response.fields != null) {\n this.fields = response.fields.map((f) => new FieldData(f));\n }\n if (response.attachments != null) {\n this.attachments = response.attachments.map((a) => new AttachmentData(a));\n }\n if (response.passwordHistory != null) {\n this.passwordHistory = response.passwordHistory.map((ph) => new PasswordHistoryData(ph));\n }\n }\n}\n","import { Jsonify } from \"type-fest\";\n\nimport { CollectionId, OrganizationId } from \"../../../types/guid\";\nimport { CollectionDetailsResponse } from \"../response/collection.response\";\n\nexport class CollectionData {\n id: CollectionId;\n organizationId: OrganizationId;\n name: string;\n externalId: string;\n readOnly: boolean;\n manage: boolean;\n hidePasswords: boolean;\n\n constructor(response: CollectionDetailsResponse) {\n this.id = response.id;\n this.organizationId = response.organizationId;\n this.name = response.name;\n this.externalId = response.externalId;\n this.readOnly = response.readOnly;\n this.manage = response.manage;\n this.hidePasswords = response.hidePasswords;\n }\n\n static fromJSON(obj: Jsonify) {\n return Object.assign(new CollectionData(new CollectionDetailsResponse({})), obj);\n }\n}\n","import { Fido2CredentialApi } from \"../api/fido2-credential.api\";\n\nexport class Fido2CredentialData {\n credentialId: string;\n keyType: \"public-key\";\n keyAlgorithm: \"ECDSA\";\n keyCurve: \"P-256\";\n keyValue: string;\n rpId: string;\n userHandle: string;\n userName: string;\n counter: string;\n rpName: string;\n userDisplayName: string;\n discoverable: string;\n creationDate: string;\n\n constructor(data?: Fido2CredentialApi) {\n if (data == null) {\n return;\n }\n\n this.credentialId = data.credentialId;\n this.keyType = data.keyType;\n this.keyAlgorithm = data.keyAlgorithm;\n this.keyCurve = data.keyCurve;\n this.keyValue = data.keyValue;\n this.rpId = data.rpId;\n this.userHandle = data.userHandle;\n this.userName = data.userName;\n this.counter = data.counter;\n this.rpName = data.rpName;\n this.userDisplayName = data.userDisplayName;\n this.discoverable = data.discoverable;\n this.creationDate = data.creationDate;\n }\n}\n","import { FieldType, LinkedIdType } from \"../../enums\";\nimport { FieldApi } from \"../api/field.api\";\n\nexport class FieldData {\n type: FieldType;\n name: string;\n value: string;\n linkedId: LinkedIdType;\n\n constructor(response?: FieldApi) {\n if (response == null) {\n return;\n }\n this.type = response.type;\n this.name = response.name;\n this.value = response.value;\n this.linkedId = response.linkedId;\n }\n}\n","import { IdentityApi } from \"../api/identity.api\";\n\nexport class IdentityData {\n title: string;\n firstName: string;\n middleName: string;\n lastName: string;\n address1: string;\n address2: string;\n address3: string;\n city: string;\n state: string;\n postalCode: string;\n country: string;\n company: string;\n email: string;\n phone: string;\n ssn: string;\n username: string;\n passportNumber: string;\n licenseNumber: string;\n\n constructor(data?: IdentityApi) {\n if (data == null) {\n return;\n }\n\n this.title = data.title;\n this.firstName = data.firstName;\n this.middleName = data.middleName;\n this.lastName = data.lastName;\n this.address1 = data.address1;\n this.address2 = data.address2;\n this.address3 = data.address3;\n this.city = data.city;\n this.state = data.state;\n this.postalCode = data.postalCode;\n this.country = data.country;\n this.company = data.company;\n this.email = data.email;\n this.phone = data.phone;\n this.ssn = data.ssn;\n this.username = data.username;\n this.passportNumber = data.passportNumber;\n this.licenseNumber = data.licenseNumber;\n }\n}\n","import { UriMatchStrategySetting } from \"../../../models/domain/domain-service\";\nimport { LoginUriApi } from \"../api/login-uri.api\";\n\nexport class LoginUriData {\n uri: string;\n uriChecksum: string;\n match: UriMatchStrategySetting = null;\n\n constructor(data?: LoginUriApi) {\n if (data == null) {\n return;\n }\n this.uri = data.uri;\n this.uriChecksum = data.uriChecksum;\n this.match = data.match;\n }\n}\n","import { LoginApi } from \"../api/login.api\";\n\nimport { Fido2CredentialData } from \"./fido2-credential.data\";\nimport { LoginUriData } from \"./login-uri.data\";\n\nexport class LoginData {\n uris: LoginUriData[];\n username: string;\n password: string;\n passwordRevisionDate: string;\n totp: string;\n autofillOnPageLoad: boolean;\n fido2Credentials?: Fido2CredentialData[];\n\n constructor(data?: LoginApi) {\n if (data == null) {\n return;\n }\n\n this.username = data.username;\n this.password = data.password;\n this.passwordRevisionDate = data.passwordRevisionDate;\n this.totp = data.totp;\n this.autofillOnPageLoad = data.autofillOnPageLoad;\n\n if (data.uris) {\n this.uris = data.uris.map((u) => new LoginUriData(u));\n }\n\n if (data.fido2Credentials) {\n this.fido2Credentials = data.fido2Credentials?.map((key) => new Fido2CredentialData(key));\n }\n }\n}\n","import { PasswordHistoryResponse } from \"../response/password-history.response\";\n\nexport class PasswordHistoryData {\n password: string;\n lastUsedDate: string;\n\n constructor(response?: PasswordHistoryResponse) {\n if (response == null) {\n return;\n }\n\n this.password = response.password;\n this.lastUsedDate = response.lastUsedDate;\n }\n}\n","import { SecureNoteType } from \"../../enums\";\nimport { SecureNoteApi } from \"../api/secure-note.api\";\n\nexport class SecureNoteData {\n type: SecureNoteType;\n\n constructor(data?: SecureNoteApi) {\n if (data == null) {\n return;\n }\n\n this.type = data.type;\n }\n}\n","import { Jsonify } from \"type-fest\";\n\nimport { Utils } from \"../../../platform/misc/utils\";\nimport Domain from \"../../../platform/models/domain/domain-base\";\nimport { EncString } from \"../../../platform/models/domain/enc-string\";\nimport { SymmetricCryptoKey } from \"../../../platform/models/domain/symmetric-crypto-key\";\nimport { AttachmentData } from \"../data/attachment.data\";\nimport { AttachmentView } from \"../view/attachment.view\";\n\nexport class Attachment extends Domain {\n id: string;\n url: string;\n size: string;\n sizeName: string; // Readable size, ex: \"4.2 KB\" or \"1.43 GB\"\n key: EncString;\n fileName: EncString;\n\n constructor(obj?: AttachmentData) {\n super();\n if (obj == null) {\n return;\n }\n\n this.size = obj.size;\n this.buildDomainModel(\n this,\n obj,\n {\n id: null,\n url: null,\n sizeName: null,\n fileName: null,\n key: null,\n },\n [\"id\", \"url\", \"sizeName\"],\n );\n }\n\n async decrypt(orgId: string, encKey?: SymmetricCryptoKey): Promise {\n const view = await this.decryptObj(\n new AttachmentView(this),\n {\n fileName: null,\n },\n orgId,\n encKey,\n );\n\n if (this.key != null) {\n view.key = await this.decryptAttachmentKey(orgId, encKey);\n }\n\n return view;\n }\n\n private async decryptAttachmentKey(orgId: string, encKey?: SymmetricCryptoKey) {\n try {\n if (encKey == null) {\n encKey = await this.getKeyForDecryption(orgId);\n }\n\n const encryptService = Utils.getContainerService().getEncryptService();\n const decValue = await encryptService.decryptToBytes(this.key, encKey);\n return new SymmetricCryptoKey(decValue);\n } catch (e) {\n // TODO: error?\n }\n }\n\n private async getKeyForDecryption(orgId: string) {\n const cryptoService = Utils.getContainerService().getCryptoService();\n return orgId != null\n ? await cryptoService.getOrgKey(orgId)\n : await cryptoService.getUserKeyWithLegacySupport();\n }\n\n toAttachmentData(): AttachmentData {\n const a = new AttachmentData();\n a.size = this.size;\n this.buildDataModel(\n this,\n a,\n {\n id: null,\n url: null,\n sizeName: null,\n fileName: null,\n key: null,\n },\n [\"id\", \"url\", \"sizeName\"],\n );\n return a;\n }\n\n static fromJSON(obj: Partial>): Attachment {\n if (obj == null) {\n return null;\n }\n\n const key = EncString.fromJSON(obj.key);\n const fileName = EncString.fromJSON(obj.fileName);\n\n return Object.assign(new Attachment(), obj, {\n key,\n fileName,\n });\n }\n}\n","import { Jsonify } from \"type-fest\";\n\nimport Domain from \"../../../platform/models/domain/domain-base\";\nimport { EncString } from \"../../../platform/models/domain/enc-string\";\nimport { SymmetricCryptoKey } from \"../../../platform/models/domain/symmetric-crypto-key\";\nimport { CardData } from \"../data/card.data\";\nimport { CardView } from \"../view/card.view\";\n\nexport class Card extends Domain {\n cardholderName: EncString;\n brand: EncString;\n number: EncString;\n expMonth: EncString;\n expYear: EncString;\n code: EncString;\n\n constructor(obj?: CardData) {\n super();\n if (obj == null) {\n return;\n }\n\n this.buildDomainModel(\n this,\n obj,\n {\n cardholderName: null,\n brand: null,\n number: null,\n expMonth: null,\n expYear: null,\n code: null,\n },\n [],\n );\n }\n\n decrypt(orgId: string, encKey?: SymmetricCryptoKey): Promise {\n return this.decryptObj(\n new CardView(),\n {\n cardholderName: null,\n brand: null,\n number: null,\n expMonth: null,\n expYear: null,\n code: null,\n },\n orgId,\n encKey,\n );\n }\n\n toCardData(): CardData {\n const c = new CardData();\n this.buildDataModel(this, c, {\n cardholderName: null,\n brand: null,\n number: null,\n expMonth: null,\n expYear: null,\n code: null,\n });\n return c;\n }\n\n static fromJSON(obj: Partial>): Card {\n if (obj == null) {\n return null;\n }\n\n const cardholderName = EncString.fromJSON(obj.cardholderName);\n const brand = EncString.fromJSON(obj.brand);\n const number = EncString.fromJSON(obj.number);\n const expMonth = EncString.fromJSON(obj.expMonth);\n const expYear = EncString.fromJSON(obj.expYear);\n const code = EncString.fromJSON(obj.code);\n return Object.assign(new Card(), obj, {\n cardholderName,\n brand,\n number,\n expMonth,\n expYear,\n code,\n });\n }\n}\n","import { Jsonify } from \"type-fest\";\n\nimport { Decryptable } from \"../../../platform/interfaces/decryptable.interface\";\nimport { Utils } from \"../../../platform/misc/utils\";\nimport Domain from \"../../../platform/models/domain/domain-base\";\nimport { EncString } from \"../../../platform/models/domain/enc-string\";\nimport { SymmetricCryptoKey } from \"../../../platform/models/domain/symmetric-crypto-key\";\nimport { InitializerKey } from \"../../../platform/services/cryptography/initializer-key\";\nimport { CipherRepromptType } from \"../../enums/cipher-reprompt-type\";\nimport { CipherType } from \"../../enums/cipher-type\";\nimport { CipherData } from \"../data/cipher.data\";\nimport { LocalData } from \"../data/local.data\";\nimport { CipherView } from \"../view/cipher.view\";\n\nimport { Attachment } from \"./attachment\";\nimport { Card } from \"./card\";\nimport { Field } from \"./field\";\nimport { Identity } from \"./identity\";\nimport { Login } from \"./login\";\nimport { Password } from \"./password\";\nimport { SecureNote } from \"./secure-note\";\n\nexport class Cipher extends Domain implements Decryptable {\n readonly initializerKey = InitializerKey.Cipher;\n\n id: string;\n organizationId: string;\n folderId: string;\n name: EncString;\n notes: EncString;\n type: CipherType;\n favorite: boolean;\n organizationUseTotp: boolean;\n edit: boolean;\n viewPassword: boolean;\n revisionDate: Date;\n localData: LocalData;\n login: Login;\n identity: Identity;\n card: Card;\n secureNote: SecureNote;\n attachments: Attachment[];\n fields: Field[];\n passwordHistory: Password[];\n collectionIds: string[];\n creationDate: Date;\n deletedDate: Date;\n reprompt: CipherRepromptType;\n key: EncString;\n\n constructor(obj?: CipherData, localData: LocalData = null) {\n super();\n if (obj == null) {\n return;\n }\n\n this.buildDomainModel(\n this,\n obj,\n {\n id: null,\n organizationId: null,\n folderId: null,\n name: null,\n notes: null,\n key: null,\n },\n [\"id\", \"organizationId\", \"folderId\"],\n );\n\n this.type = obj.type;\n this.favorite = obj.favorite;\n this.organizationUseTotp = obj.organizationUseTotp;\n this.edit = obj.edit;\n if (obj.viewPassword != null) {\n this.viewPassword = obj.viewPassword;\n } else {\n this.viewPassword = true; // Default for already synced Ciphers without viewPassword\n }\n this.revisionDate = obj.revisionDate != null ? new Date(obj.revisionDate) : null;\n this.collectionIds = obj.collectionIds;\n this.localData = localData;\n this.creationDate = obj.creationDate != null ? new Date(obj.creationDate) : null;\n this.deletedDate = obj.deletedDate != null ? new Date(obj.deletedDate) : null;\n this.reprompt = obj.reprompt;\n\n switch (this.type) {\n case CipherType.Login:\n this.login = new Login(obj.login);\n break;\n case CipherType.SecureNote:\n this.secureNote = new SecureNote(obj.secureNote);\n break;\n case CipherType.Card:\n this.card = new Card(obj.card);\n break;\n case CipherType.Identity:\n this.identity = new Identity(obj.identity);\n break;\n default:\n break;\n }\n\n if (obj.attachments != null) {\n this.attachments = obj.attachments.map((a) => new Attachment(a));\n } else {\n this.attachments = null;\n }\n\n if (obj.fields != null) {\n this.fields = obj.fields.map((f) => new Field(f));\n } else {\n this.fields = null;\n }\n\n if (obj.passwordHistory != null) {\n this.passwordHistory = obj.passwordHistory.map((ph) => new Password(ph));\n } else {\n this.passwordHistory = null;\n }\n }\n\n // We are passing the organizationId into the EncString.decrypt() method here, but because the encKey will always be\n // present and so the organizationId will not be used.\n // We will refactor the EncString.decrypt() in https://bitwarden.atlassian.net/browse/PM-3762 to remove the dependency on the organizationId.\n async decrypt(encKey: SymmetricCryptoKey): Promise {\n const model = new CipherView(this);\n let bypassValidation = true;\n\n if (this.key != null) {\n const encryptService = Utils.getContainerService().getEncryptService();\n encKey = new SymmetricCryptoKey(await encryptService.decryptToBytes(this.key, encKey));\n bypassValidation = false;\n }\n\n await this.decryptObj(\n model,\n {\n name: null,\n notes: null,\n },\n this.organizationId,\n encKey,\n );\n\n switch (this.type) {\n case CipherType.Login:\n model.login = await this.login.decrypt(this.organizationId, bypassValidation, encKey);\n break;\n case CipherType.SecureNote:\n model.secureNote = await this.secureNote.decrypt(this.organizationId, encKey);\n break;\n case CipherType.Card:\n model.card = await this.card.decrypt(this.organizationId, encKey);\n break;\n case CipherType.Identity:\n model.identity = await this.identity.decrypt(this.organizationId, encKey);\n break;\n default:\n break;\n }\n\n if (this.attachments != null && this.attachments.length > 0) {\n const attachments: any[] = [];\n await this.attachments.reduce((promise, attachment) => {\n return promise\n .then(() => {\n return attachment.decrypt(this.organizationId, encKey);\n })\n .then((decAttachment) => {\n attachments.push(decAttachment);\n });\n }, Promise.resolve());\n model.attachments = attachments;\n }\n\n if (this.fields != null && this.fields.length > 0) {\n const fields: any[] = [];\n await this.fields.reduce((promise, field) => {\n return promise\n .then(() => {\n return field.decrypt(this.organizationId, encKey);\n })\n .then((decField) => {\n fields.push(decField);\n });\n }, Promise.resolve());\n model.fields = fields;\n }\n\n if (this.passwordHistory != null && this.passwordHistory.length > 0) {\n const passwordHistory: any[] = [];\n await this.passwordHistory.reduce((promise, ph) => {\n return promise\n .then(() => {\n return ph.decrypt(this.organizationId, encKey);\n })\n .then((decPh) => {\n passwordHistory.push(decPh);\n });\n }, Promise.resolve());\n model.passwordHistory = passwordHistory;\n }\n\n return model;\n }\n\n toCipherData(): CipherData {\n const c = new CipherData();\n c.id = this.id;\n c.organizationId = this.organizationId;\n c.folderId = this.folderId;\n c.edit = this.edit;\n c.viewPassword = this.viewPassword;\n c.organizationUseTotp = this.organizationUseTotp;\n c.favorite = this.favorite;\n c.revisionDate = this.revisionDate != null ? this.revisionDate.toISOString() : null;\n c.type = this.type;\n c.collectionIds = this.collectionIds;\n c.creationDate = this.creationDate != null ? this.creationDate.toISOString() : null;\n c.deletedDate = this.deletedDate != null ? this.deletedDate.toISOString() : null;\n c.reprompt = this.reprompt;\n c.key = this.key?.encryptedString;\n\n this.buildDataModel(this, c, {\n name: null,\n notes: null,\n });\n\n switch (c.type) {\n case CipherType.Login:\n c.login = this.login.toLoginData();\n break;\n case CipherType.SecureNote:\n c.secureNote = this.secureNote.toSecureNoteData();\n break;\n case CipherType.Card:\n c.card = this.card.toCardData();\n break;\n case CipherType.Identity:\n c.identity = this.identity.toIdentityData();\n break;\n default:\n break;\n }\n\n if (this.fields != null) {\n c.fields = this.fields.map((f) => f.toFieldData());\n }\n if (this.attachments != null) {\n c.attachments = this.attachments.map((a) => a.toAttachmentData());\n }\n if (this.passwordHistory != null) {\n c.passwordHistory = this.passwordHistory.map((ph) => ph.toPasswordHistoryData());\n }\n return c;\n }\n\n static fromJSON(obj: Jsonify) {\n if (obj == null) {\n return null;\n }\n\n const domain = new Cipher();\n const name = EncString.fromJSON(obj.name);\n const notes = EncString.fromJSON(obj.notes);\n const revisionDate = obj.revisionDate == null ? null : new Date(obj.revisionDate);\n const deletedDate = obj.deletedDate == null ? null : new Date(obj.deletedDate);\n const attachments = obj.attachments?.map((a: any) => Attachment.fromJSON(a));\n const fields = obj.fields?.map((f: any) => Field.fromJSON(f));\n const passwordHistory = obj.passwordHistory?.map((ph: any) => Password.fromJSON(ph));\n const key = EncString.fromJSON(obj.key);\n\n Object.assign(domain, obj, {\n name,\n notes,\n revisionDate,\n deletedDate,\n attachments,\n fields,\n passwordHistory,\n key,\n });\n\n switch (obj.type) {\n case CipherType.Card:\n domain.card = Card.fromJSON(obj.card);\n break;\n case CipherType.Identity:\n domain.identity = Identity.fromJSON(obj.identity);\n break;\n case CipherType.Login:\n domain.login = Login.fromJSON(obj.login);\n break;\n case CipherType.SecureNote:\n domain.secureNote = SecureNote.fromJSON(obj.secureNote);\n break;\n default:\n break;\n }\n\n return domain;\n }\n}\n","import Domain from \"../../../platform/models/domain/domain-base\";\nimport { EncString } from \"../../../platform/models/domain/enc-string\";\nimport { CollectionData } from \"../data/collection.data\";\nimport { CollectionView } from \"../view/collection.view\";\n\nexport class Collection extends Domain {\n id: string;\n organizationId: string;\n name: EncString;\n externalId: string;\n readOnly: boolean;\n hidePasswords: boolean;\n manage: boolean;\n\n constructor(obj?: CollectionData) {\n super();\n if (obj == null) {\n return;\n }\n\n this.buildDomainModel(\n this,\n obj,\n {\n id: null,\n organizationId: null,\n name: null,\n externalId: null,\n readOnly: null,\n hidePasswords: null,\n manage: null,\n },\n [\"id\", \"organizationId\", \"externalId\", \"readOnly\", \"hidePasswords\", \"manage\"],\n );\n }\n\n decrypt(): Promise {\n return this.decryptObj(\n new CollectionView(this),\n {\n name: null,\n },\n this.organizationId,\n );\n }\n}\n","import { Jsonify } from \"type-fest\";\n\nimport Domain from \"../../../platform/models/domain/domain-base\";\nimport { EncString } from \"../../../platform/models/domain/enc-string\";\nimport { SymmetricCryptoKey } from \"../../../platform/models/domain/symmetric-crypto-key\";\nimport { Fido2CredentialData } from \"../data/fido2-credential.data\";\nimport { Fido2CredentialView } from \"../view/fido2-credential.view\";\n\nexport class Fido2Credential extends Domain {\n credentialId: EncString | null = null;\n keyType: EncString;\n keyAlgorithm: EncString;\n keyCurve: EncString;\n keyValue: EncString;\n rpId: EncString;\n userHandle: EncString;\n userName: EncString;\n counter: EncString;\n rpName: EncString;\n userDisplayName: EncString;\n discoverable: EncString;\n creationDate: Date;\n\n constructor(obj?: Fido2CredentialData) {\n super();\n if (obj == null) {\n return;\n }\n\n this.buildDomainModel(\n this,\n obj,\n {\n credentialId: null,\n keyType: null,\n keyAlgorithm: null,\n keyCurve: null,\n keyValue: null,\n rpId: null,\n userHandle: null,\n userName: null,\n counter: null,\n rpName: null,\n userDisplayName: null,\n discoverable: null,\n },\n [],\n );\n this.creationDate = obj.creationDate != null ? new Date(obj.creationDate) : null;\n }\n\n async decrypt(orgId: string, encKey?: SymmetricCryptoKey): Promise {\n const view = await this.decryptObj(\n new Fido2CredentialView(),\n {\n credentialId: null,\n keyType: null,\n keyAlgorithm: null,\n keyCurve: null,\n keyValue: null,\n rpId: null,\n userHandle: null,\n userName: null,\n rpName: null,\n userDisplayName: null,\n discoverable: null,\n },\n orgId,\n encKey,\n );\n\n const { counter } = await this.decryptObj(\n { counter: \"\" },\n {\n counter: null,\n },\n orgId,\n encKey,\n );\n // Counter will end up as NaN if this fails\n view.counter = parseInt(counter);\n\n const { discoverable } = await this.decryptObj(\n { discoverable: \"\" },\n {\n discoverable: null,\n },\n orgId,\n encKey,\n );\n view.discoverable = discoverable === \"true\";\n view.creationDate = this.creationDate;\n\n return view;\n }\n\n toFido2CredentialData(): Fido2CredentialData {\n const i = new Fido2CredentialData();\n i.creationDate = this.creationDate.toISOString();\n this.buildDataModel(this, i, {\n credentialId: null,\n keyType: null,\n keyAlgorithm: null,\n keyCurve: null,\n keyValue: null,\n rpId: null,\n userHandle: null,\n userName: null,\n counter: null,\n rpName: null,\n userDisplayName: null,\n discoverable: null,\n });\n return i;\n }\n\n static fromJSON(obj: Jsonify): Fido2Credential {\n if (obj == null) {\n return null;\n }\n\n const credentialId = EncString.fromJSON(obj.credentialId);\n const keyType = EncString.fromJSON(obj.keyType);\n const keyAlgorithm = EncString.fromJSON(obj.keyAlgorithm);\n const keyCurve = EncString.fromJSON(obj.keyCurve);\n const keyValue = EncString.fromJSON(obj.keyValue);\n const rpId = EncString.fromJSON(obj.rpId);\n const userHandle = EncString.fromJSON(obj.userHandle);\n const userName = EncString.fromJSON(obj.userName);\n const counter = EncString.fromJSON(obj.counter);\n const rpName = EncString.fromJSON(obj.rpName);\n const userDisplayName = EncString.fromJSON(obj.userDisplayName);\n const discoverable = EncString.fromJSON(obj.discoverable);\n const creationDate = obj.creationDate != null ? new Date(obj.creationDate) : null;\n\n return Object.assign(new Fido2Credential(), obj, {\n credentialId,\n keyType,\n keyAlgorithm,\n keyCurve,\n keyValue,\n rpId,\n userHandle,\n userName,\n counter,\n rpName,\n userDisplayName,\n discoverable,\n creationDate,\n });\n }\n}\n","import { Jsonify } from \"type-fest\";\n\nimport Domain from \"../../../platform/models/domain/domain-base\";\nimport { EncString } from \"../../../platform/models/domain/enc-string\";\nimport { SymmetricCryptoKey } from \"../../../platform/models/domain/symmetric-crypto-key\";\nimport { FieldType, LinkedIdType } from \"../../enums\";\nimport { FieldData } from \"../data/field.data\";\nimport { FieldView } from \"../view/field.view\";\n\nexport class Field extends Domain {\n name: EncString;\n value: EncString;\n type: FieldType;\n linkedId: LinkedIdType;\n\n constructor(obj?: FieldData) {\n super();\n if (obj == null) {\n return;\n }\n\n this.type = obj.type;\n this.linkedId = obj.linkedId;\n this.buildDomainModel(\n this,\n obj,\n {\n name: null,\n value: null,\n },\n [],\n );\n }\n\n decrypt(orgId: string, encKey?: SymmetricCryptoKey): Promise {\n return this.decryptObj(\n new FieldView(this),\n {\n name: null,\n value: null,\n },\n orgId,\n encKey,\n );\n }\n\n toFieldData(): FieldData {\n const f = new FieldData();\n this.buildDataModel(\n this,\n f,\n {\n name: null,\n value: null,\n type: null,\n linkedId: null,\n },\n [\"type\", \"linkedId\"],\n );\n return f;\n }\n\n static fromJSON(obj: Partial>): Field {\n if (obj == null) {\n return null;\n }\n\n const name = EncString.fromJSON(obj.name);\n const value = EncString.fromJSON(obj.value);\n\n return Object.assign(new Field(), obj, {\n name,\n value,\n });\n }\n}\n","import { Jsonify } from \"type-fest\";\n\nimport Domain from \"../../../platform/models/domain/domain-base\";\nimport { EncString } from \"../../../platform/models/domain/enc-string\";\nimport { FolderData } from \"../data/folder.data\";\nimport { FolderView } from \"../view/folder.view\";\n\nexport class Folder extends Domain {\n id: string;\n name: EncString;\n revisionDate: Date;\n\n constructor(obj?: FolderData) {\n super();\n if (obj == null) {\n return;\n }\n\n this.buildDomainModel(\n this,\n obj,\n {\n id: null,\n name: null,\n },\n [\"id\"],\n );\n\n this.revisionDate = obj.revisionDate != null ? new Date(obj.revisionDate) : null;\n }\n\n decrypt(): Promise {\n return this.decryptObj(\n new FolderView(this),\n {\n name: null,\n },\n null,\n );\n }\n\n static fromJSON(obj: Jsonify) {\n const revisionDate = obj.revisionDate == null ? null : new Date(obj.revisionDate);\n return Object.assign(new Folder(), obj, { name: EncString.fromJSON(obj.name), revisionDate });\n }\n}\n","import { Jsonify } from \"type-fest\";\n\nimport Domain from \"../../../platform/models/domain/domain-base\";\nimport { EncString } from \"../../../platform/models/domain/enc-string\";\nimport { SymmetricCryptoKey } from \"../../../platform/models/domain/symmetric-crypto-key\";\nimport { IdentityData } from \"../data/identity.data\";\nimport { IdentityView } from \"../view/identity.view\";\n\nexport class Identity extends Domain {\n title: EncString;\n firstName: EncString;\n middleName: EncString;\n lastName: EncString;\n address1: EncString;\n address2: EncString;\n address3: EncString;\n city: EncString;\n state: EncString;\n postalCode: EncString;\n country: EncString;\n company: EncString;\n email: EncString;\n phone: EncString;\n ssn: EncString;\n username: EncString;\n passportNumber: EncString;\n licenseNumber: EncString;\n\n constructor(obj?: IdentityData) {\n super();\n if (obj == null) {\n return;\n }\n\n this.buildDomainModel(\n this,\n obj,\n {\n title: null,\n firstName: null,\n middleName: null,\n lastName: null,\n address1: null,\n address2: null,\n address3: null,\n city: null,\n state: null,\n postalCode: null,\n country: null,\n company: null,\n email: null,\n phone: null,\n ssn: null,\n username: null,\n passportNumber: null,\n licenseNumber: null,\n },\n [],\n );\n }\n\n decrypt(orgId: string, encKey?: SymmetricCryptoKey): Promise {\n return this.decryptObj(\n new IdentityView(),\n {\n title: null,\n firstName: null,\n middleName: null,\n lastName: null,\n address1: null,\n address2: null,\n address3: null,\n city: null,\n state: null,\n postalCode: null,\n country: null,\n company: null,\n email: null,\n phone: null,\n ssn: null,\n username: null,\n passportNumber: null,\n licenseNumber: null,\n },\n orgId,\n encKey,\n );\n }\n\n toIdentityData(): IdentityData {\n const i = new IdentityData();\n this.buildDataModel(this, i, {\n title: null,\n firstName: null,\n middleName: null,\n lastName: null,\n address1: null,\n address2: null,\n address3: null,\n city: null,\n state: null,\n postalCode: null,\n country: null,\n company: null,\n email: null,\n phone: null,\n ssn: null,\n username: null,\n passportNumber: null,\n licenseNumber: null,\n });\n return i;\n }\n\n static fromJSON(obj: Jsonify): Identity {\n if (obj == null) {\n return null;\n }\n\n const title = EncString.fromJSON(obj.title);\n const firstName = EncString.fromJSON(obj.firstName);\n const middleName = EncString.fromJSON(obj.middleName);\n const lastName = EncString.fromJSON(obj.lastName);\n const address1 = EncString.fromJSON(obj.address1);\n const address2 = EncString.fromJSON(obj.address2);\n const address3 = EncString.fromJSON(obj.address3);\n const city = EncString.fromJSON(obj.city);\n const state = EncString.fromJSON(obj.state);\n const postalCode = EncString.fromJSON(obj.postalCode);\n const country = EncString.fromJSON(obj.country);\n const company = EncString.fromJSON(obj.company);\n const email = EncString.fromJSON(obj.email);\n const phone = EncString.fromJSON(obj.phone);\n const ssn = EncString.fromJSON(obj.ssn);\n const username = EncString.fromJSON(obj.username);\n const passportNumber = EncString.fromJSON(obj.passportNumber);\n const licenseNumber = EncString.fromJSON(obj.licenseNumber);\n\n return Object.assign(new Identity(), obj, {\n title,\n firstName,\n middleName,\n lastName,\n address1,\n address2,\n address3,\n city,\n state,\n postalCode,\n country,\n company,\n email,\n phone,\n ssn,\n username,\n passportNumber,\n licenseNumber,\n });\n }\n}\n","import { Jsonify } from \"type-fest\";\n\nimport { UriMatchStrategySetting } from \"../../../models/domain/domain-service\";\nimport { Utils } from \"../../../platform/misc/utils\";\nimport Domain from \"../../../platform/models/domain/domain-base\";\nimport { EncString } from \"../../../platform/models/domain/enc-string\";\nimport { SymmetricCryptoKey } from \"../../../platform/models/domain/symmetric-crypto-key\";\nimport { LoginUriData } from \"../data/login-uri.data\";\nimport { LoginUriView } from \"../view/login-uri.view\";\n\nexport class LoginUri extends Domain {\n uri: EncString;\n uriChecksum: EncString | undefined;\n match: UriMatchStrategySetting;\n\n constructor(obj?: LoginUriData) {\n super();\n if (obj == null) {\n return;\n }\n\n this.match = obj.match;\n this.buildDomainModel(\n this,\n obj,\n {\n uri: null,\n uriChecksum: null,\n },\n [],\n );\n }\n\n decrypt(orgId: string, encKey?: SymmetricCryptoKey): Promise {\n return this.decryptObj(\n new LoginUriView(this),\n {\n uri: null,\n },\n orgId,\n encKey,\n );\n }\n\n async validateChecksum(clearTextUri: string, orgId: string, encKey: SymmetricCryptoKey) {\n if (this.uriChecksum == null) {\n return false;\n }\n\n const cryptoService = Utils.getContainerService().getEncryptService();\n const localChecksum = await cryptoService.hash(clearTextUri, \"sha256\");\n\n const remoteChecksum = await this.uriChecksum.decrypt(orgId, encKey);\n return remoteChecksum === localChecksum;\n }\n\n toLoginUriData(): LoginUriData {\n const u = new LoginUriData();\n this.buildDataModel(\n this,\n u,\n {\n uri: null,\n uriChecksum: null,\n match: null,\n },\n [\"match\"],\n );\n return u;\n }\n\n static fromJSON(obj: Jsonify): LoginUri {\n if (obj == null) {\n return null;\n }\n\n const uri = EncString.fromJSON(obj.uri);\n const uriChecksum = EncString.fromJSON(obj.uriChecksum);\n return Object.assign(new LoginUri(), obj, {\n uri,\n uriChecksum,\n });\n }\n}\n","import { Jsonify } from \"type-fest\";\n\nimport Domain from \"../../../platform/models/domain/domain-base\";\nimport { EncString } from \"../../../platform/models/domain/enc-string\";\nimport { SymmetricCryptoKey } from \"../../../platform/models/domain/symmetric-crypto-key\";\nimport { LoginData } from \"../data/login.data\";\nimport { LoginView } from \"../view/login.view\";\n\nimport { Fido2Credential } from \"./fido2-credential\";\nimport { LoginUri } from \"./login-uri\";\n\nexport class Login extends Domain {\n uris: LoginUri[];\n username: EncString;\n password: EncString;\n passwordRevisionDate?: Date;\n totp: EncString;\n autofillOnPageLoad: boolean;\n fido2Credentials: Fido2Credential[];\n\n constructor(obj?: LoginData) {\n super();\n if (obj == null) {\n return;\n }\n\n this.passwordRevisionDate =\n obj.passwordRevisionDate != null ? new Date(obj.passwordRevisionDate) : null;\n this.autofillOnPageLoad = obj.autofillOnPageLoad;\n this.buildDomainModel(\n this,\n obj,\n {\n username: null,\n password: null,\n totp: null,\n },\n [],\n );\n\n if (obj.uris) {\n this.uris = [];\n obj.uris.forEach((u) => {\n this.uris.push(new LoginUri(u));\n });\n }\n\n if (obj.fido2Credentials) {\n this.fido2Credentials = obj.fido2Credentials.map((key) => new Fido2Credential(key));\n }\n }\n\n async decrypt(\n orgId: string,\n bypassValidation: boolean,\n encKey?: SymmetricCryptoKey,\n ): Promise {\n const view = await this.decryptObj(\n new LoginView(this),\n {\n username: null,\n password: null,\n totp: null,\n },\n orgId,\n encKey,\n );\n\n if (this.uris != null) {\n view.uris = [];\n for (let i = 0; i < this.uris.length; i++) {\n const uri = await this.uris[i].decrypt(orgId, encKey);\n // URIs are shared remotely after decryption\n // we need to validate that the string hasn't been changed by a compromised server\n // This validation is tied to the existence of cypher.key for backwards compatibility\n // So we bypass the validation if there's no cipher.key or procceed with the validation and\n // Skip the value if it's been tampered with.\n if (bypassValidation || (await this.uris[i].validateChecksum(uri.uri, orgId, encKey))) {\n view.uris.push(uri);\n }\n }\n }\n\n if (this.fido2Credentials != null) {\n view.fido2Credentials = await Promise.all(\n this.fido2Credentials.map((key) => key.decrypt(orgId, encKey)),\n );\n }\n\n return view;\n }\n\n toLoginData(): LoginData {\n const l = new LoginData();\n l.passwordRevisionDate =\n this.passwordRevisionDate != null ? this.passwordRevisionDate.toISOString() : null;\n l.autofillOnPageLoad = this.autofillOnPageLoad;\n this.buildDataModel(this, l, {\n username: null,\n password: null,\n totp: null,\n });\n\n if (this.uris != null && this.uris.length > 0) {\n l.uris = [];\n this.uris.forEach((u) => {\n l.uris.push(u.toLoginUriData());\n });\n }\n\n if (this.fido2Credentials != null && this.fido2Credentials.length > 0) {\n l.fido2Credentials = this.fido2Credentials.map((key) => key.toFido2CredentialData());\n }\n\n return l;\n }\n\n static fromJSON(obj: Partial>): Login {\n if (obj == null) {\n return null;\n }\n\n const username = EncString.fromJSON(obj.username);\n const password = EncString.fromJSON(obj.password);\n const totp = EncString.fromJSON(obj.totp);\n const passwordRevisionDate =\n obj.passwordRevisionDate == null ? null : new Date(obj.passwordRevisionDate);\n const uris = obj.uris?.map((uri: any) => LoginUri.fromJSON(uri));\n const fido2Credentials =\n obj.fido2Credentials?.map((key) => Fido2Credential.fromJSON(key)) ?? [];\n\n return Object.assign(new Login(), obj, {\n username,\n password,\n totp,\n passwordRevisionDate,\n uris,\n fido2Credentials,\n });\n }\n}\n","import { Jsonify } from \"type-fest\";\n\nimport Domain from \"../../../platform/models/domain/domain-base\";\nimport { EncString } from \"../../../platform/models/domain/enc-string\";\nimport { SymmetricCryptoKey } from \"../../../platform/models/domain/symmetric-crypto-key\";\nimport { PasswordHistoryData } from \"../data/password-history.data\";\nimport { PasswordHistoryView } from \"../view/password-history.view\";\n\nexport class Password extends Domain {\n password: EncString;\n lastUsedDate: Date;\n\n constructor(obj?: PasswordHistoryData) {\n super();\n if (obj == null) {\n return;\n }\n\n this.buildDomainModel(this, obj, {\n password: null,\n });\n this.lastUsedDate = new Date(obj.lastUsedDate);\n }\n\n decrypt(orgId: string, encKey?: SymmetricCryptoKey): Promise {\n return this.decryptObj(\n new PasswordHistoryView(this),\n {\n password: null,\n },\n orgId,\n encKey,\n );\n }\n\n toPasswordHistoryData(): PasswordHistoryData {\n const ph = new PasswordHistoryData();\n ph.lastUsedDate = this.lastUsedDate.toISOString();\n this.buildDataModel(this, ph, {\n password: null,\n });\n return ph;\n }\n\n static fromJSON(obj: Partial>): Password {\n if (obj == null) {\n return null;\n }\n\n const password = EncString.fromJSON(obj.password);\n const lastUsedDate = obj.lastUsedDate == null ? null : new Date(obj.lastUsedDate);\n\n return Object.assign(new Password(), obj, {\n password,\n lastUsedDate,\n });\n }\n}\n","import { Jsonify } from \"type-fest\";\n\nimport Domain from \"../../../platform/models/domain/domain-base\";\nimport { SymmetricCryptoKey } from \"../../../platform/models/domain/symmetric-crypto-key\";\nimport { SecureNoteType } from \"../../enums\";\nimport { SecureNoteData } from \"../data/secure-note.data\";\nimport { SecureNoteView } from \"../view/secure-note.view\";\n\nexport class SecureNote extends Domain {\n type: SecureNoteType;\n\n constructor(obj?: SecureNoteData) {\n super();\n if (obj == null) {\n return;\n }\n\n this.type = obj.type;\n }\n\n decrypt(orgId: string, encKey?: SymmetricCryptoKey): Promise {\n return Promise.resolve(new SecureNoteView(this));\n }\n\n toSecureNoteData(): SecureNoteData {\n const n = new SecureNoteData();\n n.type = this.type;\n return n;\n }\n\n static fromJSON(obj: Jsonify): SecureNote {\n if (obj == null) {\n return null;\n }\n\n return Object.assign(new SecureNote(), obj);\n }\n}\n","export class TreeNode {\n node: T;\n parent: TreeNode;\n children: TreeNode[] = [];\n\n constructor(node: T, parent: TreeNode, name?: string, id?: string) {\n this.parent = parent;\n this.node = node;\n if (name) {\n this.node.name = name;\n }\n if (id) {\n this.node.id = id;\n }\n }\n}\n\nexport interface ITreeNodeObject {\n id: string;\n name: string;\n}\n","export class CipherBulkDeleteRequest {\n ids: string[];\n organizationId: string;\n\n constructor(ids: string[], organizationId?: string) {\n this.ids = ids == null ? [] : ids;\n this.organizationId = organizationId;\n }\n}\n","export class CipherCollectionsRequest {\n collectionIds: string[];\n\n constructor(collectionIds: string[]) {\n this.collectionIds = collectionIds == null ? [] : collectionIds;\n }\n}\n","import { Cipher } from \"../domain/cipher\";\n\nimport { CipherRequest } from \"./cipher.request\";\n\nexport class CipherWithIdRequest extends CipherRequest {\n id: string;\n\n constructor(cipher: Cipher) {\n super(cipher);\n this.id = cipher.id;\n }\n}\n","export class AttachmentRequest {\n fileName: string;\n key: string;\n fileSize: number;\n adminRequest: boolean;\n}\n","import { CipherRepromptType } from \"../../enums/cipher-reprompt-type\";\nimport { CipherType } from \"../../enums/cipher-type\";\nimport { CardApi } from \"../api/card.api\";\nimport { Fido2CredentialApi } from \"../api/fido2-credential.api\";\nimport { FieldApi } from \"../api/field.api\";\nimport { IdentityApi } from \"../api/identity.api\";\nimport { LoginUriApi } from \"../api/login-uri.api\";\nimport { LoginApi } from \"../api/login.api\";\nimport { SecureNoteApi } from \"../api/secure-note.api\";\nimport { Cipher } from \"../domain/cipher\";\n\nimport { AttachmentRequest } from \"./attachment.request\";\nimport { PasswordHistoryRequest } from \"./password-history.request\";\n\nexport class CipherRequest {\n type: CipherType;\n folderId: string;\n organizationId: string;\n name: string;\n notes: string;\n favorite: boolean;\n login: LoginApi;\n secureNote: SecureNoteApi;\n card: CardApi;\n identity: IdentityApi;\n fields: FieldApi[];\n passwordHistory: PasswordHistoryRequest[];\n // Deprecated, remove at some point and rename attachments2 to attachments\n attachments: { [id: string]: string };\n attachments2: { [id: string]: AttachmentRequest };\n lastKnownRevisionDate: Date;\n reprompt: CipherRepromptType;\n key: string;\n\n constructor(cipher: Cipher) {\n this.type = cipher.type;\n this.folderId = cipher.folderId;\n this.organizationId = cipher.organizationId;\n this.name = cipher.name ? cipher.name.encryptedString : null;\n this.notes = cipher.notes ? cipher.notes.encryptedString : null;\n this.favorite = cipher.favorite;\n this.lastKnownRevisionDate = cipher.revisionDate;\n this.reprompt = cipher.reprompt;\n this.key = cipher.key?.encryptedString;\n\n switch (this.type) {\n case CipherType.Login:\n this.login = new LoginApi();\n this.login.uris =\n cipher.login.uris?.map((u) => {\n const uri = new LoginUriApi();\n uri.uri = u.uri != null ? u.uri.encryptedString : null;\n uri.match = u.match != null ? u.match : null;\n uri.uriChecksum = u.uriChecksum != null ? u.uriChecksum.encryptedString : null;\n return uri;\n }) ?? [];\n this.login.username = cipher.login.username ? cipher.login.username.encryptedString : null;\n this.login.password = cipher.login.password ? cipher.login.password.encryptedString : null;\n this.login.passwordRevisionDate =\n cipher.login.passwordRevisionDate != null\n ? cipher.login.passwordRevisionDate.toISOString()\n : null;\n this.login.totp = cipher.login.totp ? cipher.login.totp.encryptedString : null;\n this.login.autofillOnPageLoad = cipher.login.autofillOnPageLoad;\n\n if (cipher.login.fido2Credentials != null) {\n this.login.fido2Credentials = cipher.login.fido2Credentials.map((key) => {\n const keyApi = new Fido2CredentialApi();\n keyApi.credentialId =\n key.credentialId != null ? key.credentialId.encryptedString : null;\n keyApi.keyType =\n key.keyType != null ? (key.keyType.encryptedString as \"public-key\") : null;\n keyApi.keyAlgorithm =\n key.keyAlgorithm != null ? (key.keyAlgorithm.encryptedString as \"ECDSA\") : null;\n keyApi.keyCurve =\n key.keyCurve != null ? (key.keyCurve.encryptedString as \"P-256\") : null;\n keyApi.keyValue = key.keyValue != null ? key.keyValue.encryptedString : null;\n keyApi.rpId = key.rpId != null ? key.rpId.encryptedString : null;\n keyApi.rpName = key.rpName != null ? key.rpName.encryptedString : null;\n keyApi.counter = key.counter != null ? key.counter.encryptedString : null;\n keyApi.userHandle = key.userHandle != null ? key.userHandle.encryptedString : null;\n keyApi.userName = key.userName != null ? key.userName.encryptedString : null;\n keyApi.userDisplayName =\n key.userDisplayName != null ? key.userDisplayName.encryptedString : null;\n keyApi.discoverable =\n key.discoverable != null ? key.discoverable.encryptedString : null;\n keyApi.creationDate = key.creationDate != null ? key.creationDate.toISOString() : null;\n return keyApi;\n });\n }\n break;\n case CipherType.SecureNote:\n this.secureNote = new SecureNoteApi();\n this.secureNote.type = cipher.secureNote.type;\n break;\n case CipherType.Card:\n this.card = new CardApi();\n this.card.cardholderName =\n cipher.card.cardholderName != null ? cipher.card.cardholderName.encryptedString : null;\n this.card.brand = cipher.card.brand != null ? cipher.card.brand.encryptedString : null;\n this.card.number = cipher.card.number != null ? cipher.card.number.encryptedString : null;\n this.card.expMonth =\n cipher.card.expMonth != null ? cipher.card.expMonth.encryptedString : null;\n this.card.expYear =\n cipher.card.expYear != null ? cipher.card.expYear.encryptedString : null;\n this.card.code = cipher.card.code != null ? cipher.card.code.encryptedString : null;\n break;\n case CipherType.Identity:\n this.identity = new IdentityApi();\n this.identity.title =\n cipher.identity.title != null ? cipher.identity.title.encryptedString : null;\n this.identity.firstName =\n cipher.identity.firstName != null ? cipher.identity.firstName.encryptedString : null;\n this.identity.middleName =\n cipher.identity.middleName != null ? cipher.identity.middleName.encryptedString : null;\n this.identity.lastName =\n cipher.identity.lastName != null ? cipher.identity.lastName.encryptedString : null;\n this.identity.address1 =\n cipher.identity.address1 != null ? cipher.identity.address1.encryptedString : null;\n this.identity.address2 =\n cipher.identity.address2 != null ? cipher.identity.address2.encryptedString : null;\n this.identity.address3 =\n cipher.identity.address3 != null ? cipher.identity.address3.encryptedString : null;\n this.identity.city =\n cipher.identity.city != null ? cipher.identity.city.encryptedString : null;\n this.identity.state =\n cipher.identity.state != null ? cipher.identity.state.encryptedString : null;\n this.identity.postalCode =\n cipher.identity.postalCode != null ? cipher.identity.postalCode.encryptedString : null;\n this.identity.country =\n cipher.identity.country != null ? cipher.identity.country.encryptedString : null;\n this.identity.company =\n cipher.identity.company != null ? cipher.identity.company.encryptedString : null;\n this.identity.email =\n cipher.identity.email != null ? cipher.identity.email.encryptedString : null;\n this.identity.phone =\n cipher.identity.phone != null ? cipher.identity.phone.encryptedString : null;\n this.identity.ssn =\n cipher.identity.ssn != null ? cipher.identity.ssn.encryptedString : null;\n this.identity.username =\n cipher.identity.username != null ? cipher.identity.username.encryptedString : null;\n this.identity.passportNumber =\n cipher.identity.passportNumber != null\n ? cipher.identity.passportNumber.encryptedString\n : null;\n this.identity.licenseNumber =\n cipher.identity.licenseNumber != null\n ? cipher.identity.licenseNumber.encryptedString\n : null;\n break;\n default:\n break;\n }\n\n if (cipher.fields != null) {\n this.fields = cipher.fields.map((f) => {\n const field = new FieldApi();\n field.type = f.type;\n field.name = f.name ? f.name.encryptedString : null;\n field.value = f.value ? f.value.encryptedString : null;\n field.linkedId = f.linkedId;\n return field;\n });\n }\n\n if (cipher.passwordHistory != null) {\n this.passwordHistory = [];\n cipher.passwordHistory.forEach((ph) => {\n this.passwordHistory.push({\n lastUsedDate: ph.lastUsedDate,\n password: ph.password ? ph.password.encryptedString : null,\n });\n });\n }\n\n if (cipher.attachments != null) {\n this.attachments = {};\n this.attachments2 = {};\n cipher.attachments.forEach((attachment) => {\n const fileName = attachment.fileName ? attachment.fileName.encryptedString : null;\n this.attachments[attachment.id] = fileName;\n const attachmentRequest = new AttachmentRequest();\n attachmentRequest.fileName = fileName;\n if (attachment.key != null) {\n attachmentRequest.key = attachment.key.encryptedString;\n }\n this.attachments2[attachment.id] = attachmentRequest;\n });\n }\n }\n}\n","import { SelectionReadOnlyRequest } from \"../../../admin-console/models/request/selection-read-only.request\";\nimport { Collection } from \"../domain/collection\";\n\nexport class CollectionRequest {\n name: string;\n externalId: string;\n groups: SelectionReadOnlyRequest[] = [];\n users: SelectionReadOnlyRequest[] = [];\n\n constructor(collection?: Collection) {\n if (collection == null) {\n return;\n }\n this.name = collection.name ? collection.name.encryptedString : null;\n this.externalId = collection.externalId;\n }\n}\n","import { Folder } from \"../domain/folder\";\n\nimport { FolderRequest } from \"./folder.request\";\n\nexport class FolderWithIdRequest extends FolderRequest {\n id: string;\n\n constructor(folder: Folder) {\n super(folder);\n this.id = folder.id;\n }\n}\n","import { Folder } from \"../domain/folder\";\n\nexport class FolderRequest {\n name: string;\n\n constructor(folder: Folder) {\n this.name = folder.name ? folder.name.encryptedString : null;\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\n\nexport class AttachmentResponse extends BaseResponse {\n id: string;\n url: string;\n fileName: string;\n key: string;\n size: string;\n sizeName: string;\n\n constructor(response: any) {\n super(response);\n this.id = this.getResponseProperty(\"Id\");\n this.url = this.getResponseProperty(\"Url\");\n this.fileName = this.getResponseProperty(\"FileName\");\n this.key = this.getResponseProperty(\"Key\");\n this.size = this.getResponseProperty(\"Size\");\n this.sizeName = this.getResponseProperty(\"SizeName\");\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\n\nexport class PasswordHistoryResponse extends BaseResponse {\n password: string;\n lastUsedDate: string;\n\n constructor(response: any) {\n super(response);\n this.password = this.getResponseProperty(\"Password\");\n this.lastUsedDate = this.getResponseProperty(\"LastUsedDate\");\n }\n}\n","import { BaseResponse } from \"../../../models/response/base.response\";\nimport { CipherRepromptType } from \"../../enums/cipher-reprompt-type\";\nimport { CardApi } from \"../api/card.api\";\nimport { FieldApi } from \"../api/field.api\";\nimport { IdentityApi } from \"../api/identity.api\";\nimport { LoginApi } from \"../api/login.api\";\nimport { SecureNoteApi } from \"../api/secure-note.api\";\n\nimport { AttachmentResponse } from \"./attachment.response\";\nimport { PasswordHistoryResponse } from \"./password-history.response\";\n\nexport class CipherResponse extends BaseResponse {\n id: string;\n organizationId: string;\n folderId: string;\n type: number;\n name: string;\n notes: string;\n fields: FieldApi[];\n login: LoginApi;\n card: CardApi;\n identity: IdentityApi;\n secureNote: SecureNoteApi;\n favorite: boolean;\n edit: boolean;\n viewPassword: boolean;\n organizationUseTotp: boolean;\n revisionDate: string;\n attachments: AttachmentResponse[];\n passwordHistory: PasswordHistoryResponse[];\n collectionIds: string[];\n creationDate: string;\n deletedDate: string;\n reprompt: CipherRepromptType;\n key: string;\n\n constructor(response: any) {\n super(response);\n this.id = this.getResponseProperty(\"Id\");\n this.organizationId = this.getResponseProperty(\"OrganizationId\");\n this.folderId = this.getResponseProperty(\"FolderId\") || null;\n this.type = this.getResponseProperty(\"Type\");\n this.name = this.getResponseProperty(\"Name\");\n this.notes = this.getResponseProperty(\"Notes\");\n this.favorite = this.getResponseProperty(\"Favorite\") || false;\n this.edit = !!this.getResponseProperty(\"Edit\");\n if (this.getResponseProperty(\"ViewPassword\") == null) {\n this.viewPassword = true;\n } else {\n this.viewPassword = this.getResponseProperty(\"ViewPassword\");\n }\n this.organizationUseTotp = this.getResponseProperty(\"OrganizationUseTotp\");\n this.revisionDate = this.getResponseProperty(\"RevisionDate\");\n this.collectionIds = this.getResponseProperty(\"CollectionIds\");\n this.creationDate = this.getResponseProperty(\"CreationDate\");\n this.deletedDate = this.getResponseProperty(\"DeletedDate\");\n\n const login = this.getResponseProperty(\"Login\");\n if (login != null) {\n this.login = new LoginApi(login);\n }\n\n const card = this.getResponseProperty(\"Card\");\n if (card != null) {\n this.card = new CardApi(card);\n }\n\n const identity = this.getResponseProperty(\"Identity\");\n if (identity != null) {\n this.identity = new IdentityApi(identity);\n }\n\n const secureNote = this.getResponseProperty(\"SecureNote\");\n if (secureNote != null) {\n this.secureNote = new SecureNoteApi(secureNote);\n }\n\n const fields = this.getResponseProperty(\"Fields\");\n if (fields != null) {\n this.fields = fields.map((f: any) => new FieldApi(f));\n }\n\n const attachments = this.getResponseProperty(\"Attachments\");\n if (attachments != null) {\n this.attachments = attachments.map((a: any) => new AttachmentResponse(a));\n }\n\n const passwordHistory = this.getResponseProperty(\"PasswordHistory\");\n if (passwordHistory != null) {\n this.passwordHistory = passwordHistory.map((h: any) => new PasswordHistoryResponse(h));\n }\n\n this.reprompt = this.getResponseProperty(\"Reprompt\") || CipherRepromptType.None;\n this.key = this.getResponseProperty(\"Key\") || null;\n }\n}\n","import { SelectionReadOnlyResponse } from \"../../../admin-console/models/response/selection-read-only.response\";\nimport { BaseResponse } from \"../../../models/response/base.response\";\nimport { CollectionId, OrganizationId } from \"../../../types/guid\";\n\nexport class CollectionResponse extends BaseResponse {\n id: CollectionId;\n organizationId: OrganizationId;\n name: string;\n externalId: string;\n\n constructor(response: any) {\n super(response);\n this.id = this.getResponseProperty(\"Id\");\n this.organizationId = this.getResponseProperty(\"OrganizationId\");\n this.name = this.getResponseProperty(\"Name\");\n this.externalId = this.getResponseProperty(\"ExternalId\");\n }\n}\n\nexport class CollectionDetailsResponse extends CollectionResponse {\n readOnly: boolean;\n manage: boolean;\n hidePasswords: boolean;\n assigned: boolean;\n\n constructor(response: any) {\n super(response);\n this.readOnly = this.getResponseProperty(\"ReadOnly\") || false;\n this.manage = this.getResponseProperty(\"Manage\") || false;\n this.hidePasswords = this.getResponseProperty(\"HidePasswords\") || false;\n\n // Temporary until the API is updated to return this property in AC-2084\n // For now, we can assume that if the object is 'collectionDetails' then the user is assigned\n this.assigned = this.getResponseProperty(\"object\") == \"collectionDetails\";\n }\n}\n\nexport class CollectionAccessDetailsResponse extends CollectionResponse {\n groups: SelectionReadOnlyResponse[] = [];\n users: SelectionReadOnlyResponse[] = [];\n\n /**\n * Flag indicating the user has been explicitly assigned to this Collection\n */\n assigned: boolean;\n\n constructor(response: any) {\n super(response);\n this.assigned = this.getResponseProperty(\"Assigned\") || false;\n\n const groups = this.getResponseProperty(\"Groups\");\n if (groups != null) {\n this.groups = groups.map((g: any) => new SelectionReadOnlyResponse(g));\n }\n\n const users = this.getResponseProperty(\"Users\");\n if (users != null) {\n this.users = users.map((g: any) => new SelectionReadOnlyResponse(g));\n }\n }\n}\n","import { Jsonify } from \"type-fest\";\n\nimport { View } from \"../../../models/view/view\";\nimport { SymmetricCryptoKey } from \"../../../platform/models/domain/symmetric-crypto-key\";\nimport { Attachment } from \"../domain/attachment\";\n\nexport class AttachmentView implements View {\n id: string = null;\n url: string = null;\n size: string = null;\n sizeName: string = null;\n fileName: string = null;\n key: SymmetricCryptoKey = null;\n\n constructor(a?: Attachment) {\n if (!a) {\n return;\n }\n\n this.id = a.id;\n this.url = a.url;\n this.size = a.size;\n this.sizeName = a.sizeName;\n }\n\n get fileSize(): number {\n try {\n if (this.size != null) {\n return parseInt(this.size, null);\n }\n } catch {\n // Invalid file size.\n }\n return 0;\n }\n\n static fromJSON(obj: Partial>): AttachmentView {\n const key = obj.key == null ? null : SymmetricCryptoKey.fromJSON(obj.key);\n return Object.assign(new AttachmentView(), obj, { key: key });\n }\n}\n","import { Jsonify } from \"type-fest\";\n\nimport { CardLinkedId as LinkedId } from \"../../enums\";\nimport { linkedFieldOption } from \"../../linked-field-option.decorator\";\n\nimport { ItemView } from \"./item.view\";\n\nexport class CardView extends ItemView {\n @linkedFieldOption(LinkedId.CardholderName)\n cardholderName: string = null;\n @linkedFieldOption(LinkedId.ExpMonth, \"expirationMonth\")\n expMonth: string = null;\n @linkedFieldOption(LinkedId.ExpYear, \"expirationYear\")\n expYear: string = null;\n @linkedFieldOption(LinkedId.Code, \"securityCode\")\n code: string = null;\n\n private _brand: string = null;\n private _number: string = null;\n private _subTitle: string = null;\n\n get maskedCode(): string {\n return this.code != null ? \"•\".repeat(this.code.length) : null;\n }\n\n get maskedNumber(): string {\n return this.number != null ? \"•\".repeat(this.number.length) : null;\n }\n\n @linkedFieldOption(LinkedId.Brand)\n get brand(): string {\n return this._brand;\n }\n set brand(value: string) {\n this._brand = value;\n this._subTitle = null;\n }\n\n @linkedFieldOption(LinkedId.Number)\n get number(): string {\n return this._number;\n }\n set number(value: string) {\n this._number = value;\n this._subTitle = null;\n }\n\n get subTitle(): string {\n if (this._subTitle == null) {\n this._subTitle = this.brand;\n if (this.number != null && this.number.length >= 4) {\n if (this._subTitle != null && this._subTitle !== \"\") {\n this._subTitle += \", \";\n } else {\n this._subTitle = \"\";\n }\n\n // Show last 5 on amex, last 4 for all others\n const count =\n this.number.length >= 5 && this.number.match(new RegExp(\"^3[47]\")) != null ? 5 : 4;\n this._subTitle += \"*\" + this.number.substr(this.number.length - count);\n }\n }\n return this._subTitle;\n }\n\n get expiration(): string {\n if (!this.expMonth && !this.expYear) {\n return null;\n }\n\n let exp = this.expMonth != null ? (\"0\" + this.expMonth).slice(-2) : \"__\";\n exp += \" / \" + (this.expYear != null ? this.formatYear(this.expYear) : \"____\");\n return exp;\n }\n\n private formatYear(year: string): string {\n return year.length === 2 ? \"20\" + year : year;\n }\n\n static fromJSON(obj: Partial>): CardView {\n return Object.assign(new CardView(), obj);\n }\n\n // ref https://stackoverflow.com/a/5911300\n static getCardBrandByPatterns(cardNum: string): string {\n if (cardNum == null || typeof cardNum !== \"string\" || cardNum.trim() === \"\") {\n return null;\n }\n\n // Visa\n let re = new RegExp(\"^4\");\n if (cardNum.match(re) != null) {\n return \"Visa\";\n }\n\n // Mastercard\n // Updated for Mastercard 2017 BINs expansion\n if (\n /^(5[1-5][0-9]{14}|2(22[1-9][0-9]{12}|2[3-9][0-9]{13}|[3-6][0-9]{14}|7[0-1][0-9]{13}|720[0-9]{12}))$/.test(\n cardNum,\n )\n ) {\n return \"Mastercard\";\n }\n\n // AMEX\n re = new RegExp(\"^3[47]\");\n if (cardNum.match(re) != null) {\n return \"Amex\";\n }\n\n // Discover\n re = new RegExp(\n \"^(6011|622(12[6-9]|1[3-9][0-9]|[2-8][0-9]{2}|9[0-1][0-9]|92[0-5]|64[4-9])|65)\",\n );\n if (cardNum.match(re) != null) {\n return \"Discover\";\n }\n\n // Diners\n re = new RegExp(\"^36\");\n if (cardNum.match(re) != null) {\n return \"Diners Club\";\n }\n\n // Diners - Carte Blanche\n re = new RegExp(\"^30[0-5]\");\n if (cardNum.match(re) != null) {\n return \"Diners Club\";\n }\n\n // JCB\n re = new RegExp(\"^35(2[89]|[3-8][0-9])\");\n if (cardNum.match(re) != null) {\n return \"JCB\";\n }\n\n // Visa Electron\n re = new RegExp(\"^(4026|417500|4508|4844|491(3|7))\");\n if (cardNum.match(re) != null) {\n return \"Visa\";\n }\n\n return null;\n }\n}\n","import { View } from \"../../../models/view/view\";\nimport { InitializerMetadata } from \"../../../platform/interfaces/initializer-metadata.interface\";\nimport { InitializerKey } from \"../../../platform/services/cryptography/initializer-key\";\nimport { DeepJsonify } from \"../../../types/deep-jsonify\";\nimport { LinkedIdType } from \"../../enums\";\nimport { CipherRepromptType } from \"../../enums/cipher-reprompt-type\";\nimport { CipherType } from \"../../enums/cipher-type\";\nimport { LocalData } from \"../data/local.data\";\nimport { Cipher } from \"../domain/cipher\";\n\nimport { AttachmentView } from \"./attachment.view\";\nimport { CardView } from \"./card.view\";\nimport { FieldView } from \"./field.view\";\nimport { IdentityView } from \"./identity.view\";\nimport { LoginView } from \"./login.view\";\nimport { PasswordHistoryView } from \"./password-history.view\";\nimport { SecureNoteView } from \"./secure-note.view\";\n\nexport class CipherView implements View, InitializerMetadata {\n readonly initializerKey = InitializerKey.CipherView;\n\n id: string = null;\n organizationId: string = null;\n folderId: string = null;\n name: string = null;\n notes: string = null;\n type: CipherType = null;\n favorite = false;\n organizationUseTotp = false;\n edit = false;\n viewPassword = true;\n localData: LocalData;\n login = new LoginView();\n identity = new IdentityView();\n card = new CardView();\n secureNote = new SecureNoteView();\n attachments: AttachmentView[] = null;\n fields: FieldView[] = null;\n passwordHistory: PasswordHistoryView[] = null;\n collectionIds: string[] = null;\n revisionDate: Date = null;\n creationDate: Date = null;\n deletedDate: Date = null;\n reprompt: CipherRepromptType = CipherRepromptType.None;\n\n constructor(c?: Cipher) {\n if (!c) {\n return;\n }\n\n this.id = c.id;\n this.organizationId = c.organizationId;\n this.folderId = c.folderId;\n this.favorite = c.favorite;\n this.organizationUseTotp = c.organizationUseTotp;\n this.edit = c.edit;\n this.viewPassword = c.viewPassword;\n this.type = c.type;\n this.localData = c.localData;\n this.collectionIds = c.collectionIds;\n this.revisionDate = c.revisionDate;\n this.creationDate = c.creationDate;\n this.deletedDate = c.deletedDate;\n // Old locally stored ciphers might have reprompt == null. If so set it to None.\n this.reprompt = c.reprompt ?? CipherRepromptType.None;\n }\n\n private get item() {\n switch (this.type) {\n case CipherType.Login:\n return this.login;\n case CipherType.SecureNote:\n return this.secureNote;\n case CipherType.Card:\n return this.card;\n case CipherType.Identity:\n return this.identity;\n default:\n break;\n }\n\n return null;\n }\n\n get subTitle(): string {\n return this.item?.subTitle;\n }\n\n get hasPasswordHistory(): boolean {\n return this.passwordHistory && this.passwordHistory.length > 0;\n }\n\n get hasAttachments(): boolean {\n return this.attachments && this.attachments.length > 0;\n }\n\n get hasOldAttachments(): boolean {\n if (this.hasAttachments) {\n for (let i = 0; i < this.attachments.length; i++) {\n if (this.attachments[i].key == null) {\n return true;\n }\n }\n }\n return false;\n }\n\n get hasFields(): boolean {\n return this.fields && this.fields.length > 0;\n }\n\n get passwordRevisionDisplayDate(): Date {\n if (this.type !== CipherType.Login || this.login == null) {\n return null;\n } else if (this.login.password == null || this.login.password === \"\") {\n return null;\n }\n return this.login.passwordRevisionDate;\n }\n\n get isDeleted(): boolean {\n return this.deletedDate != null;\n }\n\n get linkedFieldOptions() {\n return this.item?.linkedFieldOptions;\n }\n\n linkedFieldValue(id: LinkedIdType) {\n const linkedFieldOption = this.linkedFieldOptions?.get(id);\n if (linkedFieldOption == null) {\n return null;\n }\n\n const item = this.item;\n return this.item[linkedFieldOption.propertyKey as keyof typeof item];\n }\n\n linkedFieldI18nKey(id: LinkedIdType): string {\n return this.linkedFieldOptions.get(id)?.i18nKey;\n }\n\n // This is used as a marker to indicate that the cipher view object still has its prototype\n toJSON() {\n return this;\n }\n\n static fromJSON(obj: Partial>): CipherView {\n if (obj == null) {\n return null;\n }\n\n const view = new CipherView();\n const revisionDate = obj.revisionDate == null ? null : new Date(obj.revisionDate);\n const deletedDate = obj.deletedDate == null ? null : new Date(obj.deletedDate);\n const attachments = obj.attachments?.map((a: any) => AttachmentView.fromJSON(a));\n const fields = obj.fields?.map((f: any) => FieldView.fromJSON(f));\n const passwordHistory = obj.passwordHistory?.map((ph: any) => PasswordHistoryView.fromJSON(ph));\n\n Object.assign(view, obj, {\n revisionDate: revisionDate,\n deletedDate: deletedDate,\n attachments: attachments,\n fields: fields,\n passwordHistory: passwordHistory,\n });\n\n switch (obj.type) {\n case CipherType.Card:\n view.card = CardView.fromJSON(obj.card);\n break;\n case CipherType.Identity:\n view.identity = IdentityView.fromJSON(obj.identity);\n break;\n case CipherType.Login:\n view.login = LoginView.fromJSON(obj.login);\n break;\n case CipherType.SecureNote:\n view.secureNote = SecureNoteView.fromJSON(obj.secureNote);\n break;\n default:\n break;\n }\n\n return view;\n }\n}\n","import { Jsonify } from \"type-fest\";\n\nimport { Organization } from \"../../../admin-console/models/domain/organization\";\nimport { View } from \"../../../models/view/view\";\nimport { Collection } from \"../domain/collection\";\nimport { ITreeNodeObject } from \"../domain/tree-node\";\nimport { CollectionAccessDetailsResponse } from \"../response/collection.response\";\n\nexport const NestingDelimiter = \"/\";\n\nexport class CollectionView implements View, ITreeNodeObject {\n id: string = null;\n organizationId: string = null;\n name: string = null;\n externalId: string = null;\n // readOnly applies to the items within a collection\n readOnly: boolean = null;\n hidePasswords: boolean = null;\n manage: boolean = null;\n assigned: boolean = null;\n\n constructor(c?: Collection | CollectionAccessDetailsResponse) {\n if (!c) {\n return;\n }\n\n this.id = c.id;\n this.organizationId = c.organizationId;\n this.externalId = c.externalId;\n if (c instanceof Collection) {\n this.readOnly = c.readOnly;\n this.hidePasswords = c.hidePasswords;\n this.manage = c.manage;\n this.assigned = true;\n }\n if (c instanceof CollectionAccessDetailsResponse) {\n this.assigned = c.assigned;\n }\n }\n\n canEditItems(org: Organization, v1FlexibleCollections: boolean): boolean {\n if (org != null && org.id !== this.organizationId) {\n throw new Error(\n \"Id of the organization provided does not match the org id of the collection.\",\n );\n }\n\n if (org?.flexibleCollections) {\n return (\n org?.canEditAllCiphers(v1FlexibleCollections) ||\n this.manage ||\n (this.assigned && !this.readOnly)\n );\n }\n\n return org?.canEditAnyCollection || (org?.canEditAssignedCollections && this.assigned);\n }\n\n // For editing collection details, not the items within it.\n canEdit(org: Organization): boolean {\n if (org != null && org.id !== this.organizationId) {\n throw new Error(\n \"Id of the organization provided does not match the org id of the collection.\",\n );\n }\n\n return org?.flexibleCollections\n ? org?.canEditAnyCollection || this.manage\n : org?.canEditAnyCollection || org?.canEditAssignedCollections;\n }\n\n // For deleting a collection, not the items within it.\n canDelete(org: Organization): boolean {\n if (org != null && org.id !== this.organizationId) {\n throw new Error(\n \"Id of the organization provided does not match the org id of the collection.\",\n );\n }\n\n return org?.flexibleCollections\n ? org?.canDeleteAnyCollection || (!org?.limitCollectionCreationDeletion && this.manage)\n : org?.canDeleteAnyCollection || org?.canDeleteAssignedCollections;\n }\n\n static fromJSON(obj: Jsonify) {\n return Object.assign(new CollectionView(new Collection()), obj);\n }\n}\n","import { Jsonify } from \"type-fest\";\n\nimport { ItemView } from \"./item.view\";\n\nexport class Fido2CredentialView extends ItemView {\n credentialId: string;\n keyType: \"public-key\";\n keyAlgorithm: \"ECDSA\";\n keyCurve: \"P-256\";\n keyValue: string;\n rpId: string;\n userHandle: string;\n userName: string;\n counter: number;\n rpName: string;\n userDisplayName: string;\n discoverable: boolean;\n creationDate: Date = null;\n\n get subTitle(): string {\n return this.userDisplayName;\n }\n\n static fromJSON(obj: Partial>): Fido2CredentialView {\n const creationDate = obj.creationDate != null ? new Date(obj.creationDate) : null;\n return Object.assign(new Fido2CredentialView(), obj, {\n creationDate,\n });\n }\n}\n","import { Jsonify } from \"type-fest\";\n\nimport { View } from \"../../../models/view/view\";\nimport { FieldType, LinkedIdType } from \"../../enums\";\nimport { Field } from \"../domain/field\";\n\nexport class FieldView implements View {\n name: string = null;\n value: string = null;\n type: FieldType = null;\n newField = false; // Marks if the field is new and hasn't been saved\n showValue = false;\n showCount = false;\n linkedId: LinkedIdType = null;\n\n constructor(f?: Field) {\n if (!f) {\n return;\n }\n\n this.type = f.type;\n this.linkedId = f.linkedId;\n }\n\n get maskedValue(): string {\n return this.value != null ? \"••••••••\" : null;\n }\n\n static fromJSON(obj: Partial>): FieldView {\n return Object.assign(new FieldView(), obj);\n }\n}\n","import { Jsonify } from \"type-fest\";\n\nimport { View } from \"../../../models/view/view\";\nimport { Folder } from \"../domain/folder\";\nimport { ITreeNodeObject } from \"../domain/tree-node\";\n\nexport class FolderView implements View, ITreeNodeObject {\n id: string = null;\n name: string = null;\n revisionDate: Date = null;\n\n constructor(f?: Folder) {\n if (!f) {\n return;\n }\n\n this.id = f.id;\n this.revisionDate = f.revisionDate;\n }\n\n static fromJSON(obj: Jsonify) {\n const revisionDate = obj.revisionDate == null ? null : new Date(obj.revisionDate);\n return Object.assign(new FolderView(), obj, { revisionDate });\n }\n}\n","import { Jsonify } from \"type-fest\";\n\nimport { Utils } from \"../../../platform/misc/utils\";\nimport { IdentityLinkedId as LinkedId } from \"../../enums\";\nimport { linkedFieldOption } from \"../../linked-field-option.decorator\";\n\nimport { ItemView } from \"./item.view\";\n\nexport class IdentityView extends ItemView {\n @linkedFieldOption(LinkedId.Title)\n title: string = null;\n @linkedFieldOption(LinkedId.MiddleName)\n middleName: string = null;\n @linkedFieldOption(LinkedId.Address1)\n address1: string = null;\n @linkedFieldOption(LinkedId.Address2)\n address2: string = null;\n @linkedFieldOption(LinkedId.Address3)\n address3: string = null;\n @linkedFieldOption(LinkedId.City, \"cityTown\")\n city: string = null;\n @linkedFieldOption(LinkedId.State, \"stateProvince\")\n state: string = null;\n @linkedFieldOption(LinkedId.PostalCode, \"zipPostalCode\")\n postalCode: string = null;\n @linkedFieldOption(LinkedId.Country)\n country: string = null;\n @linkedFieldOption(LinkedId.Company)\n company: string = null;\n @linkedFieldOption(LinkedId.Email)\n email: string = null;\n @linkedFieldOption(LinkedId.Phone)\n phone: string = null;\n @linkedFieldOption(LinkedId.Ssn)\n ssn: string = null;\n @linkedFieldOption(LinkedId.Username)\n username: string = null;\n @linkedFieldOption(LinkedId.PassportNumber)\n passportNumber: string = null;\n @linkedFieldOption(LinkedId.LicenseNumber)\n licenseNumber: string = null;\n\n private _firstName: string = null;\n private _lastName: string = null;\n private _subTitle: string = null;\n\n constructor() {\n super();\n }\n\n @linkedFieldOption(LinkedId.FirstName)\n get firstName(): string {\n return this._firstName;\n }\n set firstName(value: string) {\n this._firstName = value;\n this._subTitle = null;\n }\n\n @linkedFieldOption(LinkedId.LastName)\n get lastName(): string {\n return this._lastName;\n }\n set lastName(value: string) {\n this._lastName = value;\n this._subTitle = null;\n }\n\n get subTitle(): string {\n if (this._subTitle == null && (this.firstName != null || this.lastName != null)) {\n this._subTitle = \"\";\n if (this.firstName != null) {\n this._subTitle = this.firstName;\n }\n if (this.lastName != null) {\n if (this._subTitle !== \"\") {\n this._subTitle += \" \";\n }\n this._subTitle += this.lastName;\n }\n }\n\n return this._subTitle;\n }\n\n @linkedFieldOption(LinkedId.FullName)\n get fullName(): string {\n if (\n this.title != null ||\n this.firstName != null ||\n this.middleName != null ||\n this.lastName != null\n ) {\n let name = \"\";\n if (this.title != null) {\n name += this.title + \" \";\n }\n if (this.firstName != null) {\n name += this.firstName + \" \";\n }\n if (this.middleName != null) {\n name += this.middleName + \" \";\n }\n if (this.lastName != null) {\n name += this.lastName;\n }\n return name.trim();\n }\n\n return null;\n }\n\n get fullAddress(): string {\n let address = this.address1;\n if (!Utils.isNullOrWhitespace(this.address2)) {\n if (!Utils.isNullOrWhitespace(address)) {\n address += \", \";\n }\n address += this.address2;\n }\n if (!Utils.isNullOrWhitespace(this.address3)) {\n if (!Utils.isNullOrWhitespace(address)) {\n address += \", \";\n }\n address += this.address3;\n }\n return address;\n }\n\n get fullAddressPart2(): string {\n if (this.city == null && this.state == null && this.postalCode == null) {\n return null;\n }\n const city = this.city || \"-\";\n const state = this.state;\n const postalCode = this.postalCode || \"-\";\n let addressPart2 = city;\n if (!Utils.isNullOrWhitespace(state)) {\n addressPart2 += \", \" + state;\n }\n addressPart2 += \", \" + postalCode;\n return addressPart2;\n }\n\n static fromJSON(obj: Partial>): IdentityView {\n return Object.assign(new IdentityView(), obj);\n }\n}\n","import { View } from \"../../../models/view/view\";\nimport { LinkedMetadata } from \"../../linked-field-option.decorator\";\n\nexport abstract class ItemView implements View {\n linkedFieldOptions: Map;\n abstract get subTitle(): string;\n}\n","import { Jsonify } from \"type-fest\";\n\nimport { UriMatchStrategy, UriMatchStrategySetting } from \"../../../models/domain/domain-service\";\nimport { View } from \"../../../models/view/view\";\nimport { SafeUrls } from \"../../../platform/misc/safe-urls\";\nimport { Utils } from \"../../../platform/misc/utils\";\nimport { LoginUri } from \"../domain/login-uri\";\n\nexport class LoginUriView implements View {\n match: UriMatchStrategySetting = null;\n\n private _uri: string = null;\n private _domain: string = null;\n private _hostname: string = null;\n private _host: string = null;\n private _canLaunch: boolean = null;\n\n constructor(u?: LoginUri) {\n if (!u) {\n return;\n }\n\n this.match = u.match;\n }\n\n get uri(): string {\n return this._uri;\n }\n set uri(value: string) {\n this._uri = value;\n this._domain = null;\n this._canLaunch = null;\n }\n\n get domain(): string {\n if (this._domain == null && this.uri != null) {\n this._domain = Utils.getDomain(this.uri);\n if (this._domain === \"\") {\n this._domain = null;\n }\n }\n\n return this._domain;\n }\n\n get hostname(): string {\n if (this.match === UriMatchStrategy.RegularExpression) {\n return null;\n }\n if (this._hostname == null && this.uri != null) {\n this._hostname = Utils.getHostname(this.uri);\n if (this._hostname === \"\") {\n this._hostname = null;\n }\n }\n\n return this._hostname;\n }\n\n get host(): string {\n if (this.match === UriMatchStrategy.RegularExpression) {\n return null;\n }\n if (this._host == null && this.uri != null) {\n this._host = Utils.getHost(this.uri);\n if (this._host === \"\") {\n this._host = null;\n }\n }\n\n return this._host;\n }\n\n get hostnameOrUri(): string {\n return this.hostname != null ? this.hostname : this.uri;\n }\n\n get hostOrUri(): string {\n return this.host != null ? this.host : this.uri;\n }\n\n get isWebsite(): boolean {\n return (\n this.uri != null &&\n (this.uri.indexOf(\"http://\") === 0 ||\n this.uri.indexOf(\"https://\") === 0 ||\n (this.uri.indexOf(\"://\") < 0 && !Utils.isNullOrWhitespace(Utils.getDomain(this.uri))))\n );\n }\n\n get canLaunch(): boolean {\n if (this._canLaunch != null) {\n return this._canLaunch;\n }\n if (this.uri != null && this.match !== UriMatchStrategy.RegularExpression) {\n this._canLaunch = SafeUrls.canLaunch(this.launchUri);\n } else {\n this._canLaunch = false;\n }\n return this._canLaunch;\n }\n\n get launchUri(): string {\n return this.uri.indexOf(\"://\") < 0 && !Utils.isNullOrWhitespace(Utils.getDomain(this.uri))\n ? \"http://\" + this.uri\n : this.uri;\n }\n\n static fromJSON(obj: Partial>): LoginUriView {\n return Object.assign(new LoginUriView(), obj);\n }\n\n matchesUri(\n targetUri: string,\n equivalentDomains: Set,\n defaultUriMatch: UriMatchStrategySetting = null,\n ): boolean {\n if (!this.uri || !targetUri) {\n return false;\n }\n\n let matchType = this.match ?? defaultUriMatch;\n matchType ??= UriMatchStrategy.Domain;\n\n const targetDomain = Utils.getDomain(targetUri);\n const matchDomains = equivalentDomains.add(targetDomain);\n\n switch (matchType) {\n case UriMatchStrategy.Domain:\n return this.matchesDomain(targetUri, matchDomains);\n case UriMatchStrategy.Host: {\n const urlHost = Utils.getHost(targetUri);\n return urlHost != null && urlHost === Utils.getHost(this.uri);\n }\n case UriMatchStrategy.Exact:\n return targetUri === this.uri;\n case UriMatchStrategy.StartsWith:\n return targetUri.startsWith(this.uri);\n case UriMatchStrategy.RegularExpression:\n try {\n const regex = new RegExp(this.uri, \"i\");\n return regex.test(targetUri);\n } catch (e) {\n // Invalid regex\n return false;\n }\n case UriMatchStrategy.Never:\n return false;\n default:\n break;\n }\n\n return false;\n }\n\n private matchesDomain(targetUri: string, matchDomains: Set) {\n if (targetUri == null || this.domain == null || !matchDomains.has(this.domain)) {\n return false;\n }\n\n if (Utils.DomainMatchBlacklist.has(this.domain)) {\n const domainUrlHost = Utils.getHost(targetUri);\n return !Utils.DomainMatchBlacklist.get(this.domain).has(domainUrlHost);\n }\n\n return true;\n }\n}\n","import { UriMatchStrategySetting } from \"../../../models/domain/domain-service\";\nimport { Utils } from \"../../../platform/misc/utils\";\nimport { DeepJsonify } from \"../../../types/deep-jsonify\";\nimport { LoginLinkedId as LinkedId } from \"../../enums\";\nimport { linkedFieldOption } from \"../../linked-field-option.decorator\";\nimport { Login } from \"../domain/login\";\n\nimport { Fido2CredentialView } from \"./fido2-credential.view\";\nimport { ItemView } from \"./item.view\";\nimport { LoginUriView } from \"./login-uri.view\";\n\nexport class LoginView extends ItemView {\n @linkedFieldOption(LinkedId.Username)\n username: string = null;\n @linkedFieldOption(LinkedId.Password)\n password: string = null;\n\n passwordRevisionDate?: Date = null;\n totp: string = null;\n uris: LoginUriView[] = [];\n autofillOnPageLoad: boolean = null;\n fido2Credentials: Fido2CredentialView[] = null;\n\n constructor(l?: Login) {\n super();\n if (!l) {\n return;\n }\n\n this.passwordRevisionDate = l.passwordRevisionDate;\n this.autofillOnPageLoad = l.autofillOnPageLoad;\n }\n\n get uri(): string {\n return this.hasUris ? this.uris[0].uri : null;\n }\n\n get maskedPassword(): string {\n return this.password != null ? \"••••••••\" : null;\n }\n\n get subTitle(): string {\n return this.username;\n }\n\n get canLaunch(): boolean {\n return this.hasUris && this.uris.some((u) => u.canLaunch);\n }\n\n get hasTotp(): boolean {\n return !Utils.isNullOrWhitespace(this.totp);\n }\n\n get launchUri(): string {\n if (this.hasUris) {\n const uri = this.uris.find((u) => u.canLaunch);\n if (uri != null) {\n return uri.launchUri;\n }\n }\n return null;\n }\n\n get hasUris(): boolean {\n return this.uris != null && this.uris.length > 0;\n }\n\n get hasFido2Credentials(): boolean {\n return this.fido2Credentials != null && this.fido2Credentials.length > 0;\n }\n\n matchesUri(\n targetUri: string,\n equivalentDomains: Set,\n defaultUriMatch: UriMatchStrategySetting = null,\n ): boolean {\n if (this.uris == null) {\n return false;\n }\n\n return this.uris.some((uri) => uri.matchesUri(targetUri, equivalentDomains, defaultUriMatch));\n }\n\n static fromJSON(obj: Partial>): LoginView {\n const passwordRevisionDate =\n obj.passwordRevisionDate == null ? null : new Date(obj.passwordRevisionDate);\n const uris = obj.uris.map((uri) => LoginUriView.fromJSON(uri));\n const fido2Credentials = obj.fido2Credentials?.map((key) => Fido2CredentialView.fromJSON(key));\n\n return Object.assign(new LoginView(), obj, {\n passwordRevisionDate,\n uris,\n fido2Credentials,\n });\n }\n}\n","import { Jsonify } from \"type-fest\";\n\nimport { View } from \"../../../models/view/view\";\nimport { Password } from \"../domain/password\";\n\nexport class PasswordHistoryView implements View {\n password: string = null;\n lastUsedDate: Date = null;\n\n constructor(ph?: Password) {\n if (!ph) {\n return;\n }\n\n this.lastUsedDate = ph.lastUsedDate;\n }\n\n static fromJSON(obj: Partial>): PasswordHistoryView {\n const lastUsedDate = obj.lastUsedDate == null ? null : new Date(obj.lastUsedDate);\n\n return Object.assign(new PasswordHistoryView(), obj, {\n lastUsedDate: lastUsedDate,\n });\n }\n}\n","import { Jsonify } from \"type-fest\";\n\nimport { SecureNoteType } from \"../../enums\";\nimport { SecureNote } from \"../domain/secure-note\";\n\nimport { ItemView } from \"./item.view\";\n\nexport class SecureNoteView extends ItemView {\n type: SecureNoteType = null;\n\n constructor(n?: SecureNote) {\n super();\n if (!n) {\n return;\n }\n\n this.type = n.type;\n }\n\n get subTitle(): string {\n return null;\n }\n\n static fromJSON(obj: Partial>): SecureNoteView {\n return Object.assign(new SecureNoteView(), obj);\n }\n}\n","import { ITreeNodeObject, TreeNode } from \"./models/domain/tree-node\";\n\nexport class ServiceUtils {\n /**\n * Recursively adds a node to nodeTree\n * @param {TreeNode[]} nodeTree - An array of TreeNodes that the node will be added to\n * @param {number} partIndex - Index of the `parts` array that is being processed\n * @param {string[]} parts - Array of strings that represent the path to the `obj` node\n * @param {ITreeNodeObject} obj - The node to be added to the tree\n * @param {ITreeNodeObject} parent - The parent node of the `obj` node\n * @param {string} delimiter - The delimiter used to split the path string, will be used to combine the path for missing nodes\n */\n static nestedTraverse(\n nodeTree: TreeNode[],\n partIndex: number,\n parts: string[],\n obj: ITreeNodeObject,\n parent: TreeNode | undefined,\n delimiter: string,\n ) {\n if (parts.length <= partIndex) {\n return;\n }\n\n const end: boolean = partIndex === parts.length - 1;\n const partName: string = parts[partIndex];\n\n for (let i = 0; i < nodeTree.length; i++) {\n if (nodeTree[i].node.name !== partName) {\n continue;\n }\n if (end && nodeTree[i].node.id !== obj.id) {\n // Another node exists with the same name as the node being added\n nodeTree.push(new TreeNode(obj, parent, partName));\n return;\n }\n // Move down the tree to the next level\n ServiceUtils.nestedTraverse(\n nodeTree[i].children,\n partIndex + 1,\n parts,\n obj,\n nodeTree[i],\n delimiter,\n );\n return;\n }\n\n // If there's no node here with the same name...\n if (nodeTree.filter((n) => n.node.name === partName).length === 0) {\n // And we're at the end of the path given, add the node\n if (end) {\n nodeTree.push(new TreeNode(obj, parent, partName));\n return;\n }\n // And we're not at the end of the path, combine the current name with the next name\n // 1, *1.2, 1.2.1 becomes\n // 1, *1.2/1.2.1\n const newPartName = partName + delimiter + parts[partIndex + 1];\n ServiceUtils.nestedTraverse(\n nodeTree,\n 0,\n [newPartName, ...parts.slice(partIndex + 2)],\n obj,\n parent,\n delimiter,\n );\n }\n }\n\n /**\n * Searches a tree for a node with a matching `id`\n * @param {TreeNode} nodeTree - A single TreeNode branch that will be searched\n * @param {string} id - The id of the node to be found\n * @returns {TreeNode} The node with a matching `id`\n */\n static getTreeNodeObject(\n nodeTree: TreeNode,\n id: string,\n ): TreeNode {\n if (nodeTree.node.id === id) {\n return nodeTree;\n }\n for (let i = 0; i < nodeTree.children.length; i++) {\n if (nodeTree.children[i].children != null) {\n const node = ServiceUtils.getTreeNodeObject(nodeTree.children[i], id);\n if (node !== null) {\n return node;\n }\n }\n }\n return null;\n }\n\n /**\n * Searches an array of tree nodes for a node with a matching `id`\n * @param {TreeNode} nodeTree - An array of TreeNode branches that will be searched\n * @param {string} id - The id of the node to be found\n * @returns {TreeNode} The node with a matching `id`\n */\n static getTreeNodeObjectFromList(\n nodeTree: TreeNode[],\n id: string,\n ): TreeNode {\n for (let i = 0; i < nodeTree.length; i++) {\n if (nodeTree[i].node.id === id) {\n return nodeTree[i];\n } else if (nodeTree[i].children != null) {\n const node = ServiceUtils.getTreeNodeObjectFromList(nodeTree[i].children, id);\n if (node !== null) {\n return node;\n }\n }\n }\n return null;\n }\n}\n","import { NgModule } from \"@angular/core\";\n\nimport { SharedModule } from \"../shared\";\n\nimport { BitActionDirective } from \"./bit-action.directive\";\nimport { BitSubmitDirective } from \"./bit-submit.directive\";\nimport { BitFormButtonDirective } from \"./form-button.directive\";\n\n@NgModule({\n imports: [SharedModule],\n declarations: [BitActionDirective, BitFormButtonDirective, BitSubmitDirective],\n exports: [BitActionDirective, BitFormButtonDirective, BitSubmitDirective],\n})\nexport class AsyncActionsModule {}\n","import { Directive, HostListener, Input, OnDestroy, Optional } from \"@angular/core\";\nimport { BehaviorSubject, finalize, Subject, takeUntil, tap } from \"rxjs\";\n\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { ValidationService } from \"@bitwarden/common/platform/abstractions/validation.service\";\n\nimport { ButtonLikeAbstraction } from \"../shared/button-like.abstraction\";\nimport { FunctionReturningAwaitable, functionToObservable } from \"../utils/function-to-observable\";\n\n/**\n * Allow a single button to perform async actions on click and reflect the progress in the UI by automatically\n * activating the loading effect while the action is processed.\n */\n@Directive({\n selector: \"[bitAction]\",\n})\nexport class BitActionDirective implements OnDestroy {\n private destroy$ = new Subject();\n private _loading$ = new BehaviorSubject(false);\n\n disabled = false;\n\n @Input(\"bitAction\") handler: FunctionReturningAwaitable;\n\n readonly loading$ = this._loading$.asObservable();\n\n constructor(\n private buttonComponent: ButtonLikeAbstraction,\n @Optional() private validationService?: ValidationService,\n @Optional() private logService?: LogService,\n ) {}\n\n get loading() {\n return this._loading$.value;\n }\n\n set loading(value: boolean) {\n this._loading$.next(value);\n this.buttonComponent.loading = value;\n }\n\n @HostListener(\"click\")\n protected async onClick() {\n if (!this.handler || this.loading || this.disabled || this.buttonComponent.disabled) {\n return;\n }\n\n this.loading = true;\n functionToObservable(this.handler)\n .pipe(\n tap({\n error: (err: unknown) => {\n this.logService?.error(`Async action exception: ${err}`);\n this.validationService?.showError(err);\n },\n }),\n finalize(() => (this.loading = false)),\n takeUntil(this.destroy$),\n )\n .subscribe();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n}\n","import { Directive, Input, OnDestroy, OnInit, Optional } from \"@angular/core\";\nimport { FormGroupDirective } from \"@angular/forms\";\nimport { BehaviorSubject, catchError, filter, of, Subject, switchMap, takeUntil } from \"rxjs\";\n\nimport { LogService } from \"@bitwarden/common/platform/abstractions/log.service\";\nimport { ValidationService } from \"@bitwarden/common/platform/abstractions/validation.service\";\n\nimport { FunctionReturningAwaitable, functionToObservable } from \"../utils/function-to-observable\";\n\n/**\n * Allow a form to perform async actions on submit, disabling the form while the action is processing.\n */\n@Directive({\n selector: \"[formGroup][bitSubmit]\",\n})\nexport class BitSubmitDirective implements OnInit, OnDestroy {\n private destroy$ = new Subject();\n private _loading$ = new BehaviorSubject(false);\n private _disabled$ = new BehaviorSubject(false);\n\n @Input(\"bitSubmit\") handler: FunctionReturningAwaitable;\n\n @Input() allowDisabledFormSubmit?: boolean = false;\n\n readonly loading$ = this._loading$.asObservable();\n readonly disabled$ = this._disabled$.asObservable();\n\n constructor(\n private formGroupDirective: FormGroupDirective,\n @Optional() validationService?: ValidationService,\n @Optional() logService?: LogService,\n ) {\n formGroupDirective.ngSubmit\n .pipe(\n filter(() => !this.disabled),\n switchMap(() => {\n // Calling functionToObservable executes the sync part of the handler\n // allowing the function to check form validity before it gets disabled.\n const awaitable = functionToObservable(this.handler);\n\n // Disable form\n this.loading = true;\n\n return awaitable.pipe(\n catchError((err: unknown) => {\n logService?.error(`Async submit exception: ${err}`);\n validationService?.showError(err);\n return of(undefined);\n }),\n );\n }),\n takeUntil(this.destroy$),\n )\n .subscribe({\n next: () => (this.loading = false),\n complete: () => (this.loading = false),\n });\n }\n\n ngOnInit(): void {\n this.formGroupDirective.statusChanges.pipe(takeUntil(this.destroy$)).subscribe((c) => {\n if (this.allowDisabledFormSubmit) {\n this._disabled$.next(false);\n } else {\n this._disabled$.next(c === \"DISABLED\");\n }\n });\n }\n\n get disabled() {\n return this._disabled$.value;\n }\n\n set disabled(value: boolean) {\n this._disabled$.next(value);\n }\n\n get loading() {\n return this._loading$.value;\n }\n\n set loading(value: boolean) {\n this.disabled = value;\n this._loading$.next(value);\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n}\n","import { Directive, Input, OnDestroy, Optional } from \"@angular/core\";\nimport { Subject, takeUntil } from \"rxjs\";\n\nimport { ButtonLikeAbstraction } from \"../shared/button-like.abstraction\";\n\nimport { BitActionDirective } from \"./bit-action.directive\";\nimport { BitSubmitDirective } from \"./bit-submit.directive\";\n\n/**\n * This directive has two purposes:\n *\n * When attached to a submit button:\n * - Activates the button loading effect while the form is processing an async submit action.\n * - Disables the button while a `bitAction` directive on another button is being processed.\n *\n * When attached to a button with `bitAction` directive inside of a form:\n * - Disables the button while the `bitSubmit` directive is processing an async submit action.\n * - Disables the button while a `bitAction` directive on another button is being processed.\n * - Disables form submission while the `bitAction` directive is processing an async action.\n *\n * Note: you must use a directive that implements the ButtonLikeAbstraction (bitButton or bitIconButton for example)\n * along with this one in order to avoid provider errors.\n */\n@Directive({\n selector: \"button[bitFormButton]\",\n})\nexport class BitFormButtonDirective implements OnDestroy {\n private destroy$ = new Subject();\n\n @Input() type: string;\n @Input() disabled?: boolean;\n\n constructor(\n buttonComponent: ButtonLikeAbstraction,\n @Optional() submitDirective?: BitSubmitDirective,\n @Optional() actionDirective?: BitActionDirective,\n ) {\n if (submitDirective && buttonComponent) {\n submitDirective.loading$.pipe(takeUntil(this.destroy$)).subscribe((loading) => {\n if (this.type === \"submit\") {\n buttonComponent.loading = loading;\n } else {\n buttonComponent.disabled = loading;\n }\n });\n\n submitDirective.disabled$.pipe(takeUntil(this.destroy$)).subscribe((disabled) => {\n if (this.disabled !== false) {\n buttonComponent.disabled = disabled;\n }\n });\n }\n\n if (submitDirective && actionDirective) {\n actionDirective.loading$.pipe(takeUntil(this.destroy$)).subscribe((disabled) => {\n submitDirective.disabled = disabled;\n });\n\n submitDirective.disabled$.pipe(takeUntil(this.destroy$)).subscribe((disabled) => {\n actionDirective.disabled = disabled;\n });\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n}\n","import { Component, Input, OnChanges } from \"@angular/core\";\nimport { DomSanitizer, SafeResourceUrl } from \"@angular/platform-browser\";\n\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\n\ntype SizeTypes = \"xlarge\" | \"large\" | \"default\" | \"small\" | \"xsmall\";\n\nconst SizeClasses: Record = {\n xlarge: [\"tw-h-24\", \"tw-w-24\"],\n large: [\"tw-h-16\", \"tw-w-16\"],\n default: [\"tw-h-10\", \"tw-w-10\"],\n small: [\"tw-h-7\", \"tw-w-7\"],\n xsmall: [\"tw-h-6\", \"tw-w-6\"],\n};\n\n@Component({\n selector: \"bit-avatar\",\n template: ``,\n})\nexport class AvatarComponent implements OnChanges {\n @Input() border = false;\n @Input() color?: string;\n @Input() id?: string;\n @Input() text?: string;\n @Input() title: string;\n @Input() size: SizeTypes = \"default\";\n\n private svgCharCount = 2;\n private svgFontSize = 20;\n private svgFontWeight = 300;\n private svgSize = 48;\n src: SafeResourceUrl;\n\n constructor(public sanitizer: DomSanitizer) {}\n\n ngOnChanges() {\n this.generate();\n }\n\n get classList() {\n return [\"tw-rounded-full\"]\n .concat(SizeClasses[this.size] ?? [])\n .concat(this.border ? [\"tw-border\", \"tw-border-solid\", \"tw-border-secondary-500\"] : []);\n }\n\n private generate() {\n let chars: string = null;\n const upperCaseText = this.text?.toUpperCase() ?? \"\";\n\n chars = this.getFirstLetters(upperCaseText, this.svgCharCount);\n\n if (chars == null) {\n chars = this.unicodeSafeSubstring(upperCaseText, this.svgCharCount);\n }\n\n // If the chars contain an emoji, only show it.\n if (chars.match(Utils.regexpEmojiPresentation)) {\n chars = chars.match(Utils.regexpEmojiPresentation)[0];\n }\n\n let svg: HTMLElement;\n let hexColor = this.color;\n\n if (!Utils.isNullOrWhitespace(this.color)) {\n svg = this.createSvgElement(this.svgSize, hexColor);\n } else if (!Utils.isNullOrWhitespace(this.id)) {\n hexColor = Utils.stringToColor(this.id.toString());\n svg = this.createSvgElement(this.svgSize, hexColor);\n } else {\n hexColor = Utils.stringToColor(upperCaseText);\n svg = this.createSvgElement(this.svgSize, hexColor);\n }\n\n const charObj = this.createTextElement(chars, hexColor);\n svg.appendChild(charObj);\n const html = window.document.createElement(\"div\").appendChild(svg).outerHTML;\n const svgHtml = window.btoa(unescape(encodeURIComponent(html)));\n\n // This is safe because the only user provided value, chars is set using `textContent`\n this.src = this.sanitizer.bypassSecurityTrustResourceUrl(\n \"data:image/svg+xml;base64,\" + svgHtml,\n );\n }\n\n private getFirstLetters(data: string, count: number): string {\n const parts = data.split(\" \");\n if (parts.length > 1) {\n let text = \"\";\n for (let i = 0; i < count; i++) {\n text += this.unicodeSafeSubstring(parts[i], 1);\n }\n return text;\n }\n return null;\n }\n\n private createSvgElement(size: number, color: string): HTMLElement {\n const svgTag = window.document.createElement(\"svg\");\n svgTag.setAttribute(\"xmlns\", \"http://www.w3.org/2000/svg\");\n svgTag.setAttribute(\"pointer-events\", \"none\");\n svgTag.setAttribute(\"width\", size.toString());\n svgTag.setAttribute(\"height\", size.toString());\n svgTag.style.backgroundColor = color;\n svgTag.style.width = size + \"px\";\n svgTag.style.height = size + \"px\";\n return svgTag;\n }\n\n private createTextElement(character: string, color: string): HTMLElement {\n const textTag = window.document.createElement(\"text\");\n textTag.setAttribute(\"text-anchor\", \"middle\");\n textTag.setAttribute(\"y\", \"50%\");\n textTag.setAttribute(\"x\", \"50%\");\n textTag.setAttribute(\"dy\", \"0.35em\");\n textTag.setAttribute(\"pointer-events\", \"auto\");\n textTag.setAttribute(\"fill\", Utils.pickTextColorBasedOnBgColor(color, 135, true));\n textTag.setAttribute(\n \"font-family\",\n '\"Open Sans\",\"Helvetica Neue\",Helvetica,Arial,' +\n 'sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\"',\n );\n // Warning do not use innerHTML here, characters are user provided\n textTag.textContent = character;\n textTag.style.fontWeight = this.svgFontWeight.toString();\n textTag.style.fontSize = this.svgFontSize + \"px\";\n return textTag;\n }\n\n private unicodeSafeSubstring(str: string, count: number) {\n const characters = str.match(/./gu);\n return characters != null ? characters.slice(0, count).join(\"\") : \"\";\n }\n}\n","
    \n \n \n {{ item }}\n \n , \n \n \n {{ \"plusNMore\" | i18n: (items.length - filteredItems.length).toString() }}\n \n
    \n","import { Component, Input, OnChanges } from \"@angular/core\";\n\nimport { BadgeVariant } from \"../badge\";\n\n@Component({\n selector: \"bit-badge-list\",\n templateUrl: \"badge-list.component.html\",\n})\nexport class BadgeListComponent implements OnChanges {\n private _maxItems: number;\n\n protected filteredItems: string[] = [];\n protected isFiltered = false;\n\n @Input() variant: BadgeVariant = \"primary\";\n @Input() items: string[] = [];\n @Input() truncate = true;\n\n @Input()\n get maxItems(): number | undefined {\n return this._maxItems;\n }\n\n set maxItems(value: number | undefined) {\n this._maxItems = value == undefined ? undefined : Math.max(1, value);\n }\n\n ngOnChanges() {\n if (this.maxItems == undefined || this.items.length <= this.maxItems) {\n this.filteredItems = this.items;\n } else {\n this.filteredItems = this.items.slice(0, this.maxItems - 1);\n }\n this.isFiltered = this.items.length > this.filteredItems.length;\n }\n}\n","import { Directive, ElementRef, HostBinding, Input } from \"@angular/core\";\n\nexport type BadgeVariant = \"primary\" | \"secondary\" | \"success\" | \"danger\" | \"warning\" | \"info\";\n\nconst styles: Record = {\n primary: [\"tw-bg-primary-500\"],\n secondary: [\"tw-bg-text-muted\"],\n success: [\"tw-bg-success-500\"],\n danger: [\"tw-bg-danger-500\"],\n warning: [\"tw-bg-warning-500\"],\n info: [\"tw-bg-info-500\"],\n};\n\nconst hoverStyles: Record = {\n primary: [\"hover:tw-bg-primary-700\"],\n secondary: [\"hover:tw-bg-secondary-700\"],\n success: [\"hover:tw-bg-success-700\"],\n danger: [\"hover:tw-bg-danger-700\"],\n warning: [\"hover:tw-bg-warning-700\"],\n info: [\"hover:tw-bg-info-700\"],\n};\n\n@Directive({\n selector: \"span[bitBadge], a[bitBadge], button[bitBadge]\",\n})\nexport class BadgeDirective {\n @HostBinding(\"class\") get classList() {\n return [\n \"tw-inline-block\",\n \"tw-py-0.5\",\n \"tw-px-1.5\",\n \"tw-font-bold\",\n \"tw-text-center\",\n \"tw-align-text-top\",\n \"!tw-text-contrast\",\n \"tw-rounded\",\n \"tw-border-none\",\n \"tw-box-border\",\n \"tw-whitespace-nowrap\",\n \"tw-text-xs\",\n \"hover:tw-no-underline\",\n \"focus:tw-outline-none\",\n \"focus:tw-ring\",\n \"focus:tw-ring-offset-2\",\n \"focus:tw-ring-primary-700\",\n ]\n .concat(styles[this.variant])\n .concat(this.hasHoverEffects ? hoverStyles[this.variant] : [])\n .concat(this.truncate ? [\"tw-truncate\", \"tw-max-w-40\"] : []);\n }\n @HostBinding(\"attr.title\") get title() {\n return this.truncate ? this.el.nativeElement.textContent.trim() : null;\n }\n\n /**\n * Variant, sets the background color of the badge.\n */\n @Input() variant: BadgeVariant = \"primary\";\n\n /**\n * Truncate long text\n */\n @Input() truncate = true;\n\n private hasHoverEffects = false;\n\n constructor(private el: ElementRef) {\n this.hasHoverEffects = el?.nativeElement?.nodeName != \"SPAN\";\n }\n}\n","import { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\n\nimport { BadgeDirective } from \"./badge.directive\";\n\n@NgModule({\n imports: [CommonModule],\n exports: [BadgeDirective],\n declarations: [BadgeDirective],\n})\nexport class BadgeModule {}\n","\n \n \n \n \n \n\n","import { Component, Input, OnInit, Output, EventEmitter } from \"@angular/core\";\n\ntype BannerTypes = \"premium\" | \"info\" | \"warning\" | \"danger\";\n\nconst defaultIcon: Record = {\n premium: \"bwi-star\",\n info: \"bwi-info-circle\",\n warning: \"bwi-exclamation-triangle\",\n danger: \"bwi-error\",\n};\n\n@Component({\n selector: \"bit-banner\",\n templateUrl: \"./banner.component.html\",\n})\nexport class BannerComponent implements OnInit {\n @Input(\"bannerType\") bannerType: BannerTypes = \"info\";\n @Input() icon: string;\n @Input() useAlertRole = true;\n @Input() showClose = true;\n\n @Output() onClose = new EventEmitter();\n\n ngOnInit(): void {\n this.icon ??= defaultIcon[this.bannerType];\n }\n\n get bannerClass() {\n switch (this.bannerType) {\n case \"danger\":\n return \"tw-bg-danger-500\";\n case \"info\":\n return \"tw-bg-info-500\";\n case \"premium\":\n return \"tw-bg-success-500\";\n case \"warning\":\n return \"tw-bg-warning-500\";\n }\n }\n}\n","import { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\n\nimport { IconButtonModule } from \"../icon-button\";\nimport { SharedModule } from \"../shared/shared.module\";\n\nimport { BannerComponent } from \"./banner.component\";\n\n@NgModule({\n imports: [CommonModule, SharedModule, IconButtonModule],\n exports: [BannerComponent],\n declarations: [BannerComponent],\n})\nexport class BannerModule {}\n","\n \n\n","import { Component, EventEmitter, Input, Output, TemplateRef, ViewChild } from \"@angular/core\";\nimport { QueryParamsHandling } from \"@angular/router\";\n\n@Component({\n selector: \"bit-breadcrumb\",\n templateUrl: \"./breadcrumb.component.html\",\n})\nexport class BreadcrumbComponent {\n @Input()\n icon?: string;\n\n @Input()\n route?: string | any[] = undefined;\n\n @Input()\n queryParams?: Record = {};\n\n @Input()\n queryParamsHandling?: QueryParamsHandling;\n\n @Output()\n click = new EventEmitter();\n\n @ViewChild(TemplateRef, { static: true }) content: TemplateRef;\n\n onClick(args: unknown) {\n this.click.next(args);\n }\n}\n","\n \n \n \n \n \n \n \n \n \n \n \n\n\n\n 0\" class=\"bwi bwi-angle-right tw-mx-1.5 tw-text-main\">\n\n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n\n","import { Component, ContentChildren, Input, QueryList } from \"@angular/core\";\n\nimport { BreadcrumbComponent } from \"./breadcrumb.component\";\n\n@Component({\n selector: \"bit-breadcrumbs\",\n templateUrl: \"./breadcrumbs.component.html\",\n})\nexport class BreadcrumbsComponent {\n @Input()\n show = 3;\n\n private breadcrumbs: BreadcrumbComponent[] = [];\n\n @ContentChildren(BreadcrumbComponent)\n protected set breadcrumbList(value: QueryList) {\n this.breadcrumbs = value.toArray();\n }\n\n protected get beforeOverflow() {\n if (this.hasOverflow) {\n return this.breadcrumbs.slice(0, this.show - 1);\n }\n\n return this.breadcrumbs;\n }\n\n protected get overflow() {\n return this.breadcrumbs.slice(this.show - 1, -1);\n }\n\n protected get afterOverflow() {\n return this.breadcrumbs.slice(-1);\n }\n\n protected get hasOverflow() {\n return this.breadcrumbs.length > this.show;\n }\n}\n","import { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\nimport { RouterModule } from \"@angular/router\";\n\nimport { IconButtonModule } from \"../icon-button\";\nimport { LinkModule } from \"../link\";\nimport { MenuModule } from \"../menu\";\n\nimport { BreadcrumbComponent } from \"./breadcrumb.component\";\nimport { BreadcrumbsComponent } from \"./breadcrumbs.component\";\n\n@NgModule({\n imports: [CommonModule, LinkModule, IconButtonModule, MenuModule, RouterModule],\n declarations: [BreadcrumbsComponent, BreadcrumbComponent],\n exports: [BreadcrumbsComponent, BreadcrumbComponent],\n})\nexport class BreadcrumbsModule {}\n","import { coerceBooleanProperty } from \"@angular/cdk/coercion\";\nimport { Input, HostBinding, Component } from \"@angular/core\";\n\nimport { ButtonLikeAbstraction, ButtonType } from \"../shared/button-like.abstraction\";\n\nconst focusRing = [\n \"focus-visible:tw-ring\",\n \"focus-visible:tw-ring-offset-2\",\n \"focus-visible:tw-ring-primary-700\",\n \"focus-visible:tw-z-10\",\n];\n\nconst buttonStyles: Record = {\n primary: [\n \"tw-border-primary-500\",\n \"tw-bg-primary-500\",\n \"!tw-text-contrast\",\n \"hover:tw-bg-primary-700\",\n \"hover:tw-border-primary-700\",\n \"disabled:tw-bg-primary-500/60\",\n \"disabled:tw-border-primary-500/60\",\n \"disabled:!tw-text-contrast/60\",\n \"disabled:tw-bg-clip-padding\",\n \"disabled:tw-cursor-not-allowed\",\n ...focusRing,\n ],\n secondary: [\n \"tw-bg-transparent\",\n \"tw-border-text-muted\",\n \"!tw-text-muted\",\n \"hover:tw-bg-text-muted\",\n \"hover:tw-border-text-muted\",\n \"hover:!tw-text-contrast\",\n \"disabled:tw-bg-transparent\",\n \"disabled:tw-border-text-muted/60\",\n \"disabled:!tw-text-muted/60\",\n \"disabled:tw-cursor-not-allowed\",\n ...focusRing,\n ],\n danger: [\n \"tw-bg-transparent\",\n \"tw-border-danger-500\",\n \"!tw-text-danger\",\n \"hover:tw-bg-danger-500\",\n \"hover:tw-border-danger-500\",\n \"hover:!tw-text-contrast\",\n \"disabled:tw-bg-transparent\",\n \"disabled:tw-border-danger-500/60\",\n \"disabled:!tw-text-danger/60\",\n \"disabled:tw-cursor-not-allowed\",\n ...focusRing,\n ],\n unstyled: [],\n};\n\n@Component({\n selector: \"button[bitButton], a[bitButton]\",\n templateUrl: \"button.component.html\",\n providers: [{ provide: ButtonLikeAbstraction, useExisting: ButtonComponent }],\n})\nexport class ButtonComponent implements ButtonLikeAbstraction {\n @HostBinding(\"class\") get classList() {\n return [\n \"tw-font-semibold\",\n \"tw-py-1.5\",\n \"tw-px-3\",\n \"tw-rounded\",\n \"tw-transition\",\n \"tw-border\",\n \"tw-border-solid\",\n \"tw-text-center\",\n \"hover:tw-no-underline\",\n \"focus:tw-outline-none\",\n ]\n .concat(this.block ? [\"tw-w-full\", \"tw-block\"] : [\"tw-inline-block\"])\n .concat(buttonStyles[this.buttonType ?? \"secondary\"]);\n }\n\n @HostBinding(\"attr.disabled\")\n get disabledAttr() {\n const disabled = this.disabled != null && this.disabled !== false;\n return disabled || this.loading ? true : null;\n }\n\n @Input() buttonType: ButtonType;\n\n private _block = false;\n\n @Input()\n get block(): boolean {\n return this._block;\n }\n\n set block(value: boolean | \"\") {\n this._block = coerceBooleanProperty(value);\n }\n\n @Input() loading = false;\n\n @Input() disabled = false;\n\n setButtonType(value: \"primary\" | \"secondary\" | \"danger\" | \"unstyled\") {\n this.buttonType = value;\n }\n}\n","\n \n \n \n \n \n \n\n","import { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\n\nimport { ButtonComponent } from \"./button.component\";\n\n@NgModule({\n imports: [CommonModule],\n exports: [ButtonComponent],\n declarations: [ButtonComponent],\n})\nexport class ButtonModule {}\n","\n \n \n {{ title }}\n \n \n\n","import { Component, Input, OnInit } from \"@angular/core\";\n\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\n\ntype CalloutTypes = \"success\" | \"info\" | \"warning\" | \"danger\";\n\nconst defaultIcon: Record = {\n success: \"bwi-check\",\n info: \"bwi-info-circle\",\n warning: \"bwi-exclamation-triangle\",\n danger: \"bwi-error\",\n};\n\nconst defaultI18n: Partial> = {\n warning: \"warning\",\n danger: \"error\",\n};\n\n// Increments for each instance of this component\nlet nextId = 0;\n\n@Component({\n selector: \"bit-callout\",\n templateUrl: \"callout.component.html\",\n})\nexport class CalloutComponent implements OnInit {\n @Input() type: CalloutTypes = \"info\";\n @Input() icon: string;\n @Input() title: string;\n @Input() useAlertRole = false;\n protected titleId = `bit-callout-title-${nextId++}`;\n\n constructor(private i18nService: I18nService) {}\n\n ngOnInit() {\n this.icon ??= defaultIcon[this.type];\n if (this.title == null && defaultI18n[this.type] != null) {\n this.title = this.i18nService.t(defaultI18n[this.type]);\n }\n }\n\n get calloutClass() {\n switch (this.type) {\n case \"danger\":\n return \"tw-border-l-danger-500\";\n case \"info\":\n return \"tw-border-l-info-500\";\n case \"success\":\n return \"tw-border-l-success-500\";\n case \"warning\":\n return \"tw-border-l-warning-500\";\n }\n }\n\n get headerClass() {\n switch (this.type) {\n case \"danger\":\n return \"!tw-text-danger\";\n case \"info\":\n return \"!tw-text-info\";\n case \"success\":\n return \"!tw-text-success\";\n case \"warning\":\n return \"!tw-text-warning\";\n }\n }\n}\n","import { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\n\nimport { CalloutComponent } from \"./callout.component\";\n\n@NgModule({\n imports: [CommonModule],\n exports: [CalloutComponent],\n declarations: [CalloutComponent],\n})\nexport class CalloutModule {}\n","import { Component, HostBinding, Input, Optional, Self } from \"@angular/core\";\nimport { NgControl, Validators } from \"@angular/forms\";\n\nimport { BitFormControlAbstraction } from \"../form-control\";\n\n@Component({\n selector: \"input[type=checkbox][bitCheckbox]\",\n template: \"\",\n providers: [{ provide: BitFormControlAbstraction, useExisting: CheckboxComponent }],\n})\nexport class CheckboxComponent implements BitFormControlAbstraction {\n @HostBinding(\"class\")\n protected inputClasses = [\n \"tw-appearance-none\",\n \"tw-outline-none\",\n \"tw-relative\",\n \"tw-transition\",\n \"tw-cursor-pointer\",\n \"tw-inline-block\",\n \"tw-rounded\",\n \"tw-border\",\n \"tw-border-solid\",\n \"tw-border-secondary-500\",\n \"tw-h-3.5\",\n \"tw-w-3.5\",\n \"tw-mr-1.5\",\n \"tw-bottom-[-1px]\", // Fix checkbox looking off-center\n \"tw-flex-none\", // Flexbox fix for bit-form-control\n\n \"before:tw-content-['']\",\n \"before:tw-block\",\n \"before:tw-absolute\",\n \"before:tw-inset-0\",\n\n \"hover:tw-border-2\",\n \"[&>label]:tw-border-2\",\n\n \"focus-visible:tw-ring-2\",\n \"focus-visible:tw-ring-offset-2\",\n \"focus-visible:tw-ring-primary-700\",\n\n \"disabled:tw-cursor-auto\",\n \"disabled:tw-border\",\n \"disabled:tw-bg-secondary-100\",\n\n \"checked:tw-bg-primary-500\",\n \"checked:tw-border-primary-500\",\n \"checked:hover:tw-bg-primary-700\",\n \"checked:hover:tw-border-primary-700\",\n \"[&>label:hover]:checked:tw-bg-primary-700\",\n \"[&>label:hover]:checked:tw-border-primary-700\",\n \"checked:before:tw-bg-text-contrast\",\n \"checked:before:tw-mask-position-[center]\",\n \"checked:before:tw-mask-repeat-[no-repeat]\",\n \"checked:disabled:tw-border-secondary-100\",\n \"checked:disabled:tw-bg-secondary-100\",\n \"checked:disabled:before:tw-bg-text-muted\",\n\n \"[&:not(:indeterminate)]:checked:before:tw-mask-image-[var(--mask-image)]\",\n \"indeterminate:before:tw-mask-image-[var(--indeterminate-mask-image)]\",\n\n \"indeterminate:tw-bg-primary-500\",\n \"indeterminate:tw-border-primary-500\",\n \"indeterminate:hover:tw-bg-primary-700\",\n \"indeterminate:hover:tw-border-primary-700\",\n \"[&>label:hover]:indeterminate:tw-bg-primary-700\",\n \"[&>label:hover]:indeterminate:tw-border-primary-700\",\n \"indeterminate:before:tw-bg-text-contrast\",\n \"indeterminate:before:tw-mask-position-[center]\",\n \"indeterminate:before:tw-mask-repeat-[no-repeat]\",\n \"indeterminate:before:tw-mask-image-[var(--indeterminate-mask-image)]\",\n \"indeterminate:disabled:tw-border-secondary-100\",\n \"indeterminate:disabled:tw-bg-secondary-100\",\n \"indeterminate:disabled:before:tw-bg-text-muted\",\n ];\n\n constructor(@Optional() @Self() private ngControl?: NgControl) {}\n\n @HostBinding(\"style.--mask-image\")\n protected maskImage =\n `url('data:image/svg+xml,%3Csvg class=\"svg\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"8\" height=\"8\" viewBox=\"0 0 10 10\"%3E%3Cpath d=\"M0.5 6.2L2.9 8.6L9.5 1.4\" fill=\"none\" stroke=\"white\" stroke-width=\"2\"%3E%3C/path%3E%3C/svg%3E')`;\n\n @HostBinding(\"style.--indeterminate-mask-image\")\n protected indeterminateImage =\n `url('data:image/svg+xml,%3Csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" fill=\"none\" viewBox=\"0 0 13 13\"%3E%3Cpath stroke=\"%23fff\" stroke-width=\"2\" d=\"M2.5 6.5h8\"/%3E%3C/svg%3E%0A')`;\n\n @HostBinding()\n @Input()\n get disabled() {\n return this._disabled ?? this.ngControl?.disabled ?? false;\n }\n set disabled(value: any) {\n this._disabled = value != null && value !== false;\n }\n private _disabled: boolean;\n\n @Input()\n get required() {\n return (\n this._required ?? this.ngControl?.control?.hasValidator(Validators.requiredTrue) ?? false\n );\n }\n set required(value: any) {\n this._required = value != null && value !== false;\n }\n private _required: boolean;\n\n get hasError() {\n return this.ngControl?.status === \"INVALID\" && this.ngControl?.touched;\n }\n\n get error(): [string, any] {\n const key = Object.keys(this.ngControl.errors)[0];\n return [key, this.ngControl.errors[key]];\n }\n}\n","import { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\n\nimport { FormControlModule } from \"../form-control\";\nimport { SharedModule } from \"../shared\";\n\nimport { CheckboxComponent } from \"./checkbox.component\";\n\n@NgModule({\n imports: [SharedModule, CommonModule, FormControlModule],\n declarations: [CheckboxComponent],\n exports: [CheckboxComponent],\n})\nexport class CheckboxModule {}\n","import { Component, HostBinding, Input } from \"@angular/core\";\n\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\n\nenum CharacterType {\n Letter,\n Emoji,\n Special,\n Number,\n}\n\n@Component({\n selector: \"bit-color-password\",\n template: `\n {{ character }}\n {{\n i + 1\n }}\n `,\n preserveWhitespaces: false,\n})\nexport class ColorPasswordComponent {\n @Input() password: string = null;\n @Input() showCount = false;\n\n characterStyles: Record = {\n [CharacterType.Emoji]: [],\n [CharacterType.Letter]: [\"tw-text-main\"],\n [CharacterType.Special]: [\"tw-text-danger\"],\n [CharacterType.Number]: [\"tw-text-primary-500\"],\n };\n\n @HostBinding(\"class\")\n get classList() {\n return [\"tw-min-w-0\", \"tw-whitespace-pre-wrap\", \"tw-break-all\"];\n }\n\n get passwordArray() {\n // Convert to an array to handle cases that strings have special characters, i.e.: emoji.\n return Array.from(this.password);\n }\n\n getCharacterClass(character: string) {\n const charType = this.getCharacterType(character);\n const charClass = this.characterStyles[charType];\n\n if (this.showCount) {\n return charClass.concat([\n \"tw-inline-flex\",\n \"tw-flex-col\",\n \"tw-items-center\",\n \"tw-w-7\",\n \"tw-py-1\",\n \"odd:tw-bg-secondary-100\",\n \"even:tw-bg-background\",\n ]);\n }\n\n return charClass;\n }\n\n private getCharacterType(character: string): CharacterType {\n if (character.match(Utils.regexpEmojiPresentation)) {\n return CharacterType.Emoji;\n }\n\n if (character.match(/\\d/)) {\n return CharacterType.Number;\n }\n\n const specials = [\"&\", \"<\", \">\", \" \"];\n if (specials.includes(character) || character.match(/[^\\w ]/)) {\n return CharacterType.Special;\n }\n\n return CharacterType.Letter;\n }\n}\n","import { CommonModule } from \"@angular/common\";\nimport { Component } from \"@angular/core\";\n\n/**\n * Generic container that constrains page content width.\n */\n@Component({\n selector: \"bit-container\",\n templateUrl: \"container.component.html\",\n imports: [CommonModule],\n standalone: true,\n})\nexport class ContainerComponent {}\n","
    \n \n
    \n","import { style, animate, trigger, transition, group } from \"@angular/animations\";\n\nexport const fadeIn = trigger(\"fadeIn\", [\n transition(\":enter\", [\n style({ opacity: 0, transform: \"translateY(-50px)\" }),\n group([\n animate(\"0.15s linear\", style({ opacity: 1 })),\n animate(\"0.3s ease-out\", style({ transform: \"none\" })),\n ]),\n ]),\n]);\n","import { DialogModule as CdkDialogModule } from \"@angular/cdk/dialog\";\nimport { NgModule } from \"@angular/core\";\nimport { ReactiveFormsModule } from \"@angular/forms\";\n\nimport { AsyncActionsModule } from \"../async-actions\";\nimport { ButtonModule } from \"../button\";\nimport { IconButtonModule } from \"../icon-button\";\nimport { SharedModule } from \"../shared\";\nimport { TypographyModule } from \"../typography\";\n\nimport { DialogComponent } from \"./dialog/dialog.component\";\nimport { DialogService } from \"./dialog.service\";\nimport { DialogCloseDirective } from \"./directives/dialog-close.directive\";\nimport { DialogTitleContainerDirective } from \"./directives/dialog-title-container.directive\";\nimport { SimpleConfigurableDialogComponent } from \"./simple-dialog/simple-configurable-dialog/simple-configurable-dialog.component\";\nimport { IconDirective, SimpleDialogComponent } from \"./simple-dialog/simple-dialog.component\";\n\n@NgModule({\n imports: [\n SharedModule,\n AsyncActionsModule,\n ButtonModule,\n CdkDialogModule,\n IconButtonModule,\n ReactiveFormsModule,\n TypographyModule,\n ],\n declarations: [\n DialogCloseDirective,\n DialogTitleContainerDirective,\n DialogComponent,\n SimpleDialogComponent,\n SimpleConfigurableDialogComponent,\n IconDirective,\n ],\n exports: [\n CdkDialogModule,\n DialogComponent,\n SimpleDialogComponent,\n DialogCloseDirective,\n IconDirective,\n ],\n providers: [DialogService],\n})\nexport class DialogModule {}\n","
    \n \n \n\n {{ title }}\n\n
    {{ content }}
    \n\n \n \n\n \n {{ cancelButtonText }}\n \n \n
    \n
    \n","import { DialogRef, DIALOG_DATA } from \"@angular/cdk/dialog\";\nimport { Component, Inject } from \"@angular/core\";\nimport { FormGroup } from \"@angular/forms\";\n\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\n\nimport { SimpleDialogOptions, SimpleDialogType, Translation } from \"../..\";\n\nconst DEFAULT_ICON: Record = {\n primary: \"bwi-business\",\n success: \"bwi-star\",\n info: \"bwi-info-circle\",\n warning: \"bwi-exclamation-triangle\",\n danger: \"bwi-error\",\n};\n\nconst DEFAULT_COLOR: Record = {\n primary: \"tw-text-primary-500\",\n success: \"tw-text-success\",\n info: \"tw-text-info\",\n warning: \"tw-text-warning\",\n danger: \"tw-text-danger\",\n};\n\n@Component({\n templateUrl: \"./simple-configurable-dialog.component.html\",\n})\nexport class SimpleConfigurableDialogComponent {\n get iconClasses() {\n return [\n this.simpleDialogOpts.icon ?? DEFAULT_ICON[this.simpleDialogOpts.type],\n DEFAULT_COLOR[this.simpleDialogOpts.type],\n ];\n }\n\n protected title: string;\n protected content: string;\n protected acceptButtonText: string;\n protected cancelButtonText: string;\n protected formGroup = new FormGroup({});\n\n protected showCancelButton = this.simpleDialogOpts.cancelButtonText !== null;\n\n constructor(\n public dialogRef: DialogRef,\n private i18nService: I18nService,\n @Inject(DIALOG_DATA) public simpleDialogOpts?: SimpleDialogOptions,\n ) {\n this.localizeText();\n }\n\n protected accept = async () => {\n if (this.simpleDialogOpts.acceptAction) {\n await this.simpleDialogOpts.acceptAction();\n }\n\n this.dialogRef.close(true);\n };\n\n private localizeText() {\n this.title = this.translate(this.simpleDialogOpts.title);\n this.content = this.translate(this.simpleDialogOpts.content);\n this.acceptButtonText = this.translate(this.simpleDialogOpts.acceptButtonText, \"yes\");\n\n if (this.showCancelButton) {\n // If accept text is overridden, use cancel, otherwise no\n this.cancelButtonText = this.translate(\n this.simpleDialogOpts.cancelButtonText,\n this.simpleDialogOpts.acceptButtonText !== undefined ? \"cancel\" : \"no\",\n );\n }\n }\n\n private translate(translation: string | Translation, defaultKey?: string): string {\n // Translation interface use implies we must localize.\n if (typeof translation === \"object\") {\n return this.i18nService.t(translation.key, ...(translation.placeholders ?? []));\n }\n\n // Use string that is already translated or use default key post translate\n return translation ?? this.i18nService.t(defaultKey);\n }\n}\n","import {\n DEFAULT_DIALOG_CONFIG,\n Dialog,\n DialogConfig,\n DialogRef,\n DIALOG_SCROLL_STRATEGY,\n} from \"@angular/cdk/dialog\";\nimport { ComponentType, Overlay, OverlayContainer } from \"@angular/cdk/overlay\";\nimport {\n Inject,\n Injectable,\n Injector,\n OnDestroy,\n Optional,\n SkipSelf,\n TemplateRef,\n} from \"@angular/core\";\nimport { NavigationEnd, Router } from \"@angular/router\";\nimport { filter, firstValueFrom, Subject, switchMap, takeUntil } from \"rxjs\";\n\nimport { AuthService } from \"@bitwarden/common/auth/abstractions/auth.service\";\nimport { AuthenticationStatus } from \"@bitwarden/common/auth/enums/authentication-status\";\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\n\nimport { SimpleConfigurableDialogComponent } from \"./simple-dialog/simple-configurable-dialog/simple-configurable-dialog.component\";\nimport { SimpleDialogOptions, Translation } from \"./simple-dialog/types\";\n\n@Injectable()\nexport class DialogService extends Dialog implements OnDestroy {\n private _destroy$ = new Subject();\n\n private backDropClasses = [\"tw-fixed\", \"tw-bg-black\", \"tw-bg-opacity-30\", \"tw-inset-0\"];\n\n constructor(\n /** Parent class constructor */\n _overlay: Overlay,\n _injector: Injector,\n @Optional() @Inject(DEFAULT_DIALOG_CONFIG) _defaultOptions: DialogConfig,\n @Optional() @SkipSelf() _parentDialog: Dialog,\n _overlayContainer: OverlayContainer,\n @Inject(DIALOG_SCROLL_STRATEGY) scrollStrategy: any,\n\n /** Not in parent class */\n @Optional() router: Router,\n @Optional() authService: AuthService,\n\n protected i18nService: I18nService,\n ) {\n super(_overlay, _injector, _defaultOptions, _parentDialog, _overlayContainer, scrollStrategy);\n\n /** Close all open dialogs if the vault locks */\n if (router && authService) {\n router.events\n .pipe(\n filter((event) => event instanceof NavigationEnd),\n switchMap(() => authService.getAuthStatus()),\n filter((v) => v !== AuthenticationStatus.Unlocked),\n takeUntil(this._destroy$),\n )\n .subscribe(() => this.closeAll());\n }\n }\n\n override ngOnDestroy(): void {\n this._destroy$.next();\n this._destroy$.complete();\n super.ngOnDestroy();\n }\n\n override open(\n componentOrTemplateRef: ComponentType | TemplateRef,\n config?: DialogConfig>,\n ): DialogRef {\n config = {\n backdropClass: this.backDropClasses,\n ...config,\n };\n\n return super.open(componentOrTemplateRef, config);\n }\n\n /**\n * Opens a simple dialog, returns true if the user accepted the dialog.\n *\n * @param {SimpleDialogOptions} simpleDialogOptions - An object containing options for the dialog.\n * @returns `boolean` - True if the user accepted the dialog, false otherwise.\n */\n async openSimpleDialog(simpleDialogOptions: SimpleDialogOptions): Promise {\n const dialogRef = this.openSimpleDialogRef(simpleDialogOptions);\n\n return firstValueFrom(dialogRef.closed);\n }\n\n /**\n * Opens a simple dialog.\n *\n * You should probably use `openSimpleDialog` instead, unless you need to programmatically close the dialog.\n *\n * @param {SimpleDialogOptions} simpleDialogOptions - An object containing options for the dialog.\n * @returns `DialogRef` - The reference to the opened dialog.\n * Contains a closed observable which can be subscribed to for determining which button\n * a user pressed\n */\n openSimpleDialogRef(simpleDialogOptions: SimpleDialogOptions): DialogRef {\n return this.open(SimpleConfigurableDialogComponent, {\n data: simpleDialogOptions,\n disableClose: simpleDialogOptions.disableClose,\n });\n }\n\n protected translate(translation: string | Translation, defaultKey?: string): string {\n if (translation == null && defaultKey == null) {\n return null;\n }\n\n if (translation == null) {\n return this.i18nService.t(defaultKey);\n }\n\n // Translation interface use implies we must localize.\n if (typeof translation === \"object\") {\n return this.i18nService.t(translation.key, ...(translation.placeholders ?? []));\n }\n\n return translation;\n }\n}\n","\n \n

    \n {{ title }}\n \n {{ subtitle }}\n \n \n

    \n \n \n\n
    \n \n \n
    \n \n \n \n \n\n \n \n \n\n","import { coerceBooleanProperty } from \"@angular/cdk/coercion\";\nimport { Component, HostBinding, Input } from \"@angular/core\";\n\nimport { fadeIn } from \"../animations\";\n\n@Component({\n selector: \"bit-dialog\",\n templateUrl: \"./dialog.component.html\",\n animations: [fadeIn],\n})\nexport class DialogComponent {\n /**\n * Dialog size, more complex dialogs should use large, otherwise default is fine.\n */\n @Input() dialogSize: \"small\" | \"default\" | \"large\" = \"default\";\n\n /**\n * Title to show in the dialog's header\n */\n @Input() title: string;\n\n /**\n * Subtitle to show in the dialog's header\n */\n @Input() subtitle: string;\n\n private _disablePadding = false;\n /**\n * Disable the built-in padding on the dialog, for use with tabbed dialogs.\n */\n @Input() set disablePadding(value: boolean | \"\") {\n this._disablePadding = coerceBooleanProperty(value);\n }\n get disablePadding() {\n return this._disablePadding;\n }\n\n /**\n * Mark the dialog as loading which replaces the content with a spinner.\n */\n @Input() loading = false;\n\n @HostBinding(\"class\") get classes() {\n return [\"tw-flex\", \"tw-flex-col\", \"tw-max-h-screen\", \"tw-w-screen\", \"tw-p-4\"].concat(\n this.width,\n );\n }\n\n get width() {\n switch (this.dialogSize) {\n case \"small\": {\n return \"tw-max-w-sm\";\n }\n case \"large\": {\n return \"tw-max-w-3xl\";\n }\n default: {\n return \"tw-max-w-xl\";\n }\n }\n }\n}\n","import { DialogRef } from \"@angular/cdk/dialog\";\nimport { Directive, HostBinding, HostListener, Input, Optional } from \"@angular/core\";\n\n@Directive({\n selector: \"[bitDialogClose]\",\n})\nexport class DialogCloseDirective {\n @Input(\"bitDialogClose\") dialogResult: any;\n\n constructor(@Optional() public dialogRef: DialogRef) {}\n\n @HostBinding(\"attr.disabled\")\n get disableClose() {\n return this.dialogRef?.disableClose ? true : null;\n }\n\n @HostListener(\"click\")\n close(): void {\n if (this.disableClose) {\n return;\n }\n\n this.dialogRef.close(this.dialogResult);\n }\n}\n","import { CdkDialogContainer, DialogRef } from \"@angular/cdk/dialog\";\nimport { Directive, HostBinding, Input, OnInit, Optional } from \"@angular/core\";\n\n// Increments for each instance of this component\nlet nextId = 0;\n\n@Directive({\n selector: \"[bitDialogTitleContainer]\",\n})\nexport class DialogTitleContainerDirective implements OnInit {\n @HostBinding(\"id\") id = `bit-dialog-title-${nextId++}`;\n\n @Input() simple = false;\n\n constructor(@Optional() private dialogRef: DialogRef) {}\n\n ngOnInit(): void {\n // Based on angular/components, licensed under MIT\n // https://github.com/angular/components/blob/14.2.0/src/material/dialog/dialog-content-directives.ts#L121-L128\n if (this.dialogRef) {\n // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n Promise.resolve().then(() => {\n const container = this.dialogRef.containerInstance as CdkDialogContainer;\n\n if (container && container._ariaLabelledByQueue.length === 0) {\n container._ariaLabelledByQueue.push(this.id);\n }\n });\n }\n }\n}\n","\n
    \n \n \n \n \n \n \n

    \n \n

    \n
    \n
    \n \n
    \n \n \n \n\n","import { Component, ContentChild, Directive } from \"@angular/core\";\n\nimport { fadeIn } from \"../animations\";\n\n@Directive({ selector: \"[bitDialogIcon]\" })\nexport class IconDirective {}\n\n@Component({\n selector: \"bit-simple-dialog\",\n templateUrl: \"./simple-dialog.component.html\",\n animations: [fadeIn],\n})\nexport class SimpleDialogComponent {\n @ContentChild(IconDirective) icon!: IconDirective;\n\n get hasIcon() {\n return this.icon != null;\n }\n}\n","export abstract class BitFormControlAbstraction {\n disabled: boolean;\n required: boolean;\n hasError: boolean;\n error: [string, any];\n}\n","\n
    \n {{ displayError }}\n
    \n","import { coerceBooleanProperty } from \"@angular/cdk/coercion\";\nimport { Component, ContentChild, HostBinding, Input } from \"@angular/core\";\n\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\n\nimport { BitFormControlAbstraction } from \"./form-control.abstraction\";\n\n@Component({\n selector: \"bit-form-control\",\n templateUrl: \"form-control.component.html\",\n})\nexport class FormControlComponent {\n @Input() label: string;\n\n private _inline = false;\n @Input() get inline() {\n return this._inline;\n }\n set inline(value: boolean | \"\") {\n this._inline = coerceBooleanProperty(value);\n }\n\n private _disableMargin = false;\n @Input() set disableMargin(value: boolean | \"\") {\n this._disableMargin = coerceBooleanProperty(value);\n }\n get disableMargin() {\n return this._disableMargin;\n }\n\n @ContentChild(BitFormControlAbstraction) protected formControl: BitFormControlAbstraction;\n\n @HostBinding(\"class\") get classes() {\n return []\n .concat(this.inline ? [\"tw-inline-block\", \"tw-mr-4\"] : [\"tw-block\"])\n .concat(this.disableMargin ? [] : [\"tw-mb-6\"]);\n }\n\n constructor(private i18nService: I18nService) {}\n\n protected get labelClasses() {\n return [\n \"tw-transition\",\n \"tw-select-none\",\n \"tw-mb-0\",\n \"tw-inline-flex\",\n \"tw-items-baseline\",\n ].concat(this.formControl.disabled ? \"tw-cursor-auto\" : \"tw-cursor-pointer\");\n }\n\n protected get labelContentClasses() {\n return [\"tw-inline-flex\", \"tw-flex-col\", \"tw-font-semibold\"].concat(\n this.formControl.disabled ? \"tw-text-muted\" : \"tw-text-main\",\n );\n }\n\n get required() {\n return this.formControl.required;\n }\n\n get hasError() {\n return this.formControl.hasError;\n }\n\n get error() {\n return this.formControl.error;\n }\n\n get displayError() {\n switch (this.error[0]) {\n case \"required\":\n return this.i18nService.t(\"inputRequired\");\n default:\n // Attempt to show a custom error message.\n if (this.error[1]?.message) {\n return this.error[1]?.message;\n }\n\n return this.error;\n }\n }\n}\n","import { NgModule } from \"@angular/core\";\n\nimport { SharedModule } from \"../shared\";\n\nimport { FormControlComponent } from \"./form-control.component\";\nimport { BitHintComponent } from \"./hint.component\";\nimport { BitLabel } from \"./label.directive\";\n\n@NgModule({\n imports: [SharedModule],\n declarations: [FormControlComponent, BitLabel, BitHintComponent],\n exports: [FormControlComponent, BitLabel, BitHintComponent],\n})\nexport class FormControlModule {}\n","import { Directive, HostBinding } from \"@angular/core\";\n\n// Increments for each instance of this component\nlet nextId = 0;\n\n@Directive({\n selector: \"bit-hint\",\n host: {\n class: \"tw-text-muted tw-font-normal tw-inline-block tw-mt-1\",\n },\n})\nexport class BitHintComponent {\n @HostBinding() id = `bit-hint-${nextId++}`;\n}\n","import { Directive } from \"@angular/core\";\n\n@Directive({\n selector: \"bit-label\",\n})\nexport class BitLabel {}\n","import { Component, Input } from \"@angular/core\";\nimport { AbstractControl, UntypedFormGroup } from \"@angular/forms\";\n\n@Component({\n selector: \"bit-error-summary\",\n template: ` 0\">\n {{ \"fieldsNeedAttention\" | i18n: errorString }}\n `,\n host: {\n class: \"tw-block tw-text-danger tw-mt-2\",\n \"aria-live\": \"assertive\",\n },\n})\nexport class BitErrorSummary {\n @Input()\n formGroup: UntypedFormGroup;\n\n get errorCount(): number {\n return this.getErrorCount(this.formGroup);\n }\n\n get errorString() {\n return this.errorCount.toString();\n }\n\n private getErrorCount(form: UntypedFormGroup): number {\n return Object.values(form.controls).reduce((acc: number, control: AbstractControl) => {\n if (control instanceof UntypedFormGroup) {\n return acc + this.getErrorCount(control);\n }\n\n if (control.errors == null) {\n return acc;\n }\n\n if (!control.dirty && control.untouched) {\n return acc;\n }\n\n return acc + Object.keys(control.errors).length;\n }, 0);\n }\n}\n","export type InputTypes =\n | \"text\"\n | \"password\"\n | \"number\"\n | \"datetime-local\"\n | \"email\"\n | \"checkbox\"\n | \"search\"\n | \"file\"\n | \"date\"\n | \"time\";\n\nexport abstract class BitFormFieldControl {\n ariaDescribedBy: string;\n id: string;\n labelForId: string;\n required: boolean;\n hasError: boolean;\n error: [string, any];\n type?: InputTypes;\n spellcheck?: boolean;\n focus?: () => void;\n}\n","import { Component, HostBinding, Input } from \"@angular/core\";\n\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\n\n// Increments for each instance of this component\nlet nextId = 0;\n\n@Component({\n selector: \"bit-error\",\n template: ` {{ displayError }}`,\n host: {\n class: \"tw-block tw-mt-1 tw-text-danger\",\n \"aria-live\": \"assertive\",\n },\n})\nexport class BitErrorComponent {\n @HostBinding() id = `bit-error-${nextId++}`;\n\n @Input() error: [string, any];\n\n constructor(private i18nService: I18nService) {}\n\n get displayError() {\n switch (this.error[0]) {\n case \"required\":\n return this.i18nService.t(\"inputRequired\");\n case \"email\":\n return this.i18nService.t(\"inputEmail\");\n case \"minlength\":\n return this.i18nService.t(\"inputMinLength\", this.error[1]?.requiredLength);\n case \"maxlength\":\n return this.i18nService.t(\"inputMaxLength\", this.error[1]?.requiredLength);\n case \"min\":\n return this.i18nService.t(\"inputMinValue\", this.error[1]?.min);\n case \"max\":\n return this.i18nService.t(\"inputMaxValue\", this.error[1]?.max);\n case \"forbiddenCharacters\":\n return this.i18nService.t(\"inputForbiddenCharacters\", this.error[1]?.characters.join(\", \"));\n case \"multipleEmails\":\n return this.i18nService.t(\"multipleInputEmails\");\n case \"trim\":\n return this.i18nService.t(\"inputTrimValidator\");\n default:\n // Attempt to show a custom error message.\n if (this.error[1]?.message) {\n return this.error[1]?.message;\n }\n\n return this.error;\n }\n }\n}\n","\n
    \n
    \n \n
    \n \n
    \n \n
    \n
    \n\n \n \n\n","import { coerceBooleanProperty } from \"@angular/cdk/coercion\";\nimport {\n AfterContentChecked,\n Component,\n ContentChild,\n ContentChildren,\n HostBinding,\n Input,\n QueryList,\n ViewChild,\n} from \"@angular/core\";\n\nimport { BitHintComponent } from \"../form-control/hint.component\";\n\nimport { BitErrorComponent } from \"./error.component\";\nimport { BitFormFieldControl } from \"./form-field-control\";\nimport { BitPrefixDirective } from \"./prefix.directive\";\nimport { BitSuffixDirective } from \"./suffix.directive\";\n\n@Component({\n selector: \"bit-form-field\",\n templateUrl: \"./form-field.component.html\",\n})\nexport class BitFormFieldComponent implements AfterContentChecked {\n @ContentChild(BitFormFieldControl) input: BitFormFieldControl;\n @ContentChild(BitHintComponent) hint: BitHintComponent;\n\n @ViewChild(BitErrorComponent) error: BitErrorComponent;\n\n @ContentChildren(BitPrefixDirective) prefixChildren: QueryList;\n @ContentChildren(BitSuffixDirective) suffixChildren: QueryList;\n\n private _disableMargin = false;\n @Input() set disableMargin(value: boolean | \"\") {\n this._disableMargin = coerceBooleanProperty(value);\n }\n get disableMargin() {\n return this._disableMargin;\n }\n\n @HostBinding(\"class\")\n get classList() {\n return [\"tw-block\"].concat(this.disableMargin ? [] : [\"tw-mb-6\"]);\n }\n\n ngAfterContentChecked(): void {\n if (this.error) {\n this.input.ariaDescribedBy = this.error.id;\n } else if (this.hint) {\n this.input.ariaDescribedBy = this.hint.id;\n } else {\n this.input.ariaDescribedBy = undefined;\n }\n }\n}\n","import { NgModule } from \"@angular/core\";\n\nimport { FormControlModule } from \"../form-control\";\nimport { BitInputDirective } from \"../input/input.directive\";\nimport { InputModule } from \"../input/input.module\";\nimport { MultiSelectComponent } from \"../multi-select/multi-select.component\";\nimport { MultiSelectModule } from \"../multi-select/multi-select.module\";\nimport { SharedModule } from \"../shared\";\n\nimport { BitErrorSummary } from \"./error-summary.component\";\nimport { BitErrorComponent } from \"./error.component\";\nimport { BitFormFieldComponent } from \"./form-field.component\";\nimport { BitPasswordInputToggleDirective } from \"./password-input-toggle.directive\";\nimport { BitPrefixDirective } from \"./prefix.directive\";\nimport { BitSuffixDirective } from \"./suffix.directive\";\n\n@NgModule({\n imports: [SharedModule, FormControlModule, InputModule, MultiSelectModule],\n declarations: [\n BitErrorComponent,\n BitErrorSummary,\n BitFormFieldComponent,\n BitPasswordInputToggleDirective,\n BitPrefixDirective,\n BitSuffixDirective,\n ],\n exports: [\n BitErrorComponent,\n BitErrorSummary,\n BitFormFieldComponent,\n BitInputDirective,\n BitPasswordInputToggleDirective,\n BitPrefixDirective,\n BitSuffixDirective,\n MultiSelectComponent,\n FormControlModule,\n ],\n})\nexport class FormFieldModule {}\n","import {\n AfterContentInit,\n Directive,\n EventEmitter,\n Host,\n HostBinding,\n HostListener,\n Input,\n OnChanges,\n Output,\n} from \"@angular/core\";\n\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\n\nimport { BitIconButtonComponent } from \"../icon-button/icon-button.component\";\n\nimport { BitFormFieldComponent } from \"./form-field.component\";\n\n@Directive({\n selector: \"[bitPasswordInputToggle]\",\n})\nexport class BitPasswordInputToggleDirective implements AfterContentInit, OnChanges {\n /**\n * Whether the input is toggled to show the password.\n */\n @HostBinding(\"attr.aria-pressed\") @Input() toggled = false;\n @Output() toggledChange = new EventEmitter();\n\n @HostBinding(\"attr.title\") title = this.i18nService.t(\"toggleVisibility\");\n @HostBinding(\"attr.aria-label\") label = this.i18nService.t(\"toggleVisibility\");\n\n /**\n * Click handler to toggle the state of the input type.\n */\n @HostListener(\"click\") onClick() {\n this.toggled = !this.toggled;\n this.toggledChange.emit(this.toggled);\n\n this.update();\n\n this.formField.input?.focus();\n }\n\n constructor(\n @Host() private button: BitIconButtonComponent,\n private formField: BitFormFieldComponent,\n private i18nService: I18nService,\n ) {}\n\n get icon() {\n return this.toggled ? \"bwi-eye-slash\" : \"bwi-eye\";\n }\n\n ngOnChanges(): void {\n this.update();\n }\n\n ngAfterContentInit(): void {\n this.toggled = this.formField.input.type !== \"password\";\n this.button.icon = this.icon;\n }\n\n private update() {\n this.button.icon = this.icon;\n if (this.formField.input?.type != null) {\n this.formField.input.type = this.toggled ? \"text\" : \"password\";\n this.formField.input.spellcheck = this.toggled ? false : undefined;\n }\n }\n}\n","import { Directive, HostBinding, Input, OnInit, Optional } from \"@angular/core\";\n\nimport { ButtonLikeAbstraction } from \"../shared/button-like.abstraction\";\n\nexport const PrefixClasses = [\n \"tw-bg-background-alt\",\n \"tw-border\",\n \"tw-border-solid\",\n \"tw-border-secondary-500\",\n \"tw-text-muted\",\n \"tw-rounded-none\",\n];\n\nexport const PrefixButtonClasses = [\n \"hover:tw-bg-text-muted\",\n \"hover:tw-text-contrast\",\n \"disabled:tw-opacity-100\",\n \"disabled:tw-bg-secondary-100\",\n \"disabled:hover:tw-bg-secondary-100\",\n \"disabled:hover:tw-text-muted\",\n \"focus-visible:tw-ring-primary-700\",\n\n \"focus-visible:tw-border-primary-700\",\n \"focus-visible:tw-ring-1\",\n \"focus-visible:tw-ring-inset\",\n \"focus-visible:tw-ring-primary-700\",\n \"focus-visible:tw-z-10\",\n];\n\nexport const PrefixStaticContentClasses = [\"tw-block\", \"tw-px-3\", \"tw-py-1.5\"];\n\n@Directive({\n selector: \"[bitPrefix]\",\n})\nexport class BitPrefixDirective implements OnInit {\n constructor(@Optional() private buttonComponent: ButtonLikeAbstraction) {}\n\n @HostBinding(\"class\") @Input() get classList() {\n return PrefixClasses.concat([\n \"tw-border-r-0\",\n \"first:tw-rounded-l\",\n\n \"focus-visible:tw-border-r\",\n \"focus-visible:tw-mr-[-1px]\",\n ]).concat(this.buttonComponent != undefined ? PrefixButtonClasses : PrefixStaticContentClasses);\n }\n\n ngOnInit(): void {\n this.buttonComponent?.setButtonType(\"unstyled\");\n }\n}\n","import { Directive, HostBinding, Input, Optional } from \"@angular/core\";\n\nimport { ButtonLikeAbstraction } from \"../shared/button-like.abstraction\";\n\nimport { PrefixButtonClasses, PrefixClasses, PrefixStaticContentClasses } from \"./prefix.directive\";\n\n@Directive({\n selector: \"[bitSuffix]\",\n})\nexport class BitSuffixDirective {\n constructor(@Optional() private buttonComponent: ButtonLikeAbstraction) {}\n\n @HostBinding(\"class\") @Input() get classList() {\n return PrefixClasses.concat([\n \"tw-border-l-0\",\n \"last:tw-rounded-r\",\n\n \"focus-visible:tw-border-l\",\n \"focus-visible:tw-ml-[-1px]\",\n ]).concat(this.buttonComponent != undefined ? PrefixButtonClasses : PrefixStaticContentClasses);\n }\n\n ngOnInit(): void {\n this.buttonComponent?.setButtonType(\"unstyled\");\n }\n}\n","import { Component, HostBinding, Input } from \"@angular/core\";\n\nimport { ButtonLikeAbstraction, ButtonType } from \"../shared/button-like.abstraction\";\n\nexport type IconButtonType = ButtonType | \"contrast\" | \"main\" | \"muted\" | \"light\";\n\nconst focusRing = [\n // Workaround for box-shadow with transparent offset issue:\n // https://github.com/tailwindlabs/tailwindcss/issues/3595\n // Remove `before:` and use regular `tw-ring` when browser no longer has bug, or better:\n // switch to `outline` with `outline-offset` when Safari supports border radius on outline.\n // Using `box-shadow` to create outlines is a hack and as such `outline` should be preferred.\n \"tw-relative\",\n \"before:tw-content-['']\",\n \"before:tw-block\",\n \"before:tw-absolute\",\n \"before:-tw-inset-[3px]\",\n \"before:tw-rounded-md\",\n \"before:tw-transition\",\n \"before:tw-ring\",\n \"before:tw-ring-transparent\",\n \"focus-visible:tw-z-10\",\n];\n\nconst styles: Record = {\n contrast: [\n \"tw-bg-transparent\",\n \"!tw-text-contrast\",\n \"tw-border-transparent\",\n \"hover:tw-bg-transparent-hover\",\n \"hover:tw-border-text-contrast\",\n \"focus-visible:before:tw-ring-text-contrast\",\n \"disabled:tw-opacity-60\",\n \"disabled:hover:tw-border-transparent\",\n \"disabled:hover:tw-bg-transparent\",\n ...focusRing,\n ],\n main: [\n \"tw-bg-transparent\",\n \"!tw-text-main\",\n \"tw-border-transparent\",\n \"hover:tw-bg-transparent-hover\",\n \"hover:tw-border-text-main\",\n \"focus-visible:before:tw-ring-text-main\",\n \"disabled:tw-opacity-60\",\n \"disabled:hover:tw-border-transparent\",\n \"disabled:hover:tw-bg-transparent\",\n ...focusRing,\n ],\n muted: [\n \"tw-bg-transparent\",\n \"!tw-text-muted\",\n \"tw-border-transparent\",\n \"hover:tw-bg-transparent-hover\",\n \"hover:tw-border-primary-700\",\n \"focus-visible:before:tw-ring-primary-700\",\n \"disabled:tw-opacity-60\",\n \"disabled:hover:tw-border-transparent\",\n \"disabled:hover:tw-bg-transparent\",\n ...focusRing,\n ],\n primary: [\n \"tw-bg-primary-500\",\n \"!tw-text-contrast\",\n \"tw-border-primary-500\",\n \"hover:tw-bg-primary-700\",\n \"hover:tw-border-primary-700\",\n \"focus-visible:before:tw-ring-primary-700\",\n \"disabled:tw-opacity-60\",\n \"disabled:hover:tw-border-primary-500\",\n \"disabled:hover:tw-bg-primary-500\",\n ...focusRing,\n ],\n secondary: [\n \"tw-bg-transparent\",\n \"!tw-text-muted\",\n \"tw-border-text-muted\",\n \"hover:!tw-text-contrast\",\n \"hover:tw-bg-text-muted\",\n \"focus-visible:before:tw-ring-primary-700\",\n \"disabled:tw-opacity-60\",\n \"disabled:hover:tw-border-text-muted\",\n \"disabled:hover:tw-bg-transparent\",\n \"disabled:hover:!tw-text-muted\",\n \"disabled:hover:tw-border-text-muted\",\n ...focusRing,\n ],\n danger: [\n \"tw-bg-transparent\",\n \"!tw-text-danger\",\n \"tw-border-danger-500\",\n \"hover:!tw-text-contrast\",\n \"hover:tw-bg-danger-500\",\n \"focus-visible:before:tw-ring-primary-700\",\n \"disabled:tw-opacity-60\",\n \"disabled:hover:tw-border-danger-500\",\n \"disabled:hover:tw-bg-transparent\",\n \"disabled:hover:!tw-text-danger\",\n \"disabled:hover:tw-border-danger-500\",\n ...focusRing,\n ],\n light: [\n \"tw-bg-transparent\",\n \"!tw-text-alt2\",\n \"tw-border-transparent\",\n \"hover:tw-bg-transparent-hover\",\n \"hover:tw-border-text-alt2\",\n \"focus-visible:before:tw-ring-text-alt2\",\n \"disabled:hover:tw-border-transparent\",\n \"disabled:hover:tw-bg-transparent\",\n ...focusRing,\n ],\n unstyled: [],\n};\n\nexport type IconButtonSize = \"default\" | \"small\";\n\nconst sizes: Record = {\n default: [\"tw-px-2.5\", \"tw-py-1.5\"],\n small: [\"tw-leading-none\", \"tw-text-base\", \"tw-p-1\"],\n};\n\n@Component({\n selector: \"button[bitIconButton]:not(button[bitButton])\",\n templateUrl: \"icon-button.component.html\",\n providers: [{ provide: ButtonLikeAbstraction, useExisting: BitIconButtonComponent }],\n})\nexport class BitIconButtonComponent implements ButtonLikeAbstraction {\n @Input(\"bitIconButton\") icon: string;\n\n @Input() buttonType: IconButtonType;\n\n @Input() size: IconButtonSize = \"default\";\n\n @HostBinding(\"class\") get classList() {\n return [\n \"tw-font-semibold\",\n \"tw-border\",\n \"tw-border-solid\",\n \"tw-rounded\",\n \"tw-transition\",\n \"hover:tw-no-underline\",\n \"focus:tw-outline-none\",\n ]\n .concat(styles[this.buttonType ?? \"main\"])\n .concat(sizes[this.size]);\n }\n\n get iconClass() {\n return [this.icon, \"!tw-m-0\"];\n }\n\n @HostBinding(\"attr.disabled\")\n get disabledAttr() {\n const disabled = this.disabled != null && this.disabled !== false;\n return disabled || this.loading ? true : null;\n }\n\n @Input() loading = false;\n @Input() disabled = false;\n\n setButtonType(value: \"primary\" | \"secondary\" | \"danger\" | \"unstyled\") {\n this.buttonType = value;\n }\n}\n","\n \n \n \n \n \n \n\n","import { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\n\nimport { BitIconButtonComponent } from \"./icon-button.component\";\n\n@NgModule({\n imports: [CommonModule],\n declarations: [BitIconButtonComponent],\n exports: [BitIconButtonComponent],\n})\nexport class IconButtonModule {}\n","import { Component, HostBinding, Input } from \"@angular/core\";\nimport { DomSanitizer, SafeHtml } from \"@angular/platform-browser\";\n\nimport { Icon, isIcon } from \"./icon\";\n\n@Component({\n selector: \"bit-icon\",\n template: ``,\n})\nexport class BitIconComponent {\n @Input() set icon(icon: Icon) {\n if (!isIcon(icon)) {\n this.innerHtml = \"\";\n return;\n }\n\n const svg = icon.svg;\n this.innerHtml = this.domSanitizer.bypassSecurityTrustHtml(svg);\n }\n\n @HostBinding() innerHtml: SafeHtml;\n\n constructor(private domSanitizer: DomSanitizer) {}\n}\n","import { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\n\nimport { BitIconComponent } from \"./icon.component\";\n\n@NgModule({\n imports: [CommonModule],\n declarations: [BitIconComponent],\n exports: [BitIconComponent],\n})\nexport class IconModule {}\n","class Icon {\n constructor(readonly svg: string) {}\n}\n\n// We only export the type to prohibit the creation of Icons without using\n// the `svgIcon` template literal tag.\nexport type { Icon };\n\nexport function isIcon(icon: unknown): icon is Icon {\n return icon instanceof Icon;\n}\n\nexport class DynamicContentNotAllowedError extends Error {\n constructor() {\n super(\"Dynamic content in icons is not allowed due to risk of user-injected XSS.\");\n }\n}\n\nexport function svgIcon(strings: TemplateStringsArray, ...values: unknown[]): Icon {\n if (values.length > 0) {\n throw new DynamicContentNotAllowedError();\n }\n\n return new Icon(strings[0]);\n}\n","import { svgIcon } from \"../icon\";\n\nexport const Search = svgIcon`\n\n \n \n \n \n \n \n \n \n \n \n \n \n\n`;\n","import { Directive, ElementRef, Input, NgZone, Optional } from \"@angular/core\";\nimport { take } from \"rxjs/operators\";\n\nimport { Utils } from \"@bitwarden/common/platform/misc/utils\";\n\n/**\n * Interface for implementing focusable components. Used by the AutofocusDirective.\n */\nexport abstract class FocusableElement {\n focus: () => void;\n}\n\n/**\n * Directive to focus an element.\n *\n * @remarks\n *\n * If the component provides the `FocusableElement` interface, the `focus`\n * method will be called. Otherwise, the native element will be focused.\n */\n@Directive({\n selector: \"[appAutofocus], [bitAutofocus]\",\n})\nexport class AutofocusDirective {\n @Input() set appAutofocus(condition: boolean | string) {\n this.autofocus = condition === \"\" || condition === true;\n }\n\n private autofocus: boolean;\n\n constructor(\n private el: ElementRef,\n private ngZone: NgZone,\n @Optional() private focusableElement: FocusableElement,\n ) {}\n\n ngOnInit() {\n if (!Utils.isMobileBrowser && this.autofocus) {\n if (this.ngZone.isStable) {\n this.focus();\n } else {\n this.ngZone.onStable.pipe(take(1)).subscribe(this.focus.bind(this));\n }\n }\n }\n\n private focus() {\n if (this.focusableElement) {\n this.focusableElement.focus();\n } else {\n this.el.nativeElement.focus();\n }\n }\n}\n","import {\n Directive,\n ElementRef,\n HostBinding,\n HostListener,\n Input,\n NgZone,\n Optional,\n Self,\n} from \"@angular/core\";\nimport { NgControl, Validators } from \"@angular/forms\";\n\nimport { BitFormFieldControl, InputTypes } from \"../form-field/form-field-control\";\n\n// Increments for each instance of this component\nlet nextId = 0;\n\n@Directive({\n selector: \"input[bitInput], select[bitInput], textarea[bitInput]\",\n providers: [{ provide: BitFormFieldControl, useExisting: BitInputDirective }],\n})\nexport class BitInputDirective implements BitFormFieldControl {\n @HostBinding(\"class\") @Input() get classList() {\n return [\n \"tw-block\",\n \"tw-w-full\",\n \"tw-px-3\",\n \"tw-py-1.5\",\n \"tw-bg-background-alt\",\n \"tw-border\",\n \"tw-border-solid\",\n this.hasError ? \"tw-border-danger-500\" : \"tw-border-secondary-500\",\n \"tw-text-main\",\n \"tw-placeholder-text-muted\",\n // Rounded\n \"tw-rounded-none\",\n \"first:tw-rounded-l\",\n \"last:tw-rounded-r\",\n // Focus\n \"focus:tw-outline-none\",\n \"focus:tw-border-primary-700\",\n \"focus:tw-ring-1\",\n \"focus:tw-ring-inset\",\n \"focus:tw-ring-primary-700\",\n \"focus:tw-z-10\",\n \"disabled:tw-bg-secondary-100\",\n \"[&:is(input,textarea):read-only]:tw-bg-secondary-100\",\n ].filter((s) => s != \"\");\n }\n\n @HostBinding() @Input() id = `bit-input-${nextId++}`;\n\n @HostBinding(\"attr.aria-describedby\") ariaDescribedBy: string;\n\n @HostBinding(\"attr.aria-invalid\") get ariaInvalid() {\n return this.hasError ? true : undefined;\n }\n\n @HostBinding(\"attr.type\") @Input() type?: InputTypes;\n\n @HostBinding(\"attr.spellcheck\") @Input() spellcheck?: boolean;\n\n @HostBinding()\n @Input()\n get required() {\n return this._required ?? this.ngControl?.control?.hasValidator(Validators.required) ?? false;\n }\n set required(value: any) {\n this._required = value != null && value !== false;\n }\n private _required: boolean;\n\n @Input() hasPrefix = false;\n @Input() hasSuffix = false;\n\n @Input() showErrorsWhenDisabled? = false;\n\n get labelForId(): string {\n return this.id;\n }\n\n @HostListener(\"input\")\n onInput() {\n this.ngControl?.control?.markAsUntouched();\n }\n\n get hasError() {\n if (this.showErrorsWhenDisabled) {\n return (\n (this.ngControl?.status === \"INVALID\" || this.ngControl?.status === \"DISABLED\") &&\n this.ngControl?.touched &&\n this.ngControl?.errors != null\n );\n } else {\n return this.ngControl?.status === \"INVALID\" && this.ngControl?.touched;\n }\n }\n\n get error(): [string, any] {\n const key = Object.keys(this.ngControl.errors)[0];\n return [key, this.ngControl.errors[key]];\n }\n\n constructor(\n @Optional() @Self() private ngControl: NgControl,\n private ngZone: NgZone,\n private elementRef: ElementRef,\n ) {}\n\n focus() {\n this.ngZone.runOutsideAngular(() => {\n const end = this.elementRef.nativeElement.value.length;\n this.elementRef.nativeElement.setSelectionRange(end, end);\n this.elementRef.nativeElement.focus();\n });\n }\n}\n","import { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\n\nimport { BitInputDirective } from \"./input.directive\";\n\n@NgModule({\n imports: [CommonModule],\n declarations: [BitInputDirective],\n exports: [BitInputDirective],\n})\nexport class InputModule {}\n","import { Component, Input } from \"@angular/core\";\nimport { RouterModule } from \"@angular/router\";\n\nimport { LinkModule } from \"../link\";\nimport { SharedModule } from \"../shared\";\n\nexport type LayoutVariant = \"primary\" | \"secondary\";\n\n@Component({\n selector: \"bit-layout\",\n templateUrl: \"layout.component.html\",\n standalone: true,\n imports: [SharedModule, LinkModule, RouterModule],\n})\nexport class LayoutComponent {\n protected mainContentId = \"main-content\";\n\n @Input() variant: LayoutVariant = \"primary\";\n\n focusMainContent() {\n document.getElementById(this.mainContentId)?.focus();\n }\n}\n","\n \n\n
    \n \n \n \n \n \n \n
    \n","import { Input, HostBinding, Directive } from \"@angular/core\";\n\nexport type LinkType = \"primary\" | \"secondary\" | \"contrast\" | \"light\";\n\nconst linkStyles: Record = {\n primary: [\n \"!tw-text-primary-500\",\n \"hover:!tw-text-primary-500\",\n \"focus-visible:before:tw-ring-primary-700\",\n \"disabled:!tw-text-primary-500/60\",\n ],\n secondary: [\n \"!tw-text-main\",\n \"hover:!tw-text-main\",\n \"focus-visible:before:tw-ring-primary-700\",\n \"disabled:!tw-text-muted/60\",\n ],\n contrast: [\n \"!tw-text-contrast\",\n \"hover:!tw-text-contrast\",\n \"focus-visible:before:tw-ring-text-contrast\",\n \"disabled:!tw-text-contrast/60\",\n ],\n light: [\n \"!tw-text-alt2\",\n \"hover:!tw-text-alt2\",\n \"focus-visible:before:tw-ring-text-alt2\",\n \"disabled:!tw-text-alt2/60\",\n ],\n};\n\nconst commonStyles = [\n \"tw-text-unset\",\n \"tw-leading-none\",\n \"tw-p-0\",\n \"tw-font-semibold\",\n \"tw-bg-transparent\",\n \"tw-border-0\",\n \"tw-border-none\",\n \"tw-rounded\",\n \"tw-transition\",\n \"hover:tw-underline\",\n \"hover:tw-decoration-1\",\n \"disabled:tw-no-underline\",\n \"disabled:tw-cursor-not-allowed\",\n \"focus-visible:tw-outline-none\",\n \"focus-visible:tw-underline\",\n \"focus-visible:tw-decoration-1\",\n\n // Workaround for html button tag not being able to be set to `display: inline`\n // and at the same time not being able to use `tw-ring-offset` because of box-shadow issue.\n // https://github.com/w3c/csswg-drafts/issues/3226\n // Add `tw-inline`, add `tw-py-0.5` and use regular `tw-ring` if issue is fixed.\n //\n // https://github.com/tailwindlabs/tailwindcss/issues/3595\n // Remove `before:` and use regular `tw-ring` when browser no longer has bug, or better:\n // switch to `outline` with `outline-offset` when Safari supports border radius on outline.\n // Using `box-shadow` to create outlines is a hack and as such `outline` should be preferred.\n \"tw-relative\",\n \"before:tw-content-['']\",\n \"before:tw-block\",\n \"before:tw-absolute\",\n \"before:-tw-inset-x-[0.1em]\",\n \"before:tw-rounded-md\",\n \"before:tw-transition\",\n \"focus-visible:before:tw-ring-2\",\n \"focus-visible:tw-z-10\",\n];\n\n@Directive()\nabstract class LinkDirective {\n @Input()\n linkType: LinkType = \"primary\";\n}\n\n@Directive({\n selector: \"a[bitLink]\",\n})\nexport class AnchorLinkDirective extends LinkDirective {\n @HostBinding(\"class\") get classList() {\n return [\"before:-tw-inset-y-[0.125rem]\"]\n .concat(commonStyles)\n .concat(linkStyles[this.linkType] ?? []);\n }\n}\n\n@Directive({\n selector: \"button[bitLink]\",\n})\nexport class ButtonLinkDirective extends LinkDirective {\n @HostBinding(\"class\") get classList() {\n return [\"before:-tw-inset-y-[0.25rem]\"]\n .concat(commonStyles)\n .concat(linkStyles[this.linkType] ?? []);\n }\n}\n","import { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\n\nimport { AnchorLinkDirective, ButtonLinkDirective } from \"./link.directive\";\n\n@NgModule({\n imports: [CommonModule],\n exports: [AnchorLinkDirective, ButtonLinkDirective],\n declarations: [AnchorLinkDirective, ButtonLinkDirective],\n})\nexport class LinkModule {}\n","import { Component } from \"@angular/core\";\n\n@Component({\n selector: \"bit-menu-divider\",\n templateUrl: \"./menu-divider.component.html\",\n})\nexport class MenuDividerComponent {}\n","\n","import { FocusableOption } from \"@angular/cdk/a11y\";\nimport { Directive, ElementRef, HostBinding } from \"@angular/core\";\n\n@Directive({\n selector: \"[bitMenuItem]\",\n})\nexport class MenuItemDirective implements FocusableOption {\n @HostBinding(\"class\") classList = [\n \"tw-block\",\n \"tw-py-1\",\n \"tw-px-4\",\n \"!tw-text-main\",\n \"!tw-no-underline\",\n \"tw-cursor-pointer\",\n \"tw-border-none\",\n \"tw-bg-background\",\n \"tw-text-left\",\n \"hover:tw-bg-secondary-100\",\n \"focus:tw-bg-secondary-100\",\n \"focus:tw-z-50\",\n \"focus:tw-outline-none\",\n \"focus:tw-ring\",\n \"focus:tw-ring-offset-2\",\n \"focus:tw-ring-primary-700\",\n \"active:!tw-ring-0\",\n \"active:!tw-ring-offset-0\",\n ];\n @HostBinding(\"attr.role\") role = \"menuitem\";\n @HostBinding(\"tabIndex\") tabIndex = \"-1\";\n\n constructor(private elementRef: ElementRef) {}\n\n focus() {\n this.elementRef.nativeElement.focus();\n }\n}\n","import { Overlay, OverlayConfig, OverlayRef } from \"@angular/cdk/overlay\";\nimport { TemplatePortal } from \"@angular/cdk/portal\";\nimport {\n Directive,\n ElementRef,\n HostBinding,\n HostListener,\n Input,\n OnDestroy,\n ViewContainerRef,\n} from \"@angular/core\";\nimport { Observable, Subscription } from \"rxjs\";\nimport { filter, mergeWith } from \"rxjs/operators\";\n\nimport { MenuComponent } from \"./menu.component\";\n\n@Directive({\n selector: \"[bitMenuTriggerFor]\",\n})\nexport class MenuTriggerForDirective implements OnDestroy {\n @HostBinding(\"attr.aria-expanded\") isOpen = false;\n @HostBinding(\"attr.aria-haspopup\") get hasPopup(): \"menu\" | \"dialog\" {\n return this.menu?.ariaRole || \"menu\";\n }\n @HostBinding(\"attr.role\") role = \"button\";\n\n @Input(\"bitMenuTriggerFor\") menu: MenuComponent;\n\n private overlayRef: OverlayRef;\n private defaultMenuConfig: OverlayConfig = {\n panelClass: \"bit-menu-panel\",\n hasBackdrop: true,\n backdropClass: \"cdk-overlay-transparent-backdrop\",\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\n positionStrategy: this.overlay\n .position()\n .flexibleConnectedTo(this.elementRef)\n .withPositions([\n {\n originX: \"start\",\n originY: \"bottom\",\n overlayX: \"start\",\n overlayY: \"top\",\n },\n {\n originX: \"end\",\n originY: \"bottom\",\n overlayX: \"end\",\n overlayY: \"top\",\n },\n ])\n .withLockedPosition(true)\n .withFlexibleDimensions(false)\n .withPush(true),\n };\n private closedEventsSub: Subscription;\n private keyDownEventsSub: Subscription;\n\n constructor(\n private elementRef: ElementRef,\n private viewContainerRef: ViewContainerRef,\n private overlay: Overlay,\n ) {}\n\n @HostListener(\"click\") toggleMenu() {\n this.isOpen ? this.destroyMenu() : this.openMenu();\n }\n\n ngOnDestroy() {\n this.disposeAll();\n }\n\n private openMenu() {\n if (this.menu == null) {\n throw new Error(\"Cannot find bit-menu element\");\n }\n\n this.isOpen = true;\n this.overlayRef = this.overlay.create(this.defaultMenuConfig);\n\n const templatePortal = new TemplatePortal(this.menu.templateRef, this.viewContainerRef);\n this.overlayRef.attach(templatePortal);\n\n this.closedEventsSub = this.getClosedEvents().subscribe((event: KeyboardEvent | undefined) => {\n if ([\"Tab\", \"Escape\"].includes(event?.key)) {\n // Required to ensure tab order resumes correctly\n this.elementRef.nativeElement.focus();\n }\n this.destroyMenu();\n });\n this.keyDownEventsSub =\n this.menu.keyManager &&\n this.overlayRef\n .keydownEvents()\n .subscribe((event: KeyboardEvent) => this.menu.keyManager.onKeydown(event));\n }\n\n private destroyMenu() {\n if (this.overlayRef == null || !this.isOpen) {\n return;\n }\n\n this.isOpen = false;\n this.disposeAll();\n }\n\n private getClosedEvents(): Observable {\n const detachments = this.overlayRef.detachments();\n const escKey = this.overlayRef.keydownEvents().pipe(\n filter((event: KeyboardEvent) => {\n const keys = this.menu.ariaRole === \"menu\" ? [\"Escape\", \"Tab\"] : [\"Escape\"];\n return keys.includes(event.key);\n }),\n );\n const backdrop = this.overlayRef.backdropClick();\n const menuClosed = this.menu.closed;\n\n return detachments.pipe(mergeWith(escKey, backdrop, menuClosed));\n }\n\n private disposeAll() {\n this.closedEventsSub?.unsubscribe();\n this.overlayRef?.dispose();\n this.keyDownEventsSub?.unsubscribe();\n }\n}\n","\n \n \n \n\n","import { FocusKeyManager } from \"@angular/cdk/a11y\";\nimport {\n Component,\n Output,\n TemplateRef,\n ViewChild,\n EventEmitter,\n ContentChildren,\n QueryList,\n AfterContentInit,\n Input,\n} from \"@angular/core\";\n\nimport { MenuItemDirective } from \"./menu-item.directive\";\n\n@Component({\n selector: \"bit-menu\",\n templateUrl: \"./menu.component.html\",\n exportAs: \"menuComponent\",\n})\nexport class MenuComponent implements AfterContentInit {\n @ViewChild(TemplateRef) templateRef: TemplateRef;\n @Output() closed = new EventEmitter();\n @ContentChildren(MenuItemDirective, { descendants: true })\n menuItems: QueryList;\n keyManager?: FocusKeyManager;\n\n @Input() ariaRole: \"menu\" | \"dialog\" = \"menu\";\n\n @Input() ariaLabel: string;\n\n ngAfterContentInit() {\n if (this.ariaRole === \"menu\") {\n this.keyManager = new FocusKeyManager(this.menuItems).withWrap();\n }\n }\n}\n","import { A11yModule } from \"@angular/cdk/a11y\";\nimport { OverlayModule } from \"@angular/cdk/overlay\";\nimport { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\n\nimport { MenuDividerComponent } from \"./menu-divider.component\";\nimport { MenuItemDirective } from \"./menu-item.directive\";\nimport { MenuTriggerForDirective } from \"./menu-trigger-for.directive\";\nimport { MenuComponent } from \"./menu.component\";\n\n@NgModule({\n imports: [A11yModule, CommonModule, OverlayModule],\n declarations: [MenuComponent, MenuTriggerForDirective, MenuItemDirective, MenuDividerComponent],\n exports: [MenuComponent, MenuTriggerForDirective, MenuItemDirective, MenuDividerComponent],\n})\nexport class MenuModule {}\n","\n \n \n \n \n \n \n {{ item.labelName }}\n \n \n \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n {{ item.listName }}\n
    \n
    \n
    \n\n","import { hasModifierKey } from \"@angular/cdk/keycodes\";\nimport {\n Component,\n Input,\n OnInit,\n Output,\n ViewChild,\n EventEmitter,\n HostBinding,\n Optional,\n Self,\n} from \"@angular/core\";\nimport { ControlValueAccessor, NgControl, Validators } from \"@angular/forms\";\nimport { NgSelectComponent } from \"@ng-select/ng-select\";\n\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\n\nimport { BitFormFieldControl } from \"../form-field/form-field-control\";\n\nimport { SelectItemView } from \"./models/select-item-view\";\n\n// Increments for each instance of this component\nlet nextId = 0;\n\n@Component({\n selector: \"bit-multi-select\",\n templateUrl: \"./multi-select.component.html\",\n providers: [{ provide: BitFormFieldControl, useExisting: MultiSelectComponent }],\n})\n/**\n * This component has been implemented to only support Multi-select list events\n */\nexport class MultiSelectComponent implements OnInit, BitFormFieldControl, ControlValueAccessor {\n @ViewChild(NgSelectComponent) select: NgSelectComponent;\n\n // Parent component should only pass selectable items (complete list - selected items = baseItems)\n @Input() baseItems: SelectItemView[];\n // Defaults to native ng-select behavior - set to \"true\" to clear selected items on dropdown close\n @Input() removeSelectedItems = false;\n @Input() placeholder: string;\n @Input() loading = false;\n @Input() disabled = false;\n\n // Internal tracking of selected items\n @Input() selectedItems: SelectItemView[];\n\n // Default values for our implementation\n loadingText: string;\n\n protected searchInputId = `search-input-${nextId++}`;\n\n /**Implemented as part of NG_VALUE_ACCESSOR */\n private notifyOnChange?: (value: SelectItemView[]) => void;\n /**Implemented as part of NG_VALUE_ACCESSOR */\n private notifyOnTouched?: () => void;\n\n @Output() onItemsConfirmed = new EventEmitter();\n\n constructor(\n private i18nService: I18nService,\n @Optional() @Self() private ngControl?: NgControl,\n ) {\n if (ngControl != null) {\n ngControl.valueAccessor = this;\n }\n }\n\n ngOnInit(): void {\n // Default Text Values\n this.placeholder = this.placeholder ?? this.i18nService.t(\"multiSelectPlaceholder\");\n this.loadingText = this.i18nService.t(\"multiSelectLoading\");\n }\n\n /** Function for customizing keyboard navigation */\n /** Needs to be arrow function to retain `this` scope. */\n keyDown = (event: KeyboardEvent) => {\n if (!this.select.isOpen && event.key === \"Enter\" && !hasModifierKey(event)) {\n return false;\n }\n\n if (this.select.isOpen && event.key === \"Escape\" && !hasModifierKey(event)) {\n this.selectedItems = [];\n this.select.close();\n event.stopPropagation();\n return false;\n }\n\n return true;\n };\n\n /** Helper method for showing selected state in custom template */\n isSelected(item: any): boolean {\n return this.selectedItems?.find((selected) => selected.id === item.id) != undefined;\n }\n\n /**\n * The `close` callback will act as the only trigger for signifying the user's intent of completing the selection\n * of items. Selected items will be emitted to the parent component in order to allow for separate data handling.\n */\n onDropdownClosed(): void {\n // Early exit\n if (this.selectedItems == null || this.selectedItems.length == 0) {\n return;\n }\n\n // Emit results to parent component\n this.onItemsConfirmed.emit(this.selectedItems);\n\n // Remove selected items from base list based on input property\n if (this.removeSelectedItems) {\n let updatedBaseItems = this.baseItems;\n this.selectedItems.forEach((selectedItem) => {\n updatedBaseItems = updatedBaseItems.filter((item) => selectedItem.id !== item.id);\n });\n\n // Reset Lists\n this.selectedItems = null;\n this.baseItems = updatedBaseItems;\n }\n }\n\n /**Implemented as part of NG_VALUE_ACCESSOR */\n writeValue(obj: SelectItemView[]): void {\n this.selectedItems = obj;\n }\n\n /**Implemented as part of NG_VALUE_ACCESSOR */\n registerOnChange(fn: (value: SelectItemView[]) => void): void {\n this.notifyOnChange = fn;\n }\n\n /**Implemented as part of NG_VALUE_ACCESSOR */\n registerOnTouched(fn: any): void {\n this.notifyOnTouched = fn;\n }\n\n /**Implemented as part of NG_VALUE_ACCESSOR */\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n /**Implemented as part of NG_VALUE_ACCESSOR */\n protected onChange(items: SelectItemView[]) {\n if (!this.notifyOnChange) {\n return;\n }\n\n this.notifyOnChange(items);\n }\n\n /**Implemented as part of NG_VALUE_ACCESSOR */\n protected onBlur() {\n if (!this.notifyOnTouched) {\n return;\n }\n\n this.notifyOnTouched();\n }\n\n /**Implemented as part of BitFormFieldControl */\n @HostBinding(\"attr.aria-describedby\")\n get ariaDescribedBy() {\n return this._ariaDescribedBy;\n }\n set ariaDescribedBy(value: string) {\n this._ariaDescribedBy = value;\n this.select?.searchInput.nativeElement.setAttribute(\"aria-describedby\", value);\n }\n private _ariaDescribedBy: string;\n\n /**Implemented as part of BitFormFieldControl */\n get labelForId() {\n return this.searchInputId;\n }\n\n /**Implemented as part of BitFormFieldControl */\n @HostBinding() @Input() id = `bit-multi-select-${nextId++}`;\n\n /**Implemented as part of BitFormFieldControl */\n @HostBinding(\"attr.required\")\n @Input()\n get required() {\n return this._required ?? this.ngControl?.control?.hasValidator(Validators.required) ?? false;\n }\n set required(value: any) {\n this._required = value != null && value !== false;\n }\n private _required: boolean;\n\n /**Implemented as part of BitFormFieldControl */\n get hasError() {\n return this.ngControl?.status === \"INVALID\" && this.ngControl?.touched;\n }\n\n /**Implemented as part of BitFormFieldControl */\n get error(): [string, any] {\n const key = Object.keys(this.ngControl?.errors)[0];\n return [key, this.ngControl?.errors[key]];\n }\n}\n","import { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\nimport { FormsModule } from \"@angular/forms\";\nimport { NgSelectModule } from \"@ng-select/ng-select\";\n\nimport { BadgeModule } from \"../badge\";\nimport { SharedModule } from \"../shared\";\n\nimport { MultiSelectComponent } from \"./multi-select.component\";\n\n@NgModule({\n imports: [CommonModule, FormsModule, NgSelectModule, BadgeModule, SharedModule],\n exports: [MultiSelectComponent],\n declarations: [MultiSelectComponent],\n})\nexport class MultiSelectModule {}\n","import { Directive, EventEmitter, Input, Output } from \"@angular/core\";\nimport { RouterLink, RouterLinkActive } from \"@angular/router\";\n\n/**\n * `NavGroupComponent` builds upon `NavItemComponent`. This class represents the properties that are passed down to `NavItemComponent`.\n */\n@Directive()\nexport abstract class NavBaseComponent {\n /**\n * Text to display in main content\n */\n @Input() text: string;\n\n /**\n * `aria-label` for main content\n */\n @Input() ariaLabel: string;\n\n /**\n * Optional icon, e.g. `\"bwi-collection\"`\n */\n @Input() icon: string;\n\n /**\n * Optional route to be passed to internal `routerLink`. If not provided, the nav component will render as a button.\n *\n * See: {@link RouterLink.routerLink}\n *\n * ---\n *\n * We can't name this \"routerLink\" because Angular will mount the `RouterLink` directive.\n *\n * See: {@link https://github.com/angular/angular/issues/24482}\n */\n @Input() route?: RouterLink[\"routerLink\"];\n\n /**\n * Passed to internal `routerLink`\n *\n * See {@link RouterLink.relativeTo}\n */\n @Input() relativeTo?: RouterLink[\"relativeTo\"];\n\n /**\n * Passed to internal `routerLink`\n *\n * See {@link RouterLinkActive.routerLinkActiveOptions}\n */\n @Input() routerLinkActiveOptions?: RouterLinkActive[\"routerLinkActiveOptions\"] = {\n paths: \"subset\",\n queryParams: \"ignored\",\n fragment: \"ignored\",\n matrixParams: \"ignored\",\n };\n\n /**\n * If this item is used within a tree, set `variant` to `\"tree\"`\n */\n @Input() variant: \"default\" | \"tree\" = \"default\";\n\n /**\n * Depth level when nested inside of a `'tree'` variant\n */\n @Input() treeDepth = 0;\n\n /**\n * If `true`, do not change styles when nav item is active.\n */\n @Input() hideActiveStyles = false;\n\n /**\n * Fires when main content is clicked\n */\n @Output() mainContentClicked: EventEmitter = new EventEmitter();\n}\n","\n\n \n \n \n\n \n \n \n \n \n \n \n \n \n \n\n\n\n\n \n\n","import {\n AfterContentInit,\n Component,\n ContentChildren,\n EventEmitter,\n Input,\n Optional,\n Output,\n QueryList,\n SkipSelf,\n} from \"@angular/core\";\n\nimport { NavBaseComponent } from \"./nav-base.component\";\n\n@Component({\n selector: \"bit-nav-group\",\n templateUrl: \"./nav-group.component.html\",\n providers: [{ provide: NavBaseComponent, useExisting: NavGroupComponent }],\n})\nexport class NavGroupComponent extends NavBaseComponent implements AfterContentInit {\n @ContentChildren(NavBaseComponent, {\n descendants: true,\n })\n nestedNavComponents!: QueryList;\n\n /** The parent nav item should not show active styles when open. */\n protected get parentHideActiveStyles(): boolean {\n return this.hideActiveStyles || this.open;\n }\n\n /**\n * UID for `[attr.aria-controls]`\n */\n protected contentId = Math.random().toString(36).substring(2);\n\n /**\n * Is `true` if the expanded content is visible\n */\n @Input()\n open = false;\n\n @Output()\n openChange = new EventEmitter();\n\n constructor(@Optional() @SkipSelf() private parentNavGroup: NavGroupComponent) {\n super();\n }\n\n setOpen(isOpen: boolean) {\n this.open = isOpen;\n this.openChange.emit(this.open);\n this.open && this.parentNavGroup?.setOpen(this.open);\n }\n\n protected toggle(event?: MouseEvent) {\n event?.stopPropagation();\n this.setOpen(!this.open);\n }\n\n /**\n * - For any nested NavGroupComponents or NavItemComponents, increment the `treeDepth` by 1.\n */\n private initNestedStyles() {\n if (this.variant !== \"tree\") {\n return;\n }\n [...this.nestedNavComponents].forEach((navGroupOrItem) => {\n navGroupOrItem.treeDepth += 1;\n });\n }\n\n ngAfterContentInit(): void {\n this.initNestedStyles();\n }\n}\n","\n \n *:focus-visible::before]:!tw-ring-text-alt2 [&>*:hover]:!tw-border-text-alt2 [&>*]:!tw-text-alt2\"\n >\n \n \n \n \n \n \n\n \n\n \n \n {{\n text\n }}\n \n\n \n \n \n \n :not(.bwi)]:hover:tw-underline\"\n [routerLink]=\"route\"\n [relativeTo]=\"relativeTo\"\n [attr.aria-label]=\"ariaLabel || text\"\n routerLinkActive\n [routerLinkActiveOptions]=\"routerLinkActiveOptions\"\n [ariaCurrentWhenActive]=\"'page'\"\n (isActiveChange)=\"setIsActive($event)\"\n (click)=\"mainContentClicked.emit()\"\n >\n \n \n \n\n \n \n \n :not(.bwi)]:hover:tw-underline\"\n (click)=\"mainContentClicked.emit()\"\n >\n \n \n \n\n *:focus-visible::before]:!tw-ring-text-alt2 [&>*:hover]:!tw-border-text-alt2 [&>*]:tw-text-alt2\"\n >\n \n \n \n\n","import { Component, HostListener, Optional } from \"@angular/core\";\nimport { BehaviorSubject, map } from \"rxjs\";\n\nimport { NavBaseComponent } from \"./nav-base.component\";\nimport { NavGroupComponent } from \"./nav-group.component\";\n\n@Component({\n selector: \"bit-nav-item\",\n templateUrl: \"./nav-item.component.html\",\n providers: [{ provide: NavBaseComponent, useExisting: NavItemComponent }],\n})\nexport class NavItemComponent extends NavBaseComponent {\n /**\n * Is `true` if `to` matches the current route\n */\n private _isActive = false;\n protected setIsActive(isActive: boolean) {\n this._isActive = isActive;\n if (this._isActive && this.parentNavGroup) {\n this.parentNavGroup.setOpen(true);\n }\n }\n protected get showActiveStyles() {\n return this._isActive && !this.hideActiveStyles;\n }\n\n /**\n * The design spec calls for the an outline to wrap the entire element when the template's anchor/button has :focus-visible.\n * Usually, we would use :focus-within for this. However, that matches when a child element has :focus instead of :focus-visible.\n *\n * Currently, the browser does not have a pseudo selector that combines these two, e.g. :focus-visible-within (WICG/focus-visible#151)\n * To make our own :focus-visible-within functionality, we use event delegation on the host and manually check if the focus target (denoted with the .fvw class) matches :focus-visible. We then map that state to some styles, so the entire component can have an outline.\n */\n protected focusVisibleWithin$ = new BehaviorSubject(false);\n protected fvwStyles$ = this.focusVisibleWithin$.pipe(\n map((value) =>\n value ? \"tw-z-10 tw-rounded tw-outline-none tw-ring tw-ring-inset tw-ring-text-alt2\" : \"\",\n ),\n );\n @HostListener(\"focusin\", [\"$event.target\"])\n onFocusIn(target: HTMLElement) {\n this.focusVisibleWithin$.next(target.matches(\".fvw:focus-visible\"));\n }\n @HostListener(\"focusout\")\n onFocusOut() {\n this.focusVisibleWithin$.next(false);\n }\n\n constructor(@Optional() private parentNavGroup: NavGroupComponent) {\n super();\n }\n}\n","import { OverlayModule } from \"@angular/cdk/overlay\";\nimport { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\nimport { RouterModule } from \"@angular/router\";\n\nimport { IconButtonModule } from \"../icon-button/icon-button.module\";\nimport { SharedModule } from \"../shared/shared.module\";\n\nimport { NavDividerComponent } from \"./nav-divider.component\";\nimport { NavGroupComponent } from \"./nav-group.component\";\nimport { NavItemComponent } from \"./nav-item.component\";\n\n@NgModule({\n imports: [CommonModule, SharedModule, IconButtonModule, OverlayModule, RouterModule],\n declarations: [NavDividerComponent, NavGroupComponent, NavItemComponent],\n exports: [NavDividerComponent, NavGroupComponent, NavItemComponent],\n})\nexport class NavigationModule {}\n","import { Component, Input } from \"@angular/core\";\n\nimport { Icons } from \"..\";\n\n/**\n * Component for displaying a message when there are no items to display. Expects title, description and button slots.\n */\n@Component({\n selector: \"bit-no-items\",\n templateUrl: \"./no-items.component.html\",\n})\nexport class NoItemsComponent {\n @Input() icon = Icons.Search;\n}\n","\n
    \n \n

    \n \n

    \n

    \n \n

    \n
    \n
    \n \n
    \n\n","import { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\n\nimport { IconModule } from \"../icon\";\n\nimport { NoItemsComponent } from \"./no-items.component\";\n\n@NgModule({\n imports: [CommonModule, IconModule],\n exports: [NoItemsComponent],\n declarations: [NoItemsComponent],\n})\nexport class NoItemsModule {}\n","
    \n \n \n \n
     
    \n
    {{ textContent }}
    \n
    \n \n\n","import { Component, Input } from \"@angular/core\";\n\ntype SizeTypes = \"small\" | \"default\" | \"large\";\ntype BackgroundTypes = \"danger\" | \"primary\" | \"success\" | \"warning\";\n\nconst SizeClasses: Record = {\n small: [\"tw-h-1\"],\n default: [\"tw-h-4\"],\n large: [\"tw-h-6\"],\n};\n\nconst BackgroundClasses: Record = {\n danger: [\"tw-bg-danger-500\"],\n primary: [\"tw-bg-primary-500\"],\n success: [\"tw-bg-success-500\"],\n warning: [\"tw-bg-warning-500\"],\n};\n\n@Component({\n selector: \"bit-progress\",\n templateUrl: \"./progress.component.html\",\n})\nexport class ProgressComponent {\n @Input() barWidth = 0;\n @Input() bgColor: BackgroundTypes = \"primary\";\n @Input() showText = true;\n @Input() size: SizeTypes = \"default\";\n @Input() text?: string;\n\n get displayText() {\n return this.showText && this.size !== \"small\";\n }\n\n get outerBarStyles() {\n return [\"tw-overflow-hidden\", \"tw-rounded\", \"tw-bg-secondary-100\"].concat(\n SizeClasses[this.size],\n );\n }\n\n get innerBarStyles() {\n return [\n \"tw-flex\",\n \"tw-justify-center\",\n \"tw-items-center\",\n \"tw-whitespace-nowrap\",\n \"tw-text-xs\",\n \"tw-font-semibold\",\n \"tw-text-contrast\",\n \"tw-transition-all\",\n ]\n .concat(SizeClasses[this.size])\n .concat(BackgroundClasses[this.bgColor]);\n }\n\n get textContent() {\n return this.text || this.barWidth + \"%\";\n }\n}\n","import { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\n\nimport { ProgressComponent } from \"./progress.component\";\n\n@NgModule({\n imports: [CommonModule],\n exports: [ProgressComponent],\n declarations: [ProgressComponent],\n})\nexport class ProgressModule {}\n","import { Component, HostBinding, Input, Optional, Self } from \"@angular/core\";\nimport { NgControl, Validators } from \"@angular/forms\";\n\nimport { BitFormControlAbstraction } from \"../form-control\";\n\nlet nextId = 0;\n\n@Component({\n selector: \"input[type=radio][bitRadio]\",\n template: \"\",\n providers: [{ provide: BitFormControlAbstraction, useExisting: RadioInputComponent }],\n})\nexport class RadioInputComponent implements BitFormControlAbstraction {\n @HostBinding(\"attr.id\") @Input() id = `bit-radio-input-${nextId++}`;\n\n @HostBinding(\"class\")\n protected inputClasses = [\n \"tw-appearance-none\",\n \"tw-outline-none\",\n \"tw-relative\",\n \"tw-transition\",\n \"tw-cursor-pointer\",\n \"tw-inline-block\",\n \"tw-rounded-full\",\n \"tw-border\",\n \"tw-border-solid\",\n \"tw-border-secondary-500\",\n \"tw-w-3.5\",\n \"tw-h-3.5\",\n \"tw-mr-1.5\",\n \"tw-bottom-[-1px]\", // Fix checkbox looking off-center\n \"tw-flex-none\", // Flexbox fix for bit-form-control\n\n \"hover:tw-border-2\",\n \"[&>label:hover]:tw-border-2\",\n\n \"before:tw-content-['']\",\n \"before:tw-transition\",\n \"before:tw-block\",\n \"before:tw-absolute\",\n \"before:tw-rounded-full\",\n \"before:tw-inset-[2px]\",\n\n \"focus-visible:tw-ring-2\",\n \"focus-visible:tw-ring-offset-2\",\n \"focus-visible:tw-ring-primary-700\",\n\n \"disabled:tw-cursor-auto\",\n \"disabled:tw-border\",\n \"disabled:tw-bg-secondary-100\",\n\n \"checked:tw-bg-text-contrast\",\n \"checked:tw-border-primary-500\",\n\n \"checked:hover:tw-border\",\n \"checked:hover:tw-border-primary-700\",\n \"checked:hover:before:tw-bg-primary-700\",\n \"[&>label:hover]:checked:tw-bg-primary-700\",\n \"[&>label:hover]:checked:tw-border-primary-700\",\n\n \"checked:before:tw-bg-primary-500\",\n\n \"checked:disabled:tw-border-secondary-100\",\n \"checked:disabled:tw-bg-secondary-100\",\n\n \"checked:disabled:before:tw-bg-text-muted\",\n ];\n\n constructor(@Optional() @Self() private ngControl?: NgControl) {}\n\n @HostBinding()\n @Input()\n get disabled() {\n return this._disabled ?? this.ngControl?.disabled ?? false;\n }\n set disabled(value: any) {\n this._disabled = value != null && value !== false;\n }\n private _disabled: boolean;\n\n @Input()\n get required() {\n return (\n this._required ?? this.ngControl?.control?.hasValidator(Validators.requiredTrue) ?? false\n );\n }\n set required(value: any) {\n this._required = value != null && value !== false;\n }\n private _required: boolean;\n\n get hasError() {\n return this.ngControl?.status === \"INVALID\" && this.ngControl?.touched;\n }\n\n get error(): [string, any] {\n const key = Object.keys(this.ngControl.errors)[0];\n return [key, this.ngControl.errors[key]];\n }\n}\n","import { Component, HostBinding, Input } from \"@angular/core\";\n\nimport { RadioGroupComponent } from \"./radio-group.component\";\n\nlet nextId = 0;\n\n@Component({\n selector: \"bit-radio-button\",\n templateUrl: \"radio-button.component.html\",\n})\nexport class RadioButtonComponent {\n @HostBinding(\"attr.id\") @Input() id = `bit-radio-button-${nextId++}`;\n @HostBinding(\"class\") get classList() {\n return [this.block ? \"tw-block\" : \"tw-inline-block\", \"tw-mb-2\"];\n }\n\n @Input() value: unknown;\n @Input() disabled = false;\n\n constructor(private groupComponent: RadioGroupComponent) {}\n\n get inputId() {\n return `${this.id}-input`;\n }\n\n get name() {\n return this.groupComponent.name;\n }\n\n get selected() {\n return this.groupComponent.selected === this.value;\n }\n\n get groupDisabled() {\n return this.groupComponent.disabled;\n }\n\n get block() {\n return this.groupComponent.block;\n }\n\n protected onInputChange() {\n this.groupComponent.onInputChange(this.value);\n }\n\n protected onBlur() {\n this.groupComponent.onBlur();\n }\n}\n","\n \n\n \n \n\n","import { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\n\nimport { FormControlModule } from \"../form-control\";\nimport { SharedModule } from \"../shared\";\n\nimport { RadioButtonComponent } from \"./radio-button.component\";\nimport { RadioGroupComponent } from \"./radio-group.component\";\nimport { RadioInputComponent } from \"./radio-input.component\";\n\n@NgModule({\n imports: [CommonModule, SharedModule, FormControlModule],\n declarations: [RadioInputComponent, RadioButtonComponent, RadioGroupComponent],\n exports: [FormControlModule, RadioInputComponent, RadioButtonComponent, RadioGroupComponent],\n})\nexport class RadioButtonModule {}\n","\n
    \n \n \n ({{ \"required\" | i18n }})\n \n \n
    \n
    \n\n\n \n\n\n\n
    \n \n
    \n \n
    \n","import { Component, ContentChild, HostBinding, Input, Optional, Self } from \"@angular/core\";\nimport { ControlValueAccessor, NgControl, Validators } from \"@angular/forms\";\n\nimport { BitLabel } from \"../form-control/label.directive\";\n\nlet nextId = 0;\n\n@Component({\n selector: \"bit-radio-group\",\n templateUrl: \"radio-group.component.html\",\n})\nexport class RadioGroupComponent implements ControlValueAccessor {\n selected: unknown;\n disabled = false;\n\n private _name?: string;\n @Input() get name() {\n return this._name ?? this.ngControl?.name?.toString();\n }\n set name(value: string) {\n this._name = value;\n }\n\n @Input() block = false;\n\n @HostBinding(\"attr.role\") role = \"radiogroup\";\n @HostBinding(\"attr.id\") @Input() id = `bit-radio-group-${nextId++}`;\n @HostBinding(\"class\") classList = [\"tw-block\", \"tw-mb-4\"];\n\n @ContentChild(BitLabel) protected label: BitLabel;\n\n constructor(@Optional() @Self() private ngControl?: NgControl) {\n if (ngControl != null) {\n ngControl.valueAccessor = this;\n }\n }\n\n get required() {\n return this.ngControl?.control?.hasValidator(Validators.required) ?? false;\n }\n\n // ControlValueAccessor\n onChange: (value: unknown) => void;\n onTouched: () => void;\n\n writeValue(value: boolean): void {\n this.selected = value;\n }\n\n registerOnChange(fn: (value: unknown) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n onInputChange(value: unknown) {\n this.selected = value;\n this.onChange(this.selected);\n }\n\n onBlur() {\n this.onTouched();\n }\n}\n","import { Component, ElementRef, Input, ViewChild } from \"@angular/core\";\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from \"@angular/forms\";\n\nimport { FocusableElement } from \"../input/autofocus.directive\";\n\nlet nextId = 0;\n\n@Component({\n selector: \"bit-search\",\n templateUrl: \"./search.component.html\",\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n multi: true,\n useExisting: SearchComponent,\n },\n {\n provide: FocusableElement,\n useExisting: SearchComponent,\n },\n ],\n})\nexport class SearchComponent implements ControlValueAccessor, FocusableElement {\n private notifyOnChange: (v: string) => void;\n private notifyOnTouch: () => void;\n\n @ViewChild(\"input\") private input: ElementRef;\n\n protected id = `search-id-${nextId++}`;\n protected searchText: string;\n\n @Input() disabled: boolean;\n @Input() placeholder: string;\n\n focus() {\n this.input.nativeElement.focus();\n }\n\n onChange(searchText: string) {\n if (this.notifyOnChange != undefined) {\n this.notifyOnChange(searchText);\n }\n }\n\n onTouch() {\n if (this.notifyOnTouch != undefined) {\n this.notifyOnTouch();\n }\n }\n\n registerOnChange(fn: (v: string) => void): void {\n this.notifyOnChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.notifyOnTouch = fn;\n }\n\n writeValue(searchText: string): void {\n this.searchText = searchText;\n }\n\n setDisabledState(isDisabled: boolean) {\n this.disabled = isDisabled;\n }\n}\n","\n
    \n \n \n \n \n
    \n","import { NgModule } from \"@angular/core\";\nimport { FormsModule } from \"@angular/forms\";\n\nimport { InputModule } from \"../input/input.module\";\nimport { SharedModule } from \"../shared\";\n\nimport { SearchComponent } from \"./search.component\";\n\n@NgModule({\n imports: [SharedModule, InputModule, FormsModule],\n declarations: [SearchComponent],\n exports: [SearchComponent],\n})\nexport class SearchModule {}\n","import { CommonModule } from \"@angular/common\";\nimport { Component } from \"@angular/core\";\n\n@Component({\n selector: \"bit-section\",\n standalone: true,\n imports: [CommonModule],\n template: `\n
    \n \n
    \n `,\n})\nexport class SectionComponent {}\n","import { coerceBooleanProperty } from \"@angular/cdk/coercion\";\nimport { Component, Input } from \"@angular/core\";\n\nimport { Option } from \"./option\";\n\n@Component({\n selector: \"bit-option\",\n template: ``,\n})\nexport class OptionComponent implements Option {\n @Input()\n icon?: string;\n\n @Input()\n value?: T = undefined;\n\n @Input()\n label?: string;\n\n private _disabled = false;\n @Input()\n get disabled() {\n return this._disabled;\n }\n set disabled(value: boolean | \"\") {\n this._disabled = coerceBooleanProperty(value);\n }\n}\n","\n \n
    \n
    \n \n
    \n
    \n {{ item.label }}\n
    \n
    \n
    \n\n","import {\n Component,\n ContentChildren,\n HostBinding,\n Input,\n Optional,\n QueryList,\n Self,\n ViewChild,\n} from \"@angular/core\";\nimport { ControlValueAccessor, NgControl, Validators } from \"@angular/forms\";\nimport { NgSelectComponent } from \"@ng-select/ng-select\";\n\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\n\nimport { BitFormFieldControl } from \"../form-field\";\n\nimport { Option } from \"./option\";\nimport { OptionComponent } from \"./option.component\";\n\nlet nextId = 0;\n\n@Component({\n selector: \"bit-select\",\n templateUrl: \"select.component.html\",\n providers: [{ provide: BitFormFieldControl, useExisting: SelectComponent }],\n})\nexport class SelectComponent implements BitFormFieldControl, ControlValueAccessor {\n @ViewChild(NgSelectComponent) select: NgSelectComponent;\n\n /** Optional: Options can be provided using an array input or using `bit-option` */\n @Input() items: Option[] = [];\n @Input() placeholder = this.i18nService.t(\"selectPlaceholder\");\n\n protected selectedValue: T;\n protected selectedOption: Option;\n protected searchInputId = `bit-select-search-input-${nextId++}`;\n\n private notifyOnChange?: (value: T) => void;\n private notifyOnTouched?: () => void;\n\n constructor(\n private i18nService: I18nService,\n @Optional() @Self() private ngControl?: NgControl,\n ) {\n if (ngControl != null) {\n ngControl.valueAccessor = this;\n }\n }\n\n @ContentChildren(OptionComponent)\n protected set options(value: QueryList>) {\n this.items = value.toArray();\n this.selectedOption = this.findSelectedOption(this.items, this.selectedValue);\n }\n\n @HostBinding(\"class\") protected classes = [\"tw-block\", \"tw-w-full\"];\n\n @HostBinding()\n @Input()\n get disabled() {\n return this._disabled ?? this.ngControl?.disabled ?? false;\n }\n set disabled(value: any) {\n this._disabled = value != null && value !== false;\n }\n private _disabled: boolean;\n\n /**Implemented as part of NG_VALUE_ACCESSOR */\n writeValue(obj: T): void {\n this.selectedValue = obj;\n this.selectedOption = this.findSelectedOption(this.items, this.selectedValue);\n }\n\n /**Implemented as part of NG_VALUE_ACCESSOR */\n registerOnChange(fn: (value: T) => void): void {\n this.notifyOnChange = fn;\n }\n\n /**Implemented as part of NG_VALUE_ACCESSOR */\n registerOnTouched(fn: any): void {\n this.notifyOnTouched = fn;\n }\n\n /**Implemented as part of NG_VALUE_ACCESSOR */\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n /**Implemented as part of NG_VALUE_ACCESSOR */\n protected onChange(option: Option | null) {\n if (!this.notifyOnChange) {\n return;\n }\n\n this.notifyOnChange(option?.value);\n }\n\n /**Implemented as part of NG_VALUE_ACCESSOR */\n protected onBlur() {\n if (!this.notifyOnTouched) {\n return;\n }\n\n this.notifyOnTouched();\n }\n\n /**Implemented as part of BitFormFieldControl */\n @HostBinding(\"attr.aria-describedby\")\n get ariaDescribedBy() {\n return this._ariaDescribedBy;\n }\n set ariaDescribedBy(value: string) {\n this._ariaDescribedBy = value;\n this.select?.searchInput.nativeElement.setAttribute(\"aria-describedby\", value);\n }\n private _ariaDescribedBy: string;\n\n /**Implemented as part of BitFormFieldControl */\n get labelForId() {\n return this.searchInputId;\n }\n\n /**Implemented as part of BitFormFieldControl */\n @HostBinding() @Input() id = `bit-multi-select-${nextId++}`;\n\n /**Implemented as part of BitFormFieldControl */\n @HostBinding(\"attr.required\")\n @Input()\n get required() {\n return this._required ?? this.ngControl?.control?.hasValidator(Validators.required) ?? false;\n }\n set required(value: any) {\n this._required = value != null && value !== false;\n }\n private _required: boolean;\n\n /**Implemented as part of BitFormFieldControl */\n get hasError() {\n return this.ngControl?.status === \"INVALID\" && this.ngControl?.touched;\n }\n\n /**Implemented as part of BitFormFieldControl */\n get error(): [string, any] {\n const key = Object.keys(this.ngControl?.errors)[0];\n return [key, this.ngControl?.errors[key]];\n }\n\n private findSelectedOption(items: Option[], value: T): Option | undefined {\n return items.find((item) => item.value === value);\n }\n}\n","import { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\nimport { FormsModule } from \"@angular/forms\";\nimport { NgSelectModule } from \"@ng-select/ng-select\";\n\nimport { OptionComponent } from \"./option.component\";\nimport { SelectComponent } from \"./select.component\";\n\n@NgModule({\n imports: [CommonModule, NgSelectModule, FormsModule],\n declarations: [SelectComponent, OptionComponent],\n exports: [SelectComponent, OptionComponent],\n})\nexport class SelectModule {}\n","export type ButtonType = \"primary\" | \"secondary\" | \"danger\" | \"unstyled\";\n\nexport abstract class ButtonLikeAbstraction {\n loading: boolean;\n disabled: boolean;\n setButtonType: (value: ButtonType) => void;\n}\n","import { Pipe, PipeTransform } from \"@angular/core\";\n\nimport { I18nService } from \"@bitwarden/common/platform/abstractions/i18n.service\";\n\n/**\n * Temporarily duplicate this pipe\n */\n@Pipe({\n name: \"i18n\",\n})\nexport class I18nPipe implements PipeTransform {\n constructor(private i18nService: I18nService) {}\n\n transform(id: string, p1?: string, p2?: string, p3?: string): string {\n return this.i18nService.t(id, p1, p2, p3);\n }\n}\n","import { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\n\nimport { I18nPipe } from \"./i18n.pipe\";\n\n@NgModule({\n imports: [CommonModule],\n declarations: [I18nPipe],\n exports: [CommonModule, I18nPipe],\n})\nexport class SharedModule {}\n","import { Directive, HostBinding } from \"@angular/core\";\n\n@Directive({\n selector: \"th[bitCell], td[bitCell]\",\n})\nexport class CellDirective {\n @HostBinding(\"class\") get classList() {\n return [\"tw-p-3\"];\n }\n}\n","import { Directive, HostBinding, Input } from \"@angular/core\";\n\n@Directive({\n selector: \"tr[bitRow]\",\n})\nexport class RowDirective {\n @Input() alignContent: \"top\" | \"middle\" | \"bottom\" | \"baseline\" = \"middle\";\n\n get alignmentClass(): string {\n switch (this.alignContent) {\n case \"top\":\n return \"tw-align-top\";\n case \"middle\":\n return \"tw-align-middle\";\n case \"bottom\":\n return \"tw-align-bottom\";\n default:\n return \"tw-align-baseline\";\n }\n }\n\n @HostBinding(\"class\") get classList() {\n return [\n \"tw-border-0\",\n \"tw-border-b\",\n \"tw-border-secondary-300\",\n \"tw-border-solid\",\n \"hover:tw-bg-background-alt\",\n \"last:tw-border-0\",\n this.alignmentClass,\n ];\n }\n}\n","import { coerceBooleanProperty } from \"@angular/cdk/coercion\";\nimport { Component, HostBinding, Input, OnInit } from \"@angular/core\";\n\nimport type { SortFn } from \"./table-data-source\";\nimport { TableComponent } from \"./table.component\";\n\n@Component({\n selector: \"th[bitSortable]\",\n template: `\n \n `,\n})\nexport class SortableComponent implements OnInit {\n /**\n * Mark the column as sortable and specify the key to sort by\n */\n @Input() bitSortable: string;\n\n private _default: boolean;\n /**\n * Mark the column as the default sort column\n */\n @Input() set default(value: boolean | \"\") {\n this._default = coerceBooleanProperty(value);\n }\n\n /**\n * Custom sorting function\n *\n * @example\n * fn = (a, b) => a.name.localeCompare(b.name)\n */\n @Input() fn: SortFn;\n\n constructor(private table: TableComponent) {}\n\n ngOnInit(): void {\n if (this._default && !this.isActive) {\n this.setActive();\n }\n }\n\n @HostBinding(\"attr.aria-sort\") get ariaSort() {\n if (!this.isActive) {\n return undefined;\n }\n return this.sort.direction === \"asc\" ? \"ascending\" : \"descending\";\n }\n\n protected setActive() {\n if (this.table.dataSource) {\n const direction = this.isActive && this.direction === \"asc\" ? \"desc\" : \"asc\";\n this.table.dataSource.sort = { column: this.bitSortable, direction: direction, fn: this.fn };\n }\n }\n\n private get sort() {\n return this.table.dataSource?.sort;\n }\n\n get isActive() {\n return this.sort?.column === this.bitSortable;\n }\n\n get direction() {\n return this.sort?.direction;\n }\n\n get icon() {\n if (!this.isActive) {\n return \"bwi-up-down-btn\";\n }\n return this.direction === \"asc\" ? \"bwi-up-solid\" : \"bwi-down-solid\";\n }\n\n get classList() {\n return [\n \"tw-group\",\n \"tw-min-w-max\",\n\n // Offset to border and padding\n \"-tw-m-1.5\",\n \"tw-font-bold\",\n\n // Below is copied from BitIconButtonComponent\n \"tw-border\",\n \"tw-border-solid\",\n \"tw-rounded\",\n \"tw-transition\",\n \"hover:tw-no-underline\",\n \"focus:tw-outline-none\",\n\n \"tw-bg-transparent\",\n \"!tw-text-muted\",\n \"tw-border-transparent\",\n \"hover:tw-bg-transparent-hover\",\n \"hover:tw-border-primary-700\",\n \"focus-visible:before:tw-ring-primary-700\",\n \"disabled:tw-opacity-60\",\n \"disabled:hover:tw-border-transparent\",\n \"disabled:hover:tw-bg-transparent\",\n\n // Workaround for box-shadow with transparent offset issue:\n // https://github.com/tailwindlabs/tailwindcss/issues/3595\n // Remove `before:` and use regular `tw-ring` when browser no longer has bug, or better:\n // switch to `outline` with `outline-offset` when Safari supports border radius on outline.\n // Using `box-shadow` to create outlines is a hack and as such `outline` should be preferred.\n \"tw-relative\",\n \"before:tw-content-['']\",\n \"before:tw-block\",\n \"before:tw-absolute\",\n \"before:-tw-inset-[3px]\",\n \"before:tw-rounded-md\",\n \"before:tw-transition\",\n \"before:tw-ring\",\n \"before:tw-ring-transparent\",\n \"focus-visible:tw-z-10\",\n ];\n }\n}\n","import { _isNumberValue } from \"@angular/cdk/coercion\";\nimport { DataSource } from \"@angular/cdk/collections\";\nimport { BehaviorSubject, combineLatest, map, Observable, Subscription } from \"rxjs\";\n\nexport type SortDirection = \"asc\" | \"desc\";\nexport type SortFn = (a: any, b: any) => number;\nexport type Sort = {\n column?: string;\n direction: SortDirection;\n fn?: SortFn;\n};\n\n// Loosely based on CDK TableDataSource\n// https://github.com/angular/components/blob/main/src/material/table/table-data-source.ts\nexport class TableDataSource extends DataSource {\n private readonly _data: BehaviorSubject;\n private readonly _sort: BehaviorSubject;\n private readonly _filter = new BehaviorSubject(\"\");\n private readonly _renderData = new BehaviorSubject([]);\n private _renderChangesSubscription: Subscription | null = null;\n\n /**\n * The filtered set of data that has been matched by the filter string, or all the data if there\n * is no filter. Useful for knowing the set of data the table represents.\n * For example, a 'selectAll()' function would likely want to select the set of filtered data\n * shown to the user rather than all the data.\n */\n filteredData: T[];\n\n constructor() {\n super();\n this._data = new BehaviorSubject([]);\n this._sort = new BehaviorSubject({ direction: \"asc\" });\n }\n\n get data() {\n return this._data.value;\n }\n\n set data(data: T[]) {\n data = Array.isArray(data) ? data : [];\n this._data.next(data);\n // Normally the `filteredData` is updated by the re-render\n // subscription, but that won't happen if it's inactive.\n if (!this._renderChangesSubscription) {\n this.filterData(data);\n }\n }\n\n set sort(sort: Sort) {\n this._sort.next(sort);\n }\n\n get sort() {\n return this._sort.value;\n }\n\n get filter() {\n return this._filter.value;\n }\n\n set filter(filter: string) {\n this._filter.next(filter);\n // Normally the `filteredData` is updated by the re-render\n // subscription, but that won't happen if it's inactive.\n if (!this._renderChangesSubscription) {\n this.filterData(this.data);\n }\n }\n\n connect(): Observable {\n if (!this._renderChangesSubscription) {\n this.updateChangeSubscription();\n }\n\n return this._renderData;\n }\n\n disconnect(): void {\n this._renderChangesSubscription?.unsubscribe();\n this._renderChangesSubscription = null;\n }\n\n private updateChangeSubscription() {\n const filteredData = combineLatest([this._data, this._filter]).pipe(\n map(([data]) => this.filterData(data)),\n );\n\n const orderedData = combineLatest([filteredData, this._sort]).pipe(\n map(([data, sort]) => this.orderData(data, sort)),\n );\n\n this._renderChangesSubscription?.unsubscribe();\n this._renderChangesSubscription = orderedData.subscribe((data) => this._renderData.next(data));\n }\n\n private filterData(data: T[]): T[] {\n this.filteredData =\n this.filter == null || this.filter === \"\"\n ? data\n : data.filter((obj) => this.filterPredicate(obj, this.filter));\n\n return this.filteredData;\n }\n\n private orderData(data: T[], sort: Sort): T[] {\n if (!sort) {\n return data;\n }\n\n return this.sortData(data, sort);\n }\n\n /**\n * Copied from https://github.com/angular/components/blob/main/src/material/table/table-data-source.ts\n * License: MIT\n * Copyright (c) 2022 Google LLC.\n *\n * Data accessor function that is used for accessing data properties for sorting through\n * the default sortData function.\n * This default function assumes that the sort header IDs (which defaults to the column name)\n * matches the data's properties (e.g. column Xyz represents data['Xyz']).\n * May be set to a custom function for different behavior.\n * @param data Data object that is being accessed.\n * @param sortHeaderId The name of the column that represents the data.\n */\n protected sortingDataAccessor(data: T, sortHeaderId: string): string | number {\n const value = (data as unknown as Record)[sortHeaderId];\n\n if (_isNumberValue(value)) {\n const numberValue = Number(value);\n\n return numberValue < Number.MAX_SAFE_INTEGER ? numberValue : value;\n }\n\n return value;\n }\n\n /**\n * Copied from https://github.com/angular/components/blob/main/src/material/table/table-data-source.ts\n * License: MIT\n * Copyright (c) 2022 Google LLC.\n *\n * Gets a sorted copy of the data array based on the state of the MatSort. Called\n * after changes are made to the filtered data or when sort changes are emitted from MatSort.\n * By default, the function retrieves the active sort and its direction and compares data\n * by retrieving data using the sortingDataAccessor. May be overridden for a custom implementation\n * of data ordering.\n * @param data The array of data that should be sorted.\n * @param sort The connected MatSort that holds the current sort state.\n */\n protected sortData(data: T[], sort: Sort): T[] {\n const column = sort.column;\n const directionModifier = sort.direction === \"asc\" ? 1 : -1;\n if (!column) {\n return data;\n }\n\n return data.sort((a, b) => {\n // If a custom sort function is provided, use it instead of the default.\n if (sort.fn) {\n return sort.fn(a, b) * directionModifier;\n }\n\n let valueA = this.sortingDataAccessor(a, column);\n let valueB = this.sortingDataAccessor(b, column);\n\n // If there are data in the column that can be converted to a number,\n // it must be ensured that the rest of the data\n // is of the same type so as not to order incorrectly.\n const valueAType = typeof valueA;\n const valueBType = typeof valueB;\n\n if (valueAType !== valueBType) {\n if (valueAType === \"number\") {\n valueA += \"\";\n }\n if (valueBType === \"number\") {\n valueB += \"\";\n }\n }\n\n if (typeof valueA === \"string\" && typeof valueB === \"string\") {\n return valueA.localeCompare(valueB) * directionModifier;\n }\n\n // If both valueA and valueB exist (truthy), then compare the two. Otherwise, check if\n // one value exists while the other doesn't. In this case, existing value should come last.\n // This avoids inconsistent results when comparing values to undefined/null.\n // If neither value exists, return 0 (equal).\n let comparatorResult = 0;\n if (valueA != null && valueB != null) {\n // Check if one value is greater than the other; if equal, comparatorResult should remain 0.\n if (valueA > valueB) {\n comparatorResult = 1;\n } else if (valueA < valueB) {\n comparatorResult = -1;\n }\n } else if (valueA != null) {\n comparatorResult = 1;\n } else if (valueB != null) {\n comparatorResult = -1;\n }\n\n return comparatorResult * directionModifier;\n });\n }\n\n /**\n * Copied from https://github.com/angular/components/blob/main/src/material/table/table-data-source.ts\n * License: MIT\n * Copyright (c) 2022 Google LLC.\n *\n * Checks if a data object matches the data source's filter string. By default, each data object\n * is converted to a string of its properties and returns true if the filter has\n * at least one occurrence in that string. By default, the filter string has its whitespace\n * trimmed and the match is case-insensitive. May be overridden for a custom implementation of\n * filter matching.\n * @param data Data object used to check against the filter.\n * @param filter Filter string that has been set on the data source.\n * @returns Whether the filter matches against the data\n */\n protected filterPredicate(data: T, filter: string): boolean {\n // Transform the data into a lowercase string of all property values.\n const dataStr = Object.keys(data as unknown as Record)\n .reduce((currentTerm: string, key: string) => {\n // Use an obscure Unicode character to delimit the words in the concatenated string.\n // This avoids matches where the values of two columns combined will match the user's query\n // (e.g. `Flute` and `Stop` will match `Test`). The character is intended to be something\n // that has a very low chance of being typed in by somebody in a text field. This one in\n // particular is \"White up-pointing triangle with dot\" from\n // https://en.wikipedia.org/wiki/List_of_Unicode_characters\n return currentTerm + (data as unknown as Record)[key] + \"◬\";\n }, \"\")\n .toLowerCase();\n\n // Transform the filter by converting it to lowercase and removing whitespace.\n const transformedFilter = filter.trim().toLowerCase();\n\n return dataStr.indexOf(transformedFilter) != -1;\n }\n}\n","\n \n \n \n \n \n \n
    \n","import { isDataSource } from \"@angular/cdk/collections\";\nimport {\n AfterContentChecked,\n Component,\n ContentChild,\n Directive,\n Input,\n OnDestroy,\n TemplateRef,\n} from \"@angular/core\";\nimport { Observable } from \"rxjs\";\n\nimport { TableDataSource } from \"./table-data-source\";\n\n@Directive({\n selector: \"ng-template[body]\",\n})\nexport class TableBodyDirective {\n // eslint-disable-next-line @typescript-eslint/explicit-member-accessibility\n constructor(public readonly template: TemplateRef) {}\n}\n\n@Component({\n selector: \"bit-table\",\n templateUrl: \"./table.component.html\",\n})\nexport class TableComponent implements OnDestroy, AfterContentChecked {\n @Input() dataSource: TableDataSource;\n @Input() layout: \"auto\" | \"fixed\" = \"auto\";\n\n @ContentChild(TableBodyDirective) templateVariable: TableBodyDirective;\n\n protected rows: Observable;\n\n private _initialized = false;\n\n get tableClass() {\n return [\n \"tw-w-full\",\n \"tw-leading-normal\",\n \"tw-text-main\",\n \"tw-border-collapse\",\n \"tw-text-start\",\n this.layout === \"auto\" ? \"tw-table-auto\" : \"tw-table-fixed\",\n ];\n }\n\n ngAfterContentChecked(): void {\n if (!this._initialized && isDataSource(this.dataSource)) {\n this._initialized = true;\n\n const dataStream = this.dataSource.connect();\n this.rows = dataStream;\n }\n }\n\n ngOnDestroy(): void {\n if (isDataSource(this.dataSource)) {\n this.dataSource.disconnect();\n }\n }\n}\n","import { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\n\nimport { CellDirective } from \"./cell.directive\";\nimport { RowDirective } from \"./row.directive\";\nimport { SortableComponent } from \"./sortable.component\";\nimport { TableBodyDirective, TableComponent } from \"./table.component\";\n\n@NgModule({\n imports: [CommonModule],\n declarations: [\n TableComponent,\n CellDirective,\n RowDirective,\n SortableComponent,\n TableBodyDirective,\n ],\n exports: [TableComponent, CellDirective, RowDirective, SortableComponent, TableBodyDirective],\n})\nexport class TableModule {}\n","import { Component } from \"@angular/core\";\n\n/**\n * Component used for styling the tab header/background for both content and navigation tabs\n */\n@Component({\n selector: \"bit-tab-header\",\n host: {\n class:\n \"tw-h-16 tw-pl-4 tw-bg-background-alt tw-flex tw-items-end tw-border-0 tw-border-b tw-border-solid tw-border-secondary-300\",\n },\n template: ``,\n})\nexport class TabHeaderComponent {}\n","import { Directive } from \"@angular/core\";\n\n/**\n * Directive used for styling the container for bit tab labels\n */\n@Directive({\n selector: \"[bitTabListContainer]\",\n host: {\n class: \"tw-inline-flex tw-flex-wrap tw-leading-5\",\n },\n})\nexport class TabListContainerDirective {}\n","import { FocusableOption } from \"@angular/cdk/a11y\";\nimport { Directive, ElementRef, HostBinding, Input } from \"@angular/core\";\n\n/**\n * Directive used for styling tab header items for both nav links (anchor tags)\n * and content tabs (button tags)\n */\n@Directive({ selector: \"[bitTabListItem]\" })\nexport class TabListItemDirective implements FocusableOption {\n @Input() active: boolean;\n @Input() disabled: boolean;\n\n @HostBinding(\"attr.disabled\")\n get disabledAttr() {\n return this.disabled || null; // native disabled attr must be null when false\n }\n\n constructor(private elementRef: ElementRef) {}\n\n focus() {\n this.elementRef.nativeElement.focus();\n }\n\n click() {\n this.elementRef.nativeElement.click();\n }\n\n @HostBinding(\"class\")\n get classList(): string[] {\n return this.baseClassList\n .concat(this.active ? this.activeClassList : [])\n .concat(this.disabled ? this.disabledClassList : [])\n .concat(this.textColorClassList);\n }\n\n /**\n * Classes used for styling tab item text color.\n * Separate text color class list required to override bootstrap classes in Web.\n */\n get textColorClassList(): string[] {\n if (this.disabled) {\n return [\"!tw-text-muted\", \"hover:!tw-text-muted\"];\n }\n if (this.active) {\n return [\"!tw-text-primary-500\", \"hover:!tw-text-primary-700\"];\n }\n return [\"!tw-text-main\", \"hover:!tw-text-main\"];\n }\n\n get baseClassList(): string[] {\n return [\n \"tw-block\",\n \"tw-relative\",\n \"tw-py-2\",\n \"tw-px-4\",\n \"tw-font-semibold\",\n \"tw-transition\",\n \"tw-rounded-t\",\n \"tw-border-0\",\n \"tw-border-x\",\n \"tw-border-t-4\",\n \"tw-border-transparent\",\n \"tw-border-solid\",\n \"tw-bg-transparent\",\n \"hover:tw-underline\",\n \"focus-visible:tw-z-10\",\n \"focus-visible:tw-outline-none\",\n \"focus-visible:tw-ring-2\",\n \"focus-visible:tw-ring-primary-700\",\n ];\n }\n\n get disabledClassList(): string[] {\n return [\"!tw-bg-secondary-100\", \"!tw-no-underline\", \"tw-cursor-not-allowed\"];\n }\n\n get activeClassList(): string[] {\n return [\n \"tw--mb-px\",\n \"tw-border-x-secondary-300\",\n \"tw-border-t-primary-500\",\n \"tw-border-b\",\n \"tw-border-b-background\",\n \"!tw-bg-background\",\n \"hover:tw-border-t-primary-700\",\n \"focus-visible:tw-border-t-primary-700\",\n \"focus-visible:!tw-text-primary-700\",\n ];\n }\n}\n","import { TemplatePortal } from \"@angular/cdk/portal\";\nimport { Component, HostBinding, Input } from \"@angular/core\";\n\n@Component({\n selector: \"bit-tab-body\",\n templateUrl: \"tab-body.component.html\",\n})\nexport class TabBodyComponent {\n private _firstRender: boolean;\n\n @Input() content: TemplatePortal;\n @Input() preserveContent = false;\n\n @HostBinding(\"attr.hidden\") get hidden() {\n return !this.active || null;\n }\n\n @Input()\n get active() {\n return this._active;\n }\n set active(value: boolean) {\n this._active = value;\n if (this._active) {\n this._firstRender = true;\n }\n }\n private _active: boolean;\n\n /**\n * The tab content to render.\n * Inactive tabs that have never been rendered/active do not have their\n * content rendered by default for performance. If `preserveContent` is `true`\n * then the content persists after the first time content is rendered.\n */\n get tabContent() {\n if (this.active) {\n return this.content;\n }\n if (this.preserveContent && this._firstRender) {\n return this.content;\n }\n return null;\n }\n}\n","\n \n \n \n\n \n \n \n \n\n {{ tab.textLabel }}\n \n \n \n\n
    \n \n \n
    \n","\n","import { FocusKeyManager } from \"@angular/cdk/a11y\";\nimport { coerceNumberProperty } from \"@angular/cdk/coercion\";\nimport {\n AfterContentChecked,\n AfterContentInit,\n AfterViewInit,\n Component,\n ContentChildren,\n EventEmitter,\n Input,\n OnDestroy,\n Output,\n QueryList,\n ViewChildren,\n} from \"@angular/core\";\nimport { Subject, takeUntil } from \"rxjs\";\n\nimport { TabListItemDirective } from \"../shared/tab-list-item.directive\";\n\nimport { TabComponent } from \"./tab.component\";\n\n/** Used to generate unique ID's for each tab component */\nlet nextId = 0;\n\n@Component({\n selector: \"bit-tab-group\",\n templateUrl: \"./tab-group.component.html\",\n})\nexport class TabGroupComponent\n implements AfterContentChecked, AfterContentInit, AfterViewInit, OnDestroy\n{\n private readonly _groupId: number;\n private readonly destroy$ = new Subject();\n private _indexToSelect: number | null = 0;\n\n /**\n * Aria label for the tab list menu\n */\n @Input() label = \"\";\n\n /**\n * Keep the content of off-screen tabs in the DOM.\n * Useful for keeping