@@ -86,6 +86,22 @@ const COMMANDS: {[command: string]: Command|Heading} = {
8686 example : `!username [irc.example.net] username` ,
8787 summary : "Store a username to use for future connections." ,
8888 } ,
89+ "!storecert" : {
90+ example : `!storecert irc.example.net] -----BEGIN CERTIFICATE-----[...]` ,
91+ summary : `Store a SASL certificate for CertFP` ,
92+ } ,
93+ "!storekey" : {
94+ example : `!storekey [irc.example.net] -----BEGIN PRIVATE KEY-----[...]` ,
95+ summary : `Store a SASL private key for CertFP` ,
96+ } ,
97+ "!removecert" : {
98+ example : `!removecert [irc.example.net]` ,
99+ summary : `Remove a previously stored SASL certificate` ,
100+ } ,
101+ "!removekey" : {
102+ example : `!removekey [irc.example.net]` ,
103+ summary : `Remove a previously stored SASL private key` ,
104+ } ,
89105 'Info' : { heading : true } ,
90106 "!bridgeversion" : {
91107 example : `!bridgeversion` ,
@@ -166,6 +182,14 @@ export class AdminRoomHandler {
166182 return await this . handleStorePass ( req , args , event . sender ) ;
167183 case "!removepass" :
168184 return await this . handleRemovePass ( args , event . sender ) ;
185+ case "!storekey" :
186+ return await this . handleStoreKey ( req , args , event . sender ) ;
187+ case "!storecert" :
188+ return await this . handleStoreCert ( req , args , event . sender ) ;
189+ case "!removekey" :
190+ return await this . handleRemoveKey ( args , event . sender ) ;
191+ case "!removecert" :
192+ return await this . handleRemoveCert ( args , event . sender ) ;
169193 case "!listrooms" :
170194 return await this . handleListRooms ( args , event . sender ) ;
171195 case "!quit" :
@@ -463,7 +487,7 @@ export class AdminRoomHandler {
463487 let notice ;
464488
465489 try {
466- // Allow passwords with spaces
490+ // Allow usernames with spaces
467491 const username = args [ 0 ] ?. trim ( ) ;
468492 if ( ! username ) {
469493 notice = new MatrixAction (
@@ -557,6 +581,96 @@ export class AdminRoomHandler {
557581 }
558582 }
559583
584+ private async handleStoreKey ( req : BridgeRequest , args : string [ ] , userId : string ) {
585+ const server = this . extractServerFromArgs ( args ) ;
586+ const domain = server . domain ;
587+ let notice ;
588+
589+ try {
590+ const key = args . join ( '\n' ) ;
591+ if ( key . length === 0 ) {
592+ notice = new MatrixAction (
593+ "notice" ,
594+ "Format: '!storekey key' or '!storepass irc.server.name key'\n"
595+ ) ;
596+ }
597+ else {
598+ await this . ircBridge . getStore ( ) . storeKey ( userId , domain , key ) ;
599+ notice = new MatrixAction (
600+ "notice" , `Successfully stored SASL key for ${ domain } . Use !reconnect to reauthenticate.`
601+ ) ;
602+ }
603+ }
604+ catch ( err ) {
605+ req . log . error ( err . stack ) ;
606+ return new MatrixAction (
607+ "notice" , `Failed to store SASL key: ${ err . message } `
608+ ) ;
609+ }
610+ return notice ;
611+ }
612+
613+ private async handleRemoveKey ( args : string [ ] , userId : string ) {
614+ const server = this . extractServerFromArgs ( args ) ;
615+
616+ try {
617+ await this . ircBridge . getStore ( ) . removeKey ( userId , server . domain ) ;
618+ return new MatrixAction (
619+ "notice" , `Successfully removed SASL key.`
620+ ) ;
621+ }
622+ catch ( err ) {
623+ return new MatrixAction (
624+ "notice" , `Failed to remove SASL key: ${ err . message } `
625+ ) ;
626+ }
627+ }
628+
629+ private async handleStoreCert ( req : BridgeRequest , args : string [ ] , userId : string ) {
630+ const server = this . extractServerFromArgs ( args ) ;
631+ const domain = server . domain ;
632+ let notice ;
633+
634+ try {
635+ const cert = args . join ( '\n' ) ;
636+ if ( cert . length === 0 ) {
637+ notice = new MatrixAction (
638+ "notice" ,
639+ "Format: '!storecert cert' or '!storecert irc.server.name cert'\n"
640+ ) ;
641+ }
642+ else {
643+ await this . ircBridge . getStore ( ) . storeCert ( userId , domain , cert ) ;
644+ notice = new MatrixAction (
645+ "notice" , `Successfully stored SASL cert for ${ domain } . Use !reconnect to reauthenticate.`
646+ ) ;
647+ }
648+ }
649+ catch ( err ) {
650+ req . log . error ( err . stack ) ;
651+ return new MatrixAction (
652+ "notice" , `Failed to store SASL cert: ${ err . message } `
653+ ) ;
654+ }
655+ return notice ;
656+ }
657+
658+ private async handleRemoveCert ( args : string [ ] , userId : string ) {
659+ const server = this . extractServerFromArgs ( args ) ;
660+
661+ try {
662+ await this . ircBridge . getStore ( ) . removeCert ( userId , server . domain ) ;
663+ return new MatrixAction (
664+ "notice" , `Successfully removed SASL cert.`
665+ ) ;
666+ }
667+ catch ( err ) {
668+ return new MatrixAction (
669+ "notice" , `Failed to remove SASL cert: ${ err . message } `
670+ ) ;
671+ }
672+ }
673+
560674 private async handleListRooms ( args : string [ ] , sender : string ) {
561675 const server = this . extractServerFromArgs ( args ) ;
562676
0 commit comments