PSG-976 Exclude current session from security recommendations and other sessions

This commit is contained in:
Aleksandrs Proskurins
2022-10-28 10:14:19 +03:00
parent c19cb59604
commit 0614b019af
8 changed files with 6 additions and 61 deletions
@@ -25,7 +25,7 @@ class UserSessionsOverviewService: UserSessionsOverviewServiceProtocol {
private var cancellables: Set<AnyCancellable> = []
private(set) var overviewDataPublisher: CurrentValueSubject<UserSessionsOverviewData, Never>
private(set) var sessionInfos: [UserSessionInfo]
private var sessionInfos: [UserSessionInfo]
init(dataProvider: UserSessionsDataProviderProtocol) {
self.dataProvider = dataProvider
@@ -26,7 +26,6 @@ struct UserSessionsOverviewData {
protocol UserSessionsOverviewServiceProtocol {
var overviewDataPublisher: CurrentValueSubject<UserSessionsOverviewData, Never> { get }
var sessionInfos: [UserSessionInfo] { get }
func updateOverviewData(completion: @escaping (Result<UserSessionsOverviewData, Error>) -> Void) -> Void
@@ -65,50 +65,4 @@ class UserSessionListItemViewDataFactoryTests: XCTestCase {
XCTAssertEqual(sessionDetailsUnknown, VectorL10n.userSessionVerificationUnknownShort,
"The details should only show the verification state when no timestamp exists.")
}
func testCurrentSessionDetailsWithTimestamp() {
// Given other devices in each of the verification states.
let sessionInfoVerified = UserSessionInfo.mockPhone(verificationState: .verified, isCurrent: true)
let sessionInfoUnverified = UserSessionInfo.mockPhone(verificationState: .unverified, isCurrent: true)
let sessionInfoUnknown = UserSessionInfo.mockPhone(verificationState: .unknown, isCurrent: true)
// When getting session details for each of them.
let sessionDetailsVerified = factory.create(from: sessionInfoVerified).sessionDetails
let sessionDetailsUnverified = factory.create(from: sessionInfoUnverified).sessionDetails
let sessionDetailsUnknown = factory.create(from: sessionInfoUnknown).sessionDetails
// Then the details should be formatted correctly.
XCTAssertEqual(sessionDetailsVerified,
VectorL10n.userSessionItemDetails(VectorL10n.userSessionVerifiedShort, VectorL10n.userOtherSessionCurrentSessionDetails),
"The details should show as verified with a current session string when verified.")
XCTAssertEqual(sessionDetailsUnverified,
VectorL10n.userSessionItemDetails(VectorL10n.userSessionUnverifiedShort, VectorL10n.userOtherSessionCurrentSessionDetails),
"The details should show as unverified with a current session string when unverified.")
XCTAssertEqual(sessionDetailsUnknown,
VectorL10n.userOtherSessionCurrentSessionDetails,
"The details should only show the current session string when verification is unknown.")
}
func testCurrentSessionDetailsVerifiedWithoutTimestamp() {
// Given a verified other device
let sessionInfoVerified = UserSessionInfo.mockPhone(hasTimestamp: false, isCurrent: true)
let sessionInfoUnverified = UserSessionInfo.mockPhone(verificationState: .unverified, hasTimestamp: false, isCurrent: true)
let sessionInfoUnknown = UserSessionInfo.mockPhone(verificationState: .unknown, hasTimestamp: false, isCurrent: true)
// When getting session details
let sessionDetailsVerified = factory.create(from: sessionInfoVerified).sessionDetails
let sessionDetailsUnverified = factory.create(from: sessionInfoUnverified).sessionDetails
let sessionDetailsUnknown = factory.create(from: sessionInfoUnknown).sessionDetails
// Then the details should contain the verification state and a last seen date.
XCTAssertEqual(sessionDetailsVerified,
VectorL10n.userSessionItemDetails(VectorL10n.userSessionVerifiedShort, VectorL10n.userOtherSessionCurrentSessionDetails),
"The details should show as verified with a current session string when verified.")
XCTAssertEqual(sessionDetailsUnverified,
VectorL10n.userSessionItemDetails(VectorL10n.userSessionUnverifiedShort, VectorL10n.userOtherSessionCurrentSessionDetails),
"The details should show as unverified with a current session string when unverified.")
XCTAssertEqual(sessionDetailsUnknown,
VectorL10n.userOtherSessionCurrentSessionDetails,
"The details should only show the current session string when verification is unknown.")
}
}
@@ -77,7 +77,7 @@ class UserSessionsOverviewViewModel: UserSessionsOverviewViewModelType, UserSess
case .linkDevice:
completion?(.linkDevice)
case .signOutOtherSessions:
completion?(.singOutFromUserSessions(sessionInfos: userSessionsOverviewService.sessionInfos))
completion?(.singOutFromUserSessions(sessionInfos: userSessionsOverviewService.otherSessions))
}
}
@@ -111,7 +111,7 @@ class UserSessionsOverviewViewModel: UserSessionsOverviewViewModelType, UserSess
}
private func showSessions(filteredBy filter: UserOtherSessionsFilter) {
completion?(.showOtherSessions(sessionInfos: userSessionsOverviewService.sessionInfos,
completion?(.showOtherSessions(sessionInfos: userSessionsOverviewService.otherSessions,
filter: filter))
}
}
@@ -54,7 +54,7 @@ struct UserSessionListItem: View {
}
Text(viewData.sessionDetails)
.font(theme.fonts.caption1)
.foregroundColor(viewData.highlightSessionDetails ? theme.colors.alert : theme.colors.secondaryContent)
.foregroundColor(theme.colors.secondaryContent)
.multilineTextAlignment(.leading)
}
.padding(.bottom, 16)
@@ -30,8 +30,6 @@ struct UserSessionListItemViewData: Identifiable, Hashable {
let sessionDetails: String
let highlightSessionDetails: Bool
let deviceAvatarViewData: DeviceAvatarViewData
let sessionDetailsIcon: String?
@@ -18,7 +18,6 @@ import Foundation
struct UserSessionListItemViewDataFactory {
func create(from sessionInfo: UserSessionInfo,
highlightSessionDetails: Bool = false,
isSelected: Bool = false) -> UserSessionListItemViewData {
let sessionName = UserSessionNameFormatter.sessionName(deviceType: sessionInfo.deviceType,
sessionDisplayName: sessionInfo.name)
@@ -28,7 +27,6 @@ struct UserSessionListItemViewDataFactory {
return UserSessionListItemViewData(sessionId: sessionInfo.id,
sessionName: sessionName,
sessionDetails: sessionDetails,
highlightSessionDetails: highlightSessionDetails,
deviceAvatarViewData: deviceAvatarViewData,
sessionDetailsIcon: getSessionDetailsIcon(isActive: sessionInfo.isActive),
isSelected: isSelected)
@@ -52,16 +50,13 @@ struct UserSessionListItemViewDataFactory {
private func activeSessionDetails(sessionInfo: UserSessionInfo) -> String {
// Start by creating the main part of the details string.
var sessionDetailsString = ""
var lastActivityDateString: String?
if let lastActivityDate = sessionInfo.lastSeenTimestamp {
lastActivityDateString = UserSessionLastActivityFormatter.lastActivityDateString(from: lastActivityDate)
}
if sessionInfo.isCurrent {
sessionDetailsString = VectorL10n.userOtherSessionCurrentSessionDetails
} else if let lastActivityDateString = lastActivityDateString, lastActivityDateString.isEmpty == false {
var sessionDetailsString = ""
if let lastActivityDateString = lastActivityDateString, lastActivityDateString.isEmpty == false {
sessionDetailsString = VectorL10n.userSessionItemDetailsLastActivity(lastActivityDateString)
}