Fix unit test if there isn't a localhost address (for example FreeBSD jails), second...
[oweals/minetest.git] / src / base64.cpp
index 2a863d161a00e5fcf6c56caf0c088ef6914f1a9e..e14de7de28d291a00f69b2a8af12eba5163a7e5e 100644 (file)
-/* 
-   base64.cpp and base64.h
+/*
+base64.cpp and base64.h
 
-   Copyright (C) 2004-2008 René Nyffenegger
+Copyright (C) 2004-2008 René Nyffenegger
 
-   This source code is provided 'as-is', without any express or implied
-   warranty. In no event will the author be held liable for any damages
-   arising from the use of this software.
+This source code is provided 'as-is', without any express or implied
+warranty. In no event will the author be held liable for any damages
+arising from the use of this software.
 
-   Permission is granted to anyone to use this software for any purpose,
-   including commercial applications, and to alter it and redistribute it
-   freely, subject to the following restrictions:
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
 
-   1. The origin of this source code must not be misrepresented; you must not
-      claim that you wrote the original source code. If you use this source code
-      in a product, an acknowledgment in the product documentation would be
-      appreciated but is not required.
+1. The origin of this source code must not be misrepresented; you must not
+   claim that you wrote the original source code. If you use this source code
+   in a product, an acknowledgment in the product documentation would be
+   appreciated but is not required.
 
-   2. Altered source versions must be plainly marked as such, and must not be
-      misrepresented as being the original source code.
+2. Altered source versions must be plainly marked as such, and must not be
+   misrepresented as being the original source code.
 
-   3. This notice may not be removed or altered from any source distribution.
+3. This notice may not be removed or altered from any source distribution.
 
-   René Nyffenegger rene.nyffenegger@adp-gmbh.ch
+René Nyffenegger rene.nyffenegger@adp-gmbh.ch
 
 */
 
 #include "base64.h"
 #include <iostream>
 
-static const std::string base64_chars = 
-             "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
-             "abcdefghijklmnopqrstuvwxyz"
-             "0123456789+/";
+static const std::string base64_chars =
+               "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+               "abcdefghijklmnopqrstuvwxyz"
+               "0123456789+/";
 
 
 static inline bool is_base64(unsigned char c) {
-  return (isalnum(c) || (c == '+') || (c == '/'));
+       return (isalnum(c) || (c == '+') || (c == '/'));
+}
+
+bool base64_is_valid(std::string const& s)
+{
+       for(size_t i=0; i<s.size(); i++)
+               if(!is_base64(s[i])) return false;
+       return true;
 }
 
 std::string base64_encode(unsigned char const* bytes_to_encode, unsigned int in_len) {
-  std::string ret;
-  int i = 0;
-  int j = 0;
-  unsigned char char_array_3[3];
-  unsigned char char_array_4[4];
-
-  while (in_len--) {
-    char_array_3[i++] = *(bytes_to_encode++);
-    if (i == 3) {
-      char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
-      char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
-      char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
-      char_array_4[3] = char_array_3[2] & 0x3f;
-
-      for(i = 0; (i <4) ; i++)
-        ret += base64_chars[char_array_4[i]];
-      i = 0;
-    }
-  }
-
-  if (i)
-  {
-    for(j = i; j < 3; j++)
-      char_array_3[j] = '\0';
-
-    char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
-    char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
-    char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
-    char_array_4[3] = char_array_3[2] & 0x3f;
-
-    for (j = 0; (j < i + 1); j++)
-      ret += base64_chars[char_array_4[j]];
-
-    while((i++ < 3))
-      ret += '=';
-
-  }
-
-  return ret;
+       std::string ret;
+       int i = 0;
+       int j = 0;
+       unsigned char char_array_3[3];
+       unsigned char char_array_4[4];
+
+       while (in_len--) {
+               char_array_3[i++] = *(bytes_to_encode++);
+               if (i == 3) {
+                       char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
+                       char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
+                       char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
+                       char_array_4[3] = char_array_3[2] & 0x3f;
+
+                       for(i = 0; (i <4) ; i++)
+                               ret += base64_chars[char_array_4[i]];
+                       i = 0;
+               }
+       }
+
+       if (i)
+       {
+               for(j = i; j < 3; j++)
+                       char_array_3[j] = '\0';
+
+               char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
+               char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
+               char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
+               char_array_4[3] = char_array_3[2] & 0x3f;
+
+               for (j = 0; (j < i + 1); j++)
+                       ret += base64_chars[char_array_4[j]];
+
+       // Don't pad it with =
+               /*while((i++ < 3))
+                       ret += '=';*/
+
+       }
+
+       return ret;
 
 }
 
 std::string base64_decode(std::string const& encoded_string) {
-  int in_len = encoded_string.size();
-  int i = 0;
-  int j = 0;
-  int in_ = 0;
-  unsigned char char_array_4[4], char_array_3[3];
-  std::string ret;
-
-  while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) {
-    char_array_4[i++] = encoded_string[in_]; in_++;
-    if (i ==4) {
-      for (i = 0; i <4; i++)
-        char_array_4[i] = base64_chars.find(char_array_4[i]);
-
-      char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
-      char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
-      char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
-
-      for (i = 0; (i < 3); i++)
-        ret += char_array_3[i];
-      i = 0;
-    }
-  }
-
-  if (i) {
-    for (j = i; j <4; j++)
-      char_array_4[j] = 0;
-
-    for (j = 0; j <4; j++)
-      char_array_4[j] = base64_chars.find(char_array_4[j]);
-
-    char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
-    char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
-    char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
-
-    for (j = 0; (j < i - 1); j++) ret += char_array_3[j];
-  }
-
-  return ret;
+       int in_len = encoded_string.size();
+       int i = 0;
+       int j = 0;
+       int in_ = 0;
+       unsigned char char_array_4[4], char_array_3[3];
+       std::string ret;
+
+       while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) {
+               char_array_4[i++] = encoded_string[in_]; in_++;
+               if (i ==4) {
+                       for (i = 0; i <4; i++)
+                               char_array_4[i] = base64_chars.find(char_array_4[i]);
+
+                       char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
+                       char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
+                       char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
+
+                       for (i = 0; (i < 3); i++)
+                               ret += char_array_3[i];
+                       i = 0;
+               }
+       }
+
+       if (i) {
+               for (j = i; j <4; j++)
+                       char_array_4[j] = 0;
+
+               for (j = 0; j <4; j++)
+                       char_array_4[j] = base64_chars.find(char_array_4[j]);
+
+               char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
+               char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
+               char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
+
+               for (j = 0; (j < i - 1); j++) ret += char_array_3[j];
+       }
+
+       return ret;
 }