Index: /trunk/globals.h
===================================================================
--- /trunk/globals.h (revision 5353)
+++ /trunk/globals.h (revision 5354)
@@ -1103,8 +1103,10 @@
char *emmlogdir;
char *logfile;
+ char *mailfile;
uint8_t logtostdout;
uint8_t logtosyslog;
uint32_t loghistorysize;
int8_t disablelog;
+ int8_t disablemail;
int8_t disableuserfile;
int8_t usrfileflag;
Index: /trunk/module-monitor.c
===================================================================
--- /trunk/module-monitor.c (revision 5353)
+++ /trunk/module-monitor.c (revision 5354)
@@ -374,4 +374,8 @@
snprintf(buf, 256, "LogFile=%s", cfg.logfile);
monitor_send_details(buf, pid);
+ if( cfg.mailfile ) {
+ snprintf(buf, 256, "MailFile=%s", cfg.mailfile);
+ monitor_send_details(buf, pid);
+ }
if( cfg.usrfile ) {
snprintf(buf, 256, "UsrFile=%s", cfg.usrfile);
Index: /trunk/oscam-config.c
===================================================================
--- /trunk/oscam-config.c (revision 5353)
+++ /trunk/oscam-config.c (revision 5354)
@@ -422,4 +422,9 @@
}
+ if (!strcmp(token, "disablemail")) {
+ cfg.disablemail = strToIntVal(value, 1);
+ return;
+ }
+
if (!strcmp(token, "loghistorysize")) {
uint32_t newsize = strToUIntVal(value, 4096);
@@ -475,4 +480,13 @@
}
+ if (!strcmp(token, "mailfile")) {
+ NULLFREE(cfg.mailfile);
+ if (strlen(value) > 0) {
+ if(!cs_malloc(&(cfg.mailfile), strlen(value) + 1, -1)) return;
+ memcpy(cfg.mailfile, value, strlen(value) + 1);
+ } else cfg.disablemail = 1;
+ return;
+ }
+
if (!strcmp(token, "cwlogdir")) {
NULLFREE(cfg.cwlogdir);
@@ -1511,6 +1525,8 @@
cfg.logfile = NULL;
cfg.usrfile = NULL;
+ cfg.mailfile = NULL;
cfg.max_log_size = 10;
cfg.disableuserfile = 1;
+ cfg.disablemail = 1;
#ifdef CS_LOGHISTORY
cfg.loghistorysize = 0;
@@ -1600,4 +1616,5 @@
}
if(cfg.usrfile == NULL) cfg.disableuserfile = 1;
+ if(cfg.mailfile == NULL) cfg.disablemail = 1;
cs_init_log();
@@ -1937,4 +1954,6 @@
if (cfg.usrfile != NULL || cfg.http_full_cfg)
fprintf_conf(f, CONFVARWIDTH, "usrfile", "%s\n", cfg.usrfile?cfg.usrfile:"");
+ if (cfg.mailfile != NULL || cfg.http_full_cfg)
+ fprintf_conf(f, CONFVARWIDTH, "mailfile", "%s\n", cfg.mailfile?cfg.mailfile:"");
if (cfg.logfile != NULL || cfg.logtostdout == 1 || cfg.logtosyslog == 1 || cfg.http_full_cfg){
value = mk_t_logfile();
@@ -1954,4 +1973,6 @@
if ((cfg.usrfile && cfg.disableuserfile == 0) || cfg.http_full_cfg)
fprintf_conf(f, CONFVARWIDTH, "disableuserfile", "%d\n", cfg.usrfile?cfg.disableuserfile:1);
+ if ((cfg.mailfile && cfg.disablemail == 0) || cfg.http_full_cfg)
+ fprintf_conf(f, CONFVARWIDTH, "disablemail", "%d\n", cfg.mailfile?cfg.disablemail:1);
if ((cfg.loghistorysize != 4096) || cfg.http_full_cfg)
fprintf_conf(f, CONFVARWIDTH, "loghistorysize", "%u\n", cfg.loghistorysize);
Index: /trunk/oscam-http.c
===================================================================
--- /trunk/oscam-http.c (revision 5353)
+++ /trunk/oscam-http.c (revision 5354)
@@ -85,4 +85,5 @@
}
if(cfg.usrfile == NULL) cfg.disableuserfile = 1;
+ if(cfg.mailfile == NULL) cfg.disablemail = 1;
tpl_addVar(vars, TPLAPPEND, "MESSAGE", "
Configuration Global done. You should restart OSCam now.
");
if(write_config()==0) refresh_oscam(REFR_SERVER);
@@ -99,4 +100,6 @@
if (cfg.disableuserfile == 1) tpl_addVar(vars, TPLADD, "DISABLEUSERFILECHECKED", "selected");
if(cfg.usrfileflag == 1) tpl_addVar(vars, TPLADD, "USERFILEFLAGCHECKED", "selected");
+ if (cfg.mailfile != NULL) tpl_addVar(vars, TPLADD, "MAILFILE", cfg.mailfile);
+ if (cfg.disablemail == 1) tpl_addVar(vars, TPLADD, "DISABLEMAILCHECKED", "selected");
char *value = mk_t_logfile();
Index: /trunk/oscam-http.h
===================================================================
--- /trunk/oscam-http.h (revision 5353)
+++ /trunk/oscam-http.h (revision 5354)
@@ -1450,4 +1450,10 @@
\n\
\n\
+
##TPLHELPPREFIX##conf#disablemail##TPLHELPSUFFIX##Mail file: | \n\
+ \n\
+ \n\
+ \n\
+ | \n\
+
\n\
##TPLHELPPREFIX##conf#logfile##TPLHELPSUFFIX##Log file / max size: | \n\
\n\
Index: /trunk/reader-videoguard-common.c
===================================================================
--- /trunk/reader-videoguard-common.c (revision 5353)
+++ /trunk/reader-videoguard-common.c (revision 5354)
@@ -10,4 +10,20 @@
#define VG_EMMTYPE_U 1
#define VG_EMMTYPE_S 2
+
+typedef struct mailmsg_s
+{
+ uint16_t caid;
+ uint32_t serial;
+ uint16_t date;
+ uint16_t id;
+ uint8_t nsubs;
+ uint16_t len;
+ uint8_t mask;
+ uint8_t written;
+ char *message;
+ char *subject;
+} MAILMSG;
+
+LLIST *vg_msgs = 0;
void set_known_card_info(struct s_reader * reader, const unsigned char * atr, const uint32_t *atr_size)
@@ -847,4 +863,9 @@
if (ep->emm[offs] == 0x02 || ep->emm[offs] == 0x03 || ep->emm[offs] == 0x07)
{
+ if (ep->emm[offs] == 0x03 && (position == ua_position || vdrsc_fix))
+ {
+ videoguard_mail_msg(reader, &ep->emm[offs+2]);
+ return OK;
+ }
offs += ep->emm[offs+1] + 2;
if (!(offs < ep->l))
@@ -923,2 +944,125 @@
}
+static MAILMSG *find_msg(uint16_t caid, uint32_t serial, uint16_t date, uint16_t msg_id)
+{
+ MAILMSG *msg;
+ LL_ITER it = ll_iter_create(vg_msgs);
+ while ((msg = (MAILMSG *)ll_iter_next(&it)))
+ {
+ if (msg->caid == caid && msg->serial == serial && msg->date == date && msg->id == msg_id)
+ return msg;
+ }
+ return 0;
+}
+
+static void write_msg(MAILMSG *msg, uint32_t baseyear)
+{
+ FILE *fp = fopen(cfg.mailfile, "a");
+ if (fp == 0)
+ {
+ cs_log("Cannot open mailfile %s", cfg.mailfile);
+ return;
+ }
+
+ uint16_t i;
+ for (i = 0; i < msg->len - 1; ++i)
+ {
+ if (msg->message[i] == 0x00 && msg->message[i+1] == 0x32)
+ {
+ msg->subject = &msg->message[i+3];
+ break;
+ }
+ }
+ int year = (msg->date >> 8) / 12 + baseyear;
+ int mon = (msg->date >> 8) % 12 + 1;
+ int day = msg->date & 0x1f;
+
+ fprintf(fp, "%04X:%08X:%02d/%02d/%04d:%04X:\"%s\":\"%s\"\n", msg->caid, msg->serial, day, mon, year,
+ msg->id, msg->subject, msg->message);
+ fclose(fp);
+ free(msg->message);
+ msg->message = msg->subject = 0;
+ msg->written = 1;
+}
+
+static void msgs_init(uint32_t baseyear)
+{
+ vg_msgs = ll_create();
+ FILE *fp = fopen(cfg.mailfile, "r");
+ if (fp == 0)
+ return;
+ int year, mon, day;
+ char buffer[2048];
+ while (fgets(buffer, sizeof(buffer), fp))
+ {
+ MAILMSG *msg;
+ if (cs_malloc(&msg, sizeof(MAILMSG), -1) == 0)
+ {
+ fclose(fp);
+ return;
+ }
+ sscanf(buffer, "%04hX:%08X:%02d/%02d/%04d:%04hX", &msg->caid, &msg->serial, &day, &mon, &year, &msg->id);
+ year -= baseyear;
+ msg->date = ((year * 12) + mon - 1) << 8 | day;
+ msg->message = msg->subject = 0;
+ msg->written = 1;
+ ll_append(vg_msgs, msg);
+ }
+ fclose(fp);
+}
+
+void videoguard_mail_msg(struct s_reader *rdr, uint8_t *data)
+{
+ if (cfg.disablemail)
+ return;
+
+ if (vg_msgs == 0)
+ msgs_init(rdr->card_baseyear);
+
+ if (data[0] != 0xFF || data[1] != 0xFF)
+ return;
+
+ uint16_t msg_id = (data[2] << 8) | data[3];
+ uint8_t index = data[4] & 0x0F;
+ int msg_size = data[5] * 10 + 2;
+ uint16_t date = (data[9] << 8) | data[10];
+ int submsg_len = data[12] - 2;
+ uint16_t submsg_idx = (data[13] << 8) | data[14];
+ uint32_t serial = (rdr->hexserial[2]<<24) | (rdr->hexserial[3]<<16) | (rdr->hexserial[4]<<8) | rdr->hexserial[5];
+
+ MAILMSG *msg = find_msg(rdr->caid, serial, date, msg_id);
+
+ if (msg == 0)
+ {
+ if (cs_malloc(&msg, sizeof(MAILMSG), -1) == 0)
+ return;
+ msg->caid = rdr->caid;
+ msg->serial = serial;
+ msg->date = date;
+ msg->id = msg_id;
+ msg->nsubs = (data[4] & 0xF0) >> 4;
+ msg->mask = 1 << index;
+ msg->written = 0;
+ msg->len = submsg_len;
+ if (cs_malloc(&msg->message, msg_size, -1) == 0)
+ {
+ free(msg);
+ return;
+ }
+ memset(msg->message, 0, msg_size);
+ memcpy(&msg->message[submsg_idx], &data[15], submsg_len);
+ msg->subject = 0;
+ ll_append(vg_msgs, msg);
+ }
+ else
+ {
+ if (msg->written == 1 || msg->mask & (1 << index))
+ return;
+ msg->mask |= 1 << index;
+ msg->len += submsg_len;
+ memcpy(&msg->message[submsg_idx], &data[15], submsg_len);
+ }
+ if (msg->mask == (1 << msg->nsubs) - 1)
+ write_msg(msg, rdr->card_baseyear);
+}
+
Index: /trunk/reader-videoguard-common.h
===================================================================
--- /trunk/reader-videoguard-common.h (revision 5353)
+++ /trunk/reader-videoguard-common.h (revision 5354)
@@ -49,4 +49,5 @@
void videoguard_get_emm_filter(struct s_reader * rdr, uchar *filter);
int32_t videoguard_do_emm(struct s_reader * reader, EMM_PACKET *ep, unsigned char CLA, void (*read_tiers)(), int32_t (*docmd)());
+void videoguard_mail_msg(struct s_reader *rdr, uint8_t *data);
#endif // __NDS_COMMON__
|