static int32_t _ghttp_post_ecmdata(struct s_client *client, ECM_REQUEST* er) { uchar req[640], auth[64]; uchar* end; char* encauth = NULL; int32_t ret; s_ghttp* context = (s_ghttp*)client->ghttp; if(!context->session_id && strlen(client->reader->r_usr) > 0) { cs_debug_mask(D_CLIENT, "%s: username specified and no existing session, adding basic auth", client->reader->label); ret = snprintf((char*)auth, sizeof(auth), "%s:%s", client->reader->r_usr, client->reader->r_pwd); ret = b64encode((char*)auth, ret, &encauth); } if(encauth) { // basic auth login ret = snprintf((char*)req, sizeof(req), "POST /api/e/%x/%x/%x/%x/%x/%x HTTP/1.1\r\nHost: %s\r\nAuthorization: Basic %s\r\nContent-Length: %d\r\n\r\n", er->onid, er->tsid, er->pid, er->srvid, er->caid, er->prid, client->reader->device, encauth, er->ecmlen); } else { if(context->session_id) { // session exists ret = snprintf((char*)req, sizeof(req), "POST /api/e/%s/%x/%x/%x/%x/%x/%x HTTP/1.1\r\nHost: %s\r\nContent-Length: %d\r\n\r\n", context->session_id, er->onid, er->tsid, er->pid, er->srvid, er->caid, er->prid, client->reader->device, er->ecmlen); } else { // no credentials configured, assume no session required ret = snprintf((char*)req, sizeof(req), "POST /api/e/%x/%x/%x/%x/%x/%x HTTP/1.1\r\nHost: %s\r\nContent-Length: %d\r\n\r\n", er->onid, er->tsid, er->pid, er->srvid, er->caid, er->prid, client->reader->device, er->ecmlen); } } end = req + ret; memcpy(end, er->ecm, er->ecmlen); cs_debug_mask(D_CLIENT, "%s: sending full ecm - /api/e/%x/%x/%x/%x/%x/%x", client->reader->label, er->onid, er->tsid, er->pid, er->srvid, er->caid, er->prid); ret = ghttp_send(client, req, ret + er->ecmlen); return ret; }
static int32_t _ghttp_http_get(struct s_client *client, uint32_t hash, int odd) { uchar req[128], auth[64]; char* encauth = NULL; int32_t ret; s_ghttp* context = (s_ghttp*)client->ghttp; if(!context->session_id && strlen(client->reader->r_usr) > 0) { cs_debug_mask(D_CLIENT, "%s: username specified and no existing session, adding basic auth", client->reader->label); ret = snprintf((char*)auth, sizeof(auth), "%s:%s", client->reader->r_usr, client->reader->r_pwd); ret = b64encode((char*)auth, ret, &encauth); } if(encauth) { // basic auth login ret = snprintf((char*)req, sizeof(req), "GET /api/c/%d/%x HTTP/1.1\r\nHost: %s\r\nAuthorization: Basic %s\r\n\r\n", odd ? 81 : 80, hash, client->reader->device, encauth); } else { if(context->session_id) { // session exists ret = snprintf((char*)req, sizeof(req), "GET /api/c/%s/%d/%x HTTP/1.1\r\nHost: %s\r\n\r\n", context->session_id, odd ? 81 : 80, hash, client->reader->device); } else { // no credentials configured, assume no session required ret = snprintf((char*)req, sizeof(req), "GET /api/c/%d/%x HTTP/1.1\r\nHost: %s\r\n\r\n", odd ? 81 : 80, hash, client->reader->device); } } ret = ghttp_send(client, req, ret); return ret; }
static int32_t _ghttp_post_ecmdata(struct s_client *client, ECM_REQUEST *er) { uchar req[640]; uchar *end; char *encauth = NULL; int32_t ret; s_ghttp *context = (s_ghttp *)client->ghttp; encauth = _ghttp_basic_auth(client); if(encauth) // basic auth login { ret = snprintf((char *)req, sizeof(req), "POST /api/e/%x/%x/%x/%x/%x/%x HTTP/1.1\r\nHost: %s\r\nAuthorization: Basic %s\r\nContent-Length: %d\r\n\r\n", er->onid, er->tsid, er->pid, er->srvid, er->caid, er->prid, context->host_id, encauth, er->ecmlen); free(encauth); } else { if(context->session_id) // session exists { ret = snprintf((char *)req, sizeof(req), "POST /api/e/%s/%x/%x/%x/%x/%x/%x HTTP/1.1\r\nHost: %s\r\nContent-Length: %d\r\n\r\n", context->session_id, er->onid, er->tsid, er->pid, er->srvid, er->caid, er->prid, context->host_id, er->ecmlen); } else // no credentials configured, assume no session required { ret = snprintf((char *)req, sizeof(req), "POST /api/e/%x/%x/%x/%x/%x/%x HTTP/1.1\r\nHost: %s\r\nContent-Length: %d\r\n\r\n", er->onid, er->tsid, er->pid, er->srvid, er->caid, er->prid, context->host_id, er->ecmlen); } } end = req + ret; memcpy(end, er->ecm, er->ecmlen); cs_debug_mask(D_CLIENT, "%s: sending full ecm - /api/e/%x/%x/%x/%x/%x/%x", client->reader->label, er->onid, er->tsid, er->pid, er->srvid, er->caid, er->prid); ret = ghttp_send(client, req, ret + er->ecmlen); return ret; }
static int32_t _ghttp_http_get(struct s_client *client, uint32_t hash, int odd) { uchar req[128]; char *encauth = NULL; int32_t ret; s_ghttp *context = (s_ghttp *)client->ghttp; encauth = _ghttp_basic_auth(client); if(encauth) // basic auth login { ret = snprintf((char *)req, sizeof(req), "GET /api/c/%d/%x HTTP/1.1\r\nHost: %s\r\nAuthorization: Basic %s\r\n\r\n", odd ? 81 : 80, hash, context->host_id, encauth); free(encauth); } else { if(context->session_id) // session exists { ret = snprintf((char *)req, sizeof(req), "GET /api/c/%s/%d/%x HTTP/1.1\r\nHost: %s\r\n\r\n", context->session_id, odd ? 81 : 80, hash, context->host_id); } else // no credentials configured, assume no session required { ret = snprintf((char *)req, sizeof(req), "GET /api/c/%d/%x HTTP/1.1\r\nHost: %s\r\n\r\n", odd ? 81 : 80, hash, context->host_id); } } ret = ghttp_send(client, req, ret); return ret; }
static int32_t ghttp_capmt_notify(struct s_client *client, struct demux_s *demux) { uchar req[640], lenhdr[64] = ""; uchar *pids = NULL; uchar *end; char *encauth = NULL; int32_t ret; int8_t i, pids_len = 0, offs = 0; s_ghttp *context = (s_ghttp *)client->ghttp; if(!context) { return -1; } cs_debug_mask(D_CLIENT, "%s: capmt %x-%x-%x %d pids on adapter %d mask %x dmx index %d", client->reader->label, demux->onid, demux->tsid, demux->program_number, demux->ECMpidcount, demux->adapter_index, demux->ca_mask, demux->demux_index); if(demux->ECMpidcount > 0) { if(cs_malloc(&pids, demux->ECMpidcount * 8)) { pids_len = demux->ECMpidcount * 8; for(i = 0; i < demux->ECMpidcount; i++) { i2b_buf(2, demux->ECMpids[i].ECM_PID, pids + offs); i2b_buf(2, demux->ECMpids[i].CAID, pids + (offs += 2)); i2b_buf(4, demux->ECMpids[i].PROVID, pids + (offs += 2)); offs += 4; } snprintf((char *)lenhdr, sizeof(lenhdr), "\r\nContent-Length: %d", pids_len); } else { return -1; } } if(!context->host_id) { context->host_id = (uchar *)cs_strdup(client->reader->device); } encauth = _ghttp_basic_auth(client); if(encauth) // basic auth login { ret = snprintf((char *)req, sizeof(req), "%s /api/p/%x/%x/%x/%x/%x HTTP/1.1\r\nHost: %s\r\nAuthorization: Basic %s%s\r\n\r\n", ((pids_len > 0) ? "POST" : "GET"), demux->onid, demux->tsid, demux->program_number, demux->ECMpidcount, demux->enigma_namespace, context->host_id, encauth, lenhdr); free(encauth); } else { if(context->session_id) // session exists { ret = snprintf((char *)req, sizeof(req), "%s /api/p/%s/%x/%x/%x/%x/%x HTTP/1.1\r\nHost: %s%s\r\n\r\n", ((pids_len > 0) ? "POST" : "GET"), context->session_id, demux->onid, demux->tsid, demux->program_number, demux->ECMpidcount, demux->enigma_namespace, context->host_id, lenhdr); } else // no credentials configured, assume no session required { ret = snprintf((char *)req, sizeof(req), "%s /api/p/%x/%x/%x/%x/%x HTTP/1.1\r\nHost: %s%s\r\n\r\n", ((pids_len > 0) ? "POST" : "GET"), demux->onid, demux->tsid, demux->program_number, demux->ECMpidcount, demux->enigma_namespace, context->host_id, lenhdr); } } end = req + ret; if(pids_len > 0) { memcpy(end, pids, pids_len); cs_debug_mask(D_CLIENT, "%s: new unscrambling detected, switching to post", client->reader->label); _set_pid_status(context->post_contexts, demux->onid, demux->tsid, demux->program_number, 0); } cs_ddump_mask(D_CLIENT, pids, pids_len, "%s: sending capmt ecm pids - %s /api/p/%x/%x/%x/%x/%x", client->reader->label, (pids_len > 0) ? "POST" : "GET", demux->onid, demux->tsid, demux->program_number, demux->ECMpidcount, demux->enigma_namespace); ret = ghttp_send(client, req, ret + pids_len); if(pids_len > 0) { free(pids); } return 0; }