Skip to content

Commit f5c6869

Browse files
authored
Merge branch 'master' into dependabot/bundler/rexml-3.4.2
2 parents a16945f + 0854f8d commit f5c6869

File tree

33 files changed

+423
-113
lines changed

33 files changed

+423
-113
lines changed

.github/workflows/ci.yml

Lines changed: 10 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@ on:
88
branches:
99
- "**"
1010
env:
11-
CI_XCODE_15: /Applications/Xcode_15.4.0.app/Contents/Developer
12-
CI_XCODE_16: /Applications/Xcode_16.1.0.app/Contents/Developer
11+
CI_XCODE_16: /Applications/Xcode_16.4.0.app/Contents/Developer
1312
jobs:
1413
test-xcode:
1514
env:
@@ -19,89 +18,42 @@ jobs:
1918
matrix:
2019
include:
2120
# Xcode
22-
- name: Xcode 15
23-
script: build:starters
24-
iosVersion: '18.1'
25-
iosDeviceModel: iPhone 16
26-
watchOsVersion: '11.1'
27-
watchDeviceModel: Apple Watch Series 10 (46mm)
28-
tvOsVersion: '18.1'
29-
tvDeviceModel: Apple TV
30-
macosVersion: 14
31-
developerDir: CI_XCODE_15
3221
- name: Xcode 16
3322
script: build:starters
34-
iosVersion: '18.1'
23+
iosVersion: '18.5'
3524
iosDeviceModel: iPhone 16
36-
watchOsVersion: '11.1'
25+
watchOsVersion: '11.5'
3726
watchDeviceModel: Apple Watch Series 10 (46mm)
38-
tvOsVersion: '18.1'
27+
tvOsVersion: '18.5'
3928
tvDeviceModel: Apple TV
40-
macosVersion: 14
41-
developerDir: CI_XCODE_16
42-
# Core Module
43-
- name: Core Module, iOS 17
44-
script: test:ios
45-
iosVersion: '17.5'
46-
iosDeviceModel: iPhone 15
4729
macosVersion: 15
4830
developerDir: CI_XCODE_16
31+
# Core Module
4932
- name: Core Module, iOS 18
5033
script: test:ios
51-
iosVersion: '18.1'
34+
iosVersion: '18.5'
5235
iosDeviceModel: iPhone 16
5336
macosVersion: 15
5437
developerDir: CI_XCODE_16
55-
- name: Core Module, macOS 14
56-
script: test:macos
57-
macosVersion: 14
58-
developerDir: CI_XCODE_16
59-
- name: Core Module, macOS 15
60-
script: test:macos
61-
macosVersion: 15
62-
developerDir: CI_XCODE_16
63-
# LiveQuery Module
64-
- name: LiveQuery Module, iOS 17
65-
script: test:parse_live_query:ios
66-
iosVersion: '17.5'
67-
iosDeviceModel: iPhone 15
68-
macosVersion: 15
69-
developerDir: CI_XCODE_16
7038
- name: LiveQuery Module, iOS 18
7139
script: test:parse_live_query:ios
72-
iosVersion: '18.1'
40+
iosVersion: '18.5'
7341
iosDeviceModel: iPhone 16
7442
macosVersion: 15
7543
developerDir: CI_XCODE_16
76-
- name: LiveQuery Module, macOS 14
77-
script: test:parse_live_query:osx
78-
macosVersion: 14
79-
developerDir: CI_XCODE_15
8044
- name: LiveQuery Module, macOS 15
8145
script: test:parse_live_query:osx
8246
macosVersion: 15
8347
developerDir: CI_XCODE_16
84-
- name: LiveQuery Module, watchOS 10
85-
script: test:parse_live_query:watchos
86-
watchOsVersion: '10.5'
87-
watchDeviceModel: Apple Watch Series 9 (45mm)
88-
macosVersion: 15
89-
developerDir: CI_XCODE_15
9048
- name: LiveQuery Module, watchOS 11
9149
script: test:parse_live_query:watchos
92-
watchOsVersion: '11.1'
50+
watchOsVersion: '11.5'
9351
watchDeviceModel: Apple Watch Series 10 (46mm)
9452
macosVersion: 15
9553
developerDir: CI_XCODE_16
96-
- name: LiveQuery Module, tvOS 17
97-
script: test:parse_live_query:tvos
98-
tvOsVersion: '17.5'
99-
tvDeviceModel: Apple TV
100-
macosVersion: 15
101-
developerDir: CI_XCODE_16
10254
- name: LiveQuery Module, tvOS 18
10355
script: test:parse_live_query:tvos
104-
tvOsVersion: '18.1'
56+
tvOsVersion: '18.5'
10557
tvDeviceModel: Apple TV
10658
macosVersion: 15
10759
developerDir: CI_XCODE_16
@@ -184,7 +136,7 @@ jobs:
184136
plugin: xcode
185137
file: ${{ env.COVERAGE_PATH }}
186138
docs:
187-
runs-on: macos-14
139+
runs-on: macos-15
188140
timeout-minutes: 15
189141
steps:
190142
- uses: actions/checkout@v4

.github/workflows/release-automated.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,18 @@ on:
33
push:
44
branches: [ master, release, alpha, beta ]
55
env:
6-
CI_XCODE_16: /Applications/Xcode_16.1.0.app/Contents/Developer
6+
CI_XCODE_16: /Applications/Xcode_16.4.0.app/Contents/Developer
77

88
jobs:
99
release:
1010
runs-on: macos-15
1111
outputs:
1212
current_tag: ${{ steps.tag.outputs.current_tag }}
1313
steps:
14-
- uses: actions/checkout@v2
14+
- uses: actions/checkout@v4
1515
with:
1616
persist-credentials: false
17-
- uses: actions/setup-node@v2
17+
- uses: actions/setup-node@v4
1818
with:
1919
node-version: 22
2020
cache: npm
@@ -25,7 +25,7 @@ jobs:
2525
bundler-cache: true
2626
- name: Cache Gems
2727
id: cache-gems
28-
uses: actions/cache@v2
28+
uses: actions/cache@v4
2929
with:
3030
path: vendor/bundle
3131
key: ${{ runner.os }}-gem-${{ hashFiles('**/Gemfile.lock') }}

.github/workflows/release-manual-docs.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ on:
66
default: ''
77
description: 'Version tag:'
88
env:
9-
CI_XCODE_16: /Applications/Xcode_16.1.0.app/Contents/Developer
9+
CI_XCODE_16: /Applications/Xcode_16.4.0.app/Contents/Developer
1010

1111
jobs:
1212
publish-docs:

CHANGELOG.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,22 @@
1+
## [6.0.1](https://github.com/parse-community/Parse-SDK-iOS-OSX/compare/6.0.0...6.0.1) (2025-11-17)
2+
3+
4+
### Bug Fixes
5+
6+
* Invalid query request parameter `excludedKeys` sent to server for excluding fields in query results ([#1864](https://github.com/parse-community/Parse-SDK-iOS-OSX/issues/1864)) ([e14c4c5](https://github.com/parse-community/Parse-SDK-iOS-OSX/commit/e14c4c56c50c1561400e4aaf2f6272df495a17ca))
7+
8+
# [6.0.0](https://github.com/parse-community/Parse-SDK-iOS-OSX/compare/5.1.1...6.0.0) (2025-11-17)
9+
10+
11+
### Features
12+
13+
* Remove support for Xcode 15 ([#1865](https://github.com/parse-community/Parse-SDK-iOS-OSX/issues/1865)) ([b22393c](https://github.com/parse-community/Parse-SDK-iOS-OSX/commit/b22393ce823aa470f8ead10f66f02b41132ef706))
14+
15+
16+
### BREAKING CHANGES
17+
18+
* Removes support for Xcode 15 (iOS 17, macOS 14, watchOS 10, tvOS 17). ([b22393c](b22393c))
19+
120
## [5.1.1](https://github.com/parse-community/Parse-SDK-iOS-OSX/compare/5.1.0...5.1.1) (2025-01-31)
221

322

Parse/Parse/Internal/Commands/PFRESTQueryCommand.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ + (nullable NSDictionary *)findCommandParametersWithOrder:(NSString *)order
144144
if (excludedKeys.count > 0) {
145145
NSArray *sortDescriptors = @[ [NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES selector:@selector(compare:)] ];
146146
NSArray *keysArray = [excludedKeys sortedArrayUsingDescriptors:sortDescriptors];
147-
parameters[@"excludedKeys"] = [keysArray componentsJoinedByString:@","];
147+
parameters[@"excludeKeys"] = [keysArray componentsJoinedByString:@","];
148148
}
149149
if (limit >= 0) {
150150
parameters[@"limit"] = [NSString stringWithFormat:@"%d", (int)limit];

Parse/Parse/Internal/Commands/PFRESTUserCommand.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,15 @@ NS_ASSUME_NONNULL_BEGIN
2323
password:(NSString *)password
2424
revocableSession:(BOOL)revocableSessionEnabled
2525
error:(NSError **)error;
26+
/**
27+
Creates a login command with a JSON body, allowing additional parameters such as authData.
28+
29+
This posts to the login route and is required for features like MFA where additional
30+
authentication data must be supplied alongside username/password.
31+
*/
32+
+ (instancetype)logInUserCommandWithParameters:(NSDictionary *)parameters
33+
revocableSession:(BOOL)revocableSessionEnabled
34+
error:(NSError **)error;
2635
+ (instancetype)serviceLoginUserCommandWithAuthenticationType:(NSString *)authenticationType
2736
authenticationData:(NSDictionary *)authenticationData
2837
revocableSession:(BOOL)revocableSessionEnabled

Parse/Parse/Internal/Commands/PFRESTUserCommand.m

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,18 @@ + (instancetype)logInUserCommandWithUsername:(NSString *)username
6565
error:error];
6666
}
6767

68+
+ (instancetype)logInUserCommandWithParameters:(NSDictionary *)parameters
69+
revocableSession:(BOOL)revocableSessionEnabled
70+
error:(NSError **)error {
71+
// Use POST /login for body parameters like authData
72+
return [self _commandWithHTTPPath:@"login"
73+
httpMethod:PFHTTPRequestMethodPOST
74+
parameters:parameters
75+
sessionToken:nil
76+
revocableSession:revocableSessionEnabled
77+
error:error];
78+
}
79+
6880
+ (instancetype)serviceLoginUserCommandWithAuthenticationType:(NSString *)authenticationType
6981
authenticationData:(NSDictionary *)authenticationData
7082
revocableSession:(BOOL)revocableSessionEnabled

Parse/Parse/Internal/User/Controller/PFUserController.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,14 @@ NS_ASSUME_NONNULL_BEGIN
3838
- (BFTask *)logInCurrentUserAsyncWithUsername:(NSString *)username
3939
password:(NSString *)password
4040
revocableSession:(BOOL)revocableSession;
41+
/**
42+
Logs in the current user using username/password and additional parameters such as authData.
43+
The parameters dictionary can include keys like @"authData": @{ "mfa": @{ ... } } to support MFA flows.
44+
*/
45+
- (BFTask *)logInCurrentUserAsyncWithUsername:(NSString *)username
46+
password:(NSString *)password
47+
parameters:(nullable NSDictionary *)parameters
48+
revocableSession:(BOOL)revocableSession;
4149

4250
//TODO: (nlutsenko) Move this method into PFUserAuthenticationController after PFUser is decoupled further.
4351
- (BFTask *)logInCurrentUserAsyncWithAuthType:(NSString *)authType

Parse/Parse/Internal/User/Controller/PFUserController.m

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,20 @@ - (BFTask *)logInCurrentUserAsyncWithSessionToken:(NSString *)sessionToken {
6666
message:@"Invalid Session Token."]];
6767
}
6868

69-
PFUser *user = [PFUser _objectFromDictionary:dictionary
69+
// Sanitize response: do not persist transient MFA authData provider
70+
NSMutableDictionary *sanitized = [dictionary mutableCopy];
71+
id authData = sanitized[@"authData"];
72+
if ([authData isKindOfClass:[NSDictionary class]] && authData[@"mfa"]) {
73+
NSMutableDictionary *mutableAuth = [authData mutableCopy];
74+
[mutableAuth removeObjectForKey:@"mfa"]; // transient provider, do not persist
75+
if (mutableAuth.count > 0) {
76+
sanitized[@"authData"] = mutableAuth;
77+
} else {
78+
[sanitized removeObjectForKey:@"authData"];
79+
}
80+
}
81+
82+
PFUser *user = [PFUser _objectFromDictionary:sanitized
7083
defaultClassName:[PFUser parseClassName]
7184
completeData:YES];
7285
// Serialize the object to disk so we can later access it via currentUser
@@ -113,6 +126,46 @@ - (BFTask *)logInCurrentUserAsyncWithUsername:(NSString *)username
113126
}];
114127
}
115128

129+
- (BFTask *)logInCurrentUserAsyncWithUsername:(NSString *)username
130+
password:(NSString *)password
131+
parameters:(NSDictionary *)parameters
132+
revocableSession:(BOOL)revocableSession {
133+
@weakify(self);
134+
return [[BFTask taskFromExecutor:[BFExecutor defaultPriorityBackgroundExecutor] withBlock:^id{
135+
NSError *error = nil;
136+
NSMutableDictionary *merged = [@{ @"username": username ?: @"",
137+
@"password": password ?: @"" } mutableCopy];
138+
if (parameters.count > 0) {
139+
// Prevent authData from being persisted later by only sending it with the request body
140+
// and not mutating the PFUser object here. The server response will drive authData merge.
141+
[merged addEntriesFromDictionary:parameters];
142+
}
143+
PFRESTCommand *command = [PFRESTUserCommand logInUserCommandWithParameters:merged
144+
revocableSession:revocableSession
145+
error:&error];
146+
PFPreconditionReturnFailedTask(command, error);
147+
return [self.commonDataSource.commandRunner runCommandAsync:command
148+
withOptions:PFCommandRunningOptionRetryIfFailed];
149+
}] continueWithSuccessBlock:^id(BFTask *task) {
150+
@strongify(self);
151+
PFCommandResult *result = task.result;
152+
NSDictionary *dictionary = result.result;
153+
154+
if ([dictionary isKindOfClass:[NSNull class]] || !dictionary) {
155+
return [BFTask taskWithError:[PFErrorUtilities errorWithCode:kPFErrorObjectNotFound
156+
message:@"Invalid login credentials."]];
157+
}
158+
159+
PFUser *user = [PFUser _objectFromDictionary:dictionary
160+
defaultClassName:[PFUser parseClassName]
161+
completeData:YES];
162+
PFCurrentUserController *controller = self.coreDataSource.currentUserController;
163+
return [[controller saveCurrentObjectAsync:user] continueWithBlock:^id(BFTask *task) {
164+
return user;
165+
}];
166+
}];
167+
}
168+
116169
- (BFTask *)logInCurrentUserAsyncWithAuthType:(NSString *)authType
117170
authData:(NSDictionary *)authData
118171
revocableSession:(BOOL)revocableSession {

Parse/Parse/Resources/Parse-OSX.Info.plist

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@
1313
<key>CFBundlePackageType</key>
1414
<string>FMWK</string>
1515
<key>CFBundleShortVersionString</key>
16-
<string>5.1.1</string>
16+
<string>6.0.1</string>
1717
<key>CFBundleSignature</key>
1818
<string>????</string>
1919
<key>CFBundleVersion</key>
20-
<string>5.1.1</string>
20+
<string>6.0.1</string>
2121
</dict>
2222
</plist>

0 commit comments

Comments
 (0)