Skip to content

Commit

Permalink
Merge pull request #1871 from matrix-org/mauroromito/content_auth_APIs
Browse files Browse the repository at this point in the history
  • Loading branch information
Velin92 committed Jul 5, 2024
2 parents 04e422e + 389fdfa commit 1c4b3f5
Show file tree
Hide file tree
Showing 11 changed files with 90 additions and 31 deletions.
6 changes: 6 additions & 0 deletions MatrixSDK/JSONModels/MXMatrixVersions.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ struct MXMatrixClientServerAPIVersionStruct
__unsafe_unretained NSString * const v1_1;
__unsafe_unretained NSString * const v1_2;
__unsafe_unretained NSString * const v1_3;
__unsafe_unretained NSString * const v1_11;
};
extern const struct MXMatrixClientServerAPIVersionStruct MXMatrixClientServerAPIVersion;

Expand Down Expand Up @@ -123,6 +124,11 @@ extern const struct MXMatrixVersionsFeatureStruct MXMatrixVersionsFeature;
*/
@property (nonatomic, readonly) BOOL supportsRedactionWithRelationsUnstable;

/**
Indicate if the server supports MSC3916
*/
@property (nonatomic, readonly) BOOL supportsAuthenticatedMedia;

@end

NS_ASSUME_NONNULL_END
9 changes: 8 additions & 1 deletion MatrixSDK/JSONModels/MXMatrixVersions.m
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,9 @@
.r0_6_1 = @"r0.6.1",
.v1_1 = @"v1.1",
.v1_2 = @"v1.2",
.v1_3 = @"v1.3"
.v1_3 = @"v1.3",
// missing versions not considered
.v1_11 = @"v1.11"
};

const struct MXMatrixVersionsFeatureStruct MXMatrixVersionsFeature = {
Expand Down Expand Up @@ -145,6 +147,11 @@ - (BOOL)supportsRedactionWithRelationsUnstable
return [self serverSupportsFeature:kJSONKeyMSC3912Unstable];
}

- (BOOL)supportsAuthenticatedMedia
{
return [self serverSupportsVersion:MXMatrixClientServerAPIVersion.v1_11];
}

#pragma mark - Private

- (BOOL)serverSupportsVersion:(NSString *)version
Expand Down
5 changes: 5 additions & 0 deletions MatrixSDK/MXEnumConstants.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,11 @@ FOUNDATION_EXPORT NSString *const kMXContentUriScheme;
*/
FOUNDATION_EXPORT NSString *const kMXContentPrefixPath;

/**
A constant representing the default prefix of the Matrix authenticated content repository path.
*/
FOUNDATION_EXPORT NSString *const kMXAuthenticatedContentPrefixPath;

/**
A constant representing the URI path for as-yet unspecified of the AntiVirus Client-Server HTTP API.
*/
Expand Down
1 change: 1 addition & 0 deletions MatrixSDK/MXEnumConstants.m
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
*/
NSString *const kMXContentUriScheme = @"mxc://";
NSString *const kMXContentPrefixPath = @"_matrix/media/r0";
NSString *const kMXAuthenticatedContentPrefixPath = @"_matrix/client/v1/media";

/**
Prefix used in path of antivirus server API requests.
Expand Down
10 changes: 10 additions & 0 deletions MatrixSDK/MXRestClient.h
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,12 @@ extern NSString *const kMXCredentialsNewRefreshTokenDataKey;
*/
@property (nonatomic) NSString *contentPathPrefix;

/**
The Matrix content repository prefix to use for authenticated access.
By default, it is defined by the constant kMXAuthenticatedContentPrefixPath.
*/
@property (nonatomic) NSString *authenticatedContentPathPrefix;

/**
The current trusted certificate (if any).
*/
Expand All @@ -245,6 +251,10 @@ extern NSString *const kMXCredentialsNewRefreshTokenDataKey;
*/
@property (nonatomic, copy) NSSet <NSString *> *acceptableContentTypes;

/**
Supported server versions of the matrix server, only for internal use of the SDK, use the stored version on the app side.
*/
@property (readonly) BOOL isUsingAuthenticatedMedia;

/**
Create an instance based on homeserver url.
Expand Down
39 changes: 22 additions & 17 deletions MatrixSDK/MXRestClient.m
Original file line number Diff line number Diff line change
Expand Up @@ -142,10 +142,11 @@ @interface MXRestClient ()
*/
dispatch_queue_t processingQueue;
}
@property(readwrite) BOOL isUsingAuthenticatedMedia;
@end

@implementation MXRestClient
@synthesize credentials, apiPathPrefix, contentPathPrefix, completionQueue, antivirusServerPathPrefix;
@synthesize credentials, apiPathPrefix, contentPathPrefix, authenticatedContentPathPrefix, completionQueue, antivirusServerPathPrefix, isUsingAuthenticatedMedia;

+ (dispatch_queue_t)refreshQueue
{
Expand Down Expand Up @@ -198,6 +199,7 @@ -(id)initWithCredentials:(MXCredentials*)inCredentials
apiPathPrefix = kMXAPIPrefixPathR0;
antivirusServerPathPrefix = kMXAntivirusAPIPrefixPathUnstable;
contentPathPrefix = kMXContentPrefixPath;
authenticatedContentPathPrefix = kMXAuthenticatedContentPrefixPath;

credentials = inCredentials;
_identityServer = credentials.identityServer;
Expand Down Expand Up @@ -529,6 +531,7 @@ - (MXHTTPOperation*)supportedMatrixVersions:(void (^)(MXMatrixVersions *matrixVe
[self dispatchProcessing:^{
MXJSONModelSetMXJSONModel(matrixVersions, MXMatrixVersions, JSONResponse);
} andCompletion:^{
self->isUsingAuthenticatedMedia = matrixVersions.supportsAuthenticatedMedia;
success(matrixVersions);
}];
}
Expand Down Expand Up @@ -4498,28 +4501,30 @@ - (MXHTTPOperation *)previewForURL:(NSURL *)url
{
NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
parameters[@"url"] = [url absoluteString];
NSString* path = isUsingAuthenticatedMedia ? authenticatedContentPathPrefix : contentPathPrefix;

MXWeakify(self);

return [httpClient requestWithMethod:@"GET"
path:[NSString stringWithFormat:@"%@/preview_url", contentPathPrefix]
path:[NSString stringWithFormat:@"%@/preview_url", path]
parameters:parameters
success:^(NSDictionary *JSONResponse) {
MXStrongifyAndReturnIfNil(self);

if (success)
{
__block MXURLPreview *urlPreview;
[self dispatchProcessing:^{
MXJSONModelSetMXJSONModel(urlPreview, MXURLPreview, JSONResponse);
} andCompletion:^{
success(urlPreview);
}];
}
}
MXStrongifyAndReturnIfNil(self);
if (success)
{
__block MXURLPreview *urlPreview;
[self dispatchProcessing:^{
MXJSONModelSetMXJSONModel(urlPreview, MXURLPreview, JSONResponse);
} andCompletion:^{
success(urlPreview);
}];
}
}
failure:^(NSError *error) {
MXStrongifyAndReturnIfNil(self);
[self dispatchFailure:error inBlock:failure];
}];
MXStrongifyAndReturnIfNil(self);
[self dispatchFailure:error inBlock:failure];
}];
}

#pragma mark - Antivirus server API
Expand Down
2 changes: 1 addition & 1 deletion MatrixSDK/MXSession.m
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ - (id)initWithMatrixRestClient:(MXRestClient*)mxRestClient
{
matrixRestClient = mxRestClient;
_threePidAddManager = [[MX3PidAddManager alloc] initWithMatrixSession:self];
mediaManager = [[MXMediaManager alloc] initWithHomeServer:matrixRestClient.homeserver];
mediaManager = [[MXMediaManager alloc] initWithRestClient:matrixRestClient];
rooms = [NSMutableDictionary dictionary];
roomSummaries = [NSMutableDictionary dictionary];
_roomSummaryUpdateDelegate = [MXRoomSummaryUpdater roomSummaryUpdaterForSession:self];
Expand Down
2 changes: 2 additions & 0 deletions MatrixSDK/Utils/Media/MXMediaLoader.h
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,8 @@ extern NSString *const kMXMediaUploadIdPrefix;
@property (readonly) CGFloat uploadInitialRange;
@property (readonly) CGFloat uploadRange;

- (id)initWithAccessToken:(NSString *) accessToken;

/**
Cancel the operation.
*/
Expand Down
13 changes: 11 additions & 2 deletions MatrixSDK/Utils/Media/MXMediaLoader.m
Original file line number Diff line number Diff line change
Expand Up @@ -37,15 +37,23 @@

NSString *const kMXMediaUploadIdPrefix = @"upload-";


@interface MXMediaLoader()

@property (nonatomic, readonly) NSString* accessToken;

@end

@implementation MXMediaLoader

@synthesize statisticsDict;

- (id)init
- (id)initWithAccessToken:(NSString *) accessToken
{
if (self = [super init])
{
_state = MXMediaLoaderStateIdle;
_accessToken = accessToken;
}
return self;
}
Expand Down Expand Up @@ -139,6 +147,7 @@ - (void)downloadMediaFromURL:(NSString *)url
[request setValue:value forHTTPHeaderField:key];
}];

[request setValue: [NSString stringWithFormat:@"Bearer %@", _accessToken] forHTTPHeaderField: @"Authorization"];
if (data)
{
// Use an HTTP POST method to send this data as JSON object.
Expand Down Expand Up @@ -378,7 +387,7 @@ - (id)initForUploadWithMatrixSession:(MXSession*)matrixSession initialRange:(CGF
{
// Create a unique upload Id
_uploadId = [NSString stringWithFormat:@"%@%@", kMXMediaUploadIdPrefix, [[NSProcessInfo processInfo] globallyUniqueString]];

_accessToken = matrixSession.matrixRestClient.credentials.accessToken;
mxSession = matrixSession;
_uploadInitialRange = initialRange;
_uploadRange = range;
Expand Down
9 changes: 5 additions & 4 deletions MatrixSDK/Utils/Media/MXMediaManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#import <AVFoundation/AVFoundation.h>
#import "MXMediaLoader.h"
#import "MXEnumConstants.h"
#import "MXRestClient.h"

#if TARGET_OS_IPHONE
#import <UIKit/UIKit.h>
Expand Down Expand Up @@ -49,15 +50,15 @@ extern NSString *const kMXMediaManagerDefaultCacheFolder;
Create an instance based on a homeserver url. This homeserver URL is required to resolve
the Matrix Content URI (in the form of "mxc://...").
@param homeserverURL the homeserver URL.
@param restClient the REST client.
@return a MXMediaManager instance.
*/
- (id)initWithHomeServer:(NSString *)homeserverURL;
- (id)initWithRestClient:(MXRestClient *)restClient;

/**
The homeserver URL.
The rest client..
*/
@property (nonatomic, readonly) NSString *homeserverURL;
@property (nonatomic, readonly) MXRestClient *restClient;

/**
Antivirus scanner used to scan medias.
Expand Down
25 changes: 19 additions & 6 deletions MatrixSDK/Utils/Media/MXMediaManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -49,12 +49,12 @@

@implementation MXMediaManager

- (id)initWithHomeServer:(NSString *)homeserverURL
- (id)initWithRestClient:(MXRestClient *)restClient
{
self = [super init];
if (self)
{
_homeserverURL = homeserverURL;
_restClient = restClient;
_scanManager = nil;
}
return self;
Expand Down Expand Up @@ -376,7 +376,11 @@ - (NSString*)urlOfContent:(NSString*)mxContentURI
}
else
{
mxMediaPrefix = [NSString stringWithFormat:@"%@/%@/download/", _homeserverURL, kMXContentPrefixPath];
mxMediaPrefix = [NSString stringWithFormat:@"%@/%@/download/", _restClient.homeserver, kMXContentPrefixPath];
if (_restClient.isUsingAuthenticatedMedia)
{
mxMediaPrefix = [NSString stringWithFormat:@"%@/%@/download/", _restClient.homeserver, kMXAuthenticatedContentPrefixPath];
}
}

contentURL = [mxContentURI stringByReplacingOccurrencesOfString:kMXContentUriScheme withString:mxMediaPrefix];
Expand Down Expand Up @@ -415,7 +419,11 @@ - (NSString*)urlOfContentThumbnail:(NSString*)mxContentURI
}
else
{
mxThumbnailPrefix = [NSString stringWithFormat:@"%@/%@/thumbnail/", _homeserverURL, kMXContentPrefixPath];
mxThumbnailPrefix = [NSString stringWithFormat:@"%@/%@/thumbnail/", _restClient.homeserver, kMXContentPrefixPath];
if (_restClient.isUsingAuthenticatedMedia)
{
mxThumbnailPrefix = [NSString stringWithFormat:@"%@/%@/thumbnail/", _restClient.homeserver, kMXAuthenticatedContentPrefixPath];
}
}
NSString *thumbnailURL = [mxContentURI stringByReplacingOccurrencesOfString:kMXContentUriScheme withString:mxThumbnailPrefix];

Expand Down Expand Up @@ -447,7 +455,8 @@ - (NSString*)urlOfContentThumbnail:(NSString*)mxContentURI

- (NSString *)urlOfIdenticon:(NSString *)identiconString
{
return [NSString stringWithFormat:@"%@/%@/identicon/%@", _homeserverURL, kMXContentPrefixPath, [identiconString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]]];
// Deprecated API, not need to use authenticated for this.
return [NSString stringWithFormat:@"%@/%@/identicon/%@", _restClient.homeserver, kMXContentPrefixPath, [identiconString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]]];
}


Expand Down Expand Up @@ -495,6 +504,7 @@ - (MXMediaLoader*)downloadMediaFromMatrixContentURI:(NSString *)mxContentURI
withData:nil
andIdentifier:downloadId
saveAtFilePath:filePath
accessToken: _restClient.credentials.accessToken
scanManager:_scanManager
success:success
failure:failure];
Expand Down Expand Up @@ -535,6 +545,7 @@ - (MXMediaLoader*)downloadThumbnailFromMatrixContentURI:(NSString *)mxContentURI
withData:nil
andIdentifier:downloadId
saveAtFilePath:filePath
accessToken: _restClient.credentials.accessToken
scanManager:_scanManager
success:success
failure:failure];
Expand All @@ -545,6 +556,7 @@ + (MXMediaLoader*)downloadMedia:(NSString *)mediaURL
withData:(NSDictionary *)data
andIdentifier:(NSString *)downloadId
saveAtFilePath:(NSString *)filePath
accessToken:(NSString *)accessToken
scanManager:(MXScanManager *)scanManager
success:(void (^)(NSString *outputFilePath))success
failure:(void (^)(NSError *error))failure
Expand Down Expand Up @@ -592,7 +604,7 @@ + (MXMediaLoader*)downloadMedia:(NSString *)mediaURL
else
{
// Create a media loader to download data
mediaLoader = [[MXMediaLoader alloc] init];
mediaLoader = [[MXMediaLoader alloc] initWithAccessToken:accessToken];
// Report this loader
if (!downloadTable)
{
Expand Down Expand Up @@ -705,6 +717,7 @@ - (MXMediaLoader*)downloadEncryptedMediaFromMatrixContentFile:(MXEncryptedConten
withData:dataToPost
andIdentifier:downloadId
saveAtFilePath:filePath
accessToken: _restClient.credentials.accessToken
scanManager:_scanManager
success:success
failure:failure];
Expand Down

0 comments on commit 1c4b3f5

Please sign in to comment.