mirror of https://github.com/procxx/kepka.git
				
				
				
			Fix key creation for media cluster.
This commit is contained in:
		
							parent
							
								
									41e13e39bc
								
							
						
					
					
						commit
						e60a9f0943
					
				| 
						 | 
					@ -104,9 +104,6 @@ void Dcenter::setConnectionInited(bool connectionInited) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CreatingKeyType Dcenter::acquireKeyCreation(TemporaryKeyType type) {
 | 
					CreatingKeyType Dcenter::acquireKeyCreation(TemporaryKeyType type) {
 | 
				
			||||||
	QReadLocker lock(&_mutex);
 | 
						QReadLocker lock(&_mutex);
 | 
				
			||||||
	if (type == TemporaryKeyType::MediaCluster) {
 | 
					 | 
				
			||||||
		int a = 0;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	const auto index = IndexByType(type);
 | 
						const auto index = IndexByType(type);
 | 
				
			||||||
	auto &key = _temporaryKeys[index];
 | 
						auto &key = _temporaryKeys[index];
 | 
				
			||||||
	if (key != nullptr) {
 | 
						if (key != nullptr) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2245,15 +2245,8 @@ void SessionPrivate::updateAuthKey() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	DEBUG_LOG(("AuthKey Info: Connection updating key from Session, dc %1"
 | 
						DEBUG_LOG(("AuthKey Info: Connection updating key from Session, dc %1"
 | 
				
			||||||
		).arg(_shiftedDcId));
 | 
							).arg(_shiftedDcId));
 | 
				
			||||||
	const auto myKeyType = TemporaryKeyTypeByDcType(_currentDcType);
 | 
						applyAuthKey(_sessionData->getTemporaryKey(
 | 
				
			||||||
	applyAuthKey(_sessionData->getTemporaryKey(myKeyType));
 | 
							TemporaryKeyTypeByDcType(_currentDcType)));
 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (_connection
 | 
					 | 
				
			||||||
		&& !_encryptionKey
 | 
					 | 
				
			||||||
		&& myKeyType == TemporaryKeyType::MediaCluster
 | 
					 | 
				
			||||||
		&& _sessionData->getTemporaryKey(TemporaryKeyType::Regular)) {
 | 
					 | 
				
			||||||
		restart();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void SessionPrivate::setCurrentKeyId(uint64 newKeyId) {
 | 
					void SessionPrivate::setCurrentKeyId(uint64 newKeyId) {
 | 
				
			||||||
| 
						 | 
					@ -2287,16 +2280,31 @@ void SessionPrivate::applyAuthKey(AuthKeyPtr &&encryptionKey) {
 | 
				
			||||||
	setCurrentKeyId(newKeyId);
 | 
						setCurrentKeyId(newKeyId);
 | 
				
			||||||
	Assert(!_connection->sentEncryptedWithKeyId());
 | 
						Assert(!_connection->sentEncryptedWithKeyId());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	DEBUG_LOG(("AuthKey Info: Connection update key from Session, dc %1 result: %2").arg(_shiftedDcId).arg(Logs::mb(&_keyId, sizeof(_keyId)).str()));
 | 
						DEBUG_LOG(("AuthKey Info: Connection update key from Session, "
 | 
				
			||||||
 | 
							"dc %1 result: %2"
 | 
				
			||||||
 | 
							).arg(_shiftedDcId
 | 
				
			||||||
 | 
							).arg(Logs::mb(&_keyId, sizeof(_keyId)).str()));
 | 
				
			||||||
	if (_keyId) {
 | 
						if (_keyId) {
 | 
				
			||||||
		return authKeyChecked();
 | 
							return authKeyChecked();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (_instance->isKeysDestroyer()) {
 | 
						if (_instance->isKeysDestroyer()) {
 | 
				
			||||||
		// We are here to destroy an old key, so we're done.
 | 
							// We are here to destroy an old key, so we're done.
 | 
				
			||||||
		LOG(("MTP Error: No key %1 in updateAuthKey() for destroying.").arg(_shiftedDcId));
 | 
							LOG(("MTP Error: No key %1 in updateAuthKey() for destroying."
 | 
				
			||||||
 | 
								).arg(_shiftedDcId));
 | 
				
			||||||
		_instance->keyWasPossiblyDestroyed(_shiftedDcId);
 | 
							_instance->keyWasPossiblyDestroyed(_shiftedDcId);
 | 
				
			||||||
	} else if (_keyCreator) {
 | 
						} else if (noMediaKeyWithExistingRegularKey()) {
 | 
				
			||||||
 | 
							DEBUG_LOG(("AuthKey Info: No key in updateAuthKey() for media, "
 | 
				
			||||||
 | 
								"but someone has created regular, trying to acquire."));
 | 
				
			||||||
 | 
							const auto dcType = tryAcquireKeyCreation();
 | 
				
			||||||
 | 
							if (_keyCreator && dcType != _currentDcType) {
 | 
				
			||||||
 | 
								DEBUG_LOG(("AuthKey Info: "
 | 
				
			||||||
 | 
									"Dc type changed for creation, restarting."));
 | 
				
			||||||
 | 
								restart();
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (_keyCreator) {
 | 
				
			||||||
		DEBUG_LOG(("AuthKey Info: No key in updateAuthKey(), creating."));
 | 
							DEBUG_LOG(("AuthKey Info: No key in updateAuthKey(), creating."));
 | 
				
			||||||
		_keyCreator->start(
 | 
							_keyCreator->start(
 | 
				
			||||||
			BareDcId(_shiftedDcId),
 | 
								BareDcId(_shiftedDcId),
 | 
				
			||||||
| 
						 | 
					@ -2304,10 +2312,17 @@ void SessionPrivate::applyAuthKey(AuthKeyPtr &&encryptionKey) {
 | 
				
			||||||
			_connection.get(),
 | 
								_connection.get(),
 | 
				
			||||||
			_instance->dcOptions());
 | 
								_instance->dcOptions());
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		DEBUG_LOG(("AuthKey Info: No key in updateAuthKey(), but someone is creating already."));
 | 
							DEBUG_LOG(("AuthKey Info: No key in updateAuthKey(), "
 | 
				
			||||||
 | 
								"but someone is creating already, waiting."));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool SessionPrivate::noMediaKeyWithExistingRegularKey() const {
 | 
				
			||||||
 | 
						return (TemporaryKeyTypeByDcType(_currentDcType)
 | 
				
			||||||
 | 
								== TemporaryKeyType::MediaCluster)
 | 
				
			||||||
 | 
							&& _sessionData->getTemporaryKey(TemporaryKeyType::Regular);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool SessionPrivate::destroyOldEnoughPersistentKey() {
 | 
					bool SessionPrivate::destroyOldEnoughPersistentKey() {
 | 
				
			||||||
	Expects(_keyCreator != nullptr);
 | 
						Expects(_keyCreator != nullptr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -157,6 +157,7 @@ private:
 | 
				
			||||||
	void clearUnboundKeyCreator();
 | 
						void clearUnboundKeyCreator();
 | 
				
			||||||
	void releaseKeyCreationOnFail();
 | 
						void releaseKeyCreationOnFail();
 | 
				
			||||||
	void applyAuthKey(AuthKeyPtr &&encryptionKey);
 | 
						void applyAuthKey(AuthKeyPtr &&encryptionKey);
 | 
				
			||||||
 | 
						[[nodiscard]] bool noMediaKeyWithExistingRegularKey() const;
 | 
				
			||||||
	bool destroyOldEnoughPersistentKey();
 | 
						bool destroyOldEnoughPersistentKey();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void setCurrentKeyId(uint64 newKeyId);
 | 
						void setCurrentKeyId(uint64 newKeyId);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue