If the administrator specifies a smart-host as an smtp:// or smtps:// URI, allow...
[citadel.git] / citadel / modules / rssclient / serv_rssclient.c
index 2b1baa5d9b14f014a6677f3d8e355729bcea1fe0..72ce11ed280f8164cdaa538ce73b0bf6994d7529 100644 (file)
@@ -134,7 +134,7 @@ void rss_end_element(void *data, const char *el)
                        // check the use table
                        StrBuf *u = NewStrBuf();
                        StrBufAppendPrintf(u, "rss/%s", r->item_id);
-                       time_t already_seen = CheckIfAlreadySeen("rss", u, time(NULL), 604800, eUpdate, 0, 0);
+                       int already_seen = CheckIfAlreadySeen(u);
                        FreeStrBuf(&u);
 
                        if (already_seen == 0) {
@@ -185,7 +185,7 @@ void rss_end_element(void *data, const char *el)
                                }
                        }
                        else {
-                               syslog(LOG_DEBUG, "%s was already seen %ld seconds ago", r->item_id, already_seen);
+                               syslog(LOG_DEBUG, "%s was already seen", r->item_id);
                        }
        
                        CM_Free(r->msg);
@@ -213,13 +213,21 @@ void rss_end_element(void *data, const char *el)
        }
 
        else if (!strcasecmp(el, "pubdate")) {                  // date/time stamp (rss) Sat, 25 Feb 2017 14:28:01 EST
-               if (CM_IsEmpty(r->msg, eTimestamp)) {
+               if ((r->msg)&&(r->msg->cm_fields[eTimestamp]==NULL)) {
                        CM_SetFieldLONG(r->msg, eTimestamp, parsedate(ChrPtr(r->CData)));
                }
        }
 
        else if (!strcasecmp(el, "updated")) {                  // date/time stamp (atom) 2003-12-13T18:30:02Z
-               // FIXME parse it
+               if ((r->msg)&&(r->msg->cm_fields[eTimestamp]==NULL)) {
+                       struct tm t;
+                       char zulu;
+                       memset(&t, 0, sizeof t);
+                       sscanf(ChrPtr(r->CData), "%d-%d-%dT%d:%d:%d%c", &t.tm_year, &t.tm_mon, &t.tm_mday, &t.tm_hour, &t.tm_min, &t.tm_sec, &zulu);
+                       t.tm_year -= 1900;
+                       t.tm_mon -= 1;
+                       CM_SetFieldLONG(r->msg, eTimestamp, mktime(&t));
+               }
        }
 
        else if (!strcasecmp(el, "link")) {                     // link to story (rss)
@@ -246,6 +254,7 @@ void rss_end_element(void *data, const char *el)
        else if (
                (!strcasecmp(el, "description"))                // message text (rss)
                || (!strcasecmp(el, "summary"))                 // message text (atom)
+               || (!strcasecmp(el, "content"))                 // message text (atom)
        ) {
                if (r->description != NULL) {
                        free(r->description);
@@ -284,7 +293,7 @@ void rss_parse_feed(StrBuf *Feed, struct rssroom *rooms)
 
        memset(&r, 0, sizeof r);
        r.rooms = rooms;
-       XML_Parser p = XML_ParserCreateNS("UTF-8", ':');
+       XML_Parser p = XML_ParserCreate("UTF-8");
        XML_SetElementHandler(p, rss_start_element, rss_end_element);
        XML_SetCharacterDataHandler(p, rss_handle_data);
        XML_SetUserData(p, (void *)&r);
@@ -323,17 +332,6 @@ void rssclient_push_todo(char *rssurl, char *roomname)
 }
 
 
-// Callback function for curl
-//
-size_t rss_pof_write_data(void *buffer, size_t size, size_t nmemb, void *userp)
-{
-       StrBuf *Downloaded = (StrBuf *)userp;
-       size_t bytes = size * nmemb;
-       StrBufAppendBufPlain(Downloaded, buffer, bytes, 0);
-       return(bytes);
-}
-
-
 // pull one feed (possibly multiple rooms)
 //
 void rss_pull_one_feed(struct rssurl *url)
@@ -352,8 +350,10 @@ void rss_pull_one_feed(struct rssurl *url)
        Downloaded = NewStrBuf();
 
        curl_easy_setopt(curl, CURLOPT_URL, url->url);
+       curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
+       curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
        curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);                     // Follow redirects
-       curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, rss_pof_write_data);      // What to do with downloaded data
+       curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, CurlFillStrBuf_callback); // What to do with downloaded data
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, Downloaded);                  // Give it our StrBuf to work with
        curl_easy_setopt(curl, CURLOPT_TIMEOUT, 20L);                           // Time out after 20 seconds
        res = curl_easy_perform(curl);                                          // Perform the request