From fc2f037e216e517ec4b87b0663277a3fc40c1d74 Mon Sep 17 00:00:00 2001 From: Niklas Halle Date: Fri, 18 Sep 2020 16:23:04 +0200 Subject: fix stuff, start encoding, add doku for attachment sending --- src/Response.cpp | 107 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 106 insertions(+), 1 deletion(-) (limited to 'src/Response.cpp') diff --git a/src/Response.cpp b/src/Response.cpp index 286de52..d97ab40 100644 --- a/src/Response.cpp +++ b/src/Response.cpp @@ -44,4 +44,109 @@ Response::json Response::create_response(std::vector &&reply, std::string response["session"] = session; response["reply"] = std::move(reply); return response; -} \ No newline at end of file +} + +static std::string const base64_chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789+/"; + +std::string base64_encode(unsigned char const *input, unsigned int const len) { + std::string ret; + size_t i = 0; + unsigned char bytes[3]; + unsigned char sextets[4]; + + while (i <= (len - 3)) { + bytes[0] = *(input++); + bytes[1] = *(input++); + bytes[2] = *(input++); + + sextets[0] = (bytes[0] & 0xfc) >> 2; // Cuts last two bits off of first byte + sextets[1] = ((bytes[0] & 0x03) << 4) + ((bytes[1] & 0xf0) + >> 4); // Takes last two bits from first byte and adds it to first 4 bits of 2nd byte + sextets[2] = ((bytes[1] & 0x0f) << 2) + ((bytes[2] & 0xc0) + >> 6); // Takes last 4 bits of 2nd byte and adds it to first 2 bits of third byte + sextets[3] = bytes[2] & 0x3f; // takes last 6 bits of third byte + + for (size_t j = 0; j < 4; ++j) { + ret += base64_chars[sextets[j]]; + } + + i += 3; // increases to go to third byte + } + + if (i != len) { + size_t k = 0; + size_t j = len - i; // Find index of last byte + while (k < j) { // Sets first bytes + bytes[k] = *(input++); + ++k; + } + + while (j < 3) { // Set last bytes to 0x00 + bytes[j] = '\0'; + ++j; + } + + sextets[0] = (bytes[0] & 0xfc) >> 2; // Cuts last two bits off of first byte + sextets[1] = ((bytes[0] & 0x03) << 4) + ((bytes[1] & 0xf0) + >> 4); // Takes last two bits from first byte and adds it to first 4 bits of 2nd byte + sextets[2] = ((bytes[1] & 0x0f) << 2) + ((bytes[2] & 0xc0) + >> 6); // Takes last 4 bits of 2nd byte and adds it to first 2 bits of third byte + // No last one is needed, because if there were 4, then (i == len) == true + + for (j = 0; j < (len - i) + 1; ++j) { // Gets sextets that include data + ret += base64_chars[sextets[j]]; // Appends them to string + } + + while ((j++) < 4) // Appends remaining ='s + ret += '='; + + } + + return ret; +} + +std::string base64_encode_file(std::string const &path) { + std::vector temp; + + std::ifstream infile; + infile.open(path, std::ios::binary); // Open file in binary mode + if (infile.is_open()) { + while (!infile.eof()) { + char c = (char) infile.get(); + temp.push_back(c); + } + infile.close(); + } else return "File could not be opened"; + std::string ret(temp.begin(), temp.end() - 1); + ret = base64_encode((unsigned const char *) ret.c_str(), ret.size()); + + return ret; +} + +Response::json Response::create_attachment(std::string const &file_path) { + std::string name = file_path; + if (auto pos = file_path.find_last_of('/'); pos != std::string::npos) { + name = file_path.substr(pos + 1); + } + return create_attachment(file_path, name); +} + +Response::json Response::create_attachment(std::string const &file_path, std::string const &file_name) { + std::string type = "unknown"; + if (auto pos = file_name.find_last_of('.'); pos != std::string::npos) { + type = file_name.substr(pos + 1); + } + return create_attachment(file_path, file_name, type); +} + +Response::json +Response::create_attachment(std::string const &file_path, std::string const &file_name, std::string const &file_type) { + json attachment(crow::json::type::Object); + attachment["type"] = file_type; + attachment["name"] = file_name; + attachment["content"] = base64_encode_file(file_path); + return attachment; +} -- cgit v1.2.3-54-g00ecf