1 #include "system.h"
2 #include "lj.h"
3 #include "hash.h"
4 #include "util.h"
5 #include "net.h"
6 
7 #include <stdlib.h>
8 #include <string.h>
9 
10 static char *create_getevents_request(const lj_user * user, const lj_eventinfo * logininfo);
11 
12 /*****************************************************************************
13 * This function generates the body of the HTTP request, we make the headers in
14 * lj_event.  This is mostly done so that we can just use strlen() to calculate
15 * the Content Length.
16 */
17 
18 int
lj_getevents(const lj_server * const serverinfo,lj_user * user,lj_eventinfo * eventinfo)19 lj_getevents(const lj_server * const serverinfo, lj_user *user, lj_eventinfo *eventinfo)
20 {
21 	char		*event_text;
22 	int		i, ret = 0;
23 	hashtable	*lj_hash = NULL;
24 	char		*value = NULL;
25 
26 	lj_setauth(serverinfo, user);
27 	/* First we send our request */
28 	create_hash(&lj_hash);
29 	event_text = create_getevents_request(user, eventinfo);
30 	lj_send_request(serverinfo, user, event_text, lj_hash);
31 	free(event_text);
32 
33 	/* were we a success? */
34 	eventinfo->success = 1;
35 	get(lj_hash, &value, "success");
36 	if (!value || strcmp(value, "OK"))
37 	{
38 		/* we failed */
39 		eventinfo->success = 0;
40 		ret = 1;
41 	}
42 	free(value);
43 
44 	/* next we look for an errmsg */
45 	get(lj_hash, &eventinfo->errmsg, "errmsg");
46 
47 	/* now we snag number of events */
48 	geti(lj_hash, &eventinfo->count, "events_count");
49 
50 	eventinfo->events =
51 		lj_malloc((eventinfo->count) * sizeof(lj_eventninfo));
52 	for (i = 0; i < eventinfo->count; i++)
53 	{
54 		lj_eventninfo	*info = &eventinfo->events[i];
55 
56 		getpi(lj_hash, &info->itemid,	"events_%d_itemid", i + 1);
57 		getp(lj_hash, &info->time,	"events_%d_eventtime", i + 1);
58 		getp(lj_hash, &info->event,	"events_%d_event", i + 1);
59 		getp(lj_hash, &info->security,	"events_%d_security", i + 1);
60 		getpi(lj_hash, &info->allowmask,"events_%d_allowmask", i + 1);
61 		getp(lj_hash, &info->subject,	"events_%d_subject", i + 1);
62 		getp(lj_hash, &info->poster,	"events_%d_poster", i + 1);
63 		lj_urldecode(info->event);
64 	}
65 
66 	lj_debug(1, "success: [%s]\n", eventinfo->success ? "OK" : "FAIL");
67 	if (eventinfo->errmsg)
68 		lj_debug(1, "errmsg: [%s]\n", eventinfo->errmsg);
69 
70 	/* Then we close the connection and return our success / failure code */
71 	delete_hash(lj_hash);
72 	return ret;
73 }
74 
75 char *
create_getevents_request(const lj_user * const user,const lj_eventinfo * const eventinfo)76 create_getevents_request(const lj_user * const user, const lj_eventinfo * const eventinfo)
77 {
78 	char		*ret;
79 	char		*username, *password;
80 
81 	lj_urlencode(user->username, &username);
82 	lj_urlencode(user->password, &password);
83 
84 	asprintf(&ret,
85 		"mode=getevents&%s"
86 		"&truncate=100&prefersubject=1"
87 		"&selecttype=lastn&howmany=%d"
88 		"&noprops=1"
89 		"&lineendings=unix"
90 		"&usejournal=%s",
91 		user->auth,
92 		eventinfo->eventflags,
93 		eventinfo->usejournal ? eventinfo->usejournal : "");
94 
95 	free(username);
96 	free(password);
97 	return ret;
98 }
99