CGI Programm für eine Seite zur XMPP Einladung
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

146 lines
4.5 KiB

  1. // CGI Programm für eine Seite zum Einladen von Kontakten zu XMPP
  2. //
  3. // g++ -o invite.cgi invite_cgi.cpp
  4. // Datei in das cgi-bin Verzeichnis vom Web-Server kopieren
  5. //
  6. #include <iostream>
  7. #include <map>
  8. #include <stdlib.h>
  9. #include <string>
  10. #include <vector>
  11. #include "QrCode.hpp"
  12. #define VERSION "$Id$"
  13. #define HTML_TITLE "Einladung zu XMPP"
  14. #define CSS_FILE "/css/xmpp-invite.css"
  15. #define WELCOME_H1 "<H1 id=\"welcomeh1\">Du wurdest zu XMPP eingeladen<H1>"
  16. #define WELCOME_TXT \
  17. "<div id=\"welcometxt\">XMPP ist ein offener Standard für Instant Messaging Anwendungen. \
  18. Verschlüsselte Chats, Dateien übertragen oder öffenliche Gruppen.</div>"
  19. #define FOOTER_TXT \
  20. "<p>Mehr Informationen zu XMPP findest du auf \
  21. <a href=\"https://xmpp-messenger.de/\">xmpp-messenger.de</a></p> \
  22. <ul class=\"topnav\"> \
  23. <li><a href=\"https://xmpp-messenger.de/start/android.html\">Android</a></li> \
  24. <li><a href=\"https://xmpp-messenger.de/start/iso.html\">Apple iOS</a></li> \
  25. <li><a href=\"https://xmpp-messenger.de/start/linux.html\">GNU/Linux</a></li> \
  26. <li><a href=\"https://xmpp-messenger.de/start/windows.html\">Windows</a></li> \
  27. </ul>"
  28. using namespace std;
  29. /**
  30. * Query String
  31. * invite.cgi?name=Name?from=nick@domain.tld?muc=muc@chat.domain.tld?server=xmpp.domain.tld
  32. * return
  33. * "name=Name?from=nick@domain.tld?muc=muc@chat.domain.tld?server=xmpp.domain.tld";
  34. */
  35. char *getQueryString() {
  36. //return
  37. // "name=Stefan?from=stefan@xmpp-messenger.de?muc=xmpp-messenger@conference.anoxinon.me?server=anoxinon.me";
  38. return getenv("QUERY_STRING");
  39. }
  40. /**
  41. * HTML Header Text.
  42. */
  43. void html_header() {
  44. cout << "Content-type: text/html; charset=utf-8" << endl << endl;
  45. cout << "<!-- https://codeberg.org/DebXWoody/xmpp-invite-cgi - Version "
  46. << VERSION << "-->" << endl;
  47. cout << "<HTML>" << endl;
  48. cout << "<HEAD>" << endl;
  49. cout << "<TITLE>" << HTML_TITLE << "</TITLE>" << endl;
  50. cout << "<LINK href=\"" << CSS_FILE << "\" rel=\"stylesheet\"/>" << endl;
  51. cout << "</HEAD>" << endl;
  52. cout << "<BODY>" << endl;
  53. ;
  54. }
  55. void html_footer() {
  56. cout << "</BODY>" << endl;
  57. cout << "</HTML>" << endl;
  58. ;
  59. }
  60. vector<string> split(const char *phrase, string delimiter) {
  61. vector<string> list;
  62. string s = string(phrase);
  63. size_t pos = 0;
  64. string token;
  65. while ((pos = s.find(delimiter)) != string::npos) {
  66. token = s.substr(0, pos);
  67. list.push_back(token);
  68. s.erase(0, pos + delimiter.length());
  69. }
  70. list.push_back(s);
  71. return list;
  72. }
  73. string xmppURI(string s) { return "xmpp:" + s; }
  74. string toLink(string s) { return "<A href=\"" + s + "\">" + s + "</A>"; }
  75. void html_invite(std::map<string, string> vmap) {
  76. cout << WELCOME_H1 << endl;
  77. cout << WELCOME_TXT << endl;
  78. cout << "<p>" << endl;
  79. if (vmap.find("name") != vmap.end() && vmap.find("from") != vmap.end()) {
  80. string name = vmap.find("name")->second;
  81. string from = vmap.find("from")->second;
  82. cout << "Du wurdest von " << name << " zu XMPP eingeladen." << endl;
  83. cout << name << "'s JID ist: " << toLink(xmppURI(from)) << endl;
  84. } else {
  85. if (vmap.find("from") != vmap.end()) {
  86. string from = vmap.find("from")->second;
  87. cout << "Sie wurden von " << from << " eingeladen." << endl;
  88. }
  89. }
  90. cout << "</p>" << endl;
  91. cout << "<p>" << endl;
  92. if (vmap.find("muc") != vmap.end()) {
  93. string muc = vmap.find("muc")->second;
  94. cout << "Sie wurden zu einem Multi User Chat eingeladen: "
  95. << toLink(xmppURI(muc) + "?join") << endl;
  96. }
  97. cout << "</p>" << endl;
  98. cout << "<p>" << endl;
  99. if (vmap.find("server") != vmap.end()) {
  100. string server = vmap.find("server")->second;
  101. cout << "Erstell doch ein Kontakt auf dem Server: " << server << endl;
  102. }
  103. cout << "</p>" << endl;
  104. cout << FOOTER_TXT << endl;
  105. }
  106. int main(int argc, char *argv[]) {
  107. html_header();
  108. char *queryString = getQueryString();
  109. if (queryString == NULL) {
  110. cout << "Fehler: QUERY_STRING ist null" << endl;
  111. } else {
  112. std::map<string, string> vmap;
  113. vector<string> qp = split(queryString, "?");
  114. for (auto i : qp) {
  115. vector<string> pv = split(i.c_str(), "=");
  116. vmap.insert(std::pair<string, string>(pv.at(0), pv.at(1)));
  117. }
  118. html_invite(vmap);
  119. }
  120. std::string qrText = "https://xmpp-messenger.de/cgi-bin/invite.cgi?" + std::string(queryString);
  121. qrcodegen::QrCode qr0 = qrcodegen::QrCode::encodeText(qrText.c_str(), qrcodegen::QrCode::Ecc::MEDIUM);
  122. std::string svg = qr0.toSvgString(32);
  123. std::cout << svg;
  124. html_footer();
  125. return 0;
  126. }