소스 검색

Add hidden option to use appservice login for double puppeting

Tulir Asokan 2 년 전
부모
커밋
2d1e8baf1c
1개의 변경된 파일13개의 추가작업 그리고 9개의 파일을 삭제
  1. 13 9
      custompuppet.go

+ 13 - 9
custompuppet.go

@@ -125,22 +125,26 @@ func (puppet *Puppet) tryRelogin(cause error, action string) bool {
 func (puppet *Puppet) loginWithSharedSecret(mxid id.UserID) (string, error) {
 	_, homeserver, _ := mxid.Parse()
 	puppet.log.Debugfln("Logging into %s with shared secret", mxid)
-
-	mac := hmac.New(sha512.New, []byte(puppet.bridge.Config.Bridge.LoginSharedSecretMap[homeserver]))
-	mac.Write([]byte(mxid))
-
+	loginSecret := puppet.bridge.Config.Bridge.LoginSharedSecretMap[homeserver]
 	client, err := puppet.bridge.newDoublePuppetClient(mxid, "")
 	if err != nil {
 		return "", fmt.Errorf("failed to create mautrix client to log in: %v", err)
 	}
-
-	resp, err := client.Login(&mautrix.ReqLogin{
-		Type:                     mautrix.AuthTypePassword,
+	req := mautrix.ReqLogin{
 		Identifier:               mautrix.UserIdentifier{Type: mautrix.IdentifierTypeUser, User: string(mxid)},
-		Password:                 hex.EncodeToString(mac.Sum(nil)),
 		DeviceID:                 "Discord Bridge",
 		InitialDeviceDisplayName: "Discord Bridge",
-	})
+	}
+	if loginSecret == "appservice" {
+		client.AccessToken = puppet.bridge.AS.Registration.AppToken
+		req.Type = mautrix.AuthTypeAppservice
+	} else {
+		mac := hmac.New(sha512.New, []byte(loginSecret))
+		mac.Write([]byte(mxid))
+		req.Password = hex.EncodeToString(mac.Sum(nil))
+		req.Type = mautrix.AuthTypePassword
+	}
+	resp, err := client.Login(&req)
 	if err != nil {
 		return "", err
 	}