mirror of
https://gitlab.opencode.de/bwi/bundesmessenger/clients/bundesmessenger-ios.git
synced 2026-04-23 18:12:44 +02:00
PSG-976 Exclude current session from security recommendations and other sessions
This commit is contained in:
+1
-1
@@ -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
|
||||
|
||||
-1
@@ -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
|
||||
|
||||
|
||||
-46
@@ -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.")
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -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)
|
||||
|
||||
-2
@@ -30,8 +30,6 @@ struct UserSessionListItemViewData: Identifiable, Hashable {
|
||||
|
||||
let sessionDetails: String
|
||||
|
||||
let highlightSessionDetails: Bool
|
||||
|
||||
let deviceAvatarViewData: DeviceAvatarViewData
|
||||
|
||||
let sessionDetailsIcon: String?
|
||||
|
||||
+2
-7
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user