diff --git a/Sources/Plasma/CoreLib/plString.cpp b/Sources/Plasma/CoreLib/plString.cpp index a8da244e..7ca66336 100644 --- a/Sources/Plasma/CoreLib/plString.cpp +++ b/Sources/Plasma/CoreLib/plString.cpp @@ -644,6 +644,36 @@ plString plString::Substr(int start, size_t size) const return str; } +plString plString::ToUpper() const +{ + // TODO: Unicode-aware case conversion + size_t size = GetSize(); + char *dupe = new char[size + 1]; + const char *self = c_str(); + for (size_t i = 0; i < size; ++i) + dupe[i] = toupper(self[i]); + + // Don't re-check UTF-8 on this + plString str; + str.fUtf8Buffer = plStringBuffer::Steal(dupe, size); + return str; +} + +plString plString::ToLower() const +{ + // TODO: Unicode-aware case conversion + size_t size = GetSize(); + char *dupe = new char[size + 1]; + const char *self = c_str(); + for (size_t i = 0; i < size; ++i) + dupe[i] = tolower(self[i]); + + // Don't re-check UTF-8 on this + plString str; + str.fUtf8Buffer = plStringBuffer::Steal(dupe, size); + return str; +} + plString &plString::operator+=(const plString &str) { size_t catsize = GetSize() + str.GetSize(); @@ -669,9 +699,8 @@ plString operator+(const plString &left, const plString &right) return str; } -plStringStream &plStringStream::operator<<(const char *text) +plStringStream &plStringStream::append(const char *data, size_t length) { - size_t length = strlen(text); if (fLength + length > fBufSize) { char *bigger = new char[fBufSize * 2]; memcpy(bigger, fBuffer, fBufSize); @@ -679,11 +708,17 @@ plStringStream &plStringStream::operator<<(const char *text) fBuffer = bigger; fBufSize *= 2; } - memcpy(fBuffer + fLength, text, length); + memcpy(fBuffer + fLength, data, length); fLength += length; return *this; } +plStringStream &plStringStream::operator<<(const char *text) +{ + size_t length = strlen(text); + return append(text, length); +} + plStringStream &plStringStream::operator<<(int num) { char buffer[12]; @@ -697,9 +732,3 @@ plStringStream &plStringStream::operator<<(unsigned int num) snprintf(buffer, 12, "%u", num); return operator<<(buffer); } - -plStringStream &plStringStream::operator<<(char ch) -{ - char buffer[2] = { ch, 0 }; - return operator<<(buffer); -} diff --git a/Sources/Plasma/CoreLib/plString.h b/Sources/Plasma/CoreLib/plString.h index 48f272c3..c8a46774 100644 --- a/Sources/Plasma/CoreLib/plString.h +++ b/Sources/Plasma/CoreLib/plString.h @@ -260,6 +260,11 @@ public: plString Left(size_t size) const { return Substr(0, size); } plString Right(size_t size) const { return Substr(GetSize() - size, size); } + // NOTE: Does ::Compare(blah, kCaseInsensitive) make more sense? If + // so, use that instead -- it's faster and more efficient! + plString ToUpper() const; + plString ToLower() const; + public: struct less : public std::binary_function { @@ -403,14 +408,16 @@ public: } ~plStringStream() { delete [] fBuffer; } + plStringStream &append(const char *data, size_t length); + plStringStream &operator<<(const char *text); plStringStream &operator<<(int num); plStringStream &operator<<(unsigned int num); - plStringStream &operator<<(char ch); + plStringStream &operator<<(char ch) { return append(&ch, 1); } plStringStream &operator<<(const plString &text) { - return operator<<(text.s_str()); + return append(text.s_str(), text.GetSize()); } size_t GetLength() const { return fLength; } diff --git a/Sources/Plasma/NucleusLib/pnEncryption/plChallengeHash.cpp b/Sources/Plasma/NucleusLib/pnEncryption/plChallengeHash.cpp index 67128439..4c88fd4c 100644 --- a/Sources/Plasma/NucleusLib/pnEncryption/plChallengeHash.cpp +++ b/Sources/Plasma/NucleusLib/pnEncryption/plChallengeHash.cpp @@ -93,14 +93,11 @@ void CryptCreateRandomSeed(size_t length, uint8_t* data) void CryptHashPassword(const plString& username, const plString& password, ShaDigest dest) { - /* This should be unnecessary once plString has ToLower() */ - wchar_t* w_name = (wchar_t*)_TEMP_CONVERT_TO_WCHAR_T(username); - StrLower(w_name); - - plString buf = password; - buf += _TEMP_CONVERT_FROM_WCHAR_T(w_name); - - plSHAChecksum sum(buf.GetSize() * sizeof(wchar_t), (uint8_t*)_TEMP_CONVERT_TO_WCHAR_T(buf)); + plStringStream buf; + buf << password.Left(password.GetSize() - 1) << '\0'; + buf << username.ToLower().Left(username.GetSize() - 1) << '\0'; + plStringBuffer result = buf.GetString().ToUtf16(); + plSHAChecksum sum(result.GetSize() * sizeof(uint16_t), (uint8_t*)result.GetData()); memcpy(dest, sum.GetValue(), sizeof(ShaDigest)); }