Skip to content
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
5 changes: 5 additions & 0 deletions include/PowerAuth/Session.h
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,11 @@ class Session : public std::enable_shared_from_this<Session>
///
/// - Returns: Most recently fetched User Info.
cc7::json::JsonValue lastUserInfo() const noexcept;

/// Retrieve the most recently fetched Activation Status stored in the Session Data.
///
/// - Returns: Most recently fetched Activation Status.
ActivationStatusPtr lastActivationStatus() const noexcept;

private:

Expand Down
20 changes: 9 additions & 11 deletions proj-xcode/PowerAuth2/PowerAuthSDK.m
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,6 @@ @implementation PowerAuthSDK

/// Current pending status task.
PA2GetActivationStatusTask * _getActivationStatusTask;
PowerAuthActivationStatus * _lastFetchedActivationStatus;
// Current pending system status task
}

Expand Down Expand Up @@ -877,9 +876,6 @@ - (void) getActivationStatusTask:(PA2GetActivationStatusTask*)task didFinishedWi
// So, we can freely mutate objects in this instance.
if (_getActivationStatusTask == task) {
_getActivationStatusTask = nil;
if (status) {
_lastFetchedActivationStatus = status;
}
// This is the reference to task which is going to finish its execution soon.
// The ivar no longer holds the reference to the task, but we should keep that reference
// for a little bit longer, to guarantee, that we don't destroy that object during its
Expand All @@ -895,10 +891,15 @@ - (void) getActivationStatusTask:(PA2GetActivationStatusTask*)task didFinishedWi

- (PowerAuthActivationStatus*) lastFetchedActivationStatus
{
[_lock lock];
PowerAuthActivationStatus * status = _lastFetchedActivationStatus;
[_lock unlock];
return status;
PowerAuthCoreActivationStatus * coreStatus = [_sessionInterface readTaskWithSession:^PowerAuthCoreActivationStatus*(PowerAuthCoreSession *session, NSError **error) {
return [session lastActivationStatus];
} error:nil];

if (!coreStatus) {
return nil;
}

return [[PowerAuthActivationStatus alloc] initWithCoreStatus:coreStatus];
}

#pragma mark Removing an activation
Expand Down Expand Up @@ -948,9 +949,6 @@ - (void) removeActivationLocal
*/
- (void) clearCachedData
{
[_lock lock];
_lastFetchedActivationStatus = nil;
[_lock unlock];
}

#pragma mark - Authentication codes
Expand Down
10 changes: 9 additions & 1 deletion proj-xcode/PowerAuthCore/PowerAuthCoreSession.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#import <PowerAuthCore/PowerAuthCoreTimeService.h>
#import <PowerAuthCore/PowerAuthCoreEncryptorFactory.h>
#import <PowerAuthCore/PowerAuthCoreCredentials.h>
#import <PowerAuthCore/PowerAuthCoreActivationStatus.h>


/// The `PowerAuthCoreSessionDelegate` provide interface required for interaction
Expand Down Expand Up @@ -153,7 +154,14 @@
This property accesses user info cached in the session, so read access must be guaranteed.
*/
@property (nonatomic, strong, readonly, nullable) NSDictionary<NSString*, NSObject*>* lastUserInfo;

/**
Contains last activation status received from the server.
This property provides the most recent activation status and does not trigger any server communication.
If no such information has been received yet, nil is returned.

This property accesses activation status cached in the session, so read access must be guaranteed.
*/
@property (nonatomic, strong, readonly, nullable) PowerAuthCoreActivationStatus * lastActivationStatus;

#pragma mark - Serialization

Expand Down
12 changes: 12 additions & 0 deletions proj-xcode/PowerAuthCore/PowerAuthCoreSession.mm
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,18 @@ - (PowerAuthCoreProtocolVersion) protocolVersion
return cc7::objc::JsonValueToObjC(_session->lastUserInfo());
}

- (nullable PowerAuthCoreActivationStatus*) lastActivationStatus
{
[self requireReadAccess:nil];

const auto status = _session->lastActivationStatus();
if (!status) {
return nil;
}

return [[PowerAuthCoreActivationStatus alloc] initWithActivationStatus:status];
}

#pragma mark - Serialization

- (nullable NSData*) serializedState:(NSError*_Nullable*_Nullable)error
Expand Down
6 changes: 6 additions & 0 deletions src/PowerAuth/Session.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,12 @@ cc7::json::JsonValue Session::lastUserInfo() const noexcept
return _context->sessionData().getUserInfo();
}

ActivationStatusPtr Session::lastActivationStatus() const noexcept
{
LOCK_GUARD();
return _context->sessionData().getActivationStatusPtr();
}

void Session::checkActivationData() const
{
if (!sessionData().hasPersistentData()) {
Expand Down
11 changes: 11 additions & 0 deletions src/PowerAuth/model/SessionData.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,7 @@ void SessionData::resetSessionData()
_rd = nullptr;
_pd = nullptr;
_user_info = cc7::json::JsonValue();
_activation_status = nullptr;
_ud = nullptr;
}

Expand Down Expand Up @@ -232,4 +233,14 @@ void SessionData::setUserInfo(const cc7::json::JsonValue& userInfo)
_user_info = userInfo;
}

const ActivationStatusPtr& SessionData::getActivationStatusPtr() const noexcept
{
return _activation_status;
}

void SessionData::setActivationStatus(ActivationStatusPtr& ptr)
{
_activation_status = ptr;
}

} // namespace powerAuth
10 changes: 10 additions & 0 deletions src/PowerAuth/model/SessionData.h
Original file line number Diff line number Diff line change
Expand Up @@ -142,14 +142,24 @@ class SessionData
/// - Parameter userInfo: User Info claims.
void setUserInfo(const cc7::json::JsonValue& userInfo);

/// Get activation status object pointer
/// - Returns: Activation status object pointer.
const ActivationStatusPtr& getActivationStatusPtr() const noexcept;

/// Set activation status object.
/// - Parameter ptr: Pointer to activation status object.
void setActivationStatus(ActivationStatusPtr& ptr);

private:
ConstPowerAuthSpecPtr _target_specification;
RegistrationDataPtr _rd;
PersistentDataPtr _pd;
UpgradeDataPtr _ud;
bool _modified;

// Cached data
cc7::json::JsonValue _user_info;
ActivationStatusPtr _activation_status;
};

CC7_SHARED_PTR(SessionData)
Expand Down
4 changes: 3 additions & 1 deletion src/PowerAuth/v3/ActivationServiceV3.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,9 @@ ResponseObjectPtr ActivationServiceV3::processResponseActivationStatus(Context&
}

// Check counter synchronization
return std::make_shared<ActivationStatus>(Version_V3, local_state, counter_state, binary_data, custom_object);
auto activation_status = std::make_shared<ActivationStatus>(Version_V3, local_state, counter_state, binary_data, custom_object);
_session_data->setActivationStatus(activation_status);
return activation_status;
}

cc7::ByteArray ActivationServiceV3::decryptActivationStatusBlob(const cc7::json::JsonValue& response, const cc7::ByteRange& challenge, const ISecretKeysPtr& secrets)
Expand Down
4 changes: 3 additions & 1 deletion src/PowerAuth/v4/ActivationServiceV4.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -282,7 +282,9 @@ ResponseObjectPtr ActivationServiceV4::processResponseActivationStatus(Context &
local_state = ActivationState::Deadlock;
}
// Check counter synchronization
return std::make_shared<ActivationStatus>(Version_V4, local_state, counter_state, binary_data, custom_object);
auto activation_status = std::make_shared<ActivationStatus>(Version_V4, local_state, counter_state, binary_data, custom_object);
_session_data->setActivationStatus(activation_status);
return activation_status;
}

int ActivationServiceV4::calculateHashCounterDistance(cc7::ByteArray& local_ctr_data,
Expand Down