Knock support
Also, fix token refresh functionality
This commit is contained in:
parent
cfabd8be08
commit
e8f04d79c9
11 changed files with 310 additions and 75 deletions
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue