Knock support

Also, fix token refresh functionality
This commit is contained in:
N-Pex 2025-05-28 12:29:04 +02:00
parent cfabd8be08
commit e8f04d79c9
11 changed files with 310 additions and 75 deletions

View file

@ -46,6 +46,7 @@ export default {
currentRoom: null,
notificationCount: 0,
legacyCryptoStore: undefined,
tokenRefreshPromise: undefined,
};
},
@ -95,6 +96,12 @@ export default {
});
},
knockedRooms() {
return this.rooms.filter((room) => {
return room.getMyMembership() === "knock";
});
},
joinedAndInvitedRooms() {
return this.rooms.filter((room) => {
return room.getMyMembership() === "join" || room.getMyMembership() === "invite";
@ -196,6 +203,7 @@ export default {
password: user.password,
type: "m.login.password",
initial_device_display_name: this.$config.appName,
refresh_token: true
};
if (user.device_id) {
data.device_id = user.device_id;
@ -420,6 +428,7 @@ export default {
// Reject the invite, i.e. call "leave" on it.
this.matrixClient.leave(room.roomId);
}
// TODO - handle knocks
}
break;
@ -469,8 +478,12 @@ export default {
this.updateNotificationCount();
},
onRoomMyMembership(room) {
if (room.getMyMembership() === "invite") {
onRoomMyMembership(room, membership, prevMembership) {
if (membership === "invite") {
if (prevMembership === "knock") {
// This is someone accepting our knock! Auto-join.
this.matrixClient.joinRoom(room.roomId);
}
// Invitation. Need to call "recalculate" to pick
// up room name, not sure why exactly.
room.recalculate();
@ -479,25 +492,36 @@ export default {
},
onSessionRefresh(refreshToken) {
if (this.tokenRefreshPromise) {
return this.tokenRefreshPromise;
}
const now = Date.now();
return this.matrixClient.refreshToken(refreshToken).then((result) => {
// Store new one!
var user = this.$store.state.auth.user;
user.access_token = result.access_token;
user.refresh_token = result.refresh_token;
user.expires_in_ms = result.expires_in_ms;
this.$store.commit("setUser", user);
this.tokenRefreshPromise =
this.matrixClient.http.request(sdk.Method.Post, "/refresh", undefined, { refresh_token: refreshToken}, { prefix: sdk.ClientPrefix.V3, inhibitLogoutEmit: true }).then((result) => {
// Store new one!
var user = this.$store.state.auth.user;
user.access_token = result.access_token;
user.refresh_token = result.refresh_token;
user.expires_in_ms = result.expires_in_ms;
this.$store.commit("setUser", user);
// Return AccessTokens struct
let accesssTokens = {
accessToken: result.access_token,
refreshToken: result.refresh_token
};
if (result.expires_in_ms) {
accesssTokens.expiry = new Date(now + result.expires_in_ms);
};
return accesssTokens;
});
// Return AccessTokens struct
let accessTokens = {
accessToken: result.access_token,
refreshToken: result.refresh_token
};
if (result.expires_in_ms) {
accessTokens.expiry = new Date(now + result.expires_in_ms);
};
return accessTokens;
})
.catch((error) => {
throw new sdk.TokenRefreshLogoutError(error);
})
.finally(() => {
this.tokenRefreshPromise = undefined;
});
return this.tokenRefreshPromise;
},
onSessionLoggedOut() {
@ -541,7 +565,7 @@ export default {
// each time!
var updatedRooms = this.matrixClient.getVisibleRooms();
updatedRooms = updatedRooms.filter((room) => {
return room.getMyMembership() && (room.getMyMembership() == "invite" || room.getMyMembership() == "join") && room.currentState.getStateEvents(STATE_EVENT_ROOM_DELETED).length == 0;
return room.getMyMembership() && ["invite", "join", "knock"].includes(room.getMyMembership()) && room.currentState.getStateEvents(STATE_EVENT_ROOM_DELETED).length == 0;
});
updatedRooms.forEach((room) => {
room["avatar"] = room.getAvatarUrl(this.matrixClient.getHomeserverUrl(), 80, 80, "scale", true, this.useAuthedMedia);
@ -692,6 +716,14 @@ export default {
}
},
answerKnock(roomId, userId, allowAccess, reason) {
if (allowAccess) {
this.matrixClient.invite(roomId, userId, reason);
} else {
this.matrixClient.kick(roomId, userId, reason);
}
},
/**
* Returns true if the current user is joined to the given room.
* @param roomIdOrAlias
@ -921,7 +953,8 @@ export default {
statusCallback(this.$t("room.purge_removing_members"));
var joined = room.getMembersWithMembership("join");
var invited = room.getMembersWithMembership("invite");
var allMembers = joined.concat(invited);
var knocked = room.getMembersWithMembership("knock");
var allMembers = joined.concat(invited).concat(knocked);
const me = allMembers.find((m) => m.userId == self.currentUserId);