Guest User

Untitled

a guest
Sep 6th, 2018
35
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.10 KB | None | 0 0
  1. #include "../include/smtpmailobject.h"
  2. #include "exceptionobject.h"
  3. #include "exceptions/systemexception.h"
  4. #include "modulesystem.h"
  5. #include "interpreter.h"
  6. #include "function.h"
  7. #include "networkmod.h"
  8. #include "networkpermission.h"
  9. #include "misc.h"
  10. SmtpMailObject::SmtpMailObject(Class *c) : MailObject(c)
  11. {
  12.     this->port = 587;
  13.     this->curl = NULL;
  14. }
  15.  
  16. SmtpMailObject::~SmtpMailObject()
  17. {
  18.     // Clean up if the user failed to do so
  19.     if (this->curl != NULL)
  20.         curl_easy_cleanup(this->curl);
  21. }
  22.  
  23. std::shared_ptr<Object> SmtpMailObject::newInstance(Class *c)
  24. {
  25.     return std::make_shared<SmtpMailObject>(c);
  26. }
  27.  
  28. void SmtpMailObject::newInterpreter(Interpreter *interpreter)
  29. {
  30. }
  31.  
  32. void SmtpMailObject::registerClass(ModuleSystem *moduleSystem)
  33. {
  34.     Class *c = moduleSystem->getClassSystem()->registerClass("SmtpMail", moduleSystem->getClassSystem()->getClassByName("Mail"));
  35.     c->setDescriptorObject(std::make_shared<SmtpMailObject>(c));
  36.  
  37.     /**
  38.      * @class SmtpMail
  39.      *
  40.      * Constructs this SmtpMail object
  41.      */
  42.     c->registerFunction("__construct", {}, VarType::fromString("void"), SmtpMailObject::SmtpMail_construct);
  43.  
  44.     /**
  45.      * @class SmtpMail
  46.      *
  47.      * Sets the host of the SMTP server
  48.      *
  49.      * function setHost(string hostname) : void
  50.      */
  51.     c->registerFunction("setHost", {VarType::fromString("string")}, VarType::fromString("void"), SmtpMailObject::SmtpMail_setHost);
  52.  
  53.     /**
  54.      * @class SmtpMail
  55.      *
  56.      * Sets the port of the SMTP server
  57.      *
  58.      * function setPort(number port) : void
  59.      */
  60.     c->registerFunction("setPort", {VarType::fromString("number")}, VarType::fromString("void"), SmtpMailObject::SmtpMail_setPort);
  61.  
  62.     /**
  63.      * @class SmtpMail
  64.      *
  65.      * Set this to true if we should use SSL to communicate with this SMTP server
  66.      *
  67.      * function setUseSSL(boolean use_ssl) : void
  68.      */
  69.     c->registerFunction("setUseSSL", {VarType::fromString("boolean")}, VarType::fromString("void"), SmtpMailObject::SmtpMail_setUseSSL);
  70.  
  71.     /**
  72.      * @class SmtpMail
  73.      *
  74.      * Sets the username for this SMTP server
  75.      *
  76.      * function setUsername(string username) : void
  77.      */
  78.     c->registerFunction("setUsername", {VarType::fromString("string")}, VarType::fromString("void"), SmtpMailObject::SmtpMail_setUsername);
  79.  
  80.     /**
  81.      * @class SmtpMail
  82.      *
  83.      * Sets the password for this SMTP server
  84.      *
  85.      * function setPassword(string password) : void
  86.      */
  87.     c->registerFunction("setPassword", {VarType::fromString("string")}, VarType::fromString("void"), SmtpMailObject::SmtpMail_setPassword);
  88.  
  89.     /**
  90.      * @class SmtpMail
  91.      *
  92.      * Sends this email
  93.      *
  94.      * function send() : void
  95.      */
  96.     c->registerFunction("send", {}, VarType::fromString("void"), SmtpMailObject::SmtpMail_send);
  97. }
  98.  
  99. void SmtpMailObject::SmtpMail_construct(Interpreter *interpreter, std::vector<Value> values, Value *return_value, std::shared_ptr<Object> object, Scope *caller_scope)
  100. {
  101.     std::shared_ptr<SmtpMailObject> smtp_mail_obj = std::dynamic_pointer_cast<SmtpMailObject>(object);
  102.     smtp_mail_obj->curl = curl_easy_init();
  103. }
  104. void SmtpMailObject::SmtpMail_setHost(Interpreter *interpreter, std::vector<Value> values, Value *return_value, std::shared_ptr<Object> object, Scope *caller_scope)
  105. {
  106.     std::shared_ptr<SmtpMailObject> smtp_mail_obj = std::dynamic_pointer_cast<SmtpMailObject>(object);
  107.     smtp_mail_obj->host = values[0].svalue;
  108. }
  109.  
  110. void SmtpMailObject::SmtpMail_setPort(Interpreter *interpreter, std::vector<Value> values, Value *return_value, std::shared_ptr<Object> object, Scope *caller_scope)
  111. {
  112.     std::shared_ptr<SmtpMailObject> smtp_mail_obj = std::dynamic_pointer_cast<SmtpMailObject>(object);
  113.     smtp_mail_obj->port = (unsigned short)values[0].dvalue;
  114. }
  115.  
  116. void SmtpMailObject::SmtpMail_setUseSSL(Interpreter *interpreter, std::vector<Value> values, Value *return_value, std::shared_ptr<Object> object, Scope *caller_scope)
  117. {
  118.     std::shared_ptr<SmtpMailObject> smtp_mail_obj = std::dynamic_pointer_cast<SmtpMailObject>(object);
  119.     smtp_mail_obj->use_ssl = values[0].dvalue;
  120. }
  121.  
  122. void SmtpMailObject::SmtpMail_setUsername(Interpreter *interpreter, std::vector<Value> values, Value *return_value, std::shared_ptr<Object> object, Scope *caller_scope)
  123. {
  124.     std::shared_ptr<SmtpMailObject> smtp_mail_obj = std::dynamic_pointer_cast<SmtpMailObject>(object);
  125.     smtp_mail_obj->username = values[0].svalue;
  126.  
  127.     // No from provided? Then we provide the username as the from field
  128.     if (smtp_mail_obj->from == "")
  129.     {
  130.         smtp_mail_obj->from = smtp_mail_obj->username;
  131.     }
  132. }
  133.  
  134. void SmtpMailObject::SmtpMail_setPassword(Interpreter *interpreter, std::vector<Value> values, Value *return_value, std::shared_ptr<Object> object, Scope *caller_scope)
  135. {
  136.     std::shared_ptr<SmtpMailObject> smtp_mail_obj = std::dynamic_pointer_cast<SmtpMailObject>(object);
  137.     smtp_mail_obj->password = values[0].svalue;
  138. }
  139.  
  140. static size_t payload_source(void *ptr, size_t size, size_t nmemb, void *userp)
  141. {
  142.     if ((size == 0) || (nmemb == 0) || ((size * nmemb) < 1))
  143.     {
  144.         return 0;
  145.     }
  146.  
  147.     int total_b = (nmemb * size);
  148.     memcpy(ptr, (const char *)userp + total_b, size);
  149.     std::cout << "returning total bytes: " << total_b << std::endl;
  150.     return nmemb;
  151. }
  152.  
  153. void SmtpMailObject::SmtpMail_send(Interpreter *interpreter, std::vector<Value> values, Value *return_value, std::shared_ptr<Object> object, Scope *caller_scope)
  154. {
  155.     /*
  156.      * We now need to tell curl to send our email
  157.      */
  158.     struct curl_slist *recipients = NULL;
  159.     std::shared_ptr<SmtpMailObject> smtp_mail_obj = std::dynamic_pointer_cast<SmtpMailObject>(object);
  160.     curl_easy_setopt(smtp_mail_obj->curl, CURLOPT_USERNAME, smtp_mail_obj->username.c_str());
  161.     curl_easy_setopt(smtp_mail_obj->curl, CURLOPT_PASSWORD, smtp_mail_obj->password.c_str());
  162.  
  163.     curl_easy_setopt(smtp_mail_obj->curl, CURLOPT_URL, ("smtps://" + smtp_mail_obj->host + ":" + std::to_string(smtp_mail_obj->port)).c_str());
  164.  
  165.     curl_easy_setopt(smtp_mail_obj->curl, CURLOPT_USE_SSL, (long)CURLUSESSL_ALL);
  166.  
  167.     curl_easy_setopt(smtp_mail_obj->curl, CURLOPT_MAIL_FROM, smtp_mail_obj->from.c_str());
  168.  
  169.     recipients = curl_slist_append(recipients, smtp_mail_obj->to.c_str());
  170.     if (smtp_mail_obj->cc != "")
  171.     {
  172.         recipients = curl_slist_append(recipients, smtp_mail_obj->cc.c_str());
  173.     }
  174.  
  175.     std::string final_data = smtp_mail_obj->getTranscript();
  176.  
  177.     curl_easy_setopt(smtp_mail_obj->curl, CURLOPT_MAIL_RCPT, recipients);
  178.     curl_easy_setopt(smtp_mail_obj->curl, CURLOPT_READFUNCTION, NetworkModule::CurlReadCallback);
  179.     curl_easy_setopt(smtp_mail_obj->curl, CURLOPT_READDATA, final_data);
  180.     curl_easy_setopt(smtp_mail_obj->curl, CURLOPT_UPLOAD, 1L);
  181.  
  182.     // Send the message
  183.     CURLcode res = curl_easy_perform(smtp_mail_obj->curl);
  184.  
  185.     /* Check for errors */
  186.     if (res != CURLE_OK)
  187.     {
  188.         std::cout << "failed here throw exception for future purposes: " << curl_easy_strerror(res) << std::endl;
  189.     }
  190.  
  191.     /* Free the list of recipients */
  192.     curl_slist_free_all(recipients);
  193. }
Add Comment
Please, Sign In to add comment