📄 servhs.cpp
字号:
switch (servMgr->authType) { case ServMgr::AUTH_HTTPBASIC: if (http.isHeader("Authorization")) http.getAuthUserPass(user,pass); break; case ServMgr::AUTH_COOKIE: if (http.isHeader("Cookie")) { Cookie c; LOG_DEBUG("Got cookie: %s",arg); char *idp=arg; while ((idp = strstr(idp,"id="))) { idp+=3; c.set(idp,sock->host.ip); if (servMgr->cookieList.contains(c)) { LOG_DEBUG("Cookie found"); cookie = c; break; } } } break; } } //servMgr->serverHost.toResolvedName(arg); servMgr->serverHost.toStr(arg); sprintf(tmp,"PeerCast on %s",arg); HTML html(tmp,*sock); if (!sock->host.isLocalhost()) { if (!cmpCGIarg(cmd,"pass=",servMgr->password)) { switch (servMgr->authType) { case ServMgr::AUTH_HTTPBASIC: if (strcmp(pass,servMgr->password)!=0) { http.writeLine(HTTP_SC_UNAUTHORIZED); http.writeLine("WWW-Authenticate: Basic realm=\"PeerCast Admin\""); http.writeLine("%s %s",HTTP_HS_SERVER,PCX_AGENT); http.writeLine("%s %s",HTTP_HS_CONTENT,MIME_HTML); http.writeLine("%s %s",HTTP_HS_CACHE,"no-cache"); http.writeLine("%s %s",HTTP_HS_CONNECTION,"close"); http.writeLine(""); html.startHTML(); html.addHead(); html.startBody(); html.startTagEnd("h3","Please enter a valid password"); html.end(); html.end(); return; } break; case ServMgr::AUTH_COOKIE: if (!servMgr->cookieList.contains(cookie)) { addLoginPage(html); return; } break; default: http.writeLine(HTTP_SC_UNAUTHORIZED); http.writeLine(""); return; } } } try { if (cmpCGIarg(cmd,"cmd=","redirect")) { char *j = getCGIarg(cmd,"url="); if (j) { termArgs(cmd); String url; url.set(j,String::T_ESC); url.convertTo(String::T_ASCII); if (!url.contains("http://")) url.prepend("http://"); html.setRefreshURL(url.cstr()); html.startHTML(); html.addHead(); html.startBody(); html.startTagEnd("h3","Please wait..."); html.end(); html.end(); } }else{ if (cmpCGIarg(cmd,"cmd=","viewxml")) { handshakeXML(); retHTML = false; }else if (cmpCGIarg(cmd,"cmd=","clearlog")) { sys->logBuf->clear(); sprintf(jumpStr,"/admin?page=viewlog"); jumpArg = jumpStr; }else if (cmpCGIarg(cmd,"cmd=","save")) { peercastInst->saveSettings(); sprintf(jumpStr,"/admin?page=settings"); jumpArg = jumpStr; }else if (cmpCGIarg(cmd,"cmd=","apply")) { servMgr->numFilters = 0; ServFilter *currFilter=servMgr->filters;
bool brRoot=false;
bool getUpd=false;
char *cp = cmd; while (cp=nextCGIarg(cp,curr,arg)) { // server if (strcmp(curr,"serveractive")==0) servMgr->autoServe = getCGIargBOOL(arg); else if (strcmp(curr,"port")==0) servMgr->serverHost.port = getCGIargINT(arg); else if (strcmp(curr,"icymeta")==0) { int iv = getCGIargINT(arg); if (iv < 0) iv = 0; else if (iv > 16384) iv = 16384; chanMgr->icyMetaInterval = iv; }else if (strcmp(curr,"passnew")==0) strcpy(servMgr->password,arg); else if (strcmp(curr,"root")==0) servMgr->isRoot = getCGIargBOOL(arg); else if (strcmp(curr,"brroot")==0)
brRoot = getCGIargBOOL(arg);
else if (strcmp(curr,"getupd")==0)
getUpd = getCGIargBOOL(arg);
else if (strcmp(curr,"huint")==0)
chanMgr->setUpdateInterval(getCGIargINT(arg));
else if (strcmp(curr,"forceip")==0) strcpy(servMgr->forceIP,arg); else if (strcmp(curr,"djmsg")==0) { String msg; msg.set(arg,String::T_ESC); msg.convertTo(String::T_ASCII); chanMgr->setBroadcastMsg(msg); } else if (strcmp(curr,"pcmsg")==0) { servMgr->rootMsg.set(arg,String::T_ESC); servMgr->rootMsg.convertTo(String::T_ASCII); } // connections
else if (strcmp(curr,"maxcin")==0)
servMgr->maxControl = getCGIargINT(arg);
else if (strcmp(curr,"maxup")==0) servMgr->maxBitrate = getCGIargINT(arg); else if (strcmp(curr,"maxstream")==0) servMgr->maxStreams = getCGIargINT(arg); else if (strcmp(curr,"maxlisten")==0) chanMgr->maxStreamsPerChannel = getCGIargINT(arg); else if (strncmp(curr,"filt_",5)==0) { char *fs = curr+5; { if (strncmp(fs,"ip",2)==0) // ip must be first { currFilter = &servMgr->filters[servMgr->numFilters]; currFilter->init(); currFilter->host.fromStrIP(arg,DEFAULT_PORT); if ((currFilter->host.ip) && (servMgr->numFilters < (ServMgr::MAX_FILTERS-1))) { servMgr->numFilters++; servMgr->filters[servMgr->numFilters].init(); // clear new entry } }else if (strncmp(fs,"bn",2)==0) currFilter->flags |= ServFilter::F_BAN; else if (strncmp(fs,"pr",2)==0) currFilter->flags |= ServFilter::F_PRIVATE; else if (strncmp(fs,"nw",2)==0) currFilter->flags |= ServFilter::F_NETWORK; else if (strncmp(fs,"di",2)==0) currFilter->flags |= ServFilter::F_DIRECT; } } // client else if (strcmp(curr,"clientactive")==0) servMgr->autoConnect = getCGIargBOOL(arg); else if (strcmp(curr,"yp")==0) { String str(arg,String::T_ESC); str.convertTo(String::T_ASCII); servMgr->rootHost = str; } else if (strcmp(curr,"deadhitage")==0) chanMgr->deadHitAge = getCGIargINT(arg); else if (strcmp(curr,"refresh")==0) servMgr->refreshHTML = getCGIargINT(arg); else if (strcmp(curr,"auth")==0) { if (strcmp(arg,"cookie")==0) servMgr->authType = ServMgr::AUTH_COOKIE; else if (strcmp(arg,"http")==0) servMgr->authType = ServMgr::AUTH_HTTPBASIC; }else if (strcmp(curr,"expire")==0) { if (strcmp(arg,"session")==0) servMgr->cookieList.neverExpire = false; else if (strcmp(arg,"never")==0) servMgr->cookieList.neverExpire = true; } } // log options servMgr->showLog = 0; servMgr->showLog |= cmpCGIarg(cmd,"logDebug=","1") ? (1<<LogBuffer::T_DEBUG):0; servMgr->showLog |= cmpCGIarg(cmd,"logErrors=","1") ? (1<<LogBuffer::T_ERROR):0; servMgr->showLog |= cmpCGIarg(cmd,"logNetwork=","1") ? (1<<LogBuffer::T_NETWORK):0; servMgr->showLog |= cmpCGIarg(cmd,"logChannel=","1") ? (1<<LogBuffer::T_CHANNEL):0; unsigned int a; a=0; a = cmpCGIarg(cmd,"allowHTML1=","1") ? (a|ALLOW_HTML) : (a&~ALLOW_HTML); a = cmpCGIarg(cmd,"allowServent1=","1") ? (a|ALLOW_SERVENT) : (a&~ALLOW_SERVENT); a = cmpCGIarg(cmd,"allowData1=","1") ? (a|ALLOW_DATA) : (a&~ALLOW_DATA); a = cmpCGIarg(cmd,"allowBroadcast1=","1") ? (a|ALLOW_BROADCAST) : (a&~ALLOW_BROADCAST); servMgr->allowServer1 = a; a = 0; a = cmpCGIarg(cmd,"allowHTML2=","1") ? (a|ALLOW_HTML) : (a&~ALLOW_HTML); a = cmpCGIarg(cmd,"allowServent2=","1") ? (a|ALLOW_SERVENT) : (a&~ALLOW_SERVENT); a = cmpCGIarg(cmd,"allowData2=","1") ? (a|ALLOW_DATA) : (a&~ALLOW_DATA); a = cmpCGIarg(cmd,"allowBroadcast2=","1") ? (a|ALLOW_BROADCAST) : (a&~ALLOW_BROADCAST); servMgr->allowServer2 = a; peercastInst->saveSettings();
peercastApp->updateSettings();
if ((servMgr->isRoot) && (brRoot))
servMgr->broadcastRootSettings(getUpd);
sprintf(jumpStr,"/admin?page=settings"); jumpArg = jumpStr; }else if (cmpCGIarg(cmd,"page=","chaninfo")) {
ChanInfo info; char *cp = cmd; bool fromRelay=false; while (cp=nextCGIarg(cp,curr,arg)) { if (strcmp(curr,"id")==0) info.id.fromStr(arg); else if (strcmp(curr,"relay")==0) fromRelay = atoi(arg)!=0; } html.setRefresh(servMgr->refreshHTML); addHeader(html,0); ChanHitList *chl = chanMgr->findHitList(info); if (fromRelay) { Channel *c = chanMgr->findChannelByID(info.id); if (c) { addChanInfo(html,&c->info,c); if (chl) addChanHits(html,chl,&c->sourceHost,c->info); } }else { if (chl) { addChanInfo(html,&chl->info,NULL); addChanHits(html,chl,NULL,chl->info); } } addFooter(html); }else if (cmpCGIarg(cmd,"cmd=","fetch")) { ChanInfo info; String curl; char *cp = cmd; while (cp=nextCGIarg(cp,curr,arg)) { if (strcmp(curr,"url")==0) { curl.set(arg,String::T_ESC); curl.convertTo(String::T_ASCII); }else if (strcmp(curr,"name")==0) { info.name.set(arg,String::T_ESC); info.name.convertTo(String::T_ASCII); }else if (strcmp(curr,"desc")==0) { info.desc.set(arg,String::T_ESC); info.desc.convertTo(String::T_ASCII); }else if (strcmp(curr,"genre")==0) { info.genre.set(arg,String::T_ESC); info.genre.convertTo(String::T_ASCII); }else if (strcmp(curr,"contact")==0) { info.url.set(arg,String::T_ESC); info.url.convertTo(String::T_ASCII); }else if (strcmp(curr,"bitrate")==0) { info.bitrate = atoi(arg); }else if (strcmp(curr,"type")==0) { info.contentType = ChanInfo::getTypeFromStr(arg); } } Channel *c = chanMgr->createChannel(info,NULL); if (c) c->startURL(curl.cstr()); sprintf(jumpStr,"/admin?page=mychans"); jumpArg = jumpStr; }else if (cmpCGIarg(cmd,"cmd=","stopserv")) { char *cp = cmd; while (cp=nextCGIarg(cp,curr,arg)) { if (strcmp(curr,"index")==0) { Servent *s = servMgr->findServentByID(atoi(arg)); if (s) s->abort(); } } sprintf(jumpStr,"/admin?page=connections"); jumpArg = jumpStr; }else if (cmpCGIarg(cmd,"cmd=","stopfind")) { chanMgr->lastHit = 0; chanMgr->numFinds = 0; chanMgr->searchActive = false; sprintf(jumpStr,"/admin?page=chans"); jumpArg = jumpStr; }else if (cmpCGIarg(cmd,"cmd=","find")) { ChanInfo info; info.init(); char *cp = cmd; while (cp=nextCGIarg(cp,curr,arg)) { if (strcmp(curr,"name")==0) info.name.set(arg); else if (strcmp(curr,"genre")==0) info.genre.set(arg); else if (strcmp(curr,"bitrate")==0) info.bitrate = atoi(arg); else if (strcmp(curr,"id")==0) info.id.fromStr(arg); } chanMgr->startSearch(info); sprintf(jumpStr,"/admin?page=chans"); jumpArg = jumpStr; }else if (cmpCGIarg(cmd,"cmd=","hitlist")) { Channel *clist[ChanMgr::MAX_CHANNELS]; int numChans=0; bool stayConnected=hasCGIarg(cmd,"relay"); for(int i=0; i<ChanMgr::MAX_HITLISTS; i++) { ChanHitList *chl = &chanMgr->hitlists[i]; if (chl->isUsed()) { char tmp[64]; sprintf(tmp,"c%d=",i); if (cmpCGIarg(cmd,tmp,"1")) { Channel *c; if (!(c=chanMgr->findChannelByID(chl->info.id))) { c = chanMgr->createChannel(chl->info,NULL); if (!c) throw StreamException("out of channels"); c->stayConnected = stayConnected; c->startGet(); } clist[numChans++] = c; } } } char *findArg = getCGIarg(cmd,"keywords="); if (hasCGIarg(cmd,"relay")) { sys->sleep(500); sprintf(jumpStr,"/admin?page=mychans"); jumpArg = jumpStr; } }else if (cmpCGIarg(cmd,"cmd=","clear")) { char *cp = cmd; while (cp=nextCGIarg(cp,curr,arg)) { if (strcmp(curr,"hostcache")==0) servMgr->clearHostCache(ServHost::T_SERVENT); else if (strcmp(curr,"packets")==0) { stats.clearRange(Stats::PACKETSSTART,Stats::PACKETSEND); servMgr->numVersions = 0; } } sprintf(jumpStr,"/admin?page=index"); jumpArg = jumpStr; }else if (cmpCGIarg(cmd,"cmd=","upgrade")) { if (servMgr->downloadURL[0]) { sprintf(jumpStr,"/admin?cmd=redirect&url=%s",servMgr->downloadURL); jumpArg = jumpStr; } }else if (cmpCGIarg(cmd,"cmd=","chan")) { Channel *clist2[ChanMgr::MAX_CHANNELS]; int num2=0; Channel *clist[ChanMgr::MAX_CHANNELS]; ChanInfo info; int num = chanMgr->findChannels(info,clist,ChanMgr::MAX_CHANNELS); for(int i=0; i<num; i++) { Channel *c = clist[i]; char tmp[64]; sprintf(tmp,"c%d=",c->index); if (cmpCGIarg(cmd,tmp,"1")) clist2[num2++] = c; } bool delay=false; if (hasCGIarg(cmd,"bump")) { for(int i=0; i<num2; i++) clist2[i]->bump = true; delay = true; } if (hasCGIarg(cmd,"keep")) { for(int i=0; i<num2; i++) clist2[i]->stayConnected = true; delay = true; } if (hasCGIarg(cmd,"stop")) { for(int i=0; i<num2; i++) clist2[i]->thread.active = false; delay = true; } if (delay) sys->sleep(500); sprintf(jumpStr,"/admin?page=mychans"); jumpArg = jumpStr; }else if (cmpCGIarg(cmd,"cmd=","connect")) { Servent *s = servMgr->servents; { char tmp[64]; sprintf(tmp,"c%d=",s->serventID); if (cmpCGIarg(cmd,tmp,"1"))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -