From 0c839469839314f432703b8294cf318d5d16d785 Mon Sep 17 00:00:00 2001 From: Lucki Date: Tue, 6 Sep 2022 00:46:52 +0200 Subject: [PATCH] Add Matrix username spoofing (#1875) * Matrix username spoofing * Add config sample --- bridge/matrix/helpers.go | 2 +- bridge/matrix/matrix.go | 46 ++++++++++++++++++++++++++++++---------- matterbridge.toml.sample | 5 +++++ 3 files changed, 41 insertions(+), 12 deletions(-) diff --git a/bridge/matrix/helpers.go b/bridge/matrix/helpers.go index b8e848a2..5a91f748 100644 --- a/bridge/matrix/helpers.go +++ b/bridge/matrix/helpers.go @@ -51,7 +51,7 @@ func interface2Struct(in interface{}, out interface{}) error { return json.Unmarshal(jsonObj, out) } -// getDisplayName retrieves the displayName for mxid, querying the homserver if the mxid is not in the cache. +// getDisplayName retrieves the displayName for mxid, querying the homeserver if the mxid is not in the cache. func (b *Bmatrix) getDisplayName(mxid string) string { if b.GetBool("UseUserName") { return mxid[1:] diff --git a/bridge/matrix/matrix.go b/bridge/matrix/matrix.go index 702f4c8d..49fc33b3 100644 --- a/bridge/matrix/matrix.go +++ b/bridge/matrix/matrix.go @@ -148,12 +148,37 @@ func (b *Bmatrix) Send(msg config.Message) (string, error) { username := newMatrixUsername(msg.Username) + body := username.plain + msg.Text + formattedBody := username.formatted + helper.ParseMarkdown(msg.Text) + + if b.GetBool("SpoofUsername") { + // https://spec.matrix.org/v1.3/client-server-api/#mroommember + type stateMember struct { + AvatarURL string `json:"avatar_url,omitempty"` + DisplayName string `json:"displayname"` + Membership string `json:"membership"` + } + + // TODO: reset username afterwards with DisplayName: null ? + m := stateMember{ + AvatarURL: "", + DisplayName: username.plain, + Membership: "join", + } + + _, err := b.mc.SendStateEvent(channel, "m.room.member", b.UserID, m) + if err == nil { + body = msg.Text + formattedBody = helper.ParseMarkdown(msg.Text) + } + } + // Make a action /me of the message if msg.Event == config.EventUserAction { m := matrix.TextMessage{ MsgType: "m.emote", - Body: username.plain + msg.Text, - FormattedBody: username.formatted + helper.ParseMarkdown(msg.Text), + Body: body, + FormattedBody: formattedBody, Format: "org.matrix.custom.html", } @@ -224,10 +249,10 @@ func (b *Bmatrix) Send(msg config.Message) (string, error) { if msg.ID != "" { rmsg := EditedMessage{ TextMessage: matrix.TextMessage{ - Body: username.plain + msg.Text, + Body: body, MsgType: "m.text", Format: "org.matrix.custom.html", - FormattedBody: username.formatted + helper.ParseMarkdown(msg.Text), + FormattedBody: formattedBody, }, } @@ -266,8 +291,8 @@ func (b *Bmatrix) Send(msg config.Message) (string, error) { if msg.Event == config.EventJoinLeave { m := matrix.TextMessage{ MsgType: "m.notice", - Body: username.plain + msg.Text, - FormattedBody: username.formatted + msg.Text, + Body: body, + FormattedBody: formattedBody, Format: "org.matrix.custom.html", } @@ -297,8 +322,8 @@ func (b *Bmatrix) Send(msg config.Message) (string, error) { m := ReplyMessage{ TextMessage: matrix.TextMessage{ MsgType: "m.text", - Body: username.plain + msg.Text, - FormattedBody: username.formatted + helper.ParseMarkdown(msg.Text), + Body: body, + FormattedBody: formattedBody, Format: "org.matrix.custom.html", }, } @@ -338,7 +363,7 @@ func (b *Bmatrix) Send(msg config.Message) (string, error) { ) err = b.retry(func() error { - resp, err = b.mc.SendText(channel, username.plain+msg.Text) + resp, err = b.mc.SendText(channel, body) return err }) @@ -356,8 +381,7 @@ func (b *Bmatrix) Send(msg config.Message) (string, error) { ) err = b.retry(func() error { - resp, err = b.mc.SendFormattedText(channel, username.plain+msg.Text, - username.formatted+helper.ParseMarkdown(msg.Text)) + resp, err = b.mc.SendFormattedText(channel, body, formattedBody) return err }) diff --git a/matterbridge.toml.sample b/matterbridge.toml.sample index 41ab44bf..97b27d73 100644 --- a/matterbridge.toml.sample +++ b/matterbridge.toml.sample @@ -1390,6 +1390,11 @@ RemoteNickFormat="[{PROTOCOL}] <{NICK}> " #OPTIONAL (default false) ShowJoinPart=false +#Rename the bot in the current room to the username of the message +#This will make an additional API request per message and will probably count towards rate limits +#OPTIONAL (default false) +SpoofUsername=false + #StripNick only allows alphanumerical nicks. See https://github.com/42wim/matterbridge/issues/285 #It will strip other characters from the nick #OPTIONAL (default false)