mirror of
https://foundry.openuru.org/gitblit/r/CWE-ou-minkata.git
synced 2025-07-17 10:52:46 +00:00
Integrate SecurePreloader into pfPatcher
This commit is contained in:
@ -667,17 +667,13 @@ bool plSecureStream::IsSecureFile(const plFileName& fileName)
|
||||
hsStream* plSecureStream::OpenSecureFile(const plFileName& fileName, const uint32_t flags /* = kRequireEncryption */, uint32_t* key /* = nil */)
|
||||
{
|
||||
bool requireEncryption = flags & kRequireEncryption;
|
||||
#ifndef PLASMA_EXTERNAL_RELEASE
|
||||
requireEncryption = false;
|
||||
#endif
|
||||
|
||||
bool deleteOnExit = flags & kDeleteOnExit;
|
||||
bool isEncrypted = IsSecureFile(fileName);
|
||||
|
||||
hsStream* s = nil;
|
||||
hsStream* s = nullptr;
|
||||
if (isEncrypted)
|
||||
s = new plSecureStream(deleteOnExit, key);
|
||||
else if (!requireEncryption) // If this isn't an external release, let them use unencrypted data
|
||||
else if (!requireEncryption)
|
||||
s = new hsUNIXStream;
|
||||
|
||||
if (s)
|
||||
|
@ -40,7 +40,7 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com
|
||||
|
||||
*==LICENSE==*/
|
||||
|
||||
#include <string>
|
||||
#include "HeadSpin.h"
|
||||
#include "plStreamSource.h"
|
||||
#include "plSecureStream.h"
|
||||
#include "plEncryptedStream.h"
|
||||
@ -49,8 +49,15 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com
|
||||
# include <wctype.h>
|
||||
#endif
|
||||
|
||||
plStreamSource::plStreamSource()
|
||||
{
|
||||
memset(fServerKey, 0, arrsize(fServerKey));
|
||||
}
|
||||
|
||||
void plStreamSource::ICleanup()
|
||||
{
|
||||
hsTempMutexLock lock(fMutex);
|
||||
|
||||
// loop through all the file data records, and delete the streams
|
||||
decltype(fFileData.begin()) curData;
|
||||
for (curData = fFileData.begin(); curData != fFileData.end(); curData++)
|
||||
@ -65,6 +72,8 @@ void plStreamSource::ICleanup()
|
||||
|
||||
hsStream* plStreamSource::GetFile(const plFileName& filename)
|
||||
{
|
||||
hsTempMutexLock lock(fMutex);
|
||||
|
||||
plFileName sFilename = filename.Normalize('/');
|
||||
if (fFileData.find(sFilename) == fFileData.end())
|
||||
{
|
||||
@ -78,14 +87,15 @@ hsStream* plStreamSource::GetFile(const plFileName& filename)
|
||||
fFileData[sFilename].fExt = sFilename.GetFileExt();
|
||||
if (plSecureStream::IsSecureFile(filename))
|
||||
{
|
||||
uint32_t encryptionKey[4];
|
||||
if (!plSecureStream::GetSecureEncryptionKey(filename, encryptionKey, 4))
|
||||
{
|
||||
FATAL("Hey camper... You need an NTD key file!");
|
||||
return nil;
|
||||
}
|
||||
hsStream* ss = nullptr;
|
||||
|
||||
fFileData[sFilename].fStream = plSecureStream::OpenSecureFile(filename, 0, encryptionKey);
|
||||
uint32_t encryptionKey[4];
|
||||
if (plSecureStream::GetSecureEncryptionKey(filename, encryptionKey, 4))
|
||||
ss = plSecureStream::OpenSecureFile(filename, 0, encryptionKey);
|
||||
else
|
||||
ss = plSecureStream::OpenSecureFile(filename, 0, fServerKey);
|
||||
fFileData[sFilename].fStream = ss;
|
||||
hsAssert(ss, "failed to open a SecureStream for a disc file!");
|
||||
}
|
||||
else // otherwise it is an encrypted or plain stream, this call handles both
|
||||
fFileData[sFilename].fStream = plEncryptedStream::OpenEncryptedFile(filename);
|
||||
@ -102,6 +112,7 @@ std::vector<plFileName> plStreamSource::GetListOfNames(const plFileName& dir, co
|
||||
{
|
||||
plFileName sDir = dir.Normalize('/');
|
||||
hsAssert(ext.CharAt(0) != '.', "Don't add a dot");
|
||||
hsTempMutexLock lock(fMutex);
|
||||
|
||||
// loop through all the file data records, and create the list
|
||||
std::vector<plFileName> retVal;
|
||||
@ -131,6 +142,7 @@ bool plStreamSource::InsertFile(const plFileName& filename, hsStream* stream)
|
||||
{
|
||||
plFileName sFilename = filename.Normalize('/');
|
||||
|
||||
hsTempMutexLock lock(fMutex);
|
||||
if (fFileData.find(sFilename) != fFileData.end())
|
||||
return false; // duplicate entry, return failure
|
||||
|
||||
|
@ -43,8 +43,8 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com
|
||||
#define plStreamSource_h_inc
|
||||
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include "hsStream.h"
|
||||
#include "hsThread.h"
|
||||
|
||||
// A class for holding and accessing file streams. The preloader will insert
|
||||
// files in here once they are loaded. In internal builds, if a requested file
|
||||
@ -60,10 +60,12 @@ private:
|
||||
hsStream* fStream; // we own this pointer, so clean it up
|
||||
};
|
||||
std::map<plFileName, fileData, plFileName::less_i> fFileData; // key is filename
|
||||
hsMutex fMutex;
|
||||
uint32_t fServerKey[4];
|
||||
|
||||
void ICleanup(); // closes all file pointers and cleans up after itself
|
||||
|
||||
plStreamSource() {}
|
||||
plStreamSource();
|
||||
public:
|
||||
~plStreamSource() {ICleanup();}
|
||||
|
||||
@ -77,6 +79,9 @@ public:
|
||||
// For other classes to insert files (takes ownership of the stream if successful)
|
||||
bool InsertFile(const plFileName& filename, hsStream* stream);
|
||||
|
||||
/** Gets a pointer to our encryption key */
|
||||
uint32_t* GetEncryptionKey() { return fServerKey; }
|
||||
|
||||
// Instance handling
|
||||
static plStreamSource* GetInstance();
|
||||
};
|
||||
|
Reference in New Issue
Block a user