Skip to content

Commit

Permalink
Merge pull request #1814 from nextcloud/ensure-sessionid
Browse files Browse the repository at this point in the history
Ensure non-nil sessionId
  • Loading branch information
Ivansss authored Dec 16, 2024
2 parents 0a273c2 + b7e47d3 commit f3f79c0
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 44 deletions.
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

0 comments on commit f3f79c0

Please sign in to comment.