Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ensure non-nil sessionId #1814

Merged
merged 5 commits into from
Dec 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 2 additions & 43 deletions NextcloudTalk/ChatViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -202,10 +202,6 @@ import SwiftyAttributes
}

if !self.offlineMode {
if self.room.token == nil {
fatalTokenError()
}

NCRoomsManager.sharedInstance().joinRoom(self.room.token, forCall: false)
}

Expand All @@ -216,39 +212,6 @@ import SwiftyAttributes
}
}

private func fatalTokenError() {
let capabilities = NCDatabaseManager.sharedInstance().serverCapabilities()

switch capabilities.versionMajor {
case 19:
fatalError()
case 20:
fatalError()
case 21:
fatalError()
case 22:
fatalError()
case 23:
fatalError()
case 24:
fatalError()
case 25:
fatalError()
case 26:
fatalError()
case 27:
fatalError()
case 28:
fatalError()
case 29:
fatalError()
case 30:
fatalError()
default:
fatalError()
}
}

public override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)

Expand Down Expand Up @@ -289,11 +252,7 @@ import SwiftyAttributes
// Check if new messages were added while the app was inactive (eg. via background-refresh)
self.checkForNewStoredMessages()

if !self.offlineMode {
if self.room.token == nil {
fatalTokenError()
}

if !self.offlineMode {
NCRoomsManager.sharedInstance().joinRoom(self.room.token, forCall: false)
}

Expand Down Expand Up @@ -785,7 +744,7 @@ import SwiftyAttributes
return
}

if let room = notification.userInfo?["room"] as? NCRoom {
if let room = notification.userInfo?["room"] as? NCRoom, room.token == self.room.token {
self.room = room
}

Expand Down
5 changes: 5 additions & 0 deletions NextcloudTalk/NCAPIController.m
Original file line number Diff line number Diff line change
Expand Up @@ -368,6 +368,11 @@ - (NSURLSessionDataTask *)joinRoom:(NSString *)token forAccount:(TalkAccount *)a
NCRoom *room = nil;
if ([[NCDatabaseManager sharedInstance] serverHasTalkCapability:kCapabilityListableRooms forAccountId:account.accountId]) {
room = [NCRoom roomWithDictionary:dataDictionary andAccountId:account.accountId];

// Don't return a room object, if the token does not match
if (!room.token || ![room.token isEqualToString:token]) {
room = nil;
}
}

if (block) {
Expand Down
8 changes: 8 additions & 0 deletions NextcloudTalk/NCRoomsManagerExtensions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import Foundation

@objc extension NCRoomsManager {

public static let statusCodeNoSessionId = 996
public static let statusCodeFailedToJoinExternal = 997
public static let statusCodeShouldIgnoreAttemptButJoinedSuccessfully = 998
public static let statusCodeIgnoreJoinAttempt = 999
Expand Down Expand Up @@ -157,6 +158,13 @@ import Foundation
return
}

// While we received a successful http status code, we did not receive a sessionId -> treat it as an error
guard let sessionId else {
let error = NSError(domain: NSCocoaErrorDomain, code: NCRoomsManager.statusCodeNoSessionId)
completionBlock(nil, nil, error, NCRoomsManager.statusCodeNoSessionId, nil)
return
}

NCUtils.log("Joined room \(token) in NC successfully")

// Remember the latest sessionId we're using to join a room, to be able to check when joining the external signaling server
Expand Down
46 changes: 45 additions & 1 deletion NextcloudTalkTests/Unit/Chat/UnitChatViewControllerTest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import XCTest

final class UnitChatViewControllerTest: TestBaseRealm {

func testLocalMention() throws {
func testExpireMessages() throws {
let activeAccount = NCDatabaseManager.sharedInstance().activeAccount()
let roomName = "Expire Messages Test Room"
let roomToken = "expToken"
Expand Down Expand Up @@ -69,6 +69,50 @@ final class UnitChatViewControllerTest: TestBaseRealm {
XCTAssertEqual(NCChatMessage.allObjects().count, 0)
}

func testJoinRoomWithEmptyRoomObject() throws {
let activeAccount = NCDatabaseManager.sharedInstance().activeAccount()
let roomName = "EmptyRoomObject"
let roomToken = "emptyRoomObject"

let room = NCRoom()
room.token = roomToken
room.name = roomName
room.accountId = activeAccount.accountId

try? realm.transaction {
realm.add(room)
}

let chatViewController = ChatViewController(forRoom: room, withAccount: activeAccount)!

expectation(forNotification: .NCRoomsManagerDidJoinRoom, object: nil) { notification -> Bool in
XCTAssertNil(notification.userInfo?["error"])

// swiftlint:disable:next force_cast
XCTAssertEqual(notification.userInfo?["token"] as! String, roomToken)

return true
}

let userInfo: [String: Any] = [
"token": roomToken,
"room": NCRoom()
]

NotificationCenter.default.post(name: .NCRoomsManagerDidJoinRoom, object: self, userInfo: userInfo)

waitForExpectations(timeout: TestConstants.timeoutShort, handler: nil)

let exp = expectation(description: "\(#function)\(#line)")

DispatchQueue.main.async {
XCTAssertNotNil(chatViewController.room.token)
exp.fulfill()
}

waitForExpectations(timeout: TestConstants.timeoutShort, handler: nil)
}

func testFrequentlyEmojis() throws {
var activeAccount = NCDatabaseManager.sharedInstance().activeAccount()
XCTAssertEqual(activeAccount.frequentlyUsedEmojis, ["👍", "❤️", "😂", "😅"])
Expand Down
Loading