Skip to content

Commit 9d625f5

Browse files
Merge pull request #1162 from beribas/fix_crashing_vcardtemp_types
Fix crashes in XMPPvCardTempEmail and XMPPvCardTempTel initialize
2 parents 19e8d02 + e83ff42 commit 9d625f5

File tree

7 files changed

+142
-9
lines changed

7 files changed

+142
-9
lines changed

Extensions/XEP-0054/XMPPvCardTemp.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ extern NSString *const kXMPPvCardTempElement;
5555

5656
@property (nonatomic, strong, nullable) NSArray<XMPPvCardTempAdr*> *addresses;
5757
@property (nonatomic, strong, nullable) NSArray<XMPPvCardTempLabel*> *labels;
58-
@property (nonatomic, strong, nullable) NSArray<XMPPvCardTempTel*> *telecomsAddresses;
58+
@property (nonatomic, strong) NSArray<XMPPvCardTempTel*> *telecomsAddresses;
5959
@property (nonatomic, strong) NSArray<XMPPvCardTempEmail*> *emailAddresses;
6060

6161
@property (nonatomic, strong, nullable) XMPPJID *jid;

Extensions/XEP-0054/XMPPvCardTemp.m

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -315,11 +315,45 @@ - (void)setLabels:(NSArray *)labels { }
315315
- (void)clearLabels { }
316316

317317

318-
- (NSArray *)telecomsAddresses { return nil; }
319-
- (void)addTelecomsAddress:(XMPPvCardTempTel *)tel { }
320-
- (void)removeTelecomsAddress:(XMPPvCardTempTel *)tel { }
321-
- (void)setTelecomsAddresses:(NSArray *)tels { }
322-
- (void)clearTelecomsAddresses { }
318+
- (NSArray *)telecomsAddresses {
319+
NSMutableArray *result = [NSMutableArray new];
320+
NSArray *tels = [self elementsForName:@"TEL"];
321+
for (NSXMLElement *tel in tels) {
322+
XMPPvCardTempTel *vCardTempTel = [XMPPvCardTempTel vCardTelFromElement:tel];
323+
[result addObject:vCardTempTel];
324+
}
325+
326+
return result;
327+
}
328+
329+
330+
- (void)addTelecomsAddress:(XMPPvCardTempTel *)tel {
331+
[self addChild:tel];
332+
}
333+
334+
335+
- (void)removeTelecomsAddress:(XMPPvCardTempTel *)tel {
336+
NSArray *telElements = [self elementsForName:@"TEL"];
337+
for (NSXMLElement *element in telElements) {
338+
XMPPvCardTempTel *vCardTempTel = [XMPPvCardTempTel vCardTelFromElement:[element copy]];
339+
if ([vCardTempTel.number isEqualToString:tel.number]) {
340+
NSUInteger index = [[self children] indexOfObject:element];
341+
[self removeChildAtIndex:index];
342+
}
343+
}
344+
}
345+
346+
- (void)setTelecomsAddresses:(NSArray<XMPPvCardTempTel *> *)tels {
347+
[self clearTelecomsAddresses];
348+
for (XMPPvCardTempTel *tel in tels) {
349+
[self addTelecomsAddress:tel];
350+
}
351+
}
352+
353+
354+
- (void)clearTelecomsAddresses {
355+
[self removeElementsForName:@"TEL"];
356+
}
323357

324358

325359
- (NSArray *)emailAddresses {

Extensions/XEP-0054/XMPPvCardTempEmail.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ - (NSString *)userid {
117117
}
118118

119119

120-
- (void)setIsUserid:(NSString *)userid {
120+
- (void)setUserid:(NSString *)userid {
121121
XMPP_VCARD_SET_STRING_CHILD(userid, @"USERID");
122122
}
123123

Extensions/XEP-0054/XMPPvCardTempTel.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,8 @@ - (BOOL)hasMessaging {
116116
}
117117

118118

119-
- (void)setIsMessaging:(BOOL)msg {
120-
XMPP_VCARD_SET_EMPTY_CHILD(msg && ![self hasMessaging], @"MSG");
119+
- (void)setHasMessaging:(BOOL)hasMessaging {
120+
XMPP_VCARD_SET_EMPTY_CHILD(hasMessaging && ![self hasMessaging], @"MSG");
121121
}
122122

123123

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
//
2+
// XMPPvCardTempTests.swift
3+
// XMPPFrameworkSwiftTests
4+
//
5+
// Created by Oleg Langer on 07.04.20.
6+
//
7+
8+
import XCTest
9+
10+
class XMPPvCardTempTests: XCTestCase {
11+
var xmlString: String!
12+
var sut: XMPPvCardTemp!
13+
14+
override func setUp() {
15+
xmlString = """
16+
<vCard xmlns="vcard-temp">
17+
<NICKNAME>DESKTOP</NICKNAME>
18+
<EMAIL>
19+
<INTERNET/>
20+
<USERID>[email protected]</USERID>
21+
</EMAIL>
22+
<TEL>
23+
<WORK/>
24+
<VOICE/>
25+
<NUMBER>303-308-3282</NUMBER>
26+
</TEL>
27+
</vCard>
28+
"""
29+
let element = try! XMLElement(xmlString: xmlString)
30+
sut = XMPPvCardTemp.vCardTemp(from: element)
31+
}
32+
33+
func testCreateFromXMLString() {
34+
XCTAssertNotNil(sut)
35+
}
36+
37+
func testGetEmailAddress() {
38+
XCTAssertEqual(sut.emailAddresses.count, 1)
39+
let email = sut.emailAddresses.first
40+
XCTAssertNotNil(email)
41+
XCTAssertEqual(email?.userid, "[email protected]")
42+
XCTAssertEqual(email?.isInternet, true)
43+
}
44+
45+
func testRemoveEmailAddress() {
46+
let email = sut.emailAddresses.first!
47+
sut.removeEmailAddress(email)
48+
49+
XCTAssertEqual(sut.emailAddresses.count, 0)
50+
}
51+
52+
func testAddEmailAddress() {
53+
// Remove all first
54+
sut.clearEmailAddresses()
55+
56+
let element = XMLElement(name: "EMAIL")
57+
let newMail = XMPPvCardTempEmail.vCardEmail(from: element)
58+
newMail.isWork = true
59+
newMail.userid = "[email protected]"
60+
sut.addEmailAddress(newMail)
61+
62+
XCTAssertEqual(sut.emailAddresses.first, newMail)
63+
}
64+
65+
func testGetTelecomAddress() {
66+
XCTAssertEqual(sut.telecomsAddresses.count, 1)
67+
let tel = sut.telecomsAddresses.first!
68+
XCTAssertTrue(tel.isWork)
69+
XCTAssertTrue(tel.isVoice)
70+
XCTAssertEqual(tel.number, "303-308-3282")
71+
}
72+
73+
func testRemoveTelecomAddresses() {
74+
let tel = sut.telecomsAddresses.first!
75+
sut.removeTelecomsAddress(tel)
76+
XCTAssertEqual(sut.telecomsAddresses.count, 0)
77+
}
78+
79+
func testAddTelecomAddress() {
80+
sut.clearTelecomsAddresses()
81+
82+
let element = XMLElement(name: "TEL")
83+
let newTel = XMPPvCardTempTel.vCardTel(from: element)
84+
newTel.isCell = true
85+
newTel.number = "101"
86+
sut.addTelecomsAddress(newTel)
87+
88+
XCTAssertEqual(sut.telecomsAddresses.count, 1)
89+
XCTAssertEqual(sut.telecomsAddresses.first!, newTel)
90+
}
91+
}

Xcode/Testing-iOS/XMPPFrameworkTests.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
/* Begin PBXBuildFile section */
1010
1A5DC58D2566E3FC0AAB5BA7 /* Pods_XMPPFrameworkSwiftTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6923171573DDCA8E2DEC3A22 /* Pods_XMPPFrameworkSwiftTests.framework */; };
11+
9943D285243CA2EB000A9DFC /* XMPPvCardTempTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9943D284243CA2EB000A9DFC /* XMPPvCardTempTests.swift */; };
1112
D945D6F71FD9EA2100C7502C /* XMPPPresenceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D945D6F61FD9EA2100C7502C /* XMPPPresenceTests.swift */; };
1213
D973A07C1D2F18040096F3ED /* CapabilitiesHashingTest.m in Sources */ = {isa = PBXBuildFile; fileRef = D973A06F1D2F18040096F3ED /* CapabilitiesHashingTest.m */; };
1314
D973A07D1D2F18040096F3ED /* EncodeDecodeTest.m in Sources */ = {isa = PBXBuildFile; fileRef = D973A0701D2F18040096F3ED /* EncodeDecodeTest.m */; };
@@ -45,6 +46,7 @@
4546
63F50D921C60208200CA0201 /* XMPPFrameworkTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = XMPPFrameworkTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
4647
63F50D971C60208200CA0201 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
4748
6923171573DDCA8E2DEC3A22 /* Pods_XMPPFrameworkSwiftTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_XMPPFrameworkSwiftTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
49+
9943D284243CA2EB000A9DFC /* XMPPvCardTempTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = XMPPvCardTempTests.swift; path = "../../Testing-Swift/XMPPvCardTempTests.swift"; sourceTree = "<group>"; };
4850
AE993B61B8D33F0468A9B133 /* Pods-XMPPFrameworkTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-XMPPFrameworkTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-XMPPFrameworkTests/Pods-XMPPFrameworkTests.release.xcconfig"; sourceTree = "<group>"; };
4951
D945D6F61FD9EA2100C7502C /* XMPPPresenceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = XMPPPresenceTests.swift; path = "../../Testing-Swift/XMPPPresenceTests.swift"; sourceTree = "<group>"; };
5052
D973A06E1D2F18030096F3ED /* XMPPFrameworkTests-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "XMPPFrameworkTests-Bridging-Header.h"; sourceTree = "<group>"; };
@@ -173,6 +175,7 @@
173175
D9B81AC61FBCD39E00455683 /* XMPPMockStream.h */,
174176
D9B81AC51FBCD39E00455683 /* XMPPMockStream.m */,
175177
D9A7B03F1FB988EC005183CD /* Info.plist */,
178+
9943D284243CA2EB000A9DFC /* XMPPvCardTempTests.swift */,
176179
);
177180
path = XMPPFrameworkSwiftTests;
178181
sourceTree = "<group>";
@@ -411,6 +414,7 @@
411414
buildActionMask = 2147483647;
412415
files = (
413416
D9B81AC91FBCD3B400455683 /* XMPPBookmarksModuleTests.swift in Sources */,
417+
9943D285243CA2EB000A9DFC /* XMPPvCardTempTests.swift in Sources */,
414418
D9B81AC71FBCD39E00455683 /* XMPPMockStream.m in Sources */,
415419
D945D6F71FD9EA2100C7502C /* XMPPPresenceTests.swift in Sources */,
416420
);

Xcode/Testing-macOS/XMPPFrameworkTests.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
/* Begin PBXBuildFile section */
1010
4A6D92D0C7C1950CBA77BE55 /* Pods_XMPPFrameworkTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 23C81F1C22F160BD2130E79A /* Pods_XMPPFrameworkTests.framework */; };
11+
9943D287243D0E17000A9DFC /* XMPPvCardTempTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9943D286243D0E17000A9DFC /* XMPPvCardTempTests.swift */; };
1112
B407FF87953F6A78BCCE2871 /* Pods_XMPPFrameworkSwiftTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 777EEF98731B0EC5DBD49953 /* Pods_XMPPFrameworkSwiftTests.framework */; };
1213
D93B87901FBCE8D6002B6CB7 /* XMPPBookmarksModuleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D93B878F1FBCE8D6002B6CB7 /* XMPPBookmarksModuleTests.swift */; };
1314
D93B87931FBCE90D002B6CB7 /* XMPPMockStream.m in Sources */ = {isa = PBXBuildFile; fileRef = D93B87911FBCE90C002B6CB7 /* XMPPMockStream.m */; };
@@ -43,6 +44,7 @@
4344
5AA422BDF36502C8A148D622 /* Pods-XMPPFrameworkTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-XMPPFrameworkTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-XMPPFrameworkTests/Pods-XMPPFrameworkTests.debug.xcconfig"; sourceTree = "<group>"; };
4445
5CE125FD447C51125BCAAAFF /* Pods-XMPPFrameworkSwiftTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-XMPPFrameworkSwiftTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-XMPPFrameworkSwiftTests/Pods-XMPPFrameworkSwiftTests.debug.xcconfig"; sourceTree = "<group>"; };
4546
777EEF98731B0EC5DBD49953 /* Pods_XMPPFrameworkSwiftTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_XMPPFrameworkSwiftTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
47+
9943D286243D0E17000A9DFC /* XMPPvCardTempTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = XMPPvCardTempTests.swift; path = "../../Testing-Swift/XMPPvCardTempTests.swift"; sourceTree = "<group>"; };
4648
D93B878E1FBCE8D6002B6CB7 /* XMPPFrameworkTests-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "XMPPFrameworkTests-Bridging-Header.h"; path = "../../Testing-Swift/XMPPFrameworkTests-Bridging-Header.h"; sourceTree = "<group>"; };
4749
D93B878F1FBCE8D6002B6CB7 /* XMPPBookmarksModuleTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = XMPPBookmarksModuleTests.swift; path = "../../Testing-Swift/XMPPBookmarksModuleTests.swift"; sourceTree = "<group>"; };
4850
D93B87911FBCE90C002B6CB7 /* XMPPMockStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XMPPMockStream.m; path = "../../Testing-Shared/XMPPMockStream.m"; sourceTree = "<group>"; };
@@ -164,6 +166,7 @@
164166
D9A7B02E1FB985BE005183CD /* XMPPFrameworkSwiftTests */ = {
165167
isa = PBXGroup;
166168
children = (
169+
9943D286243D0E17000A9DFC /* XMPPvCardTempTests.swift */,
167170
D945D6F81FD9EA3B00C7502C /* XMPPPresenceTests.swift */,
168171
D93B87921FBCE90D002B6CB7 /* XMPPMockStream.h */,
169172
D93B87911FBCE90C002B6CB7 /* XMPPMockStream.m */,
@@ -405,6 +408,7 @@
405408
buildActionMask = 2147483647;
406409
files = (
407410
D93B87931FBCE90D002B6CB7 /* XMPPMockStream.m in Sources */,
411+
9943D287243D0E17000A9DFC /* XMPPvCardTempTests.swift in Sources */,
408412
D93B87901FBCE8D6002B6CB7 /* XMPPBookmarksModuleTests.swift in Sources */,
409413
D945D6F91FD9EA3C00C7502C /* XMPPPresenceTests.swift in Sources */,
410414
);

0 commit comments

Comments
 (0)