void file_uri_replace(SessionId sessionId, const char * pJoiner, std::string & data) { qcc::String p; vRecvFiles::iterator iter; size_t start_pos = 0; size_t end_pos; while ((start_pos = data.find("file://", start_pos)) != std::string::npos) { if ((end_pos = data.find("\'", start_pos)) != std::string::npos) { if ((iter = std::find_if(gRecvFiles.begin(), gRecvFiles.end(), find_uri(sessionId, pJoiner, data.substr(start_pos, end_pos - start_pos).data()))) != gRecvFiles.end()) data.replace(start_pos, end_pos - start_pos, get_uri((*iter)->path.data()).data()); } start_pos++; } }
void CSender::SaveFileInfo(SessionId sessionId, const char * pJoiner, const char * sPath, const FILE_SEND_ITEM * pFSI) { if (pFSI) { vRecvFiles::iterator _iter; if ((_iter = std::find_if(gRecvFiles.begin(), gRecvFiles.end(), find_uri(sessionId, pJoiner, pFSI->uri))) != gRecvFiles.end()) { (*_iter)->fsize = pFSI->fsize; (*_iter)->mtime = pFSI->mtime; (*_iter)->path = sPath; } else { FILE_RECV_ITEM * pFRI = new FILE_RECV_ITEM; pFRI->fsize = pFSI->fsize; pFRI->mtime = pFSI->mtime; pFRI->uri = pFSI->uri; pFRI->joiner = pJoiner; pFRI->session_id = sessionId; pFRI->path = sPath; gRecvFiles.push_back(pFRI); } } }
int http_parse_headers() { char *end; // разбор URI char *uri = util_scan_caseless(req, " ", req + 6 /* http op max len */, 1); if(uri == 0) return 500; // TODO code 501 char *uri_end = util_scan_caseless(uri, " ", uri + 64 /* max uri len */, 0); if(uri_end == 0) return 500; // TODO generate error, too long URI *uri_end = 0; // z-term URI if(memcmp((unsigned char*)uri, "/", 2) == 0) uri = "/index.html"; http.page = find_uri(uri); if(http.page == 0) return 404; *uri_end = ' '; // restore truncated rec data // LBS 27.01.2011 // выделить аргументы - LBS 5.05.2012 util_fill((void*)req_args, sizeof req_args, 0); char *arg = util_scan_caseless(req, "?", uri_end, 1); if(arg != 0) { unsigned arglen = uri_end - arg; if(arglen > sizeof req_args - 1) arglen = sizeof req_args - 1; util_cpy((void*)arg, (void*)req_args, arglen); } // найти начало http заголовков char *hdr = util_scan_caseless(uri_end+1, "\r\n", uri_end + 11 /* http version field approx. len + crlf */, 1); if(!hdr) return 500; // Host // LBS 27.01.2011 req_host[0] = 0; char *host = util_scan_caseless(hdr, "Host:", hdr_end, 1); if(host) { end = util_scan_caseless(host, "\r\n", hdr_end, 0); if(end) { host = util_skip_lws(host, end); unsigned hostlen = end - host; if(hostlen < sizeof req_host) { util_cpy((void*)host, (void*)req_host, hostlen); req_host[hostlen] = 0; // z-term } } } // CORS Origin // 16.12.2014 req_origin[0] = 0; char *orig = util_scan_caseless(hdr, "Origin:", hdr_end, 1); if(orig) { orig = util_skip_lws(orig, end); strlccpy(req_origin, orig, '\r', sizeof req_origin); } // авторизация char *cre = util_scan_caseless(hdr, "Authorization:", hdr_end, 1); if(!cre) return 401; end = util_scan_caseless(cre, "\r\n", hdr_end, 0); cre = util_scan_caseless(cre, "Basic", end, 1); if(!cre) return 401; cre = util_skip_lws(cre, end); end = util_skip_not_lws(cre, end); // LWS = [CRLF] 1*( SP | HT ) char userpass[36], *pass; unsigned b64len = end - cre; if(b64len > 44) return 401; // limit to 11 letter groups of 4 => up to 33 decoded chars // 13.02.2015 base64_decode(cre, userpass, sizeof userpass); for(pass=userpass; *pass!=':'; ++pass) // scan to passwd if(*pass == 0) return 401; *pass++ = 0; // replace ':' with 0, point to password if(check_user_access(userpass, pass) == 0) return 401; // разбор типа операции if(memcmp((void*)req, "GET", 3) == 0 && (http.page->flags & HTML_FLG_GET)) { return 290; } else if(memcmp(req, "OPTIONS", 7) == 0) { return 297; } else if(memcmp((void*)req, "POST", 4) == 0 && (http.page->flags & HTML_FLG_POST)) { char *conlen = util_scan_caseless(hdr, "Content-Length:", hdr_end, 1); if(!conlen) return 500; conlen = util_skip_lws(conlen, hdr_end); end = util_scan_caseless(conlen, "\r\n", hdr_end, 0); *end = 0; //str_dec_to_data((void*)conlen, (void*)&http.post_content_length, sizeof http.post_content_length); http.post_content_length = atoi(conlen); // 13.03.2013 dksf48 return 291; } return 500; }
void CSender::OnRecvData(const InterfaceDescription::Member* /*pMember*/, const char* /*srcPath*/, Message& msg) { uint8_t * data; size_t size; mTrain::iterator iter; const char * pJoiner = msg->GetSender(); mTrain & train = m_mTrain[pJoiner]; SessionId sessionId = m_pMob->GetSessionID(); msg->GetArg(0)->Get("ay", &size, &data); if (IS_TRAIN_HEADER(data) && size == sizeof(TRAIN_HEADER)) { TRAIN_HEADER * pTH = (TRAIN_HEADER *)data; if (pTH->action == ACT_END) OnDataEnd(pTH->footprint, pJoiner); else if (pTH->action == ACT_NO_MISSING) m_pMob->SetSignal(pJoiner, false); else { train[pTH->chain].action = pTH->action; train[pTH->chain].footprint = pTH->footprint; blkInit(&(train[pTH->chain].body)); memcpy(train[pTH->chain].extra, pTH->extra, TRAIN_EXTRA_LEN); if (pTH->action == ACT_FILE) { FILE_SEND_ITEM * pFSI = (FILE_SEND_ITEM *)pTH->extra; if (pFSI) { qcc::String uri = pFSI->uri; train[pTH->chain].path = mem2file(0, 0, uri.substr(uri.find_last_of('.')).data()); } } } } else if ((iter = train.find(((int*)data)[0])) != train.end()){ if (size == sizeof(int)) { switch (iter->second.action) { case ACT_SIGNAL: MissingCheck(iter->second.body.z); blkFree(&(iter->second.body)); break; case ACT_MISSING: { sqlite3_stmt *pStmt = NULL; sqlite3_stmt *pStmt2 = NULL; SYNC_DATA sd; strcpy_s(sd.joiner, sizeof(sd.joiner), m_pMob->GetJoinName()); QUERY_SQL_V(m_pMob->GetUndoDB(), pStmt2, ("SELECT num, snum, base_table, redo FROM works WHERE joiner=%Q AND snum IN (%s)", sd.joiner, iter->second.body.z), sd.snum = sqlite3_column_int(pStmt2, 1); strcpy_s(sd.base_table, sizeof(sd.base_table), (const char *)sqlite3_column_text(pStmt2, 2)); sd.snum_prev = -1; QUERY_SQL_V(m_pMob->GetUndoDB(), pStmt, ("SELECT joiner, snum FROM works WHERE num < %d AND base_table=%Q ORDER BY num DESC LIMIT 1", sqlite3_column_int(pStmt2, 0), sd.base_table), strcpy_s(sd.joiner_prev, sizeof(sd.joiner_prev), (const char *)sqlite3_column_text(pStmt, 0)); sd.snum_prev = sqlite3_column_int(pStmt, 1); break; ); alljoyn_send(sessionId, msg->GetSender(), ACT_DATA, (char *)sqlite3_column_text(pStmt2, 3), sqlite3_column_bytes(pStmt2, 3) + 1, (const char *)&sd, sizeof(SYNC_DATA)); ); blkFree(&(iter->second.body)); break; } case ACT_DATA: { TRAIN & cargo = m_mStation[pJoiner][iter->second.footprint]; cargo.action = iter->second.action; blkMove(&(cargo.body), &(iter->second.body)); memcpy(cargo.extra, iter->second.extra, TRAIN_EXTRA_LEN); break; } case ACT_FLIST: if (sizeof(FILE_SEND_ITEM) % iter->second.body.nUsed == 0) { int n = 0; Block data; vRecvFiles::iterator _iter; FILE_SEND_ITEM * pFSI = (FILE_SEND_ITEM *)iter->second.body.z; blkInit(&data); while (n < iter->second.body.nUsed) { if ((_iter = std::find_if(gRecvFiles.begin(), gRecvFiles.end(), find_uri(sessionId, msg->GetSender(), pFSI->uri))) == gRecvFiles.end() || (*_iter)->mtime != pFSI->mtime || (*_iter)->mtime != pFSI->mtime) mem2mem(&data, (char *)pFSI, sizeof(FILE_SEND_ITEM)); n += sizeof(FILE_SEND_ITEM); pFSI++; } if (data.nUsed > 0) SendData(pJoiner, iter->second.footprint, ACT_FLIST_REQ, sessionId, data.z, data.nUsed); // special target most be assigned. else OnDataEnd(iter->second.footprint, pJoiner); blkFree(&data); blkFree(&(iter->second.body)); } break; case ACT_FLIST_REQ: if (sizeof(FILE_SEND_ITEM) % iter->second.body.nUsed == 0) { int n = 0; FILE_SEND_ITEM * pFSI = (FILE_SEND_ITEM *)iter->second.body.z; while (n < iter->second.body.nUsed) { SendFile(pJoiner, iter->second.footprint, ACT_FILE, sessionId, pFSI); n += sizeof(FILE_SEND_ITEM); pFSI++; } SendData(pJoiner, iter->second.footprint, ACT_END, sessionId, 0, 0);// special target most be assigned. } blkFree(&(iter->second.body)); break; case ACT_FILE: SaveFileInfo(sessionId, pJoiner, iter->second.path.data(), (FILE_SEND_ITEM *)iter->second.extra); break; default: blkFree(&(iter->second.body)); break; } train.erase(iter); }