Admin.c 360 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684
  1. // SoftEther VPN Source Code - Developer Edition Master Branch
  2. // Cedar Communication Module
  3. // Admin.c
  4. // RPC Module for Management
  5. #include "Admin.h"
  6. #include "Account.h"
  7. #include "AzureClient.h"
  8. #include "BridgeUnix.h"
  9. #include "BridgeWin32.h"
  10. #include "Connection.h"
  11. #include "DDNS.h"
  12. #include "Layer3.h"
  13. #include "Link.h"
  14. #include "Listener.h"
  15. #include "Nat.h"
  16. #include "Remote.h"
  17. #include "Proto.h"
  18. #include "Proto_IPsec.h"
  19. #include "Proto_OpenVPN.h"
  20. #include "Proto_PPP.h"
  21. #include "Protocol.h"
  22. #include "Sam.h"
  23. #include "SecureNAT.h"
  24. #include "Server.h"
  25. #include "Session.h"
  26. #include "Virtual.h"
  27. #include "Wpc.h"
  28. #include "Mayaqua/Cfg.h"
  29. #include "Mayaqua/FileIO.h"
  30. #include "Mayaqua/Internat.h"
  31. #include "Mayaqua/HTTP.h"
  32. #include "Mayaqua/Memory.h"
  33. #include "Mayaqua/Microsoft.h"
  34. #include "Mayaqua/Object.h"
  35. #include "Mayaqua/Pack.h"
  36. #include "Mayaqua/Str.h"
  37. #include "Mayaqua/Table.h"
  38. #include "Mayaqua/Tick64.h"
  39. // Macro for RPC function declaration
  40. #define DECLARE_RPC_EX(rpc_name, data_type, function, in_rpc, out_rpc, free_rpc) \
  41. else if (StrCmpi(name, rpc_name) == 0) \
  42. { \
  43. data_type *t; \
  44. t = ZeroMalloc(sizeof(data_type)); \
  45. in_rpc(t, p); \
  46. err = function(a, t); \
  47. if (err == ERR_NO_ERROR) \
  48. { \
  49. out_rpc(ret, t); \
  50. } \
  51. free_rpc(t); \
  52. Free(t); \
  53. ok = true; \
  54. }
  55. #define DECLARE_RPC(rpc_name, data_type, function, in_rpc, out_rpc) \
  56. else if (StrCmpi(name, rpc_name) == 0) \
  57. { \
  58. data_type *t; \
  59. t = ZeroMalloc(sizeof(data_type)); \
  60. in_rpc(t, p); \
  61. err = function(a, t); \
  62. if (err == ERR_NO_ERROR) \
  63. { \
  64. out_rpc(ret, t); \
  65. } \
  66. Free(t); \
  67. ok = true; \
  68. }
  69. #define DECLARE_SC_EX(rpc_name, data_type, function, in_rpc, out_rpc, free_rpc) \
  70. UINT function(RPC *r, data_type *t) \
  71. { \
  72. PACK *p, *ret; \
  73. UINT err; \
  74. if (r == NULL || t == NULL) \
  75. { \
  76. return ERR_INTERNAL_ERROR; \
  77. } \
  78. p = NewPack(); \
  79. out_rpc(p, t); \
  80. free_rpc(t); \
  81. Zero(t, sizeof(data_type)); \
  82. ret = AdminCall(r, rpc_name, p); \
  83. err = GetErrorFromPack(ret); \
  84. if (err == ERR_NO_ERROR) \
  85. { \
  86. in_rpc(t, ret); \
  87. } \
  88. FreePack(ret); \
  89. return err; \
  90. }
  91. #define DECLARE_SC(rpc_name, data_type, function, in_rpc, out_rpc) \
  92. UINT function(RPC *r, data_type *t) \
  93. { \
  94. PACK *p, *ret; \
  95. UINT err; \
  96. if (r == NULL || t == NULL) \
  97. { \
  98. return ERR_INTERNAL_ERROR; \
  99. } \
  100. p = NewPack(); \
  101. out_rpc(p, t); \
  102. ret = AdminCall(r, rpc_name, p); \
  103. err = GetErrorFromPack(ret); \
  104. if (err == ERR_NO_ERROR) \
  105. { \
  106. in_rpc(t, ret); \
  107. } \
  108. FreePack(ret); \
  109. return err; \
  110. }
  111. #define CHECK_RIGHT \
  112. if (a->ServerAdmin == false && (StrCmpi(a->HubName, t->HubName) != 0)) \
  113. return ERR_NOT_ENOUGH_RIGHT; \
  114. if (IsEmptyStr(t->HubName)) \
  115. return ERR_INVALID_PARAMETER;
  116. #define SERVER_ADMIN_ONLY \
  117. if (a->ServerAdmin == false) \
  118. return ERR_NOT_ENOUGH_RIGHT;
  119. #define NO_SUPPORT_FOR_BRIDGE \
  120. if (a->Server->Cedar->Bridge) \
  121. return ERR_NOT_SUPPORTED;
  122. // Get server Caps (Guessing from the build number if failed to get Caps)
  123. CAPSLIST *ScGetCapsEx(RPC *rpc)
  124. {
  125. RPC_SERVER_INFO info;
  126. CAPSLIST *t;
  127. bool is_bridge = false;
  128. // Validate arguments
  129. if (rpc == NULL)
  130. {
  131. return NULL;
  132. }
  133. Zero(&info, sizeof(info));
  134. ScGetServerInfo(rpc, &info);
  135. t = ZeroMalloc(sizeof(CAPSLIST));
  136. // Try to get Caps by RPC
  137. if (ScGetCaps(rpc, t) != ERR_NO_ERROR)
  138. {
  139. UINT build;
  140. Free(t);
  141. t = NewCapsList();
  142. // Since acquisition of Caps went wrong, get build number
  143. build = info.ServerBuildInt;
  144. is_bridge = (SearchStrEx(info.ServerProductName, "bridge", 0, false) == INFINITE) ? false : true;
  145. AddCapsInt(t, "i_max_packet_size", 1514);
  146. if (is_bridge == false)
  147. {
  148. AddCapsInt(t, "i_max_hubs", 4096);
  149. AddCapsInt(t, "i_max_sessions", 4096);
  150. if (info.ServerType != SERVER_TYPE_FARM_MEMBER)
  151. {
  152. AddCapsInt(t, "i_max_users_per_hub", 10000);
  153. AddCapsInt(t, "i_max_groups_per_hub", 10000);
  154. AddCapsInt(t, "i_max_access_lists", 4096);
  155. }
  156. else
  157. {
  158. AddCapsInt(t, "i_max_users_per_hub", 0);
  159. AddCapsInt(t, "i_max_groups_per_hub", 0);
  160. AddCapsInt(t, "i_max_access_lists", 0);
  161. }
  162. }
  163. else
  164. {
  165. AddCapsInt(t, "i_max_hubs", 0);
  166. AddCapsInt(t, "i_max_sessions", 0);
  167. AddCapsInt(t, "i_max_users_per_hub", 0);
  168. AddCapsInt(t, "i_max_groups_per_hub", 0);
  169. AddCapsInt(t, "i_max_access_lists", 0);
  170. }
  171. AddCapsInt(t, "i_max_mac_tables", 10000);
  172. AddCapsInt(t, "i_max_ip_tables", 10000);
  173. if (info.ServerType == SERVER_TYPE_STANDALONE)
  174. {
  175. AddCapsBool(t, "b_support_securenat", (build >= 3600) ? true : false);
  176. AddCapsInt(t, "i_max_secnat_tables", 4096);
  177. }
  178. else
  179. {
  180. AddCapsBool(t, "b_support_securenat", false);
  181. AddCapsInt(t, "i_max_secnat_tables", 0);
  182. }
  183. if (is_bridge)
  184. {
  185. AddCapsBool(t, "b_bridge", true);
  186. }
  187. else if (info.ServerType == SERVER_TYPE_STANDALONE)
  188. {
  189. AddCapsBool(t, "b_standalone", true);
  190. }
  191. else if (info.ServerType == SERVER_TYPE_FARM_CONTROLLER)
  192. {
  193. AddCapsBool(t, "b_cluster_controller", true);
  194. }
  195. else
  196. {
  197. AddCapsBool(t, "b_cluster_member", true);
  198. }
  199. AddCapsBool(t, "b_support_config_hub", info.ServerType != SERVER_TYPE_FARM_MEMBER &&
  200. is_bridge == false);
  201. AddCapsBool(t, "b_vpn_client_connect", is_bridge == false ? true : false);
  202. AddCapsBool(t, "b_support_radius", info.ServerType != SERVER_TYPE_FARM_MEMBER &&
  203. is_bridge == false);
  204. if (build >= 3600)
  205. {
  206. RPC_BRIDGE_SUPPORT b;
  207. Zero(&b, sizeof(b));
  208. if (ScGetBridgeSupport(rpc, &b) == ERR_NO_ERROR)
  209. {
  210. AddCapsBool(t, "b_local_bridge", b.IsBridgeSupportedOs);
  211. AddCapsBool(t, "b_must_install_pcap", b.IsWinPcapNeeded);
  212. }
  213. else
  214. {
  215. AddCapsBool(t, "b_local_bridge", false);
  216. AddCapsBool(t, "b_must_install_pcap", false);
  217. }
  218. }
  219. else
  220. {
  221. AddCapsBool(t, "b_local_bridge", false);
  222. AddCapsBool(t, "b_must_install_pcap", false);
  223. }
  224. AddCapsBool(t, "b_tap_supported", false);
  225. if (info.ServerType == SERVER_TYPE_STANDALONE)
  226. {
  227. AddCapsBool(t, "b_support_cascade", true);
  228. }
  229. else
  230. {
  231. AddCapsBool(t, "b_support_cascade", false);
  232. }
  233. AddCapsBool(t, "b_support_cascade_cert", false);
  234. AddCapsBool(t, "b_support_config_log", info.ServerType != SERVER_TYPE_FARM_MEMBER);
  235. AddCapsBool(t, "b_support_autodelete", false);
  236. }
  237. if (true)
  238. {
  239. TOKEN_LIST *names;
  240. // Fill items that doesn't exist in server-side as false
  241. names = GetTableNameStartWith("CT_b_");
  242. if (names != NULL)
  243. {
  244. UINT i;
  245. for (i = 0;i < names->NumTokens;i++)
  246. {
  247. char *name = names->Token[i] + 3;
  248. if (GetCaps(t, name) == NULL)
  249. {
  250. AddCapsBool(t, name, false);
  251. }
  252. }
  253. FreeToken(names);
  254. }
  255. }
  256. FreeRpcServerInfo(&info);
  257. return t;
  258. }
  259. // Process server side include
  260. BUF *AdminWebProcessServerSideInclude(BUF *src_txt, char *filename, UINT depth)
  261. {
  262. char *src_str;
  263. UINT src_str_size;
  264. UINT i, len;
  265. BUF *ret = NULL;
  266. UINT pos = 0;
  267. char dirname[MAX_PATH];
  268. if (src_txt == NULL || filename == NULL || depth >= 4)
  269. {
  270. return CloneBuf(src_txt);
  271. }
  272. if (EndWith(filename, ".html") == false)
  273. {
  274. // We process only .html files
  275. return CloneBuf(src_txt);
  276. }
  277. GetDirNameFromFilePath(dirname, sizeof(dirname), filename);
  278. src_str_size = src_txt->Size + 1;
  279. src_str = ZeroMalloc(src_str_size);
  280. Copy(src_str, src_txt->Buf, src_txt->Size);
  281. len = StrLen(src_str);
  282. ret = NewBuf();
  283. for (i = 0;i < len;i++)
  284. {
  285. char *start_tag = "<!--#include file=";
  286. bool is_ssi = false;
  287. if (StartWith(src_str + i, start_tag))
  288. {
  289. UINT a = i + StrLen(start_tag);
  290. if (src_str[a] == '\"' || src_str[a] == '\'')
  291. {
  292. char delimier = src_str[a];
  293. char delimier_str[2];
  294. UINT b;
  295. delimier_str[0] = delimier;
  296. delimier_str[1] = 0;
  297. b = SearchStrEx(src_str, delimier_str, i + StrLen(start_tag) + 1, true);
  298. if ((b != INFINITE) && (b >= i + StrLen(start_tag) + 1) && ((b - (i + StrLen(start_tag) + 1)) < 32))
  299. {
  300. char inc_filename[MAX_PATH];
  301. char *end_tag = "-->";
  302. UINT x;
  303. Zero(inc_filename, sizeof(inc_filename));
  304. StrCpy(inc_filename, sizeof(inc_filename), src_str + i + StrLen(start_tag) + 1);
  305. inc_filename[b - (i + StrLen(start_tag) + 1)] = 0;
  306. x = SearchStrEx(src_str, end_tag, b + 1, true);
  307. if ((x != INFINITE) && (x >= (b + 1)))
  308. {
  309. BUF *inc_buf;
  310. char full_inc_filename[MAX_PATH];
  311. if (StartWith(inc_filename, "/"))
  312. {
  313. Format(full_inc_filename, sizeof(full_inc_filename), "|wwwroot/%s", inc_filename + 1);
  314. }
  315. else
  316. {
  317. StrCpy(full_inc_filename, sizeof(full_inc_filename), dirname);
  318. StrCat(full_inc_filename, sizeof(full_inc_filename), "/");
  319. StrCat(full_inc_filename, sizeof(full_inc_filename), inc_filename);
  320. }
  321. Debug("dirname = %s, full_inc_filename (src) = %s\n\n", dirname, full_inc_filename);
  322. NormalizePath(full_inc_filename, sizeof(full_inc_filename), full_inc_filename);
  323. if (StartWith(full_inc_filename, "|wwwroot/") == false
  324. && StartWith(full_inc_filename, "|wwwroot\\") == false)
  325. {
  326. char tmp[MAX_PATH];
  327. Format(tmp, sizeof(tmp), "|wwwroot/%s", full_inc_filename);
  328. StrCpy(full_inc_filename, sizeof(full_inc_filename), tmp);
  329. }
  330. Debug("inc_filename = %s\nfull_inc_filename = %s\n\n", inc_filename, full_inc_filename);
  331. inc_buf = ReadDump(full_inc_filename);
  332. if (inc_buf != NULL)
  333. {
  334. BUF *inc_buf2;
  335. inc_buf2 = AdminWebProcessServerSideInclude(inc_buf, full_inc_filename, depth + 1);
  336. BufSkipUtf8Bom(inc_buf2);
  337. WriteBufBufWithOffset(ret, inc_buf2);
  338. FreeBuf(inc_buf);
  339. FreeBuf(inc_buf2);
  340. }
  341. else
  342. {
  343. Debug("Loading SSI '%s' error.\n", inc_buf);
  344. }
  345. i = (x + StrLen(end_tag) - 1);
  346. is_ssi = true;
  347. }
  348. }
  349. }
  350. }
  351. if (is_ssi == false)
  352. {
  353. WriteBufChar(ret, src_str[i]);
  354. }
  355. }
  356. Free(src_str);
  357. return ret;
  358. }
  359. // Handle the file request
  360. bool AdminWebHandleFileRequest(ADMIN *a, CONNECTION *c, SOCK *s, HTTP_HEADER *h, char *url_src, char *query_string, char *virtual_root_dir, char *physical_root_dir)
  361. {
  362. bool ret = false;
  363. char url[MAX_PATH];
  364. UINT i, len;
  365. if (a == NULL || c == NULL || s == NULL || h == NULL || query_string == NULL ||
  366. virtual_root_dir == NULL || physical_root_dir == NULL)
  367. {
  368. return false;
  369. }
  370. StrCpy(url, sizeof(url), url_src);
  371. len = StrLen(url);
  372. for (i = 0;i < len;i++)
  373. {
  374. if (url[i] == '\\')
  375. {
  376. url[i] = '/';
  377. }
  378. }
  379. // Is dangerous URL?
  380. if (InStr(url, "..") || InStr(url, "//") || InStr(url, "\\\\") || InStr(url, "/\\") || InStr(url, "\\/"))
  381. {
  382. ret = AdminWebSend404Error(s, h);
  383. }
  384. else
  385. {
  386. char filename[MAX_PATH];
  387. bool is_index_file = false;
  388. BUF *b = AdminWebTryFindAndReadFile(virtual_root_dir, physical_root_dir, url,
  389. filename, sizeof(filename), &is_index_file);
  390. if (b == NULL)
  391. {
  392. ret = AdminWebSend404Error(s, h);
  393. }
  394. else
  395. {
  396. if (is_index_file && EndWith(url, "/") == false)
  397. {
  398. char url2[MAX_PATH];
  399. StrCpy(url2, sizeof(url2), url);
  400. StrCat(url2, sizeof(url2), "/");
  401. ret = AdminWebSend302Redirect(s, url2, query_string, h);
  402. }
  403. else if (is_index_file == false && EndWith(url, "/"))
  404. {
  405. char url2[MAX_PATH];
  406. TrimEndWith(url2, sizeof(url2), url, "/");
  407. ret = AdminWebSend302Redirect(s, url2, query_string, h);
  408. }
  409. else
  410. {
  411. BUF *b2 = AdminWebProcessServerSideInclude(b, filename, 0);
  412. char *mime = GetMimeTypeFromFileName(filename);
  413. if (mime == NULL)
  414. {
  415. mime = "application/octet-stream";
  416. }
  417. ret = AdminWebSendBody(s, 200, "OK", b2->Buf, b2->Size, mime, NULL, NULL, h);
  418. FreeBuf(b2);
  419. }
  420. FreeBuf(b);
  421. }
  422. }
  423. return ret;
  424. }
  425. // Try to find a file, and if exists return the file contents
  426. BUF *AdminWebTryFindAndReadFile(char *vroot, char *proot, char *url, char *ret_filename, UINT ret_filename_size, bool *is_index_html)
  427. {
  428. char tmp[MAX_PATH];
  429. char tmp2[MAX_PATH];
  430. UINT vroot_len;
  431. UINT url_len;
  432. char relative_path[MAX_PATH];
  433. BUF *b;
  434. if (vroot == NULL || proot == NULL || url == NULL || ret_filename == NULL || is_index_html == NULL)
  435. {
  436. return NULL;
  437. }
  438. *is_index_html = false;
  439. if (StartWith(url, vroot) == false)
  440. {
  441. return NULL;
  442. }
  443. vroot_len = StrLen(vroot);
  444. url_len = StrLen(url);
  445. StrCpy(relative_path, sizeof(relative_path), url + vroot_len);
  446. if (StartWith(relative_path, "/"))
  447. {
  448. char tmp3[MAX_PATH];
  449. StrCpy(tmp3, sizeof(tmp3), relative_path + 1);
  450. StrCpy(relative_path, sizeof(relative_path), tmp3);
  451. }
  452. CombinePath(tmp, sizeof(tmp), proot, relative_path);
  453. // index.html
  454. CombinePath(tmp2, sizeof(tmp2), tmp, "index.html");
  455. b = AdminWebTryOneFile(tmp2, ret_filename, ret_filename_size);
  456. if (b != NULL)
  457. {
  458. *is_index_html = true;
  459. return b;
  460. }
  461. // dirname/filename
  462. StrCpy(tmp2, sizeof(tmp2), tmp);
  463. b = AdminWebTryOneFile(tmp2, ret_filename, ret_filename_size);
  464. if (b != NULL)
  465. {
  466. return b;
  467. }
  468. return NULL;
  469. }
  470. BUF *AdminWebTryOneFile(char *filename, char *ret_filename, UINT ret_filename_size)
  471. {
  472. BUF *b;
  473. if (filename == NULL || ret_filename == NULL)
  474. {
  475. return NULL;
  476. }
  477. b = ReadDump(filename);
  478. if (b == NULL)
  479. {
  480. return NULL;
  481. }
  482. StrCpy(ret_filename, ret_filename_size, filename);
  483. return b;
  484. }
  485. // Send a 401 Unauthorized error
  486. bool AdminWebSendUnauthorized(SOCK *s, HTTP_HEADER *http_request_headers)
  487. {
  488. char *http_401_str = "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\r\n<html><head>\r\n<title>401 Unauthorized</title>\r\n</head><body>\r\n<h1>" CEDAR_SERVER_STR ": Administrative authentication required.</h1>\r\n<p>This VPN Server could not verify that you are authorized to access to the \r\nserver in administrative mode.</p>\r\n<p><strong>For web browser logins:<br></strong>You must supply the HTTP basic \r\nauthentication credential as following.</p>\r\n<ul>\r\n\t<li>To login to the VPN server as the entire server administrator, specify empty or &quot;administrator&quot; as the username field, and specify the server administrative \r\n\tpassword as the password field.<br></li>\r\n\t<li>To login to a particular Virtual Hub as the hub administrator, specify \r\n\tthe hub name as the username field, and specify the hub administrative \r\n\tpassword as the password field.</li>\r\n</ul>\r\n<p><strong>For JSON-RPC client logins:<br></strong>Instead to HTTP basic \r\nauthentication, you can also specify the HTTP header parameters as following.</p>\r\n<ul>\r\n\t<li>X-VPNADMIN-HUBNAME: Empty to login to the VPN Server as the entire \r\n\tserver administrator, or specify the target Virtual Hub name as the hub \r\n\tadministrator.</li>\r\n\t<li>X-VPNADMIN-PASSWORD: Specify the administrative password.</li>\r\n</ul>\r\n</body></html>\r\n";
  489. bool ret;
  490. // Validate arguments
  491. if (s == NULL || http_request_headers == NULL)
  492. {
  493. return false;
  494. }
  495. // Creating a Data
  496. ret = AdminWebSendBody(s, 401, "Unauthorized", http_401_str, StrLen(http_401_str), HTTP_CONTENT_TYPE,
  497. "WWW-Authenticate",
  498. "Basic realm=\"Username 'administrator' for entire VPN Server privilege, or specify Virtual Hub name as the username for specified Virtual Hub administrative privilege.\"",
  499. http_request_headers);
  500. return ret;
  501. }
  502. // Send reply
  503. bool AdminWebSendBody(SOCK *s, UINT status_code, char *status_string, UCHAR *data, UINT data_size, char *content_type, char *add_header_name, char *add_header_value,
  504. HTTP_HEADER *request_headers)
  505. {
  506. HTTP_HEADER *h;
  507. char date_str[MAX_SIZE];
  508. char error_code_str[16];
  509. bool ret = false;
  510. HTTP_VALUE *origin;
  511. if (s == NULL || status_string == NULL || (data_size != 0 && data == NULL) || request_headers == NULL)
  512. {
  513. return false;
  514. }
  515. if (content_type == NULL)
  516. {
  517. content_type = "text/html; charset=utf-8";
  518. }
  519. ToStr(error_code_str, status_code);
  520. GetHttpDateStr(date_str, sizeof(date_str), SystemTime64());
  521. h = NewHttpHeader("HTTP/1.1", error_code_str, status_string);
  522. if (StrCmpi(request_headers->Method, "OPTIONS") == 0)
  523. {
  524. AddHttpValue(h, NewHttpValue("Allow", "OPTIONS, GET, POST"));
  525. }
  526. AddHttpValue(h, NewHttpValue("Cache-Control", "no-cache"));
  527. AddHttpValue(h, NewHttpValue("Content-Type", content_type));
  528. AddHttpValue(h, NewHttpValue("Date", date_str));
  529. AddHttpValue(h, NewHttpValue("Connection", "Keep-Alive"));
  530. AddHttpValue(h, NewHttpValue("Access-Control-Allow-Methods", "OPTIONS,GET,POST"));
  531. AddHttpValue(h, NewHttpValue("Access-Control-Allow-Headers", "X-VPNADMIN-HUBNAME,X-VPNADMIN-PASSWORD"));
  532. AddHttpValue(h, NewHttpValue("Access-Control-Allow-Credentials", "true"));
  533. origin = GetHttpValue(request_headers, "Origin");
  534. if (origin != NULL)
  535. {
  536. AddHttpValue(h, NewHttpValue("Access-Control-Allow-Origin", origin->Data));
  537. }
  538. if (add_header_name != NULL && add_header_value != NULL)
  539. {
  540. AddHttpValue(h, NewHttpValue(add_header_name, add_header_value));
  541. }
  542. ret = PostHttp(s, h, data, data_size);
  543. FreeHttpHeader(h);
  544. return ret;
  545. }
  546. // Send 404 error
  547. bool AdminWebSend404Error(SOCK *s, HTTP_HEADER *request_headers)
  548. {
  549. char *body = "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\r\n<html><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL was not found on this server.</p></body></html>\r\n";
  550. if (s == NULL || request_headers == NULL)
  551. {
  552. return false;
  553. }
  554. return AdminWebSendBody(s, 404, "Not Found", body, StrLen(body), NULL, NULL, NULL, request_headers);
  555. }
  556. // Send 302 redirect
  557. bool AdminWebSend302Redirect(SOCK *s, char *url, char *query_string, HTTP_HEADER *request_headers)
  558. {
  559. bool ret = false;
  560. char *txt;
  561. UINT txt_size;
  562. char *url2;
  563. UINT url2_size;
  564. char *body = "<html><head><title>Object moved</title></head><body>\r\n<h2>Object moved to <a href=\"$URL$\">here</a>.</h2>\r\n</body></html>";
  565. if (s == NULL || url == NULL || request_headers == NULL)
  566. {
  567. return false;
  568. }
  569. url2_size = (StrSize(url) + StrSize(query_string) + MAX_SIZE) * 2;
  570. url2 = ZeroMalloc(url2_size);
  571. StrCpy(url2, url2_size, url);
  572. if (IsEmptyStr(query_string) == false)
  573. {
  574. StrCat(url2, url2_size, "?");
  575. StrCat(url2, url2_size, query_string);
  576. }
  577. txt_size = (StrSize(body) + StrSize(url2) + MAX_SIZE) * 2;
  578. txt = ZeroMalloc(txt_size);
  579. ReplaceStrEx(txt, txt_size, body, "$URL$", url2, false);
  580. ret = AdminWebSendBody(s, 302, "Found", txt, StrLen(txt), NULL, "Location", url2, request_headers);
  581. Free(txt);
  582. Free(url2);
  583. return ret;
  584. }
  585. // "/admin" web page POST handler
  586. void AdminWebProcPost(CONNECTION *c, SOCK *s, HTTP_HEADER *h, UINT post_data_size, char *url_target)
  587. {
  588. ADMIN *a;
  589. UCHAR *data;
  590. char url[MAX_PATH];
  591. char query_string[MAX_SIZE];
  592. UINT i;
  593. if (c == NULL || s == NULL || h == NULL || url_target == NULL)
  594. {
  595. return;
  596. }
  597. a = JsonRpcAuthLogin(c->Cedar, s, h);
  598. if (a == NULL)
  599. {
  600. RecvAllWithDiscard(s, post_data_size, s->SecureMode);
  601. AdminWebSendUnauthorized(s, h);
  602. return;
  603. }
  604. if (post_data_size > a->MaxJsonRpcRecvSize)
  605. {
  606. Disconnect(s);
  607. return;
  608. }
  609. data = ZeroMalloc(post_data_size + 1);
  610. if (RecvAll(s, data, post_data_size, s->SecureMode))
  611. {
  612. c->JsonRpcAuthed = true;
  613. #ifndef GC_SOFTETHER_OSS
  614. RemoveDosEntry(c->Listener, s);
  615. #endif // GC_SOFTETHER_OSS
  616. // Divide url_target into URL and query string
  617. StrCpy(url, sizeof(url), url_target);
  618. Zero(query_string, sizeof(query_string));
  619. i = SearchStr(url, "?", 0);
  620. if (i != INFINITE)
  621. {
  622. StrCpy(query_string, sizeof(query_string), url + i + 1);
  623. url[i] = 0;
  624. }
  625. AdminWebHandleFileRequest(a, c, s, h, url, query_string, "/admin", "|wwwroot/admin");
  626. }
  627. Free(data);
  628. Free(a);
  629. }
  630. // "/admin" web page GET handler
  631. void AdminWebProcGet(CONNECTION *c, SOCK *s, HTTP_HEADER *h, char *url_target)
  632. {
  633. ADMIN *a;
  634. char url[MAX_PATH];
  635. char query_string[MAX_SIZE];
  636. UINT i;
  637. if (c == NULL || s == NULL || h == NULL || url_target == NULL)
  638. {
  639. return;
  640. }
  641. a = JsonRpcAuthLogin(c->Cedar, s, h);
  642. if (a == NULL)
  643. {
  644. AdminWebSendUnauthorized(s, h);
  645. return;
  646. }
  647. c->JsonRpcAuthed = true;
  648. #ifndef GC_SOFTETHER_OSS
  649. RemoveDosEntry(c->Listener, s);
  650. #endif // GC_SOFTETHER_OSS
  651. // Divide url_target into URL and query string
  652. StrCpy(url, sizeof(url), url_target);
  653. Zero(query_string, sizeof(query_string));
  654. i = SearchStr(url, "?", 0);
  655. if (i != INFINITE)
  656. {
  657. StrCpy(query_string, sizeof(query_string), url + i + 1);
  658. url[i] = 0;
  659. }
  660. AdminWebHandleFileRequest(a, c, s, h, url, query_string, "/admin", "|wwwroot/admin");
  661. Free(a);
  662. }
  663. // New JSON-RPC Result
  664. JSON_VALUE *JsonRpcNewResponse(PACK *p)
  665. {
  666. JSON_VALUE *jv;
  667. JSON_OBJECT *jo;
  668. JSON_VALUE *jv2;
  669. if (p == NULL)
  670. {
  671. return NULL;
  672. }
  673. jv = JsonNewObject();
  674. jo = JsonValueGetObject(jv);
  675. jv2 = PackToJson(p);
  676. JsonSet(jo, "result", jv2);
  677. return jv;
  678. }
  679. // New JSON-RPC Error
  680. JSON_VALUE *JsonRpcNewError(int code, wchar_t *message)
  681. {
  682. wchar_t msg[MAX_PATH];
  683. JSON_VALUE *jv;
  684. JSON_OBJECT *jo;
  685. JSON_VALUE *jv2;
  686. JSON_OBJECT *jo2;
  687. if (UniIsEmptyStr(message))
  688. {
  689. UniFormat(msg, sizeof(msg), L"Error code %u", code);
  690. }
  691. else
  692. {
  693. UniFormat(msg, sizeof(msg), L"Error code %u: %s", code, message);
  694. }
  695. jv = JsonNewObject();
  696. jo = JsonValueGetObject(jv);
  697. jv2 = JsonNewObject();
  698. jo2 = JsonValueGetObject(jv2);
  699. JsonSet(jo, "error", jv2);
  700. JsonSetNumber(jo2, "code", (UINT64)code);
  701. JsonSetUniStr(jo2, "message", msg);
  702. return jv;
  703. }
  704. // JSON-RPC process request object
  705. JSON_VALUE *JsonRpcProcRequestObject(ADMIN *admin, CONNECTION *c, SOCK *s, JSON_VALUE *json_req, char *method_name)
  706. {
  707. PACK *pack_request;
  708. JSON_VALUE *ret = NULL;
  709. if (c == NULL || s == NULL || json_req == NULL || admin == NULL)
  710. {
  711. return NULL;
  712. }
  713. pack_request = JsonToPack(json_req);
  714. PackAddStr(pack_request, "function_name", method_name);
  715. if (pack_request != NULL)
  716. {
  717. RPC *rpc;
  718. PACK *pack_response;
  719. UINT err;
  720. // RPC Server
  721. rpc = StartRpcServer(s, AdminDispatch, admin);
  722. admin->Rpc = rpc;
  723. pack_response = CallRpcDispatcher(rpc, pack_request);
  724. if (pack_response == NULL)
  725. {
  726. pack_response = PackError(ERR_NOT_SUPPORTED);
  727. }
  728. RpcFreeEx(rpc, true);
  729. FreePack(pack_request);
  730. // Construct response object
  731. err = GetErrorFromPack(pack_response);
  732. if (err != 0)
  733. {
  734. // Return the error
  735. ret = JsonRpcNewError(err, _E(err));
  736. }
  737. else
  738. {
  739. // Return the PACK
  740. ret = JsonRpcNewResponse(pack_response);
  741. }
  742. SLog(admin->Server->Cedar, "LS_API_RPC_CALL",
  743. &s->RemoteIP, s->RemotePort, s->RemoteHostname,
  744. method_name, err, _E(err));
  745. FreePack(pack_response);
  746. }
  747. return ret;
  748. }
  749. // JSON-RPC HTTP user authentication
  750. bool HttpParseBasicAuthHeader(HTTP_HEADER *h, char *username, UINT username_size, char *password, UINT password_size)
  751. {
  752. bool ret = false;
  753. HTTP_VALUE *auth_value;
  754. HTTP_VALUE *vpnadmin_hubname;
  755. HTTP_VALUE *vpnadmin_password;
  756. if (h == NULL || username == NULL || password == NULL)
  757. {
  758. return false;
  759. }
  760. auth_value = GetHttpValue(h, "Authorization");
  761. vpnadmin_hubname = GetHttpValue(h, "X-VPNADMIN-HUBNAME");
  762. vpnadmin_password = GetHttpValue(h, "X-VPNADMIN-PASSWORD");
  763. if (vpnadmin_password != NULL)
  764. {
  765. if (vpnadmin_hubname == NULL)
  766. {
  767. StrCpy(username, username_size, "");
  768. }
  769. else
  770. {
  771. StrCpy(username, username_size, vpnadmin_hubname->Data);
  772. }
  773. StrCpy(password, password_size, vpnadmin_password->Data);
  774. ret = true;
  775. }
  776. if (ret == false && auth_value != NULL)
  777. {
  778. char key[32], value[MAX_SIZE];
  779. if (GetKeyAndValue(auth_value->Data, key, sizeof(key), value, sizeof(value), " \t"))
  780. {
  781. if (StrCmpi(key, "Basic") == 0 && IsEmptyStr(value) == false)
  782. {
  783. char *str = Base64ToBin(NULL, value, StrLen(value));
  784. if (str != NULL)
  785. {
  786. if (str[0] == ':')
  787. {
  788. // Empty username
  789. StrCpy(username, username_size, "");
  790. StrCpy(password, password_size, str + 1);
  791. ret = true;
  792. }
  793. else
  794. {
  795. if (GetKeyAndValue(str, username, username_size, password, password_size, ":"))
  796. {
  797. ret = true;
  798. }
  799. }
  800. Free(str);
  801. }
  802. }
  803. }
  804. }
  805. return ret;
  806. }
  807. // JSON-RPC Login
  808. ADMIN *JsonRpcAuthLogin(CEDAR *c, SOCK *sock, HTTP_HEADER *h)
  809. {
  810. ADMIN *a = NULL;
  811. char username[MAX_HUBNAME_LEN + 1];
  812. char password[MAX_PASSWORD_LEN + 1];
  813. SERVER *s;
  814. char empty_pw_hash[SHA1_SIZE];
  815. if (c == NULL || h == NULL || sock == NULL)
  816. {
  817. return NULL;
  818. }
  819. s = c->Server;
  820. HashAdminPassword(empty_pw_hash, "");
  821. Zero(username, sizeof(username));
  822. Zero(password, sizeof(password));
  823. if (HttpParseBasicAuthHeader(h, username, sizeof(username), password, sizeof(password)))
  824. {
  825. char pw_hash[SHA1_SIZE];
  826. bool is_server_admin = false;
  827. bool is_hub_admin = false;
  828. char hub_name[MAX_HUBNAME_LEN + 1];
  829. HashAdminPassword(pw_hash, password);
  830. Zero(hub_name, sizeof(hub_name));
  831. // Check if the server administrator password is empty. If yes, login always success.
  832. if (Cmp(s->HashedPassword, empty_pw_hash, SHA1_SIZE) == 0)
  833. {
  834. is_server_admin = true;
  835. }
  836. else
  837. {
  838. if (IsEmptyStr(username) || StrCmpi(username, ADMINISTRATOR_USERNAME) == 0)
  839. {
  840. // If the username is empty or 'administrator', verify with the server admin password.
  841. if (Cmp(s->HashedPassword, pw_hash, SHA1_SIZE) == 0)
  842. {
  843. is_server_admin = true;
  844. }
  845. }
  846. }
  847. if (is_server_admin == false)
  848. {
  849. HUB *h;
  850. // Hub admin mode
  851. LockHubList(c);
  852. {
  853. h = GetHub(c, username);
  854. }
  855. UnlockHubList(c);
  856. if (h != NULL)
  857. {
  858. Lock(h->lock);
  859. {
  860. if (Cmp(h->HashedPassword, empty_pw_hash, SHA1_SIZE) != 0 && IsZero(h->HashedPassword, sizeof(h->HashedPassword)) == false)
  861. {
  862. if (Cmp(pw_hash, h->HashedPassword, SHA1_SIZE) == 0)
  863. {
  864. is_hub_admin = true;
  865. StrCpy(hub_name, sizeof(hub_name), h->Name);
  866. }
  867. }
  868. }
  869. Unlock(h->lock);
  870. ReleaseHub(h);
  871. }
  872. }
  873. if (is_server_admin || is_hub_admin)
  874. {
  875. if (CheckAdminSourceAddress(sock, hub_name))
  876. {
  877. a = ZeroMalloc(sizeof(ADMIN));
  878. a->Server = s;
  879. a->ServerAdmin = is_server_admin;
  880. a->ClientBuild = c->Build;
  881. if (is_hub_admin)
  882. {
  883. StrCpy(a->dummy1, sizeof(a->dummy1), hub_name);
  884. a->HubName = a->dummy1;
  885. }
  886. }
  887. }
  888. }
  889. if (a != NULL)
  890. {
  891. char admin_mode[256];
  892. if (a->ServerAdmin)
  893. {
  894. a->MaxJsonRpcRecvSize = ADMIN_RPC_MAX_POST_SIZE_BY_SERVER_ADMIN;
  895. }
  896. else
  897. {
  898. a->MaxJsonRpcRecvSize = ADMIN_RPC_MAX_POST_SIZE_BY_HUB_ADMIN;
  899. }
  900. if (IsEmptyStr(a->HubName))
  901. {
  902. StrCpy(admin_mode, sizeof(admin_mode),
  903. "Entire VPN Server Admin Mode");
  904. }
  905. else
  906. {
  907. Format(admin_mode, sizeof(admin_mode),
  908. "Virtual Hub Admin Mode for '%s'",
  909. a->HubName);
  910. }
  911. SLog(s->Cedar, "LS_API_AUTH_OK",
  912. &sock->RemoteIP, sock->RemotePort, sock->RemoteHostname,
  913. admin_mode, username, h->Method, h->Target);
  914. }
  915. else
  916. {
  917. SLog(s->Cedar, "LS_API_AUTH_ERROR",
  918. &sock->RemoteIP, sock->RemotePort, sock->RemoteHostname,
  919. username, h->Method, h->Target);
  920. }
  921. return a;
  922. }
  923. // Query string to JSON list value
  924. JSON_VALUE *QueryStringToJsonListValue(char *qs)
  925. {
  926. TOKEN_LIST *t;
  927. UINT i;
  928. LIST *distinct_list = NULL;
  929. JSON_VALUE *v = NULL;
  930. JSON_OBJECT *o = NULL;
  931. if (qs == NULL)
  932. {
  933. return NULL;
  934. }
  935. t = ParseTokenWithoutNullStr(qs, "&");
  936. if (t == NULL)
  937. {
  938. return NULL;
  939. }
  940. distinct_list = NewStrList();
  941. v = JsonNewObject();
  942. o = JsonValueGetObject(v);
  943. for (i = 0;i < t->NumTokens;i++)
  944. {
  945. char *token = t->Token[i];
  946. UINT pos;
  947. pos = SearchStr(token, "=", 0);
  948. if (pos != INFINITE)
  949. {
  950. char *key_decoded;
  951. char *value_decoded;
  952. char *key = CopyStr(token);
  953. char *value = CopyStr(token + pos + 1);
  954. key[pos] = 0;
  955. key_decoded = UrlDecode(key);
  956. value_decoded = UrlDecode(value);
  957. if (key_decoded != NULL && value_decoded != NULL)
  958. {
  959. if (AddStrToStrListDistinct(distinct_list, key_decoded))
  960. {
  961. JsonSetStr(o, key_decoded, value_decoded);
  962. }
  963. }
  964. Free(value_decoded);
  965. Free(key_decoded);
  966. Free(key);
  967. Free(value);
  968. }
  969. }
  970. FreeToken(t);
  971. FreeStrList(distinct_list);
  972. return v;
  973. }
  974. // Construct new JSON-RPC dummy request
  975. JSON_VALUE *ConstructDummyJsonRpcRequest(char *method_name, JSON_VALUE *p)
  976. {
  977. JSON_VALUE *ret;
  978. JSON_OBJECT *ret_object;
  979. UCHAR rand[16];
  980. char id_str[64];
  981. Rand(rand, sizeof(rand));
  982. BinToStr(id_str, sizeof(id_str), rand, sizeof(rand));
  983. ret = JsonNewObject();
  984. ret_object = JsonObject(ret);
  985. JsonSetStr(ret_object, "jsonrpc", "2.0");
  986. JsonSetStr(ret_object, "method", method_name);
  987. JsonSet(ret_object, "params", p);
  988. JsonSetStr(ret_object, "id", id_str);
  989. return ret;
  990. }
  991. // JSON-RPC Options Dispatch
  992. void JsonRpcProcOptions(CONNECTION *c, SOCK *s, HTTP_HEADER *h, char *url_target)
  993. {
  994. if (c == NULL || s == NULL || h == NULL || url_target == NULL)
  995. {
  996. return;
  997. }
  998. c->JsonRpcAuthed = true;
  999. #ifndef GC_SOFTETHER_OSS
  1000. RemoveDosEntry(c->Listener, s);
  1001. #endif // GC_SOFTETHER_OSS
  1002. AdminWebSendBody(s, 200, "OK", NULL, 0, NULL, NULL, NULL, h);
  1003. }
  1004. // JSON-RPC GET Dispatch
  1005. void JsonRpcProcGet(CONNECTION *c, SOCK *s, HTTP_HEADER *h, char *url_target)
  1006. {
  1007. ADMIN *a;
  1008. char url[MAX_PATH];
  1009. char query_string[MAX_SIZE];
  1010. UINT i;
  1011. bool reply_sent = false;
  1012. if (c == NULL || s == NULL || h == NULL || url_target == NULL)
  1013. {
  1014. return;
  1015. }
  1016. a = JsonRpcAuthLogin(c->Cedar, s, h);
  1017. if (a == NULL)
  1018. {
  1019. AdminWebSendUnauthorized(s, h);
  1020. return;
  1021. }
  1022. c->JsonRpcAuthed = true;
  1023. #ifndef GC_SOFTETHER_OSS
  1024. RemoveDosEntry(c->Listener, s);
  1025. #endif // GC_SOFTETHER_OSS
  1026. // Divide url_target into URL and query string
  1027. StrCpy(url, sizeof(url), url_target);
  1028. Zero(query_string, sizeof(query_string));
  1029. i = SearchStr(url, "?", 0);
  1030. if (i != INFINITE)
  1031. {
  1032. StrCpy(query_string, sizeof(query_string), url + i + 1);
  1033. url[i] = 0;
  1034. }
  1035. if (StartWith(url, "/api/"))
  1036. {
  1037. // Call a method
  1038. JSON_VALUE *params_value = NULL;
  1039. JSON_OBJECT *params_object = NULL;
  1040. UINT i;
  1041. char method_name[MAX_PATH];
  1042. StrCpy(method_name, sizeof(method_name), url + 5);
  1043. i = SearchStr(method_name, "/", 0);
  1044. if (i != INFINITE)
  1045. {
  1046. method_name[i] = 0;
  1047. }
  1048. if (IsEmptyStr(method_name) == false)
  1049. {
  1050. // Call a method
  1051. params_value = QueryStringToJsonListValue(query_string);
  1052. if (params_value != NULL)
  1053. {
  1054. JSON_VALUE *json_ret = NULL;
  1055. char id[96];
  1056. char *ret_str = NULL;
  1057. GetDateTimeStrMilli64(id, sizeof(id), LocalTime64());
  1058. params_object = JsonObject(params_value);
  1059. // Process the request
  1060. json_ret = JsonRpcProcRequestObject(a, c, s, params_value, method_name);
  1061. if (json_ret == NULL)
  1062. {
  1063. json_ret = JsonRpcNewError(ERR_INTERNAL_ERROR, L"Internal error");
  1064. }
  1065. JsonSetStr(JsonObject(json_ret), "jsonrpc", "2.0");
  1066. JsonSetStr(JsonObject(json_ret), "id", id);
  1067. ret_str = JsonToStr(json_ret);
  1068. AdminWebSendBody(s, 200, "OK", ret_str, StrLen(ret_str), "text/plain; charset=UTF-8", NULL, NULL, h);
  1069. Free(ret_str);
  1070. JsonFree(json_ret);
  1071. JsonFree(params_value);
  1072. }
  1073. }
  1074. }
  1075. if (reply_sent == false)
  1076. {
  1077. BUF *html_buf = ReadDump("|vpnserver_api_doc.html");
  1078. if (html_buf != NULL)
  1079. {
  1080. AdminWebSendBody(s, 200, "OK", html_buf->Buf, html_buf->Size, "text/html; charset=UTF-8", NULL, NULL, h);
  1081. FreeBuf(html_buf);
  1082. }
  1083. else
  1084. {
  1085. AdminWebSend404Error(s, h);
  1086. }
  1087. }
  1088. if (a->LogFileList != NULL)
  1089. {
  1090. FreeEnumLogFile(a->LogFileList);
  1091. }
  1092. Free(a);
  1093. }
  1094. // JSON-RPC POST Dispatch
  1095. void JsonRpcProcPost(CONNECTION *c, SOCK *s, HTTP_HEADER *h, UINT post_data_size)
  1096. {
  1097. ADMIN *a;
  1098. UCHAR *data;
  1099. if (c == NULL || s == NULL || h == NULL)
  1100. {
  1101. return;
  1102. }
  1103. a = JsonRpcAuthLogin(c->Cedar, s, h);
  1104. if (a == NULL)
  1105. {
  1106. RecvAllWithDiscard(s, post_data_size, s->SecureMode);
  1107. AdminWebSendUnauthorized(s, h);
  1108. return;
  1109. }
  1110. if (post_data_size > a->MaxJsonRpcRecvSize)
  1111. {
  1112. Disconnect(s);
  1113. return;
  1114. }
  1115. data = ZeroMalloc(post_data_size + 1);
  1116. if (RecvAll(s, data, post_data_size, s->SecureMode))
  1117. {
  1118. // Parse JSON
  1119. JSON_VALUE *json_req = StrToJson(data);
  1120. JSON_OBJECT *json_req_object = JsonObject(json_req);
  1121. JSON_VALUE *json_ret = NULL;
  1122. char *res = NULL;
  1123. char *request_id = NULL;
  1124. char *method_name = NULL;
  1125. c->JsonRpcAuthed = true;
  1126. #ifndef GC_SOFTETHER_OSS
  1127. RemoveDosEntry(c->Listener, s);
  1128. #endif // GC_SOFTETHER_OSS
  1129. if (json_req == NULL || json_req_object == NULL)
  1130. {
  1131. // Parse error
  1132. json_ret = JsonRpcNewError(ERR_INVALID_PARAMETER, L"Parameter is invalid: JSON-RPC Parse Error");
  1133. }
  1134. else
  1135. {
  1136. // check the JSON-RPC version
  1137. char *ver_str = JsonGetStr(json_req_object, "jsonrpc");
  1138. if (StrCmpi(ver_str, "2.0") != 0)
  1139. {
  1140. // Invalid version
  1141. json_ret = JsonRpcNewError(ERR_INVALID_PARAMETER, L"JSON-RPC version is invalid");
  1142. }
  1143. else
  1144. {
  1145. JSON_VALUE *params_value = NULL;
  1146. JSON_OBJECT *params_object = NULL;
  1147. // Get Request ID
  1148. request_id = JsonGetStr(json_req_object, "id");
  1149. // Get method name
  1150. method_name = JsonGetStr(json_req_object, "method");
  1151. // Get parameters
  1152. params_value = JsonGet(json_req_object, "params");
  1153. params_object = JsonObject(params_value);
  1154. if (IsEmptyStr(method_name))
  1155. {
  1156. // method is empty
  1157. json_ret = JsonRpcNewError(ERR_INVALID_PARAMETER, L"JSON-RPC method name is empty");
  1158. }
  1159. else if (params_value == NULL || params_object == NULL)
  1160. {
  1161. // params is empty
  1162. json_ret = JsonRpcNewError(ERR_INVALID_PARAMETER, L"JSON-RPC parameter is empty");
  1163. }
  1164. else
  1165. {
  1166. // Process the request
  1167. json_ret = JsonRpcProcRequestObject(a, c, s, params_value, method_name);
  1168. }
  1169. }
  1170. }
  1171. if (json_ret == NULL)
  1172. {
  1173. json_ret = JsonRpcNewError(ERR_INTERNAL_ERROR, L"Internal error");
  1174. }
  1175. JsonSetStr(JsonObject(json_ret), "jsonrpc", "2.0");
  1176. if (request_id == NULL)
  1177. {
  1178. request_id = "0";
  1179. }
  1180. JsonSetStr(JsonObject(json_ret), "id", request_id);
  1181. res = JsonToStr(json_ret);
  1182. AdminWebSendBody(s, 200, "OK", res, StrLen(res), "application/json", NULL, NULL, h);
  1183. Free(res);
  1184. JsonFree(json_ret);
  1185. JsonFree(json_req);
  1186. }
  1187. Free(data);
  1188. if (a->LogFileList != NULL)
  1189. {
  1190. FreeEnumLogFile(a->LogFileList);
  1191. }
  1192. Free(a);
  1193. }
  1194. // Dispatch routine for Administration RPC
  1195. PACK *AdminDispatch(RPC *rpc, char *name, PACK *p)
  1196. {
  1197. ADMIN *a;
  1198. PACK *ret;
  1199. UINT err;
  1200. SERVER *server = NULL;
  1201. CEDAR *cedar = NULL;
  1202. bool ok = false;
  1203. // Validate arguments
  1204. if (rpc == NULL || name == NULL || p == NULL)
  1205. {
  1206. return NULL;
  1207. }
  1208. ret = NewPack();
  1209. err = ERR_NO_ERROR;
  1210. // Administration structure
  1211. a = (ADMIN *)rpc->Param;
  1212. if (a == NULL)
  1213. {
  1214. FreePack(ret);
  1215. return NULL;
  1216. }
  1217. server = a->Server;
  1218. if (server == NULL)
  1219. {
  1220. return NULL;
  1221. }
  1222. cedar = server->Cedar;
  1223. Lock(cedar->CedarSuperLock);
  1224. if (true)
  1225. {
  1226. char tmp[MAX_PATH];
  1227. char ip[MAX_PATH];
  1228. UINT rpc_id = 0;
  1229. StrCpy(ip, sizeof(ip), "Unknown");
  1230. if (rpc->Sock != NULL)
  1231. {
  1232. IPToStr(ip, sizeof(ip), &rpc->Sock->RemoteIP);
  1233. rpc_id = rpc->Sock->socket;
  1234. }
  1235. Format(tmp, sizeof(tmp), "RPC: RPC-%u (%s): Entering RPC [%s]...",
  1236. rpc_id, ip, name);
  1237. SiDebugLog(a->Server, tmp);
  1238. }
  1239. if (0) {}
  1240. // RPC function declaration: from here
  1241. DECLARE_RPC_EX("Test", RPC_TEST, StTest, InRpcTest, OutRpcTest, FreeRpcTest)
  1242. DECLARE_RPC_EX("GetServerInfo", RPC_SERVER_INFO, StGetServerInfo, InRpcServerInfo, OutRpcServerInfo, FreeRpcServerInfo)
  1243. DECLARE_RPC("GetServerStatus", RPC_SERVER_STATUS, StGetServerStatus, InRpcServerStatus, OutRpcServerStatus)
  1244. DECLARE_RPC("CreateListener", RPC_LISTENER, StCreateListener, InRpcListener, OutRpcListener)
  1245. DECLARE_RPC_EX("EnumListener", RPC_LISTENER_LIST, StEnumListener, InRpcListenerList, OutRpcListenerList, FreeRpcListenerList)
  1246. DECLARE_RPC("DeleteListener", RPC_LISTENER, StDeleteListener, InRpcListener, OutRpcListener)
  1247. DECLARE_RPC("EnableListener", RPC_LISTENER, StEnableListener, InRpcListener, OutRpcListener)
  1248. DECLARE_RPC_EX("SetPortsUDP", RPC_PORTS, StSetPortsUDP, InRpcPorts, OutRpcPorts, FreeRpcPorts)
  1249. DECLARE_RPC_EX("GetPortsUDP", RPC_PORTS, StGetPortsUDP, InRpcPorts, OutRpcPorts, FreeRpcPorts)
  1250. DECLARE_RPC_EX("SetProtoOptions", RPC_PROTO_OPTIONS, StSetProtoOptions, InRpcProtoOptions, OutRpcProtoOptions, FreeRpcProtoOptions)
  1251. DECLARE_RPC_EX("GetProtoOptions", RPC_PROTO_OPTIONS, StGetProtoOptions, InRpcProtoOptions, OutRpcProtoOptions, FreeRpcProtoOptions)
  1252. DECLARE_RPC("SetServerPassword", RPC_SET_PASSWORD, StSetServerPassword, InRpcSetPassword, OutRpcSetPassword)
  1253. DECLARE_RPC_EX("SetFarmSetting", RPC_FARM, StSetFarmSetting, InRpcFarm, OutRpcFarm, FreeRpcFarm)
  1254. DECLARE_RPC_EX("GetFarmSetting", RPC_FARM, StGetFarmSetting, InRpcFarm, OutRpcFarm, FreeRpcFarm)
  1255. DECLARE_RPC_EX("GetFarmInfo", RPC_FARM_INFO, StGetFarmInfo, InRpcFarmInfo, OutRpcFarmInfo, FreeRpcFarmInfo)
  1256. DECLARE_RPC_EX("EnumFarmMember", RPC_ENUM_FARM, StEnumFarmMember, InRpcEnumFarm, OutRpcEnumFarm, FreeRpcEnumFarm)
  1257. DECLARE_RPC("GetFarmConnectionStatus", RPC_FARM_CONNECTION_STATUS, StGetFarmConnectionStatus, InRpcFarmConnectionStatus, OutRpcFarmConnectionStatus)
  1258. DECLARE_RPC_EX("SetServerCert", RPC_KEY_PAIR, StSetServerCert, InRpcKeyPair, OutRpcKeyPair, FreeRpcKeyPair)
  1259. DECLARE_RPC_EX("GetServerCert", RPC_KEY_PAIR, StGetServerCert, InRpcKeyPair, OutRpcKeyPair, FreeRpcKeyPair)
  1260. DECLARE_RPC_EX("GetServerCipherList", RPC_STR, StGetServerCipherList, InRpcStr, OutRpcStr, FreeRpcStr)
  1261. DECLARE_RPC_EX("GetServerCipher", RPC_STR, StGetServerCipher, InRpcStr, OutRpcStr, FreeRpcStr)
  1262. DECLARE_RPC_EX("SetServerCipher", RPC_STR, StSetServerCipher, InRpcStr, OutRpcStr, FreeRpcStr)
  1263. DECLARE_RPC_EX("AddWgk", RPC_WGK, StAddWgk, InRpcWgk, OutRpcWgk, FreeRpcWgk)
  1264. DECLARE_RPC_EX("DeleteWgk", RPC_WGK, StDeleteWgk, InRpcWgk, OutRpcWgk, FreeRpcWgk)
  1265. DECLARE_RPC_EX("EnumWgk", RPC_WGK, StEnumWgk, InRpcWgk, OutRpcWgk, FreeRpcWgk)
  1266. DECLARE_RPC("CreateHub", RPC_CREATE_HUB, StCreateHub, InRpcCreateHub, OutRpcCreateHub)
  1267. DECLARE_RPC("SetHub", RPC_CREATE_HUB, StSetHub, InRpcCreateHub, OutRpcCreateHub)
  1268. DECLARE_RPC("GetHub", RPC_CREATE_HUB, StGetHub, InRpcCreateHub, OutRpcCreateHub)
  1269. DECLARE_RPC_EX("EnumHub", RPC_ENUM_HUB, StEnumHub, InRpcEnumHub, OutRpcEnumHub, FreeRpcEnumHub)
  1270. DECLARE_RPC("DeleteHub", RPC_DELETE_HUB, StDeleteHub, InRpcDeleteHub, OutRpcDeleteHub)
  1271. DECLARE_RPC("GetHubRadius", RPC_RADIUS, StGetHubRadius, InRpcRadius, OutRpcRadius)
  1272. DECLARE_RPC("SetHubRadius", RPC_RADIUS, StSetHubRadius, InRpcRadius, OutRpcRadius)
  1273. DECLARE_RPC_EX("EnumConnection", RPC_ENUM_CONNECTION, StEnumConnection, InRpcEnumConnection, OutRpcEnumConnection, FreeRpcEnumConnection)
  1274. DECLARE_RPC("DisconnectConnection", RPC_DISCONNECT_CONNECTION, StDisconnectConnection, InRpcDisconnectConnection, OutRpcDisconnectConnection)
  1275. DECLARE_RPC("GetConnectionInfo", RPC_CONNECTION_INFO, StGetConnectionInfo, InRpcConnectionInfo, OutRpcConnectionInfo)
  1276. DECLARE_RPC("SetHubOnline", RPC_SET_HUB_ONLINE, StSetHubOnline, InRpcSetHubOnline, OutRpcSetHubOnline)
  1277. DECLARE_RPC("GetHubStatus", RPC_HUB_STATUS, StGetHubStatus, InRpcHubStatus, OutRpcHubStatus)
  1278. DECLARE_RPC("SetHubLog", RPC_HUB_LOG, StSetHubLog, InRpcHubLog, OutRpcHubLog)
  1279. DECLARE_RPC("GetHubLog", RPC_HUB_LOG, StGetHubLog, InRpcHubLog, OutRpcHubLog)
  1280. DECLARE_RPC_EX("AddCa", RPC_HUB_ADD_CA, StAddCa, InRpcHubAddCa, OutRpcHubAddCa, FreeRpcHubAddCa)
  1281. DECLARE_RPC_EX("EnumCa", RPC_HUB_ENUM_CA, StEnumCa, InRpcHubEnumCa, OutRpcHubEnumCa, FreeRpcHubEnumCa)
  1282. DECLARE_RPC_EX("GetCa", RPC_HUB_GET_CA, StGetCa, InRpcHubGetCa, OutRpcHubGetCa, FreeRpcHubGetCa)
  1283. DECLARE_RPC("DeleteCa", RPC_HUB_DELETE_CA, StDeleteCa, InRpcHubDeleteCa, OutRpcHubDeleteCa)
  1284. DECLARE_RPC("SetLinkOnline", RPC_LINK, StSetLinkOnline, InRpcLink, OutRpcLink)
  1285. DECLARE_RPC("SetLinkOffline", RPC_LINK, StSetLinkOffline, InRpcLink, OutRpcLink)
  1286. DECLARE_RPC("DeleteLink", RPC_LINK, StDeleteLink, InRpcLink, OutRpcLink)
  1287. DECLARE_RPC("RenameLink", RPC_RENAME_LINK, StRenameLink, InRpcRenameLink, OutRpcRenameLink)
  1288. DECLARE_RPC_EX("CreateLink", RPC_CREATE_LINK, StCreateLink, InRpcCreateLink, OutRpcCreateLink, FreeRpcCreateLink)
  1289. DECLARE_RPC_EX("GetLink", RPC_CREATE_LINK, StGetLink, InRpcCreateLink, OutRpcCreateLink, FreeRpcCreateLink)
  1290. DECLARE_RPC_EX("SetLink", RPC_CREATE_LINK, StSetLink, InRpcCreateLink, OutRpcCreateLink, FreeRpcCreateLink)
  1291. DECLARE_RPC_EX("EnumLink", RPC_ENUM_LINK, StEnumLink, InRpcEnumLink, OutRpcEnumLink, FreeRpcEnumLink)
  1292. DECLARE_RPC_EX("GetLinkStatus", RPC_LINK_STATUS, StGetLinkStatus, InRpcLinkStatus, OutRpcLinkStatus, FreeRpcLinkStatus)
  1293. DECLARE_RPC("AddAccess", RPC_ADD_ACCESS, StAddAccess, InRpcAddAccess, OutRpcAddAccess)
  1294. DECLARE_RPC("DeleteAccess", RPC_DELETE_ACCESS, StDeleteAccess, InRpcDeleteAccess, OutRpcDeleteAccess)
  1295. DECLARE_RPC_EX("EnumAccess", RPC_ENUM_ACCESS_LIST, StEnumAccess, InRpcEnumAccessList, OutRpcEnumAccessList, FreeRpcEnumAccessList)
  1296. DECLARE_RPC_EX("SetAccessList", RPC_ENUM_ACCESS_LIST, StSetAccessList, InRpcEnumAccessList, OutRpcEnumAccessList, FreeRpcEnumAccessList)
  1297. DECLARE_RPC_EX("CreateUser", RPC_SET_USER, StCreateUser, InRpcSetUser, OutRpcSetUser, FreeRpcSetUser)
  1298. DECLARE_RPC_EX("SetUser", RPC_SET_USER, StSetUser, InRpcSetUser, OutRpcSetUser, FreeRpcSetUser)
  1299. DECLARE_RPC_EX("GetUser", RPC_SET_USER, StGetUser, InRpcSetUser, OutRpcSetUser, FreeRpcSetUser)
  1300. DECLARE_RPC("DeleteUser", RPC_DELETE_USER, StDeleteUser, InRpcDeleteUser, OutRpcDeleteUser)
  1301. DECLARE_RPC_EX("EnumUser", RPC_ENUM_USER, StEnumUser, InRpcEnumUser, OutRpcEnumUser, FreeRpcEnumUser)
  1302. DECLARE_RPC_EX("CreateGroup", RPC_SET_GROUP, StCreateGroup, InRpcSetGroup, OutRpcSetGroup, FreeRpcSetGroup)
  1303. DECLARE_RPC_EX("SetGroup", RPC_SET_GROUP, StSetGroup, InRpcSetGroup, OutRpcSetGroup, FreeRpcSetGroup)
  1304. DECLARE_RPC_EX("GetGroup", RPC_SET_GROUP, StGetGroup, InRpcSetGroup, OutRpcSetGroup, FreeRpcSetGroup)
  1305. DECLARE_RPC("DeleteGroup", RPC_DELETE_USER, StDeleteGroup, InRpcDeleteUser, OutRpcDeleteUser)
  1306. DECLARE_RPC_EX("EnumGroup", RPC_ENUM_GROUP, StEnumGroup, InRpcEnumGroup, OutRpcEnumGroup, FreeRpcEnumGroup)
  1307. DECLARE_RPC_EX("EnumSession", RPC_ENUM_SESSION, StEnumSession, InRpcEnumSession, OutRpcEnumSession, FreeRpcEnumSession)
  1308. DECLARE_RPC_EX("GetSessionStatus", RPC_SESSION_STATUS, StGetSessionStatus, InRpcSessionStatus, OutRpcSessionStatus, FreeRpcSessionStatus)
  1309. DECLARE_RPC("DeleteSession", RPC_DELETE_SESSION, StDeleteSession, InRpcDeleteSession, OutRpcDeleteSession)
  1310. DECLARE_RPC_EX("EnumMacTable", RPC_ENUM_MAC_TABLE, StEnumMacTable, InRpcEnumMacTable, OutRpcEnumMacTable, FreeRpcEnumMacTable)
  1311. DECLARE_RPC("DeleteMacTable", RPC_DELETE_TABLE, StDeleteMacTable, InRpcDeleteTable, OutRpcDeleteTable)
  1312. DECLARE_RPC_EX("EnumIpTable", RPC_ENUM_IP_TABLE, StEnumIpTable, InRpcEnumIpTable, OutRpcEnumIpTable, FreeRpcEnumIpTable)
  1313. DECLARE_RPC("DeleteIpTable", RPC_DELETE_TABLE, StDeleteIpTable, InRpcDeleteTable, OutRpcDeleteTable)
  1314. DECLARE_RPC("SetKeep", RPC_KEEP, StSetKeep, InRpcKeep, OutRpcKeep)
  1315. DECLARE_RPC("GetKeep", RPC_KEEP, StGetKeep, InRpcKeep, OutRpcKeep)
  1316. DECLARE_RPC("EnableSecureNAT", RPC_HUB, StEnableSecureNAT, InRpcHub, OutRpcHub)
  1317. DECLARE_RPC("DisableSecureNAT", RPC_HUB, StDisableSecureNAT, InRpcHub, OutRpcHub)
  1318. DECLARE_RPC("SetSecureNATOption", VH_OPTION, StSetSecureNATOption, InVhOption, OutVhOption)
  1319. DECLARE_RPC("GetSecureNATOption", VH_OPTION, StGetSecureNATOption, InVhOption, OutVhOption)
  1320. DECLARE_RPC_EX("EnumNAT", RPC_ENUM_NAT, StEnumNAT, InRpcEnumNat, OutRpcEnumNat, FreeRpcEnumNat)
  1321. DECLARE_RPC_EX("EnumDHCP", RPC_ENUM_DHCP, StEnumDHCP, InRpcEnumDhcp, OutRpcEnumDhcp, FreeRpcEnumDhcp)
  1322. DECLARE_RPC("GetSecureNATStatus", RPC_NAT_STATUS, StGetSecureNATStatus, InRpcNatStatus, OutRpcNatStatus)
  1323. DECLARE_RPC_EX("EnumEthernet", RPC_ENUM_ETH, StEnumEthernet, InRpcEnumEth, OutRpcEnumEth, FreeRpcEnumEth)
  1324. DECLARE_RPC("AddLocalBridge", RPC_LOCALBRIDGE, StAddLocalBridge, InRpcLocalBridge, OutRpcLocalBridge)
  1325. DECLARE_RPC("DeleteLocalBridge", RPC_LOCALBRIDGE, StDeleteLocalBridge, InRpcLocalBridge, OutRpcLocalBridge)
  1326. DECLARE_RPC_EX("EnumLocalBridge", RPC_ENUM_LOCALBRIDGE, StEnumLocalBridge, InRpcEnumLocalBridge, OutRpcEnumLocalBridge, FreeRpcEnumLocalBridge)
  1327. DECLARE_RPC("GetBridgeSupport", RPC_BRIDGE_SUPPORT, StGetBridgeSupport, InRpcBridgeSupport, OutRpcBridgeSupport)
  1328. DECLARE_RPC("RebootServer", RPC_TEST, StRebootServer, InRpcTest, OutRpcTest)
  1329. DECLARE_RPC_EX("GetCaps", CAPSLIST, StGetCaps, InRpcCapsList, OutRpcCapsList, FreeRpcCapsList)
  1330. DECLARE_RPC_EX("GetConfig", RPC_CONFIG, StGetConfig, InRpcConfig, OutRpcConfig, FreeRpcConfig)
  1331. DECLARE_RPC_EX("SetConfig", RPC_CONFIG, StSetConfig, InRpcConfig, OutRpcConfig, FreeRpcConfig)
  1332. DECLARE_RPC_EX("GetDefaultHubAdminOptions", RPC_ADMIN_OPTION, StGetDefaultHubAdminOptions, InRpcAdminOption, OutRpcAdminOption, FreeRpcAdminOption)
  1333. DECLARE_RPC_EX("GetHubAdminOptions", RPC_ADMIN_OPTION, StGetHubAdminOptions, InRpcAdminOption, OutRpcAdminOption, FreeRpcAdminOption)
  1334. DECLARE_RPC_EX("SetHubAdminOptions", RPC_ADMIN_OPTION, StSetHubAdminOptions, InRpcAdminOption, OutRpcAdminOption, FreeRpcAdminOption)
  1335. DECLARE_RPC_EX("GetHubExtOptions", RPC_ADMIN_OPTION, StGetHubExtOptions, InRpcAdminOption, OutRpcAdminOption, FreeRpcAdminOption)
  1336. DECLARE_RPC_EX("SetHubExtOptions", RPC_ADMIN_OPTION, StSetHubExtOptions, InRpcAdminOption, OutRpcAdminOption, FreeRpcAdminOption)
  1337. DECLARE_RPC("AddL3Switch", RPC_L3SW, StAddL3Switch, InRpcL3Sw, OutRpcL3Sw)
  1338. DECLARE_RPC("DelL3Switch", RPC_L3SW, StDelL3Switch, InRpcL3Sw, OutRpcL3Sw)
  1339. DECLARE_RPC_EX("EnumL3Switch", RPC_ENUM_L3SW, StEnumL3Switch, InRpcEnumL3Sw, OutRpcEnumL3Sw, FreeRpcEnumL3Sw)
  1340. DECLARE_RPC("StartL3Switch", RPC_L3SW, StStartL3Switch, InRpcL3Sw, OutRpcL3Sw)
  1341. DECLARE_RPC("StopL3Switch", RPC_L3SW, StStopL3Switch, InRpcL3Sw, OutRpcL3Sw)
  1342. DECLARE_RPC("AddL3If", RPC_L3IF, StAddL3If, InRpcL3If, OutRpcL3If)
  1343. DECLARE_RPC("DelL3If", RPC_L3IF, StDelL3If, InRpcL3If, OutRpcL3If)
  1344. DECLARE_RPC_EX("EnumL3If", RPC_ENUM_L3IF, StEnumL3If, InRpcEnumL3If, OutRpcEnumL3If, FreeRpcEnumL3If)
  1345. DECLARE_RPC("AddL3Table", RPC_L3TABLE, StAddL3Table, InRpcL3Table, OutRpcL3Table)
  1346. DECLARE_RPC("DelL3Table", RPC_L3TABLE, StDelL3Table, InRpcL3Table, OutRpcL3Table)
  1347. DECLARE_RPC_EX("EnumL3Table", RPC_ENUM_L3TABLE, StEnumL3Table, InRpcEnumL3Table, OutRpcEnumL3Table, FreeRpcEnumL3Table)
  1348. DECLARE_RPC_EX("EnumCrl", RPC_ENUM_CRL, StEnumCrl, InRpcEnumCrl, OutRpcEnumCrl, FreeRpcEnumCrl)
  1349. DECLARE_RPC_EX("AddCrl", RPC_CRL, StAddCrl, InRpcCrl, OutRpcCrl, FreeRpcCrl)
  1350. DECLARE_RPC_EX("DelCrl", RPC_CRL, StDelCrl, InRpcCrl, OutRpcCrl, FreeRpcCrl)
  1351. DECLARE_RPC_EX("GetCrl", RPC_CRL, StGetCrl, InRpcCrl, OutRpcCrl, FreeRpcCrl)
  1352. DECLARE_RPC_EX("SetCrl", RPC_CRL, StSetCrl, InRpcCrl, OutRpcCrl, FreeRpcCrl)
  1353. DECLARE_RPC_EX("SetAcList", RPC_AC_LIST, StSetAcList, InRpcAcList, OutRpcAcList, FreeRpcAcList)
  1354. DECLARE_RPC_EX("GetAcList", RPC_AC_LIST, StGetAcList, InRpcAcList, OutRpcAcList, FreeRpcAcList)
  1355. DECLARE_RPC_EX("EnumLogFile", RPC_ENUM_LOG_FILE, StEnumLogFile, InRpcEnumLogFile, OutRpcEnumLogFile, FreeRpcEnumLogFile)
  1356. DECLARE_RPC_EX("ReadLogFile", RPC_READ_LOG_FILE, StReadLogFile, InRpcReadLogFile, OutRpcReadLogFile, FreeRpcReadLogFile)
  1357. DECLARE_RPC("AddLicenseKey", RPC_TEST, StAddLicenseKey, InRpcTest, OutRpcTest)
  1358. DECLARE_RPC("DelLicenseKey", RPC_TEST, StDelLicenseKey, InRpcTest, OutRpcTest)
  1359. DECLARE_RPC_EX("EnumLicenseKey", RPC_ENUM_LICENSE_KEY, StEnumLicenseKey, InRpcEnumLicenseKey, OutRpcEnumLicenseKey, FreeRpcEnumLicenseKey)
  1360. DECLARE_RPC("GetLicenseStatus", RPC_LICENSE_STATUS, StGetLicenseStatus, InRpcLicenseStatus, OutRpcLicenseStatus)
  1361. DECLARE_RPC("SetSysLog", SYSLOG_SETTING, StSetSysLog, InRpcSysLogSetting, OutRpcSysLogSetting)
  1362. DECLARE_RPC("GetSysLog", SYSLOG_SETTING, StGetSysLog, InRpcSysLogSetting, OutRpcSysLogSetting)
  1363. DECLARE_RPC_EX("EnumEthVLan", RPC_ENUM_ETH_VLAN, StEnumEthVLan, InRpcEnumEthVLan, OutRpcEnumEthVLan, FreeRpcEnumEthVLan)
  1364. DECLARE_RPC("SetEnableEthVLan", RPC_TEST, StSetEnableEthVLan, InRpcTest, OutRpcTest)
  1365. DECLARE_RPC_EX("SetHubMsg", RPC_MSG, StSetHubMsg, InRpcMsg, OutRpcMsg, FreeRpcMsg)
  1366. DECLARE_RPC_EX("GetHubMsg", RPC_MSG, StGetHubMsg, InRpcMsg, OutRpcMsg, FreeRpcMsg)
  1367. DECLARE_RPC("Crash", RPC_TEST, StCrash, InRpcTest, OutRpcTest)
  1368. DECLARE_RPC_EX("GetAdminMsg", RPC_MSG, StGetAdminMsg, InRpcMsg, OutRpcMsg, FreeRpcMsg)
  1369. DECLARE_RPC("Flush", RPC_TEST, StFlush, InRpcTest, OutRpcTest)
  1370. DECLARE_RPC("Debug", RPC_TEST, StDebug, InRpcTest, OutRpcTest)
  1371. DECLARE_RPC("SetIPsecServices", IPSEC_SERVICES, StSetIPsecServices, InIPsecServices, OutIPsecServices)
  1372. DECLARE_RPC("GetIPsecServices", IPSEC_SERVICES, StGetIPsecServices, InIPsecServices, OutIPsecServices)
  1373. DECLARE_RPC("AddEtherIpId", ETHERIP_ID, StAddEtherIpId, InEtherIpId, OutEtherIpId)
  1374. DECLARE_RPC("GetEtherIpId", ETHERIP_ID, StGetEtherIpId, InEtherIpId, OutEtherIpId)
  1375. DECLARE_RPC("DeleteEtherIpId", ETHERIP_ID, StDeleteEtherIpId, InEtherIpId, OutEtherIpId)
  1376. DECLARE_RPC_EX("EnumEtherIpId", RPC_ENUM_ETHERIP_ID, StEnumEtherIpId, InRpcEnumEtherIpId, OutRpcEnumEtherIpId, FreeRpcEnumEtherIpId)
  1377. DECLARE_RPC("SetOpenVpnSstpConfig", OPENVPN_SSTP_CONFIG, StSetOpenVpnSstpConfig, InOpenVpnSstpConfig, OutOpenVpnSstpConfig)
  1378. DECLARE_RPC("GetOpenVpnSstpConfig", OPENVPN_SSTP_CONFIG, StGetOpenVpnSstpConfig, InOpenVpnSstpConfig, OutOpenVpnSstpConfig)
  1379. DECLARE_RPC("GetDDnsClientStatus", DDNS_CLIENT_STATUS, StGetDDnsClientStatus, InDDnsClientStatus, OutDDnsClientStatus)
  1380. DECLARE_RPC("ChangeDDnsClientHostname", RPC_TEST, StChangeDDnsClientHostname, InRpcTest, OutRpcTest)
  1381. DECLARE_RPC("RegenerateServerCert", RPC_TEST, StRegenerateServerCert, InRpcTest, OutRpcTest)
  1382. DECLARE_RPC_EX("MakeOpenVpnConfigFile", RPC_READ_LOG_FILE, StMakeOpenVpnConfigFile, InRpcReadLogFile, OutRpcReadLogFile, FreeRpcReadLogFile)
  1383. DECLARE_RPC("SetSpecialListener", RPC_SPECIAL_LISTENER, StSetSpecialListener, InRpcSpecialListener, OutRpcSpecialListener)
  1384. DECLARE_RPC("GetSpecialListener", RPC_SPECIAL_LISTENER, StGetSpecialListener, InRpcSpecialListener, OutRpcSpecialListener)
  1385. DECLARE_RPC("GetAzureStatus", RPC_AZURE_STATUS, StGetAzureStatus, InRpcAzureStatus, OutRpcAzureStatus)
  1386. DECLARE_RPC("SetAzureStatus", RPC_AZURE_STATUS, StSetAzureStatus, InRpcAzureStatus, OutRpcAzureStatus)
  1387. DECLARE_RPC("GetDDnsInternetSettng", INTERNET_SETTING, StGetDDnsInternetSetting, InRpcInternetSetting, OutRpcInternetSetting)
  1388. DECLARE_RPC("SetDDnsInternetSettng", INTERNET_SETTING, StSetDDnsInternetSetting, InRpcInternetSetting, OutRpcInternetSetting)
  1389. // RPC function declaration: till here
  1390. if (ok == false)
  1391. {
  1392. err = ERR_NOT_SUPPORTED;
  1393. }
  1394. if (err != ERR_NO_ERROR)
  1395. {
  1396. PackAddInt(ret, "error", err);
  1397. }
  1398. if (true)
  1399. {
  1400. char tmp[MAX_PATH];
  1401. char ip[MAX_PATH];
  1402. UINT rpc_id = 0;
  1403. StrCpy(ip, sizeof(ip), "Unknown");
  1404. if (rpc->Sock != NULL)
  1405. {
  1406. IPToStr(ip, sizeof(ip), &rpc->Sock->RemoteIP);
  1407. rpc_id = rpc->Sock->socket;
  1408. }
  1409. Format(tmp, sizeof(tmp), "RPC: RPC-%u (%s): Leaving RPC [%s] (Error: %u).",
  1410. rpc_id, ip, name, err);
  1411. SiDebugLog(a->Server, tmp);
  1412. }
  1413. Unlock(cedar->CedarSuperLock);
  1414. return ret;
  1415. }
  1416. // RPC call function declaration: from here
  1417. DECLARE_SC_EX("Test", RPC_TEST, ScTest, InRpcTest, OutRpcTest, FreeRpcTest)
  1418. DECLARE_SC_EX("GetServerInfo", RPC_SERVER_INFO, ScGetServerInfo, InRpcServerInfo, OutRpcServerInfo, FreeRpcServerInfo)
  1419. DECLARE_SC("GetServerStatus", RPC_SERVER_STATUS, ScGetServerStatus, InRpcServerStatus, OutRpcServerStatus)
  1420. DECLARE_SC("CreateListener", RPC_LISTENER, ScCreateListener, InRpcListener, OutRpcListener)
  1421. DECLARE_SC_EX("EnumListener", RPC_LISTENER_LIST, ScEnumListener, InRpcListenerList, OutRpcListenerList, FreeRpcListenerList)
  1422. DECLARE_SC("DeleteListener", RPC_LISTENER, ScDeleteListener, InRpcListener, OutRpcListener)
  1423. DECLARE_SC("EnableListener", RPC_LISTENER, ScEnableListener, InRpcListener, OutRpcListener)
  1424. DECLARE_SC_EX("SetPortsUDP", RPC_PORTS, ScSetPortsUDP, InRpcPorts, OutRpcPorts, FreeRpcPorts)
  1425. DECLARE_SC_EX("GetPortsUDP", RPC_PORTS, ScGetPortsUDP, InRpcPorts, OutRpcPorts, FreeRpcPorts)
  1426. DECLARE_SC_EX("SetProtoOptions", RPC_PROTO_OPTIONS, ScSetProtoOptions, InRpcProtoOptions, OutRpcProtoOptions, FreeRpcProtoOptions)
  1427. DECLARE_SC_EX("GetProtoOptions", RPC_PROTO_OPTIONS, ScGetProtoOptions, InRpcProtoOptions, OutRpcProtoOptions, FreeRpcProtoOptions)
  1428. DECLARE_SC("SetServerPassword", RPC_SET_PASSWORD, ScSetServerPassword, InRpcSetPassword, OutRpcSetPassword)
  1429. DECLARE_SC_EX("SetFarmSetting", RPC_FARM, ScSetFarmSetting, InRpcFarm, OutRpcFarm, FreeRpcFarm)
  1430. DECLARE_SC_EX("GetFarmSetting", RPC_FARM, ScGetFarmSetting, InRpcFarm, OutRpcFarm, FreeRpcFarm)
  1431. DECLARE_SC_EX("GetFarmInfo", RPC_FARM_INFO, ScGetFarmInfo, InRpcFarmInfo, OutRpcFarmInfo, FreeRpcFarmInfo)
  1432. DECLARE_SC_EX("EnumFarmMember", RPC_ENUM_FARM, ScEnumFarmMember, InRpcEnumFarm, OutRpcEnumFarm, FreeRpcEnumFarm)
  1433. DECLARE_SC("GetFarmConnectionStatus", RPC_FARM_CONNECTION_STATUS, ScGetFarmConnectionStatus, InRpcFarmConnectionStatus, OutRpcFarmConnectionStatus)
  1434. DECLARE_SC_EX("SetServerCert", RPC_KEY_PAIR, ScSetServerCert, InRpcKeyPair, OutRpcKeyPair, FreeRpcKeyPair)
  1435. DECLARE_SC_EX("GetServerCert", RPC_KEY_PAIR, ScGetServerCert, InRpcKeyPair, OutRpcKeyPair, FreeRpcKeyPair)
  1436. DECLARE_SC_EX("GetServerCipherList", RPC_STR, ScGetServerCipherList, InRpcStr, OutRpcStr, FreeRpcStr)
  1437. DECLARE_SC_EX("GetServerCipher", RPC_STR, ScGetServerCipher, InRpcStr, OutRpcStr, FreeRpcStr)
  1438. DECLARE_SC_EX("SetServerCipher", RPC_STR, ScSetServerCipher, InRpcStr, OutRpcStr, FreeRpcStr)
  1439. DECLARE_SC_EX("AddWgk", RPC_WGK, ScAddWgk, InRpcWgk, OutRpcWgk, FreeRpcWgk)
  1440. DECLARE_SC_EX("DeleteWgk", RPC_WGK, ScDeleteWgk, InRpcWgk, OutRpcWgk, FreeRpcWgk)
  1441. DECLARE_SC_EX("EnumWgk", RPC_WGK, ScEnumWgk, InRpcWgk, OutRpcWgk, FreeRpcWgk)
  1442. DECLARE_SC("CreateHub", RPC_CREATE_HUB, ScCreateHub, InRpcCreateHub, OutRpcCreateHub)
  1443. DECLARE_SC("SetHub", RPC_CREATE_HUB, ScSetHub, InRpcCreateHub, OutRpcCreateHub)
  1444. DECLARE_SC("GetHub", RPC_CREATE_HUB, ScGetHub, InRpcCreateHub, OutRpcCreateHub)
  1445. DECLARE_SC_EX("EnumHub", RPC_ENUM_HUB, ScEnumHub, InRpcEnumHub, OutRpcEnumHub, FreeRpcEnumHub)
  1446. DECLARE_SC("DeleteHub", RPC_DELETE_HUB, ScDeleteHub, InRpcDeleteHub, OutRpcDeleteHub)
  1447. DECLARE_SC("GetHubRadius", RPC_RADIUS, ScGetHubRadius, InRpcRadius, OutRpcRadius)
  1448. DECLARE_SC("SetHubRadius", RPC_RADIUS, ScSetHubRadius, InRpcRadius, OutRpcRadius)
  1449. DECLARE_SC_EX("EnumConnection", RPC_ENUM_CONNECTION, ScEnumConnection, InRpcEnumConnection, OutRpcEnumConnection, FreeRpcEnumConnection)
  1450. DECLARE_SC("DisconnectConnection", RPC_DISCONNECT_CONNECTION, ScDisconnectConnection, InRpcDisconnectConnection, OutRpcDisconnectConnection)
  1451. DECLARE_SC("GetConnectionInfo", RPC_CONNECTION_INFO, ScGetConnectionInfo, InRpcConnectionInfo, OutRpcConnectionInfo)
  1452. DECLARE_SC("SetHubOnline", RPC_SET_HUB_ONLINE, ScSetHubOnline, InRpcSetHubOnline, OutRpcSetHubOnline)
  1453. DECLARE_SC("GetHubStatus", RPC_HUB_STATUS, ScGetHubStatus, InRpcHubStatus, OutRpcHubStatus)
  1454. DECLARE_SC("SetHubLog", RPC_HUB_LOG, ScSetHubLog, InRpcHubLog, OutRpcHubLog)
  1455. DECLARE_SC("GetHubLog", RPC_HUB_LOG, ScGetHubLog, InRpcHubLog, OutRpcHubLog)
  1456. DECLARE_SC_EX("AddCa", RPC_HUB_ADD_CA, ScAddCa, InRpcHubAddCa, OutRpcHubAddCa, FreeRpcHubAddCa)
  1457. DECLARE_SC_EX("EnumCa", RPC_HUB_ENUM_CA, ScEnumCa, InRpcHubEnumCa, OutRpcHubEnumCa, FreeRpcHubEnumCa)
  1458. DECLARE_SC_EX("GetCa", RPC_HUB_GET_CA, ScGetCa, InRpcHubGetCa, OutRpcHubGetCa, FreeRpcHubGetCa)
  1459. DECLARE_SC("DeleteCa", RPC_HUB_DELETE_CA, ScDeleteCa, InRpcHubDeleteCa, OutRpcHubDeleteCa)
  1460. DECLARE_SC_EX("CreateLink", RPC_CREATE_LINK, ScCreateLink, InRpcCreateLink, OutRpcCreateLink, FreeRpcCreateLink)
  1461. DECLARE_SC_EX("GetLink", RPC_CREATE_LINK, ScGetLink, InRpcCreateLink, OutRpcCreateLink, FreeRpcCreateLink)
  1462. DECLARE_SC_EX("SetLink", RPC_CREATE_LINK, ScSetLink, InRpcCreateLink, OutRpcCreateLink, FreeRpcCreateLink)
  1463. DECLARE_SC_EX("EnumLink", RPC_ENUM_LINK, ScEnumLink, InRpcEnumLink, OutRpcEnumLink, FreeRpcEnumLink)
  1464. DECLARE_SC_EX("GetLinkStatus", RPC_LINK_STATUS, ScGetLinkStatus, InRpcLinkStatus, OutRpcLinkStatus, FreeRpcLinkStatus)
  1465. DECLARE_SC("SetLinkOnline", RPC_LINK, ScSetLinkOnline, InRpcLink, OutRpcLink)
  1466. DECLARE_SC("SetLinkOffline", RPC_LINK, ScSetLinkOffline, InRpcLink, OutRpcLink)
  1467. DECLARE_SC("DeleteLink", RPC_LINK, ScDeleteLink, InRpcLink, OutRpcLink)
  1468. DECLARE_SC("RenameLink", RPC_RENAME_LINK, ScRenameLink, InRpcRenameLink, OutRpcRenameLink)
  1469. DECLARE_SC("AddAccess", RPC_ADD_ACCESS, ScAddAccess, InRpcAddAccess, OutRpcAddAccess)
  1470. DECLARE_SC("DeleteAccess", RPC_DELETE_ACCESS, ScDeleteAccess, InRpcDeleteAccess, OutRpcDeleteAccess)
  1471. DECLARE_SC_EX("EnumAccess", RPC_ENUM_ACCESS_LIST, ScEnumAccess, InRpcEnumAccessList, OutRpcEnumAccessList, FreeRpcEnumAccessList)
  1472. DECLARE_SC_EX("SetAccessList", RPC_ENUM_ACCESS_LIST, ScSetAccessList, InRpcEnumAccessList, OutRpcEnumAccessList, FreeRpcEnumAccessList)
  1473. DECLARE_SC_EX("CreateUser", RPC_SET_USER, ScCreateUser, InRpcSetUser, OutRpcSetUser, FreeRpcSetUser)
  1474. DECLARE_SC_EX("SetUser", RPC_SET_USER, ScSetUser, InRpcSetUser, OutRpcSetUser, FreeRpcSetUser)
  1475. DECLARE_SC_EX("GetUser", RPC_SET_USER, ScGetUser, InRpcSetUser, OutRpcSetUser, FreeRpcSetUser)
  1476. DECLARE_SC("DeleteUser", RPC_DELETE_USER, ScDeleteUser, InRpcDeleteUser, OutRpcDeleteUser)
  1477. DECLARE_SC_EX("EnumUser", RPC_ENUM_USER, ScEnumUser, InRpcEnumUser, OutRpcEnumUser, FreeRpcEnumUser)
  1478. DECLARE_SC_EX("CreateGroup", RPC_SET_GROUP, ScCreateGroup, InRpcSetGroup, OutRpcSetGroup, FreeRpcSetGroup)
  1479. DECLARE_SC_EX("SetGroup", RPC_SET_GROUP, ScSetGroup, InRpcSetGroup, OutRpcSetGroup, FreeRpcSetGroup)
  1480. DECLARE_SC_EX("GetGroup", RPC_SET_GROUP, ScGetGroup, InRpcSetGroup, OutRpcSetGroup, FreeRpcSetGroup)
  1481. DECLARE_SC("DeleteGroup", RPC_DELETE_USER, ScDeleteGroup, InRpcDeleteUser, OutRpcDeleteUser)
  1482. DECLARE_SC_EX("EnumGroup", RPC_ENUM_GROUP, ScEnumGroup, InRpcEnumGroup, OutRpcEnumGroup, FreeRpcEnumGroup)
  1483. DECLARE_SC_EX("EnumSession", RPC_ENUM_SESSION, ScEnumSession, InRpcEnumSession, OutRpcEnumSession, FreeRpcEnumSession)
  1484. DECLARE_SC_EX("GetSessionStatus", RPC_SESSION_STATUS, ScGetSessionStatus, InRpcSessionStatus, OutRpcSessionStatus, FreeRpcSessionStatus)
  1485. DECLARE_SC("DeleteSession", RPC_DELETE_SESSION, ScDeleteSession, InRpcDeleteSession, OutRpcDeleteSession)
  1486. DECLARE_SC_EX("EnumMacTable", RPC_ENUM_MAC_TABLE, ScEnumMacTable, InRpcEnumMacTable, OutRpcEnumMacTable, FreeRpcEnumMacTable)
  1487. DECLARE_SC("DeleteMacTable", RPC_DELETE_TABLE, ScDeleteMacTable, InRpcDeleteTable, OutRpcDeleteTable)
  1488. DECLARE_SC_EX("EnumIpTable", RPC_ENUM_IP_TABLE, ScEnumIpTable, InRpcEnumIpTable, OutRpcEnumIpTable, FreeRpcEnumIpTable)
  1489. DECLARE_SC("DeleteIpTable", RPC_DELETE_TABLE, ScDeleteIpTable, InRpcDeleteTable, OutRpcDeleteTable)
  1490. DECLARE_SC("SetKeep", RPC_KEEP, ScSetKeep, InRpcKeep, OutRpcKeep)
  1491. DECLARE_SC("GetKeep", RPC_KEEP, ScGetKeep, InRpcKeep, OutRpcKeep)
  1492. DECLARE_SC("EnableSecureNAT", RPC_HUB, ScEnableSecureNAT, InRpcHub, OutRpcHub)
  1493. DECLARE_SC("DisableSecureNAT", RPC_HUB, ScDisableSecureNAT, InRpcHub, OutRpcHub)
  1494. DECLARE_SC("SetSecureNATOption", VH_OPTION, ScSetSecureNATOption, InVhOption, OutVhOption)
  1495. DECLARE_SC("GetSecureNATOption", VH_OPTION, ScGetSecureNATOption, InVhOption, OutVhOption)
  1496. DECLARE_SC_EX("EnumNAT", RPC_ENUM_NAT, ScEnumNAT, InRpcEnumNat, OutRpcEnumNat, FreeRpcEnumNat)
  1497. DECLARE_SC_EX("EnumDHCP", RPC_ENUM_DHCP, ScEnumDHCP, InRpcEnumDhcp, OutRpcEnumDhcp, FreeRpcEnumDhcp)
  1498. DECLARE_SC("GetSecureNATStatus", RPC_NAT_STATUS, ScGetSecureNATStatus, InRpcNatStatus, OutRpcNatStatus)
  1499. DECLARE_SC_EX("EnumEthernet", RPC_ENUM_ETH, ScEnumEthernet, InRpcEnumEth, OutRpcEnumEth, FreeRpcEnumEth)
  1500. DECLARE_SC("AddLocalBridge", RPC_LOCALBRIDGE, ScAddLocalBridge, InRpcLocalBridge, OutRpcLocalBridge)
  1501. DECLARE_SC("DeleteLocalBridge", RPC_LOCALBRIDGE, ScDeleteLocalBridge, InRpcLocalBridge, OutRpcLocalBridge)
  1502. DECLARE_SC_EX("EnumLocalBridge", RPC_ENUM_LOCALBRIDGE, ScEnumLocalBridge, InRpcEnumLocalBridge, OutRpcEnumLocalBridge, FreeRpcEnumLocalBridge)
  1503. DECLARE_SC("GetBridgeSupport", RPC_BRIDGE_SUPPORT, ScGetBridgeSupport, InRpcBridgeSupport, OutRpcBridgeSupport)
  1504. DECLARE_SC("RebootServer", RPC_TEST, ScRebootServer, InRpcTest, OutRpcTest)
  1505. DECLARE_SC_EX("GetCaps", CAPSLIST, ScGetCaps, InRpcCapsList, OutRpcCapsList, FreeRpcCapsList)
  1506. DECLARE_SC_EX("GetConfig", RPC_CONFIG, ScGetConfig, InRpcConfig, OutRpcConfig, FreeRpcConfig)
  1507. DECLARE_SC_EX("SetConfig", RPC_CONFIG, ScSetConfig, InRpcConfig, OutRpcConfig, FreeRpcConfig)
  1508. DECLARE_SC_EX("GetHubAdminOptions", RPC_ADMIN_OPTION, ScGetHubAdminOptions, InRpcAdminOption, OutRpcAdminOption, FreeRpcAdminOption)
  1509. DECLARE_SC_EX("SetHubAdminOptions", RPC_ADMIN_OPTION, ScSetHubAdminOptions, InRpcAdminOption, OutRpcAdminOption, FreeRpcAdminOption)
  1510. DECLARE_SC_EX("GetHubExtOptions", RPC_ADMIN_OPTION, ScGetHubExtOptions, InRpcAdminOption, OutRpcAdminOption, FreeRpcAdminOption)
  1511. DECLARE_SC_EX("SetHubExtOptions", RPC_ADMIN_OPTION, ScSetHubExtOptions, InRpcAdminOption, OutRpcAdminOption, FreeRpcAdminOption)
  1512. DECLARE_SC_EX("GetDefaultHubAdminOptions", RPC_ADMIN_OPTION, ScGetDefaultHubAdminOptions, InRpcAdminOption, OutRpcAdminOption, FreeRpcAdminOption)
  1513. DECLARE_SC("AddL3Switch", RPC_L3SW, ScAddL3Switch, InRpcL3Sw, OutRpcL3Sw)
  1514. DECLARE_SC("DelL3Switch", RPC_L3SW, ScDelL3Switch, InRpcL3Sw, OutRpcL3Sw)
  1515. DECLARE_SC_EX("EnumL3Switch", RPC_ENUM_L3SW, ScEnumL3Switch, InRpcEnumL3Sw, OutRpcEnumL3Sw, FreeRpcEnumL3Sw)
  1516. DECLARE_SC("StartL3Switch", RPC_L3SW, ScStartL3Switch, InRpcL3Sw, OutRpcL3Sw)
  1517. DECLARE_SC("StopL3Switch", RPC_L3SW, ScStopL3Switch, InRpcL3Sw, OutRpcL3Sw)
  1518. DECLARE_SC("AddL3If", RPC_L3IF, ScAddL3If, InRpcL3If, OutRpcL3If)
  1519. DECLARE_SC("DelL3If", RPC_L3IF, ScDelL3If, InRpcL3If, OutRpcL3If)
  1520. DECLARE_SC_EX("EnumL3If", RPC_ENUM_L3IF, ScEnumL3If, InRpcEnumL3If, OutRpcEnumL3If, FreeRpcEnumL3If)
  1521. DECLARE_SC("AddL3Table", RPC_L3TABLE, ScAddL3Table, InRpcL3Table, OutRpcL3Table)
  1522. DECLARE_SC("DelL3Table", RPC_L3TABLE, ScDelL3Table, InRpcL3Table, OutRpcL3Table)
  1523. DECLARE_SC_EX("EnumL3Table", RPC_ENUM_L3TABLE, ScEnumL3Table, InRpcEnumL3Table, OutRpcEnumL3Table, FreeRpcEnumL3Table)
  1524. DECLARE_SC_EX("EnumCrl", RPC_ENUM_CRL, ScEnumCrl, InRpcEnumCrl, OutRpcEnumCrl, FreeRpcEnumCrl)
  1525. DECLARE_SC_EX("AddCrl", RPC_CRL, ScAddCrl, InRpcCrl, OutRpcCrl, FreeRpcCrl)
  1526. DECLARE_SC_EX("DelCrl", RPC_CRL, ScDelCrl, InRpcCrl, OutRpcCrl, FreeRpcCrl)
  1527. DECLARE_SC_EX("GetCrl", RPC_CRL, ScGetCrl, InRpcCrl, OutRpcCrl, FreeRpcCrl)
  1528. DECLARE_SC_EX("SetCrl", RPC_CRL, ScSetCrl, InRpcCrl, OutRpcCrl, FreeRpcCrl)
  1529. DECLARE_SC_EX("SetAcList", RPC_AC_LIST, ScSetAcList, InRpcAcList, OutRpcAcList, FreeRpcAcList)
  1530. DECLARE_SC_EX("GetAcList", RPC_AC_LIST, ScGetAcList, InRpcAcList, OutRpcAcList, FreeRpcAcList)
  1531. DECLARE_SC_EX("EnumLogFile", RPC_ENUM_LOG_FILE, ScEnumLogFile, InRpcEnumLogFile, OutRpcEnumLogFile, FreeRpcEnumLogFile)
  1532. DECLARE_SC_EX("ReadLogFile", RPC_READ_LOG_FILE, ScReadLogFile, InRpcReadLogFile, OutRpcReadLogFile, FreeRpcReadLogFile)
  1533. DECLARE_SC("AddLicenseKey", RPC_TEST, ScAddLicenseKey, InRpcTest, OutRpcTest)
  1534. DECLARE_SC("DelLicenseKey", RPC_TEST, ScDelLicenseKey, InRpcTest, OutRpcTest)
  1535. DECLARE_SC_EX("EnumLicenseKey", RPC_ENUM_LICENSE_KEY, ScEnumLicenseKey, InRpcEnumLicenseKey, OutRpcEnumLicenseKey, FreeRpcEnumLicenseKey)
  1536. DECLARE_SC("GetLicenseStatus", RPC_LICENSE_STATUS, ScGetLicenseStatus, InRpcLicenseStatus, OutRpcLicenseStatus)
  1537. DECLARE_SC("SetSysLog", SYSLOG_SETTING, ScSetSysLog, InRpcSysLogSetting, OutRpcSysLogSetting)
  1538. DECLARE_SC("GetSysLog", SYSLOG_SETTING, ScGetSysLog, InRpcSysLogSetting, OutRpcSysLogSetting)
  1539. DECLARE_SC_EX("EnumEthVLan", RPC_ENUM_ETH_VLAN, ScEnumEthVLan, InRpcEnumEthVLan, OutRpcEnumEthVLan, FreeRpcEnumEthVLan)
  1540. DECLARE_SC("SetEnableEthVLan", RPC_TEST, ScSetEnableEthVLan, InRpcTest, OutRpcTest)
  1541. DECLARE_SC_EX("SetHubMsg", RPC_MSG, ScSetHubMsg, InRpcMsg, OutRpcMsg, FreeRpcMsg)
  1542. DECLARE_SC_EX("GetHubMsg", RPC_MSG, ScGetHubMsg, InRpcMsg, OutRpcMsg, FreeRpcMsg)
  1543. DECLARE_SC("Crash", RPC_TEST, ScCrash, InRpcTest, OutRpcTest)
  1544. DECLARE_SC_EX("GetAdminMsg", RPC_MSG, ScGetAdminMsg, InRpcMsg, OutRpcMsg, FreeRpcMsg)
  1545. DECLARE_SC("Flush", RPC_TEST, ScFlush, InRpcTest, OutRpcTest)
  1546. DECLARE_SC("Debug", RPC_TEST, ScDebug, InRpcTest, OutRpcTest)
  1547. DECLARE_SC("SetIPsecServices", IPSEC_SERVICES, ScSetIPsecServices, InIPsecServices, OutIPsecServices)
  1548. DECLARE_SC("GetIPsecServices", IPSEC_SERVICES, ScGetIPsecServices, InIPsecServices, OutIPsecServices)
  1549. DECLARE_SC("AddEtherIpId", ETHERIP_ID, ScAddEtherIpId, InEtherIpId, OutEtherIpId)
  1550. DECLARE_SC("GetEtherIpId", ETHERIP_ID, ScGetEtherIpId, InEtherIpId, OutEtherIpId)
  1551. DECLARE_SC("DeleteEtherIpId", ETHERIP_ID, ScDeleteEtherIpId, InEtherIpId, OutEtherIpId)
  1552. DECLARE_SC_EX("EnumEtherIpId", RPC_ENUM_ETHERIP_ID, ScEnumEtherIpId, InRpcEnumEtherIpId, OutRpcEnumEtherIpId, FreeRpcEnumEtherIpId)
  1553. DECLARE_SC("SetOpenVpnSstpConfig", OPENVPN_SSTP_CONFIG, ScSetOpenVpnSstpConfig, InOpenVpnSstpConfig, OutOpenVpnSstpConfig)
  1554. DECLARE_SC("GetOpenVpnSstpConfig", OPENVPN_SSTP_CONFIG, ScGetOpenVpnSstpConfig, InOpenVpnSstpConfig, OutOpenVpnSstpConfig)
  1555. DECLARE_SC("GetDDnsClientStatus", DDNS_CLIENT_STATUS, ScGetDDnsClientStatus, InDDnsClientStatus, OutDDnsClientStatus)
  1556. DECLARE_SC("ChangeDDnsClientHostname", RPC_TEST, ScChangeDDnsClientHostname, InRpcTest, OutRpcTest)
  1557. DECLARE_SC("RegenerateServerCert", RPC_TEST, ScRegenerateServerCert, InRpcTest, OutRpcTest)
  1558. DECLARE_SC_EX("MakeOpenVpnConfigFile", RPC_READ_LOG_FILE, ScMakeOpenVpnConfigFile, InRpcReadLogFile, OutRpcReadLogFile, FreeRpcReadLogFile)
  1559. DECLARE_SC("SetSpecialListener", RPC_SPECIAL_LISTENER, ScSetSpecialListener, InRpcSpecialListener, OutRpcSpecialListener)
  1560. DECLARE_SC("GetSpecialListener", RPC_SPECIAL_LISTENER, ScGetSpecialListener, InRpcSpecialListener, OutRpcSpecialListener)
  1561. DECLARE_SC("GetAzureStatus", RPC_AZURE_STATUS, ScGetAzureStatus, InRpcAzureStatus, OutRpcAzureStatus)
  1562. DECLARE_SC("SetAzureStatus", RPC_AZURE_STATUS, ScSetAzureStatus, InRpcAzureStatus, OutRpcAzureStatus)
  1563. DECLARE_SC("GetDDnsInternetSettng", INTERNET_SETTING, ScGetDDnsInternetSetting, InRpcInternetSetting, OutRpcInternetSetting)
  1564. DECLARE_SC("SetDDnsInternetSettng", INTERNET_SETTING, ScSetDDnsInternetSetting, InRpcInternetSetting, OutRpcInternetSetting)
  1565. // RPC call function declaration: till here
  1566. // Setting VPN Gate Server Configuration
  1567. UINT StSetVgsConfig(ADMIN *a, VGS_CONFIG *t)
  1568. {
  1569. return ERR_NOT_SUPPORTED;
  1570. }
  1571. // Get VPN Gate configuration
  1572. UINT StGetVgsConfig(ADMIN *a, VGS_CONFIG *t)
  1573. {
  1574. return ERR_NOT_SUPPORTED;
  1575. }
  1576. // Get DDNS proxy configuration
  1577. UINT StGetDDnsInternetSetting(ADMIN *a, INTERNET_SETTING *t)
  1578. {
  1579. SERVER *s = a->Server;
  1580. CEDAR *c = s->Cedar;
  1581. UINT ret = ERR_NO_ERROR;
  1582. SERVER_ADMIN_ONLY;
  1583. NO_SUPPORT_FOR_BRIDGE;
  1584. if (s->DDnsClient == NULL)
  1585. {
  1586. return ERR_NOT_SUPPORTED;
  1587. }
  1588. Zero(t, sizeof(INTERNET_SETTING));
  1589. DCGetInternetSetting(s->DDnsClient, t);
  1590. return ret;
  1591. }
  1592. // Set DDNS proxy configuration
  1593. UINT StSetDDnsInternetSetting(ADMIN *a, INTERNET_SETTING *t)
  1594. {
  1595. SERVER *s = a->Server;
  1596. CEDAR *c = s->Cedar;
  1597. UINT ret = ERR_NO_ERROR;
  1598. SERVER_ADMIN_ONLY;
  1599. NO_SUPPORT_FOR_BRIDGE;
  1600. if (s->DDnsClient == NULL)
  1601. {
  1602. return ERR_NOT_SUPPORTED;
  1603. }
  1604. DCSetInternetSetting(s->DDnsClient, t);
  1605. IncrementServerConfigRevision(s);
  1606. return ret;
  1607. }
  1608. // Get Azure status
  1609. UINT StGetAzureStatus(ADMIN *a, RPC_AZURE_STATUS *t)
  1610. {
  1611. SERVER *s = a->Server;
  1612. CEDAR *c = s->Cedar;
  1613. UINT ret = ERR_NO_ERROR;
  1614. AZURE_CLIENT *ac;
  1615. SERVER_ADMIN_ONLY;
  1616. NO_SUPPORT_FOR_BRIDGE;
  1617. if (SiIsAzureSupported(s) == false)
  1618. {
  1619. return ERR_NOT_SUPPORTED;
  1620. }
  1621. ac = s->AzureClient;
  1622. if (ac == NULL)
  1623. {
  1624. return ERR_NOT_SUPPORTED;
  1625. }
  1626. Zero(t, sizeof(RPC_AZURE_STATUS));
  1627. Lock(ac->Lock);
  1628. {
  1629. t->IsConnected = ac->IsConnected;
  1630. t->IsEnabled = ac->IsEnabled;
  1631. }
  1632. Unlock(ac->Lock);
  1633. return ERR_NO_ERROR;
  1634. }
  1635. // Set Azure status
  1636. UINT StSetAzureStatus(ADMIN *a, RPC_AZURE_STATUS *t)
  1637. {
  1638. SERVER *s = a->Server;
  1639. CEDAR *c = s->Cedar;
  1640. UINT ret = ERR_NO_ERROR;
  1641. SERVER_ADMIN_ONLY;
  1642. NO_SUPPORT_FOR_BRIDGE;
  1643. if (SiIsAzureSupported(s) == false)
  1644. {
  1645. return ERR_NOT_SUPPORTED;
  1646. }
  1647. SiSetAzureEnable(s, t->IsEnabled);
  1648. IncrementServerConfigRevision(s);
  1649. return ERR_NO_ERROR;
  1650. }
  1651. // Get special listener status
  1652. UINT StGetSpecialListener(ADMIN *a, RPC_SPECIAL_LISTENER *t)
  1653. {
  1654. SERVER *s = a->Server;
  1655. CEDAR *c = s->Cedar;
  1656. UINT ret = ERR_NO_ERROR;
  1657. SERVER_ADMIN_ONLY;
  1658. NO_SUPPORT_FOR_BRIDGE;
  1659. Zero(t, sizeof(RPC_SPECIAL_LISTENER));
  1660. t->VpnOverDnsListener = s->EnableVpnOverDns;
  1661. t->VpnOverIcmpListener = s->EnableVpnOverIcmp;
  1662. return ERR_NO_ERROR;
  1663. }
  1664. // Set special listener status
  1665. UINT StSetSpecialListener(ADMIN *a, RPC_SPECIAL_LISTENER *t)
  1666. {
  1667. SERVER *s = a->Server;
  1668. CEDAR *c = s->Cedar;
  1669. UINT ret = ERR_NO_ERROR;
  1670. SERVER_ADMIN_ONLY;
  1671. NO_SUPPORT_FOR_BRIDGE;
  1672. // Check ports
  1673. if (t->VpnOverDnsListener && (MAKEBOOL(s->EnableVpnOverDns) != MAKEBOOL(t->VpnOverDnsListener)))
  1674. {
  1675. if (SiCanOpenVpnOverDnsPort() == false)
  1676. {
  1677. return ERR_SPECIAL_LISTENER_DNS_ERROR;
  1678. }
  1679. }
  1680. if (t->VpnOverIcmpListener && (MAKEBOOL(s->EnableVpnOverIcmp) != MAKEBOOL(t->VpnOverIcmpListener)))
  1681. {
  1682. if (SiCanOpenVpnOverIcmpPort() == false)
  1683. {
  1684. return ERR_SPECIAL_LISTENER_ICMP_ERROR;
  1685. }
  1686. }
  1687. s->EnableVpnOverDns = t->VpnOverDnsListener;
  1688. s->EnableVpnOverIcmp = t->VpnOverIcmpListener;
  1689. SiApplySpecialListenerStatus(s);
  1690. ALog(a, NULL, "LA_SET_SPECIAL_LISTENER");
  1691. IncrementServerConfigRevision(s);
  1692. return ERR_NO_ERROR;
  1693. }
  1694. // Set configurations for OpenVPN and SSTP
  1695. UINT StSetOpenVpnSstpConfig(ADMIN *a, OPENVPN_SSTP_CONFIG *t)
  1696. {
  1697. PROTO *proto = a->Server->Proto;
  1698. PROTO_CONTAINER *container, tmp_c;
  1699. PROTO_OPTION *option, tmp_o;
  1700. UINT ret = ERR_NO_ERROR;
  1701. bool changed = false;
  1702. SERVER_ADMIN_ONLY;
  1703. if (proto == NULL)
  1704. {
  1705. return ERR_NOT_SUPPORTED;
  1706. }
  1707. tmp_o.Name = PROTO_OPTION_TOGGLE_NAME;
  1708. tmp_c.Name = "OpenVPN";
  1709. container = Search(proto->Containers, &tmp_c);
  1710. if (container != NULL)
  1711. {
  1712. option = Search(container->Options, &tmp_o);
  1713. if (option != NULL)
  1714. {
  1715. if (option->Type == PROTO_OPTION_BOOL)
  1716. {
  1717. option->Bool = t->EnableOpenVPN;
  1718. changed = true;
  1719. }
  1720. else
  1721. {
  1722. ret = ERR_INVALID_PARAMETER;
  1723. }
  1724. }
  1725. else
  1726. {
  1727. ret = ERR_OBJECT_NOT_FOUND;
  1728. }
  1729. }
  1730. else
  1731. {
  1732. ret = ERR_OBJECT_NOT_FOUND;
  1733. }
  1734. tmp_c.Name = "SSTP";
  1735. container = Search(proto->Containers, &tmp_c);
  1736. if (container != NULL)
  1737. {
  1738. option = Search(container->Options, &tmp_o);
  1739. if (option != NULL)
  1740. {
  1741. if (option->Type == PROTO_OPTION_BOOL)
  1742. {
  1743. option->Bool = t->EnableSSTP;
  1744. changed = true;
  1745. }
  1746. else
  1747. {
  1748. ret = ERR_INVALID_PARAMETER;
  1749. }
  1750. }
  1751. else
  1752. {
  1753. ret = ERR_OBJECT_NOT_FOUND;
  1754. }
  1755. }
  1756. else
  1757. {
  1758. ret = ERR_OBJECT_NOT_FOUND;
  1759. }
  1760. if (changed)
  1761. {
  1762. ALog(a, NULL, "LA_SET_OVPN_SSTP_CONFIG");
  1763. IncrementServerConfigRevision(a->Server);
  1764. }
  1765. return ret;
  1766. }
  1767. // Get configurations for OpenVPN and SSTP
  1768. UINT StGetOpenVpnSstpConfig(ADMIN *a, OPENVPN_SSTP_CONFIG *t)
  1769. {
  1770. PROTO *proto = a->Server->Proto;
  1771. if (proto == NULL)
  1772. {
  1773. return ERR_NOT_SUPPORTED;
  1774. }
  1775. t->EnableOpenVPN = ProtoEnabled(proto, "OpenVPN");
  1776. t->EnableSSTP = ProtoEnabled(proto, "SSTP");
  1777. return ERR_NO_ERROR;
  1778. }
  1779. // Get status of DDNS client
  1780. UINT StGetDDnsClientStatus(ADMIN *a, DDNS_CLIENT_STATUS *t)
  1781. {
  1782. SERVER *s = a->Server;
  1783. CEDAR *c = s->Cedar;
  1784. UINT ret = ERR_NO_ERROR;
  1785. SERVER_ADMIN_ONLY;
  1786. NO_SUPPORT_FOR_BRIDGE;
  1787. if (s->DDnsClient == NULL)
  1788. {
  1789. return ERR_NOT_SUPPORTED;
  1790. }
  1791. Zero(t, sizeof(DDNS_CLIENT_STATUS));
  1792. DCGetStatus(s->DDnsClient, t);
  1793. return ERR_NO_ERROR;
  1794. }
  1795. // Change host-name for DDNS client
  1796. UINT StChangeDDnsClientHostname(ADMIN *a, RPC_TEST *t)
  1797. {
  1798. SERVER *s = a->Server;
  1799. CEDAR *c = s->Cedar;
  1800. UINT ret = ERR_NO_ERROR;
  1801. SERVER_ADMIN_ONLY;
  1802. NO_SUPPORT_FOR_BRIDGE;
  1803. if (s->DDnsClient == NULL)
  1804. {
  1805. return ERR_NOT_SUPPORTED;
  1806. }
  1807. ret = DCChangeHostName(s->DDnsClient, t->StrValue);
  1808. if (ret == ERR_NO_ERROR)
  1809. {
  1810. ALog(a, NULL, "LA_DDNS_HOSTNAME_CHANGED", t->StrValue);
  1811. }
  1812. IncrementServerConfigRevision(s);
  1813. return ret;
  1814. }
  1815. // Regenerate server certification
  1816. UINT StRegenerateServerCert(ADMIN *a, RPC_TEST *t)
  1817. {
  1818. SERVER *s = a->Server;
  1819. CEDAR *c = s->Cedar;
  1820. UINT ret = ERR_NO_ERROR;
  1821. X *x;
  1822. K *k;
  1823. SERVER_ADMIN_ONLY;
  1824. SiGenerateDefaultCertEx(&x, &k, t->StrValue);
  1825. SetCedarCert(c, x, k);
  1826. ALog(a, NULL, "LA_REGENERATE_SERVER_CERT", t->StrValue);
  1827. IncrementServerConfigRevision(s);
  1828. FreeX(x);
  1829. FreeK(k);
  1830. return ERR_NO_ERROR;
  1831. }
  1832. // Generate OpenVPN configuration files
  1833. UINT StMakeOpenVpnConfigFile(ADMIN *a, RPC_READ_LOG_FILE *t)
  1834. {
  1835. SERVER *s = a->Server;
  1836. CEDAR *c = s->Cedar;
  1837. UINT ret = ERR_NO_ERROR;
  1838. ZIP_PACKER *p;
  1839. FIFO *f;
  1840. BUF *readme_buf;
  1841. BUF *readme_pdf_buf;
  1842. BUF *sample_buf;
  1843. LIST *port_list;
  1844. char my_hostname[MAX_SIZE];
  1845. SERVER_ADMIN_ONLY;
  1846. NO_SUPPORT_FOR_BRIDGE;
  1847. if (s->ServerType != SERVER_TYPE_STANDALONE)
  1848. {
  1849. return ERR_NOT_SUPPORTED;
  1850. }
  1851. if (ProtoEnabled(s->Proto, "OpenVPN") == false)
  1852. {
  1853. return ERR_OPENVPN_IS_NOT_ENABLED;
  1854. }
  1855. port_list = s->PortsUDP;
  1856. FreeRpcReadLogFile(t);
  1857. Zero(t, sizeof(RPC_READ_LOG_FILE));
  1858. p = NewZipPacker();
  1859. // readme.txt
  1860. readme_buf = ReadDump("|openvpn_readme.txt");
  1861. // readme.pdf
  1862. readme_pdf_buf = ReadDump("|openvpn_readme.pdf");
  1863. // sample.ovpn
  1864. sample_buf = ReadDump("|openvpn_sample.ovpn");
  1865. // host name
  1866. GetMachineHostName(my_hostname, sizeof(my_hostname));
  1867. my_hostname[16] = 0;
  1868. if (readme_buf == NULL || sample_buf == NULL || readme_pdf_buf == NULL)
  1869. {
  1870. ret = ERR_INTERNAL_ERROR;
  1871. }
  1872. else
  1873. {
  1874. BUF *config_l3_buf, *config_l2_buf;
  1875. X *x = NULL;
  1876. BUF *x_buf;
  1877. char protocol[MAX_SIZE];
  1878. UINT port = OPENVPN_UDP_PORT;
  1879. char port_str[MAX_SIZE];
  1880. char hostname[MAX_SIZE];
  1881. char tag_before_hostname[MAX_SIZE];
  1882. DDNS_CLIENT_STATUS ddns;
  1883. UCHAR *zero_buffer;
  1884. UINT zero_buffer_size = 128 * 1024;
  1885. char name_tmp[MAX_SIZE];
  1886. zero_buffer = ZeroMalloc(zero_buffer_size);
  1887. if (x == NULL)
  1888. {
  1889. Lock(c->lock);
  1890. {
  1891. x = CloneX(c->ServerX);
  1892. }
  1893. Unlock(c->lock);
  1894. if (x != NULL)
  1895. {
  1896. // Get the root certificate
  1897. if (x->root_cert == false)
  1898. {
  1899. X *root_x = NULL;
  1900. LIST *cert_list = NewCertList(true);
  1901. if (TryGetRootCertChain(cert_list, x, true, &root_x))
  1902. {
  1903. FreeX(x);
  1904. x = root_x;
  1905. }
  1906. FreeCertList(cert_list);
  1907. }
  1908. }
  1909. }
  1910. x_buf = XToBuf(x, true);
  1911. SeekBufToEnd(x_buf);
  1912. WriteBufChar(x_buf, 0);
  1913. SeekBufToBegin(x_buf);
  1914. FreeX(x);
  1915. Zero(hostname, sizeof(hostname));
  1916. Zero(tag_before_hostname, sizeof(tag_before_hostname));
  1917. Zero(&ddns, sizeof(ddns));
  1918. if (s->DDnsClient != NULL)
  1919. {
  1920. DCGetStatus(s->DDnsClient, &ddns);
  1921. if (IsEmptyStr(ddns.CurrentHostName) == false && IsEmptyStr(ddns.DnsSuffix) == false &&
  1922. ddns.Err_IPv4 == ERR_NO_ERROR)
  1923. {
  1924. StrCpy(tag_before_hostname, sizeof(tag_before_hostname),
  1925. "# Note: The below hostname is came from the Dynamic DNS Client function\r\n"
  1926. "# which is running on the VPN Server. If you don't want to use\r\n"
  1927. "# the Dynamic DNS hostname, replace it to either IP address or\r\n"
  1928. "# other domain's hostname.\r\n\r\n");
  1929. Format(hostname, sizeof(hostname), "%s.v4%s", ddns.CurrentHostName, ddns.DnsSuffix);
  1930. }
  1931. }
  1932. if (IsEmptyStr(hostname))
  1933. {
  1934. IP myip;
  1935. Zero(&myip, sizeof(myip));
  1936. GetCurrentGlobalIP(&myip, false);
  1937. if (IsZeroIP(&myip))
  1938. {
  1939. GetCurrentGlobalIPGuess(&myip, false);
  1940. }
  1941. IPToStr(hostname, sizeof(hostname), &myip);
  1942. }
  1943. SeekBuf(sample_buf, sample_buf->Size, 0);
  1944. WriteBuf(sample_buf, zero_buffer, zero_buffer_size);
  1945. config_l3_buf = CloneBuf(sample_buf);
  1946. config_l2_buf = CloneBuf(sample_buf);
  1947. // Generate contents of configuration
  1948. if (LIST_NUM(port_list) >= 1)
  1949. {
  1950. StrCpy(protocol, sizeof(protocol), "udp");
  1951. if (IsIntInList(port_list, OPENVPN_UDP_PORT))
  1952. {
  1953. port = OPENVPN_UDP_PORT;
  1954. }
  1955. else
  1956. {
  1957. port = *((UINT *)(LIST_DATA(port_list, 0)));
  1958. }
  1959. }
  1960. else
  1961. {
  1962. RPC_LISTENER_LIST tt;
  1963. UINT i;
  1964. port = 0;
  1965. StrCpy(protocol, sizeof(protocol), "tcp");
  1966. Zero(&tt, sizeof(tt));
  1967. StEnumListener(a, &tt);
  1968. for (i = 0;i < tt.NumPort;i++)
  1969. {
  1970. if (tt.Enables[i] && tt.Errors[i] == false)
  1971. {
  1972. port = tt.Ports[i];
  1973. break;
  1974. }
  1975. }
  1976. FreeRpcListenerList(&tt);
  1977. if (port == 0)
  1978. {
  1979. StrCpy(protocol, sizeof(protocol), "udp");
  1980. port = OPENVPN_UDP_PORT;
  1981. }
  1982. }
  1983. ToStr(port_str, port);
  1984. if (IsEmptyStr(my_hostname) == false)
  1985. {
  1986. StrCat(my_hostname, sizeof(my_hostname), "_");
  1987. StrLower(my_hostname);
  1988. }
  1989. ZipAddFileSimple(p, "readme.txt", LocalTime64(), 0, readme_buf->Buf, readme_buf->Size);
  1990. ZipAddFileSimple(p, "readme.pdf", LocalTime64(), 0, readme_pdf_buf->Buf, readme_pdf_buf->Size);
  1991. ReplaceStrEx((char *)config_l3_buf->Buf, config_l3_buf->Size, (char *)config_l3_buf->Buf,
  1992. "$TAG_TUN_TAP$", "tun", false);
  1993. ReplaceStrEx((char *)config_l3_buf->Buf, config_l3_buf->Size, (char *)config_l3_buf->Buf,
  1994. "$TAG_PROTO$", protocol, false);
  1995. ReplaceStrEx((char *)config_l3_buf->Buf, config_l3_buf->Size, (char *)config_l3_buf->Buf,
  1996. "$TAG_HOSTNAME$", hostname, false);
  1997. ReplaceStrEx((char *)config_l3_buf->Buf, config_l3_buf->Size, (char *)config_l3_buf->Buf,
  1998. "$TAG_BEFORE_REMOTE$", tag_before_hostname, false);
  1999. ReplaceStrEx((char *)config_l3_buf->Buf, config_l3_buf->Size, (char *)config_l3_buf->Buf,
  2000. "$TAG_PORT$", port_str, false);
  2001. if (x_buf != NULL)
  2002. {
  2003. ReplaceStrEx((char *)config_l3_buf->Buf, config_l3_buf->Size, (char *)config_l3_buf->Buf,
  2004. "$CA$", x_buf->Buf, false);
  2005. }
  2006. Format(name_tmp, sizeof(name_tmp), "%sopenvpn_remote_access_l3.ovpn", my_hostname);
  2007. ZipAddFileSimple(p, name_tmp, LocalTime64(), 0, config_l3_buf->Buf, StrLen(config_l3_buf->Buf));
  2008. ReplaceStrEx((char *)config_l2_buf->Buf, config_l2_buf->Size, (char *)config_l2_buf->Buf,
  2009. "$TAG_TUN_TAP$", "tap", false);
  2010. ReplaceStrEx((char *)config_l2_buf->Buf, config_l2_buf->Size, (char *)config_l2_buf->Buf,
  2011. "$TAG_PROTO$", protocol, false);
  2012. ReplaceStrEx((char *)config_l2_buf->Buf, config_l2_buf->Size, (char *)config_l2_buf->Buf,
  2013. "$TAG_HOSTNAME$", hostname, false);
  2014. ReplaceStrEx((char *)config_l2_buf->Buf, config_l2_buf->Size, (char *)config_l2_buf->Buf,
  2015. "$TAG_BEFORE_REMOTE$", tag_before_hostname, false);
  2016. ReplaceStrEx((char *)config_l2_buf->Buf, config_l2_buf->Size, (char *)config_l2_buf->Buf,
  2017. "$TAG_PORT$", port_str, false);
  2018. if (x_buf != NULL)
  2019. {
  2020. ReplaceStrEx((char *)config_l2_buf->Buf, config_l2_buf->Size, (char *)config_l2_buf->Buf,
  2021. "$CA$", x_buf->Buf, false);
  2022. }
  2023. Format(name_tmp, sizeof(name_tmp), "%sopenvpn_site_to_site_bridge_l2.ovpn", my_hostname);
  2024. ZipAddFileSimple(p, name_tmp, LocalTime64(), 0, config_l2_buf->Buf, StrLen(config_l2_buf->Buf));
  2025. FreeBuf(config_l3_buf);
  2026. FreeBuf(config_l2_buf);
  2027. f = ZipFinish(p);
  2028. if (f != NULL)
  2029. {
  2030. t->Buffer = NewBuf();
  2031. WriteBuf(t->Buffer, FifoPtr(f), FifoSize(f));
  2032. SeekBuf(t->Buffer, 0, 0);
  2033. }
  2034. FreeBuf(readme_buf);
  2035. FreeBuf(sample_buf);
  2036. FreeBuf(readme_pdf_buf);
  2037. FreeBuf(x_buf);
  2038. Free(zero_buffer);
  2039. }
  2040. FreeZipPacker(p);
  2041. return ERR_NO_ERROR;
  2042. }
  2043. // Set IPsec service configuration
  2044. UINT StSetIPsecServices(ADMIN *a, IPSEC_SERVICES *t)
  2045. {
  2046. SERVER *s = a->Server;
  2047. CEDAR *c = s->Cedar;
  2048. UINT ret = ERR_NO_ERROR;
  2049. SERVER_ADMIN_ONLY;
  2050. NO_SUPPORT_FOR_BRIDGE;
  2051. if (GetServerCapsBool(s, "b_support_ipsec") == false || s->IPsecServer == NULL)
  2052. {
  2053. return ERR_NOT_SUPPORTED;
  2054. }
  2055. IPsecServerSetServices(s->IPsecServer, t);
  2056. ALog(a, NULL, "LA_SET_IPSEC_CONFIG");
  2057. IncrementServerConfigRevision(s);
  2058. return ERR_NO_ERROR;
  2059. }
  2060. // Get IPsec service configuration
  2061. UINT StGetIPsecServices(ADMIN *a, IPSEC_SERVICES *t)
  2062. {
  2063. SERVER *s = a->Server;
  2064. CEDAR *c = s->Cedar;
  2065. UINT ret = ERR_NO_ERROR;
  2066. SERVER_ADMIN_ONLY;
  2067. NO_SUPPORT_FOR_BRIDGE;
  2068. if (GetServerCapsBool(s, "b_support_ipsec") == false || s->IPsecServer == NULL)
  2069. {
  2070. return ERR_NOT_SUPPORTED;
  2071. }
  2072. Zero(t, sizeof(IPSEC_SERVICES));
  2073. IPsecServerGetServices(s->IPsecServer, t);
  2074. return ERR_NO_ERROR;
  2075. }
  2076. // Add EtherIP ID setting
  2077. UINT StAddEtherIpId(ADMIN *a, ETHERIP_ID *t)
  2078. {
  2079. SERVER *s = a->Server;
  2080. CEDAR *c = s->Cedar;
  2081. UINT ret = ERR_NO_ERROR;
  2082. SERVER_ADMIN_ONLY;
  2083. NO_SUPPORT_FOR_BRIDGE;
  2084. if (GetServerCapsBool(s, "b_support_ipsec") == false || s->IPsecServer == NULL)
  2085. {
  2086. return ERR_NOT_SUPPORTED;
  2087. }
  2088. AddEtherIPId(s->IPsecServer, t);
  2089. ALog(a, NULL, "LA_ADD_ETHERIP_ID", t->Id);
  2090. IncrementServerConfigRevision(s);
  2091. return ERR_NO_ERROR;
  2092. }
  2093. // Get EtherIP ID setting
  2094. UINT StGetEtherIpId(ADMIN *a, ETHERIP_ID *t)
  2095. {
  2096. SERVER *s = a->Server;
  2097. CEDAR *c = s->Cedar;
  2098. UINT ret = ERR_NO_ERROR;
  2099. char id[MAX_SIZE];
  2100. SERVER_ADMIN_ONLY;
  2101. NO_SUPPORT_FOR_BRIDGE;
  2102. if (GetServerCapsBool(s, "b_support_ipsec") == false || s->IPsecServer == NULL)
  2103. {
  2104. return ERR_NOT_SUPPORTED;
  2105. }
  2106. StrCpy(id, sizeof(id), t->Id);
  2107. Zero(t, sizeof(ETHERIP_ID));
  2108. if (SearchEtherIPId(s->IPsecServer, t, id) == false)
  2109. {
  2110. return ERR_OBJECT_NOT_FOUND;
  2111. }
  2112. return ERR_NO_ERROR;
  2113. }
  2114. // Delete EtherIP ID setting
  2115. UINT StDeleteEtherIpId(ADMIN *a, ETHERIP_ID *t)
  2116. {
  2117. SERVER *s = a->Server;
  2118. CEDAR *c = s->Cedar;
  2119. UINT ret = ERR_NO_ERROR;
  2120. char id[MAX_SIZE];
  2121. SERVER_ADMIN_ONLY;
  2122. NO_SUPPORT_FOR_BRIDGE;
  2123. if (GetServerCapsBool(s, "b_support_ipsec") == false || s->IPsecServer == NULL)
  2124. {
  2125. return ERR_NOT_SUPPORTED;
  2126. }
  2127. StrCpy(id, sizeof(id), t->Id);
  2128. if (DeleteEtherIPId(s->IPsecServer, id) == false)
  2129. {
  2130. return ERR_OBJECT_NOT_FOUND;
  2131. }
  2132. ALog(a, NULL, "LA_DEL_ETHERIP_ID", id);
  2133. IncrementServerConfigRevision(s);
  2134. return ERR_NO_ERROR;
  2135. }
  2136. // Enumerate EtherIP ID settings
  2137. UINT StEnumEtherIpId(ADMIN *a, RPC_ENUM_ETHERIP_ID *t)
  2138. {
  2139. SERVER *s = a->Server;
  2140. CEDAR *c = s->Cedar;
  2141. UINT ret = ERR_NO_ERROR;
  2142. SERVER_ADMIN_ONLY;
  2143. NO_SUPPORT_FOR_BRIDGE;
  2144. if (GetServerCapsBool(s, "b_support_ipsec") == false || s->IPsecServer == NULL)
  2145. {
  2146. return ERR_NOT_SUPPORTED;
  2147. }
  2148. FreeRpcEnumEtherIpId(t);
  2149. Zero(t, sizeof(RPC_ENUM_ETHERIP_ID));
  2150. Lock(s->IPsecServer->LockSettings);
  2151. {
  2152. UINT i;
  2153. UINT num;
  2154. num = LIST_NUM(s->IPsecServer->EtherIPIdList);
  2155. t->NumItem = num;
  2156. t->IdList = ZeroMalloc(sizeof(ETHERIP_ID) * num);
  2157. for (i = 0;i < num;i++)
  2158. {
  2159. ETHERIP_ID *d = &t->IdList[i];
  2160. ETHERIP_ID *src = LIST_DATA(s->IPsecServer->EtherIPIdList, i);
  2161. Copy(d, src, sizeof(ETHERIP_ID));
  2162. }
  2163. }
  2164. Unlock(s->IPsecServer->LockSettings);
  2165. return ERR_NO_ERROR;
  2166. }
  2167. // Set message of today on hub
  2168. UINT StSetHubMsg(ADMIN *a, RPC_MSG *t)
  2169. {
  2170. SERVER *s = a->Server;
  2171. CEDAR *c = s->Cedar;
  2172. HUB *h;
  2173. UINT ret = ERR_NO_ERROR;
  2174. char hubname[MAX_HUBNAME_LEN + 1];
  2175. CHECK_RIGHT;
  2176. NO_SUPPORT_FOR_BRIDGE;
  2177. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  2178. {
  2179. return ERR_NOT_SUPPORTED;
  2180. }
  2181. if (UniStrLen(t->Msg) > HUB_MAXMSG_LEN)
  2182. {
  2183. return ERR_MEMORY_NOT_ENOUGH;
  2184. }
  2185. StrCpy(hubname, sizeof(hubname), t->HubName);
  2186. h = GetHub(c, hubname);
  2187. if (h == NULL)
  2188. {
  2189. ret = ERR_HUB_NOT_FOUND;
  2190. }
  2191. else
  2192. {
  2193. if (a->ServerAdmin == false && GetHubAdminOption(h, "no_change_msg") != 0)
  2194. {
  2195. ret = ERR_NOT_ENOUGH_RIGHT;
  2196. }
  2197. else
  2198. {
  2199. SetHubMsg(h, t->Msg);
  2200. }
  2201. ReleaseHub(h);
  2202. }
  2203. IncrementServerConfigRevision(s);
  2204. return ret;
  2205. }
  2206. // Get message of today on hub
  2207. UINT StGetHubMsg(ADMIN *a, RPC_MSG *t)
  2208. {
  2209. SERVER *s = a->Server;
  2210. CEDAR *c = s->Cedar;
  2211. HUB *h;
  2212. UINT ret = ERR_NO_ERROR;
  2213. char hubname[MAX_HUBNAME_LEN + 1];
  2214. CHECK_RIGHT;
  2215. NO_SUPPORT_FOR_BRIDGE;
  2216. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  2217. {
  2218. return ERR_NOT_SUPPORTED;
  2219. }
  2220. if (UniStrLen(t->Msg) > HUB_MAXMSG_LEN)
  2221. {
  2222. return ERR_MEMORY_NOT_ENOUGH;
  2223. }
  2224. StrCpy(hubname, sizeof(hubname), t->HubName);
  2225. h = GetHub(c, hubname);
  2226. if (h == NULL)
  2227. {
  2228. ret = ERR_HUB_NOT_FOUND;
  2229. }
  2230. else
  2231. {
  2232. FreeRpcMsg(t);
  2233. Zero(t, sizeof(RPC_MSG));
  2234. t->Msg = GetHubMsg(h);
  2235. ReleaseHub(h);
  2236. }
  2237. return ret;
  2238. }
  2239. // Do debug function
  2240. UINT StDebug(ADMIN *a, RPC_TEST *t)
  2241. {
  2242. SERVER *s = a->Server;
  2243. CEDAR *c = s->Cedar;
  2244. UINT ret = ERR_NO_ERROR;
  2245. RPC_TEST t2;
  2246. SERVER_ADMIN_ONLY;
  2247. Zero(&t2, sizeof(t2));
  2248. ret = SiDebug(s, &t2, t->IntValue, t->StrValue);
  2249. if (ret == ERR_NO_ERROR)
  2250. {
  2251. Copy(t, &t2, sizeof(RPC_TEST));
  2252. }
  2253. else
  2254. {
  2255. Zero(t, sizeof(RPC_TEST));
  2256. }
  2257. return ret;
  2258. }
  2259. // Flush configuration file
  2260. UINT StFlush(ADMIN *a, RPC_TEST *t)
  2261. {
  2262. SERVER *s = a->Server;
  2263. CEDAR *c = s->Cedar;
  2264. UINT ret = ERR_NO_ERROR;
  2265. UINT size;
  2266. SERVER_ADMIN_ONLY;
  2267. size = SiWriteConfigurationFile(s);
  2268. t->IntValue = size;
  2269. return ERR_NO_ERROR;
  2270. }
  2271. // Do Crash
  2272. UINT StCrash(ADMIN *a, RPC_TEST *t)
  2273. {
  2274. SERVER *s = a->Server;
  2275. CEDAR *c = s->Cedar;
  2276. UINT ret = ERR_NO_ERROR;
  2277. SERVER_ADMIN_ONLY;
  2278. #ifdef OS_WIN32
  2279. MsSetEnableMinidump(false);
  2280. #endif // OS_WIN32
  2281. CrashNow();
  2282. return ERR_NO_ERROR;
  2283. }
  2284. // Get message for administrators
  2285. UINT StGetAdminMsg(ADMIN *a, RPC_MSG *t)
  2286. {
  2287. SERVER *s = a->Server;
  2288. CEDAR *c = s->Cedar;
  2289. UINT ret = ERR_NO_ERROR;
  2290. RPC_WINVER server_ver;
  2291. RPC_WINVER client_ver;
  2292. wchar_t winver_msg_client[3800];
  2293. wchar_t winver_msg_server[3800];
  2294. UINT tmpsize;
  2295. wchar_t *tmp;
  2296. FreeRpcMsg(t);
  2297. Zero(t, sizeof(RPC_MSG));
  2298. // Check for Windows version
  2299. GetWinVer(&server_ver);
  2300. Copy(&client_ver, &a->ClientWinVer, sizeof(RPC_WINVER));
  2301. Zero(winver_msg_client, sizeof(winver_msg_client));
  2302. Zero(winver_msg_server, sizeof(winver_msg_server));
  2303. if (IsSupportedWinVer(&client_ver) == false)
  2304. {
  2305. SYSTEMTIME st;
  2306. LocalTime(&st);
  2307. UniFormat(winver_msg_client, sizeof(winver_msg_client), _UU("WINVER_ERROR_FORMAT"),
  2308. _UU("WINVER_ERROR_PC_LOCAL"),
  2309. client_ver.Title,
  2310. _UU("WINVER_ERROR_VPNSERVER"),
  2311. SUPPORTED_WINDOWS_LIST,
  2312. _UU("WINVER_ERROR_PC_LOCAL"),
  2313. _UU("WINVER_ERROR_VPNSERVER"),
  2314. _UU("WINVER_ERROR_VPNSERVER"),
  2315. _UU("WINVER_ERROR_VPNSERVER"),
  2316. st.wYear, st.wMonth);
  2317. }
  2318. if (IsSupportedWinVer(&server_ver) == false)
  2319. {
  2320. SYSTEMTIME st;
  2321. LocalTime(&st);
  2322. UniFormat(winver_msg_server, sizeof(winver_msg_server), _UU("WINVER_ERROR_FORMAT"),
  2323. _UU("WINVER_ERROR_PC_REMOTE"),
  2324. server_ver.Title,
  2325. _UU("WINVER_ERROR_VPNSERVER"),
  2326. SUPPORTED_WINDOWS_LIST,
  2327. _UU("WINVER_ERROR_PC_REMOTE"),
  2328. _UU("WINVER_ERROR_VPNSERVER"),
  2329. _UU("WINVER_ERROR_VPNSERVER"),
  2330. _UU("WINVER_ERROR_VPNSERVER"),
  2331. st.wYear, st.wMonth);
  2332. }
  2333. tmpsize = UniStrSize(winver_msg_client) + UniStrSize(winver_msg_server) + 10000;
  2334. tmp = ZeroMalloc(tmpsize);
  2335. if (
  2336. c->Bridge == false)
  2337. {
  2338. if (GetGlobalServerFlag(GSF_SHOW_OSS_MSG) != 0)
  2339. {
  2340. UniStrCat(tmp, tmpsize, _UU("OSS_MSG"));
  2341. }
  2342. }
  2343. UniStrCat(tmp, tmpsize, winver_msg_client);
  2344. UniStrCat(tmp, tmpsize, winver_msg_server);
  2345. t->Msg = tmp;
  2346. return ERR_NO_ERROR;
  2347. }
  2348. // Enumerate VLAN tag transparent setting
  2349. UINT StEnumEthVLan(ADMIN *a, RPC_ENUM_ETH_VLAN *t)
  2350. {
  2351. SERVER *s = a->Server;
  2352. CEDAR *c = s->Cedar;
  2353. UINT ret = ERR_NO_ERROR;
  2354. SERVER_ADMIN_ONLY;
  2355. #ifdef OS_WIN32
  2356. if (GetServerCapsBool(s, "b_support_eth_vlan") == false)
  2357. {
  2358. ret = ERR_NOT_SUPPORTED;
  2359. }
  2360. else
  2361. {
  2362. FreeRpcEnumEthVLan(t);
  2363. Zero(t, sizeof(RPC_ENUM_ETH_VLAN));
  2364. if (EnumEthVLanWin32(t) == false)
  2365. {
  2366. ret = ERR_INTERNAL_ERROR;
  2367. }
  2368. }
  2369. #else // OS_WIN32
  2370. ret = ERR_NOT_SUPPORTED;
  2371. #endif // OS_WIN32
  2372. return ret;
  2373. }
  2374. // Set VLAN tag transparent setting
  2375. UINT StSetEnableEthVLan(ADMIN *a, RPC_TEST *t)
  2376. {
  2377. SERVER *s = a->Server;
  2378. CEDAR *c = s->Cedar;
  2379. UINT ret = ERR_NO_ERROR;
  2380. SERVER_ADMIN_ONLY;
  2381. #ifdef OS_WIN32
  2382. if (GetServerCapsBool(s, "b_support_eth_vlan") == false)
  2383. {
  2384. ret = ERR_NOT_SUPPORTED;
  2385. }
  2386. else if (MsIsAdmin() == false)
  2387. {
  2388. ret = ERR_NOT_ENOUGH_RIGHT;
  2389. }
  2390. else
  2391. {
  2392. if (SetVLanEnableStatus(t->StrValue, MAKEBOOL(t->IntValue)) == false)
  2393. {
  2394. ret = ERR_INTERNAL_ERROR;
  2395. }
  2396. }
  2397. #else // OS_WIN32
  2398. ret = ERR_NOT_SUPPORTED;
  2399. #endif // OS_WIN32
  2400. return ret;
  2401. }
  2402. // Get license status
  2403. UINT StGetLicenseStatus(ADMIN *a, RPC_LICENSE_STATUS *t)
  2404. {
  2405. return ERR_NOT_SUPPORTED;
  2406. }
  2407. // Enumerate license key
  2408. UINT StEnumLicenseKey(ADMIN *a, RPC_ENUM_LICENSE_KEY *t)
  2409. {
  2410. return ERR_NOT_SUPPORTED;
  2411. }
  2412. // Add new license key
  2413. UINT StAddLicenseKey(ADMIN *a, RPC_TEST *t)
  2414. {
  2415. return ERR_NOT_SUPPORTED;
  2416. }
  2417. // Delete a license key
  2418. UINT StDelLicenseKey(ADMIN *a, RPC_TEST *t)
  2419. {
  2420. return ERR_NOT_SUPPORTED;
  2421. }
  2422. // Download a log file
  2423. BUF *DownloadFileFromServer(RPC *r, char *server_name, char *filepath, UINT total_size, DOWNLOAD_PROC *proc, void *param)
  2424. {
  2425. UINT offset;
  2426. BUF *buf;
  2427. // Validate arguments
  2428. if (r == NULL || filepath == NULL)
  2429. {
  2430. return NULL;
  2431. }
  2432. if (server_name == NULL)
  2433. {
  2434. server_name = "";
  2435. }
  2436. offset = 0;
  2437. buf = NewBuf();
  2438. while (true)
  2439. {
  2440. DOWNLOAD_PROGRESS g;
  2441. RPC_READ_LOG_FILE t;
  2442. UINT ret;
  2443. Zero(&t, sizeof(t));
  2444. StrCpy(t.FilePath, sizeof(t.FilePath), filepath);
  2445. t.Offset = offset;
  2446. StrCpy(t.ServerName, sizeof(t.ServerName), server_name);
  2447. ret = ScReadLogFile(r, &t);
  2448. if (ret != ERR_NO_ERROR)
  2449. {
  2450. // Failed
  2451. FreeRpcReadLogFile(&t);
  2452. FreeBuf(buf);
  2453. return NULL;
  2454. }
  2455. if (t.Buffer == NULL)
  2456. {
  2457. // read to the end
  2458. break;
  2459. }
  2460. // Update current progress
  2461. offset += t.Buffer->Size;
  2462. Zero(&g, sizeof(g));
  2463. g.Param = param;
  2464. g.CurrentSize = offset;
  2465. g.TotalSize = MAX(total_size, offset);
  2466. g.ProgressPercent = (UINT)(MAKESURE((UINT64)g.CurrentSize * 100ULL / (UINT64)(MAX(g.TotalSize, 1)), 0, 100ULL));
  2467. WriteBuf(buf, t.Buffer->Buf, t.Buffer->Size);
  2468. FreeRpcReadLogFile(&t);
  2469. if (proc != NULL)
  2470. {
  2471. if (proc(&g) == false)
  2472. {
  2473. // Canceled by user
  2474. FreeBuf(buf);
  2475. return NULL;
  2476. }
  2477. }
  2478. }
  2479. if (buf->Size == 0)
  2480. {
  2481. // Downloading failed
  2482. FreeBuf(buf);
  2483. return NULL;
  2484. }
  2485. return buf;
  2486. }
  2487. // Read a log file
  2488. UINT StReadLogFile(ADMIN *a, RPC_READ_LOG_FILE *t)
  2489. {
  2490. SERVER *s = a->Server;
  2491. CEDAR *c = s->Cedar;
  2492. char logfilename[MAX_PATH];
  2493. char servername[MAX_HOST_NAME_LEN + 1];
  2494. UINT offset;
  2495. bool local = true;
  2496. if (IsEmptyStr(t->FilePath))
  2497. {
  2498. return ERR_INVALID_PARAMETER;
  2499. }
  2500. StrCpy(logfilename, sizeof(logfilename), t->FilePath);
  2501. StrCpy(servername, sizeof(servername), t->ServerName);
  2502. offset = t->Offset;
  2503. if (s->ServerType != SERVER_TYPE_FARM_CONTROLLER)
  2504. {
  2505. GetMachineName(servername, sizeof(servername));
  2506. }
  2507. // Check the permission to read the log file
  2508. if (a->LogFileList == NULL)
  2509. {
  2510. // Enum the log files first
  2511. RPC_ENUM_LOG_FILE elf;
  2512. UINT elf_ret;
  2513. Zero(&elf, sizeof(elf));
  2514. elf_ret = StEnumLogFile(a, &elf);
  2515. FreeRpcEnumLogFile(&elf);
  2516. if (elf_ret != ERR_NO_ERROR)
  2517. {
  2518. return elf_ret;
  2519. }
  2520. }
  2521. if (CheckLogFileNameFromEnumList(a->LogFileList, logfilename, servername) == false)
  2522. {
  2523. // There is no such file in the log file list
  2524. return ERR_OBJECT_NOT_FOUND;
  2525. }
  2526. FreeRpcReadLogFile(t);
  2527. Zero(t, sizeof(RPC_READ_LOG_FILE));
  2528. if (s->ServerType == SERVER_TYPE_FARM_CONTROLLER)
  2529. {
  2530. UINT i;
  2531. // When the host name in request is a cluster member, redirect the request
  2532. LockList(s->FarmMemberList);
  2533. {
  2534. for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
  2535. {
  2536. FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
  2537. if (f->Me == false)
  2538. {
  2539. if (StrCmpi(f->hostname, servername) == 0)
  2540. {
  2541. RPC_READ_LOG_FILE tt;
  2542. Zero(&tt, sizeof(tt));
  2543. local = false;
  2544. StrCpy(tt.ServerName, sizeof(tt.ServerName), servername);
  2545. StrCpy(tt.FilePath, sizeof(tt.FilePath), logfilename);
  2546. tt.Offset = offset;
  2547. if (SiCallReadLogFile(s, f, &tt))
  2548. {
  2549. if (tt.Buffer != NULL && tt.Buffer->Size > 0)
  2550. {
  2551. t->Buffer = NewBuf();
  2552. WriteBuf(t->Buffer, tt.Buffer->Buf, tt.Buffer->Size);
  2553. }
  2554. }
  2555. FreeRpcReadLogFile(&tt);
  2556. break;
  2557. }
  2558. }
  2559. }
  2560. }
  2561. UnlockList(s->FarmMemberList);
  2562. }
  2563. // Read a local file
  2564. if (local)
  2565. {
  2566. SiReadLocalLogFile(s, logfilename, offset, t);
  2567. }
  2568. if (offset == 0)
  2569. {
  2570. ALog(a, NULL, "LA_READ_LOG_FILE", servername, logfilename);
  2571. }
  2572. StrCpy(t->FilePath, sizeof(t->FilePath), logfilename);
  2573. StrCpy(t->ServerName, sizeof(t->ServerName), servername);
  2574. t->Offset = offset;
  2575. return ERR_NO_ERROR;
  2576. }
  2577. // Enumerate log files
  2578. UINT StEnumLogFile(ADMIN *a, RPC_ENUM_LOG_FILE *t)
  2579. {
  2580. SERVER *s = a->Server;
  2581. CEDAR *c = s->Cedar;
  2582. UINT i;
  2583. bool no_access = false;
  2584. HUB *h;
  2585. if (a->ServerAdmin == false)
  2586. {
  2587. h = GetHub(c, a->HubName);
  2588. if (a->ServerAdmin == false && GetHubAdminOption(h, "no_read_log_file") != 0)
  2589. {
  2590. no_access = true;
  2591. }
  2592. ReleaseHub(h);
  2593. }
  2594. else
  2595. {
  2596. if (s->ServerType == SERVER_TYPE_FARM_CONTROLLER)
  2597. {
  2598. // Since Management session will become unstable if log files are
  2599. // enumerated on a cluster controller, it forbids.
  2600. return ERR_NOT_SUPPORTED;
  2601. }
  2602. }
  2603. if (no_access)
  2604. {
  2605. return ERR_NOT_ENOUGH_RIGHT;
  2606. }
  2607. FreeRpcEnumLogFile(t);
  2608. Zero(t, sizeof(RPC_ENUM_LOG_FILE));
  2609. // Enumerate local log files
  2610. SiEnumLocalLogFileList(s, a->ServerAdmin ? NULL : a->HubName, t);
  2611. if (s->ServerType == SERVER_TYPE_FARM_CONTROLLER)
  2612. {
  2613. UINT i;
  2614. LIST *tt_list = NewListFast(NULL);
  2615. LockList(s->FarmMemberList);
  2616. {
  2617. for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
  2618. {
  2619. FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
  2620. if (f->Me == false)
  2621. {
  2622. // Enumerate log files on other cluster members.
  2623. RPC_ENUM_LOG_FILE *tt;
  2624. tt = ZeroMalloc(sizeof(RPC_ENUM_LOG_FILE));
  2625. if (SiCallEnumLogFileList(s, f, tt, a->ServerAdmin ? "" : a->HubName))
  2626. {
  2627. UINT i;
  2628. for (i = 0;i < tt->NumItem;i++)
  2629. {
  2630. RPC_ENUM_LOG_FILE_ITEM *e = &tt->Items[i];
  2631. StrCpy(e->ServerName, sizeof(e->ServerName), f->hostname);
  2632. }
  2633. Add(tt_list, tt);
  2634. }
  2635. else
  2636. {
  2637. Free(tt);
  2638. }
  2639. }
  2640. }
  2641. }
  2642. UnlockList(s->FarmMemberList);
  2643. for (i = 0;i < LIST_NUM(tt_list);i++)
  2644. {
  2645. RPC_ENUM_LOG_FILE *tt = LIST_DATA(tt_list, i);
  2646. AdjoinRpcEnumLogFile(t, tt);
  2647. FreeRpcEnumLogFile(tt);
  2648. Free(tt);
  2649. }
  2650. ReleaseList(tt_list);
  2651. }
  2652. // Cache the last list of log files on RPC session
  2653. if (a->LogFileList != NULL)
  2654. {
  2655. FreeEnumLogFile(a->LogFileList);
  2656. }
  2657. a->LogFileList = NewListFast(CmpLogFile);
  2658. for (i = 0;i < t->NumItem;i++)
  2659. {
  2660. RPC_ENUM_LOG_FILE_ITEM *e = &t->Items[i];
  2661. LOG_FILE *f = ZeroMalloc(sizeof(LOG_FILE));
  2662. f->FileSize = e->FileSize;
  2663. f->UpdatedTime = e->UpdatedTime;
  2664. StrCpy(f->Path, sizeof(f->Path), e->FilePath);
  2665. StrCpy(f->ServerName, sizeof(f->ServerName), e->ServerName);
  2666. Insert(a->LogFileList, f);
  2667. }
  2668. return ERR_NO_ERROR;
  2669. }
  2670. // Get access control list
  2671. UINT StGetAcList(ADMIN *a, RPC_AC_LIST *t)
  2672. {
  2673. SERVER *s = a->Server;
  2674. CEDAR *c = s->Cedar;
  2675. HUB *h;
  2676. UINT ret = ERR_NO_ERROR;
  2677. char hubname[MAX_HUBNAME_LEN + 1];
  2678. CHECK_RIGHT;
  2679. NO_SUPPORT_FOR_BRIDGE;
  2680. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  2681. {
  2682. return ERR_NOT_SUPPORTED;
  2683. }
  2684. StrCpy(hubname, sizeof(hubname), t->HubName);
  2685. FreeRpcAcList(t);
  2686. Zero(t, sizeof(RPC_AC_LIST));
  2687. StrCpy(t->HubName, sizeof(t->HubName), hubname);
  2688. h = GetHub(c, hubname);
  2689. if (h == NULL)
  2690. {
  2691. ret = ERR_HUB_NOT_FOUND;
  2692. }
  2693. else
  2694. {
  2695. if (h->HubDb == NULL)
  2696. {
  2697. ret = ERR_NOT_SUPPORTED;
  2698. }
  2699. else
  2700. {
  2701. HUBDB *db = h->HubDb;
  2702. LockList(db->AcList);
  2703. {
  2704. t->o = NewAcList();
  2705. SetAcList(t->o, db->AcList);
  2706. }
  2707. UnlockList(db->AcList);
  2708. }
  2709. ReleaseHub(h);
  2710. }
  2711. return ret;
  2712. }
  2713. // Set access control list
  2714. UINT StSetAcList(ADMIN *a, RPC_AC_LIST *t)
  2715. {
  2716. SERVER *s = a->Server;
  2717. CEDAR *c = s->Cedar;
  2718. HUB *h;
  2719. UINT ret = ERR_NO_ERROR;
  2720. char hubname[MAX_HUBNAME_LEN + 1];
  2721. if (c->Bridge)
  2722. {
  2723. return ERR_NOT_SUPPORTED;
  2724. }
  2725. if (GetGlobalServerFlag(GSF_DISABLE_AC) != 0 && LIST_NUM(t->o) >= 1)
  2726. {
  2727. return ERR_NOT_SUPPORTED_FUNCTION_ON_OPENSOURCE;
  2728. }
  2729. CHECK_RIGHT;
  2730. NO_SUPPORT_FOR_BRIDGE;
  2731. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  2732. {
  2733. return ERR_NOT_SUPPORTED;
  2734. }
  2735. StrCpy(hubname, sizeof(hubname), t->HubName);
  2736. h = GetHub(c, hubname);
  2737. if (h == NULL)
  2738. {
  2739. ret = ERR_HUB_NOT_FOUND;
  2740. }
  2741. else
  2742. {
  2743. if (a->ServerAdmin == false && GetHubAdminOption(h, "no_change_access_control_list") != 0)
  2744. {
  2745. ret = ERR_NOT_ENOUGH_RIGHT;
  2746. }
  2747. else
  2748. {
  2749. if (h->HubDb == NULL)
  2750. {
  2751. ret = ERR_NOT_SUPPORTED;
  2752. }
  2753. else
  2754. {
  2755. HUBDB *db = h->HubDb;
  2756. LockList(db->AcList);
  2757. {
  2758. SetAcList(db->AcList, t->o);
  2759. {
  2760. ALog(a, h, "LA_SET_AC_LIST", LIST_NUM(t->o));
  2761. IncrementServerConfigRevision(s);
  2762. }
  2763. }
  2764. UnlockList(db->AcList);
  2765. }
  2766. }
  2767. ReleaseHub(h);
  2768. }
  2769. return ret;
  2770. }
  2771. // Set CRL (Certificate Revocation List) entry
  2772. UINT StSetCrl(ADMIN *a, RPC_CRL *t)
  2773. {
  2774. SERVER *s = a->Server;
  2775. CEDAR *c = s->Cedar;
  2776. HUB *h;
  2777. UINT ret = ERR_NO_ERROR;
  2778. UINT key;
  2779. char hubname[MAX_HUBNAME_LEN + 1];
  2780. CHECK_RIGHT;
  2781. NO_SUPPORT_FOR_BRIDGE;
  2782. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  2783. {
  2784. return ERR_NOT_SUPPORTED;
  2785. }
  2786. StrCpy(hubname, sizeof(hubname), t->HubName);
  2787. key = t->Key;
  2788. h = GetHub(c, hubname);
  2789. if (h == NULL)
  2790. {
  2791. ret = ERR_HUB_NOT_FOUND;
  2792. }
  2793. else
  2794. {
  2795. if (a->ServerAdmin == false && GetHubAdminOption(h, "no_change_crl_list") != 0)
  2796. {
  2797. ret = ERR_NOT_ENOUGH_RIGHT;
  2798. }
  2799. else
  2800. {
  2801. if (h->HubDb == NULL)
  2802. {
  2803. ret = ERR_NOT_SUPPORTED;
  2804. }
  2805. else
  2806. {
  2807. LockList(h->HubDb->CrlList);
  2808. {
  2809. CRL *crl = ListKeyToPointer(h->HubDb->CrlList, t->Key);
  2810. if (crl == NULL)
  2811. {
  2812. ret = ERR_OBJECT_NOT_FOUND;
  2813. }
  2814. else
  2815. {
  2816. CRL *new_crl = CopyCrl(t->Crl);
  2817. if (ReplaceListPointer(h->HubDb->CrlList, crl, new_crl))
  2818. {
  2819. ALog(a, h, "LA_ADD_CRL");
  2820. FreeCrl(crl);
  2821. IncrementServerConfigRevision(s);
  2822. }
  2823. }
  2824. }
  2825. UnlockList(h->HubDb->CrlList);
  2826. }
  2827. }
  2828. ReleaseHub(h);
  2829. }
  2830. return ret;
  2831. }
  2832. // Get CRL (Certificate Revocation List) entry
  2833. UINT StGetCrl(ADMIN *a, RPC_CRL *t)
  2834. {
  2835. SERVER *s = a->Server;
  2836. CEDAR *c = s->Cedar;
  2837. HUB *h;
  2838. UINT ret = ERR_NO_ERROR;
  2839. UINT key;
  2840. char hubname[MAX_HUBNAME_LEN + 1];
  2841. CHECK_RIGHT;
  2842. NO_SUPPORT_FOR_BRIDGE;
  2843. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  2844. {
  2845. return ERR_NOT_SUPPORTED;
  2846. }
  2847. StrCpy(hubname, sizeof(hubname), t->HubName);
  2848. key = t->Key;
  2849. FreeRpcCrl(t);
  2850. Zero(t, sizeof(RPC_CRL));
  2851. StrCpy(t->HubName, sizeof(t->HubName), hubname);
  2852. t->Key = key;
  2853. h = GetHub(c, hubname);
  2854. if (h == NULL)
  2855. {
  2856. ret = ERR_HUB_NOT_FOUND;
  2857. }
  2858. else
  2859. {
  2860. if (h->HubDb == NULL)
  2861. {
  2862. ret = ERR_NOT_SUPPORTED;
  2863. }
  2864. else
  2865. {
  2866. LockList(h->HubDb->CrlList);
  2867. {
  2868. CRL *crl = ListKeyToPointer(h->HubDb->CrlList, t->Key);
  2869. if (crl == NULL)
  2870. {
  2871. ret = ERR_OBJECT_NOT_FOUND;
  2872. }
  2873. else
  2874. {
  2875. t->Crl = CopyCrl(crl);
  2876. }
  2877. }
  2878. UnlockList(h->HubDb->CrlList);
  2879. }
  2880. ReleaseHub(h);
  2881. }
  2882. return ret;
  2883. }
  2884. // Delete CRL (Certificate Revocation List) entry
  2885. UINT StDelCrl(ADMIN *a, RPC_CRL *t)
  2886. {
  2887. SERVER *s = a->Server;
  2888. CEDAR *c = s->Cedar;
  2889. HUB *h;
  2890. UINT ret = ERR_NO_ERROR;
  2891. char hubname[MAX_HUBNAME_LEN + 1];
  2892. CHECK_RIGHT;
  2893. NO_SUPPORT_FOR_BRIDGE;
  2894. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  2895. {
  2896. return ERR_NOT_SUPPORTED;
  2897. }
  2898. StrCpy(hubname, sizeof(hubname), t->HubName);
  2899. h = GetHub(c, hubname);
  2900. if (h == NULL)
  2901. {
  2902. ret = ERR_HUB_NOT_FOUND;
  2903. }
  2904. else
  2905. {
  2906. if (a->ServerAdmin == false && GetHubAdminOption(h, "no_change_crl_list") != 0)
  2907. {
  2908. ret = ERR_NOT_ENOUGH_RIGHT;
  2909. }
  2910. else
  2911. {
  2912. if (h->HubDb == NULL)
  2913. {
  2914. ret = ERR_NOT_SUPPORTED;
  2915. }
  2916. else
  2917. {
  2918. LockList(h->HubDb->CrlList);
  2919. {
  2920. CRL *crl = ListKeyToPointer(h->HubDb->CrlList, t->Key);
  2921. if (crl == NULL)
  2922. {
  2923. ret = ERR_OBJECT_NOT_FOUND;
  2924. }
  2925. else
  2926. {
  2927. ALog(a, h, "LA_DEL_CRL");
  2928. FreeCrl(crl);
  2929. Delete(h->HubDb->CrlList, crl);
  2930. }
  2931. }
  2932. UnlockList(h->HubDb->CrlList);
  2933. }
  2934. }
  2935. ReleaseHub(h);
  2936. }
  2937. return ret;
  2938. }
  2939. // Add new CRL (Certificate Revocation List) entry
  2940. UINT StAddCrl(ADMIN *a, RPC_CRL *t)
  2941. {
  2942. SERVER *s = a->Server;
  2943. CEDAR *c = s->Cedar;
  2944. HUB *h;
  2945. UINT ret = ERR_NO_ERROR;
  2946. char hubname[MAX_HUBNAME_LEN + 1];
  2947. if (c->Bridge)
  2948. {
  2949. return ERR_NOT_SUPPORTED;
  2950. }
  2951. CHECK_RIGHT;
  2952. NO_SUPPORT_FOR_BRIDGE;
  2953. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  2954. {
  2955. return ERR_NOT_SUPPORTED;
  2956. }
  2957. StrCpy(hubname, sizeof(hubname), t->HubName);
  2958. h = GetHub(c, hubname);
  2959. if (h == NULL)
  2960. {
  2961. ret = ERR_HUB_NOT_FOUND;
  2962. }
  2963. else
  2964. {
  2965. if (a->ServerAdmin == false && GetHubAdminOption(h, "no_change_crl_list") != 0)
  2966. {
  2967. ret = ERR_NOT_ENOUGH_RIGHT;
  2968. }
  2969. else
  2970. {
  2971. if (h->HubDb == NULL)
  2972. {
  2973. ret = ERR_NOT_SUPPORTED;
  2974. }
  2975. else
  2976. {
  2977. LockList(h->HubDb->CrlList);
  2978. {
  2979. if (LIST_NUM(h->HubDb->CrlList) < MAX_HUB_CRLS)
  2980. {
  2981. CRL *crl = CopyCrl(t->Crl);
  2982. Insert(h->HubDb->CrlList, crl);
  2983. ALog(a, h, "LA_SET_CRL");
  2984. IncrementServerConfigRevision(s);
  2985. }
  2986. }
  2987. UnlockList(h->HubDb->CrlList);
  2988. }
  2989. }
  2990. ReleaseHub(h);
  2991. }
  2992. return ret;
  2993. }
  2994. // Get CRL (Certificate Revocation List) index
  2995. UINT StEnumCrl(ADMIN *a, RPC_ENUM_CRL *t)
  2996. {
  2997. SERVER *s = a->Server;
  2998. CEDAR *c = s->Cedar;
  2999. HUB *h;
  3000. UINT ret = ERR_NO_ERROR;
  3001. char hubname[MAX_HUBNAME_LEN + 1];
  3002. CHECK_RIGHT;
  3003. NO_SUPPORT_FOR_BRIDGE;
  3004. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  3005. {
  3006. return ERR_NOT_SUPPORTED;
  3007. }
  3008. StrCpy(hubname, sizeof(hubname), t->HubName);
  3009. FreeRpcEnumCrl(t);
  3010. Zero(t, sizeof(RPC_ENUM_CRL));
  3011. StrCpy(t->HubName, sizeof(t->HubName), hubname);
  3012. h = GetHub(c, hubname);
  3013. if (h == NULL)
  3014. {
  3015. ret = ERR_HUB_NOT_FOUND;
  3016. }
  3017. else
  3018. {
  3019. if (h->HubDb == NULL)
  3020. {
  3021. ret = ERR_NOT_SUPPORTED;
  3022. }
  3023. else
  3024. {
  3025. LockList(h->HubDb->CrlList);
  3026. {
  3027. UINT i;
  3028. t->NumItem = LIST_NUM(h->HubDb->CrlList);
  3029. t->Items = ZeroMalloc(sizeof(RPC_ENUM_CRL_ITEM) * t->NumItem);
  3030. for (i = 0;i < LIST_NUM(h->HubDb->CrlList);i++)
  3031. {
  3032. CRL *crl = LIST_DATA(h->HubDb->CrlList, i);
  3033. wchar_t *info = GenerateCrlStr(crl);
  3034. UniStrCpy(t->Items[i].CrlInfo, sizeof(t->Items[i].CrlInfo), info);
  3035. Free(info);
  3036. t->Items[i].Key = POINTER_TO_KEY(crl);
  3037. }
  3038. }
  3039. UnlockList(h->HubDb->CrlList);
  3040. }
  3041. ReleaseHub(h);
  3042. }
  3043. return ret;
  3044. }
  3045. // Get routing table on virtual L3 switch
  3046. UINT StEnumL3Table(ADMIN *a, RPC_ENUM_L3TABLE *t)
  3047. {
  3048. SERVER *s = a->Server;
  3049. CEDAR *c = s->Cedar;
  3050. UINT ret = ERR_NO_ERROR;
  3051. L3SW *sw;
  3052. char name[MAX_HUBNAME_LEN + 1];
  3053. if (IsEmptyStr(t->Name))
  3054. {
  3055. return ERR_INVALID_PARAMETER;
  3056. }
  3057. NO_SUPPORT_FOR_BRIDGE;
  3058. StrCpy(name, sizeof(name), t->Name);
  3059. FreeRpcEnumL3Table(t);
  3060. Zero(t, sizeof(RPC_ENUM_L3TABLE));
  3061. StrCpy(t->Name, sizeof(t->Name), name);
  3062. sw = L3GetSw(c, t->Name);
  3063. if (sw == NULL)
  3064. {
  3065. ret = ERR_LAYER3_SW_NOT_FOUND;
  3066. }
  3067. else
  3068. {
  3069. UINT i;
  3070. Lock(sw->lock);
  3071. {
  3072. t->NumItem = LIST_NUM(sw->TableList);
  3073. t->Items = ZeroMalloc(sizeof(RPC_L3TABLE) * t->NumItem);
  3074. for (i = 0;i < t->NumItem;i++)
  3075. {
  3076. L3TABLE *tbl = LIST_DATA(sw->TableList, i);
  3077. RPC_L3TABLE *e = &t->Items[i];
  3078. StrCpy(e->Name, sizeof(e->Name), name);
  3079. e->NetworkAddress = tbl->NetworkAddress;
  3080. e->SubnetMask = tbl->SubnetMask;
  3081. e->GatewayAddress = tbl->GatewayAddress;
  3082. e->Metric = tbl->Metric;
  3083. }
  3084. }
  3085. Unlock(sw->lock);
  3086. ReleaseL3Sw(sw);
  3087. }
  3088. return ret;
  3089. }
  3090. // Delete routing table entry on virtual L3 switch
  3091. UINT StDelL3Table(ADMIN *a, RPC_L3TABLE *t)
  3092. {
  3093. SERVER *s = a->Server;
  3094. CEDAR *c = s->Cedar;
  3095. UINT ret = ERR_NO_ERROR;
  3096. L3SW *sw;
  3097. SERVER_ADMIN_ONLY;
  3098. NO_SUPPORT_FOR_BRIDGE;
  3099. sw = L3GetSw(c, t->Name);
  3100. if (sw == NULL)
  3101. {
  3102. ret = ERR_LAYER3_SW_NOT_FOUND;
  3103. }
  3104. else
  3105. {
  3106. L3TABLE tbl;
  3107. Zero(&tbl, sizeof(tbl));
  3108. tbl.NetworkAddress = t->NetworkAddress;
  3109. tbl.SubnetMask = t->SubnetMask;
  3110. tbl.GatewayAddress = t->GatewayAddress;
  3111. tbl.Metric = t->Metric;
  3112. if (L3DelTable(sw, &tbl) == false)
  3113. {
  3114. ret = ERR_LAYER3_TABLE_DEL_FAILED;
  3115. }
  3116. else
  3117. {
  3118. char tmp[MAX_SIZE];
  3119. IPToStr32(tmp, sizeof(tmp), tbl.NetworkAddress);
  3120. ALog(a, NULL, "LA_DEL_L3_TABLE", tmp, t->Name);
  3121. IncrementServerConfigRevision(s);
  3122. }
  3123. ReleaseL3Sw(sw);
  3124. }
  3125. return ret;
  3126. }
  3127. // Add new routing table entry on virtual L3 switch
  3128. UINT StAddL3Table(ADMIN *a, RPC_L3TABLE *t)
  3129. {
  3130. SERVER *s = a->Server;
  3131. CEDAR *c = s->Cedar;
  3132. UINT ret = ERR_NO_ERROR;
  3133. L3SW *sw;
  3134. if (IsNetworkAddress32(t->NetworkAddress, t->SubnetMask) == false ||
  3135. IsHostIPAddress32(t->GatewayAddress) == false)
  3136. {
  3137. return ERR_INVALID_PARAMETER;
  3138. }
  3139. SERVER_ADMIN_ONLY;
  3140. NO_SUPPORT_FOR_BRIDGE;
  3141. sw = L3GetSw(c, t->Name);
  3142. if (sw == NULL)
  3143. {
  3144. ret = ERR_LAYER3_SW_NOT_FOUND;
  3145. }
  3146. else
  3147. {
  3148. L3TABLE tbl;
  3149. Zero(&tbl, sizeof(tbl));
  3150. tbl.NetworkAddress = t->NetworkAddress;
  3151. tbl.SubnetMask = t->SubnetMask;
  3152. tbl.GatewayAddress = t->GatewayAddress;
  3153. tbl.Metric = t->Metric;
  3154. if (L3AddTable(sw, &tbl) == false)
  3155. {
  3156. ret = ERR_LAYER3_TABLE_ADD_FAILED;
  3157. }
  3158. else
  3159. {
  3160. char tmp[MAX_SIZE];
  3161. IPToStr32(tmp, sizeof(tmp), tbl.NetworkAddress);
  3162. ALog(a, NULL, "LA_ADD_L3_TABLE", tmp, t->Name);
  3163. IncrementServerConfigRevision(s);
  3164. }
  3165. ReleaseL3Sw(sw);
  3166. }
  3167. return ret;
  3168. }
  3169. // Enumerate virtual interfaces on virtual L3 switch
  3170. UINT StEnumL3If(ADMIN *a, RPC_ENUM_L3IF *t)
  3171. {
  3172. SERVER *s = a->Server;
  3173. CEDAR *c = s->Cedar;
  3174. UINT ret = ERR_NO_ERROR;
  3175. L3SW *sw;
  3176. char name[MAX_HUBNAME_LEN + 1];
  3177. NO_SUPPORT_FOR_BRIDGE;
  3178. StrCpy(name, sizeof(name), t->Name);
  3179. FreeRpcEnumL3If(t);
  3180. Zero(t, sizeof(RPC_ENUM_L3IF));
  3181. StrCpy(t->Name, sizeof(t->Name), name);
  3182. sw = L3GetSw(c, t->Name);
  3183. if (sw == NULL)
  3184. {
  3185. ret = ERR_LAYER3_SW_NOT_FOUND;
  3186. }
  3187. else
  3188. {
  3189. Lock(sw->lock);
  3190. {
  3191. UINT i;
  3192. t->NumItem = LIST_NUM(sw->IfList);
  3193. t->Items = ZeroMalloc(sizeof(RPC_L3IF) * t->NumItem);
  3194. for (i = 0;i < t->NumItem;i++)
  3195. {
  3196. L3IF *f = LIST_DATA(sw->IfList, i);
  3197. RPC_L3IF *e = &t->Items[i];
  3198. StrCpy(e->Name, sizeof(e->Name), sw->Name);
  3199. StrCpy(e->HubName, sizeof(e->HubName), f->HubName);
  3200. e->IpAddress = f->IpAddress;
  3201. e->SubnetMask = f->SubnetMask;
  3202. }
  3203. }
  3204. Unlock(sw->lock);
  3205. ReleaseL3Sw(sw);
  3206. }
  3207. return ret;
  3208. }
  3209. // Delete a virtual interface on virtual L3 switch
  3210. UINT StDelL3If(ADMIN *a, RPC_L3IF *t)
  3211. {
  3212. SERVER *s = a->Server;
  3213. CEDAR *c = s->Cedar;
  3214. UINT ret = ERR_NO_ERROR;
  3215. L3SW *sw;
  3216. NO_SUPPORT_FOR_BRIDGE;
  3217. SERVER_ADMIN_ONLY;
  3218. sw = L3GetSw(c, t->Name);
  3219. if (sw == NULL)
  3220. {
  3221. ret = ERR_LAYER3_SW_NOT_FOUND;
  3222. }
  3223. else
  3224. {
  3225. if (L3DelIf(sw, t->HubName) == false)
  3226. {
  3227. ret = ERR_LAYER3_IF_DEL_FAILED;
  3228. }
  3229. else
  3230. {
  3231. ALog(a, NULL, "LA_DEL_L3_IF", t->HubName, t->Name);
  3232. IncrementServerConfigRevision(s);
  3233. }
  3234. ReleaseL3Sw(sw);
  3235. }
  3236. return ret;
  3237. }
  3238. // Add new virtual interface on virtual L3 switch
  3239. UINT StAddL3If(ADMIN *a, RPC_L3IF *t)
  3240. {
  3241. SERVER *s = a->Server;
  3242. CEDAR *c = s->Cedar;
  3243. UINT ret = ERR_NO_ERROR;
  3244. L3SW *sw;
  3245. if (IsSubnetMask32(t->SubnetMask) == false || IsHostIPAddress32(t->IpAddress) == false)
  3246. {
  3247. return ERR_INVALID_PARAMETER;
  3248. }
  3249. if ((t->IpAddress & (~t->SubnetMask)) == 0)
  3250. {
  3251. return ERR_INVALID_PARAMETER;
  3252. }
  3253. NO_SUPPORT_FOR_BRIDGE;
  3254. SERVER_ADMIN_ONLY;
  3255. sw = L3GetSw(c, t->Name);
  3256. if (sw == NULL)
  3257. {
  3258. ret = ERR_LAYER3_SW_NOT_FOUND;
  3259. }
  3260. else
  3261. {
  3262. Lock(sw->lock);
  3263. {
  3264. if (L3SearchIf(sw, t->HubName) != NULL)
  3265. {
  3266. // Already exists
  3267. ret = ERR_LAYER3_IF_EXISTS;
  3268. }
  3269. else
  3270. {
  3271. if (L3AddIf(sw, t->HubName, t->IpAddress, t->SubnetMask) == false)
  3272. {
  3273. ret = ERR_LAYER3_IF_ADD_FAILED;
  3274. }
  3275. else
  3276. {
  3277. ALog(a, NULL, "LA_ADD_L3_IF", t->HubName, t->Name);
  3278. IncrementServerConfigRevision(s);
  3279. }
  3280. }
  3281. }
  3282. Unlock(sw->lock);
  3283. ReleaseL3Sw(sw);
  3284. }
  3285. return ret;
  3286. }
  3287. // Stop a virtual layer-3 switch
  3288. UINT StStopL3Switch(ADMIN *a, RPC_L3SW *t)
  3289. {
  3290. SERVER *s = a->Server;
  3291. CEDAR *c = s->Cedar;
  3292. UINT ret = ERR_NO_ERROR;
  3293. L3SW *sw;
  3294. if (IsEmptyStr(t->Name))
  3295. {
  3296. return ERR_INVALID_PARAMETER;
  3297. }
  3298. NO_SUPPORT_FOR_BRIDGE;
  3299. SERVER_ADMIN_ONLY;
  3300. sw = L3GetSw(c, t->Name);
  3301. if (sw == NULL)
  3302. {
  3303. ret = ERR_LAYER3_SW_NOT_FOUND;
  3304. }
  3305. else
  3306. {
  3307. L3SwStop(sw);
  3308. ALog(a, NULL, "LA_STOP_L3_SW", sw->Name);
  3309. ReleaseL3Sw(sw);
  3310. IncrementServerConfigRevision(s);
  3311. }
  3312. return ret;
  3313. }
  3314. // Start a virtual layer-3 switch
  3315. UINT StStartL3Switch(ADMIN *a, RPC_L3SW *t)
  3316. {
  3317. SERVER *s = a->Server;
  3318. CEDAR *c = s->Cedar;
  3319. UINT ret = ERR_NO_ERROR;
  3320. L3SW *sw;
  3321. if (IsEmptyStr(t->Name))
  3322. {
  3323. return ERR_INVALID_PARAMETER;
  3324. }
  3325. NO_SUPPORT_FOR_BRIDGE;
  3326. SERVER_ADMIN_ONLY;
  3327. sw = L3GetSw(c, t->Name);
  3328. if (sw == NULL)
  3329. {
  3330. ret = ERR_LAYER3_SW_NOT_FOUND;
  3331. }
  3332. else
  3333. {
  3334. Lock(sw->lock);
  3335. {
  3336. // Count the registered virtual interfaces
  3337. if (LIST_NUM(sw->IfList) >= 1)
  3338. {
  3339. L3SwStart(sw);
  3340. ALog(a, NULL, "LA_START_L3_SW", sw->Name);
  3341. IncrementServerConfigRevision(s);
  3342. }
  3343. else
  3344. {
  3345. ret = ERR_LAYER3_CANT_START_SWITCH;
  3346. }
  3347. }
  3348. Unlock(sw->lock);
  3349. ReleaseL3Sw(sw);
  3350. }
  3351. return ret;
  3352. }
  3353. // Enumerate virtual layer-3 switches
  3354. UINT StEnumL3Switch(ADMIN *a, RPC_ENUM_L3SW *t)
  3355. {
  3356. UINT i;
  3357. SERVER *s = a->Server;
  3358. CEDAR *c = s->Cedar;
  3359. UINT ret = ERR_NO_ERROR;
  3360. NO_SUPPORT_FOR_BRIDGE;
  3361. FreeRpcEnumL3Sw(t);
  3362. Zero(t, sizeof(RPC_ENUM_L3SW));
  3363. LockList(c->L3SwList);
  3364. {
  3365. t->NumItem = LIST_NUM(c->L3SwList);
  3366. t->Items = ZeroMalloc(sizeof(RPC_ENUM_L3SW_ITEM) * t->NumItem);
  3367. for (i = 0;i < LIST_NUM(c->L3SwList);i++)
  3368. {
  3369. L3SW *sw = LIST_DATA(c->L3SwList, i);
  3370. RPC_ENUM_L3SW_ITEM *e = &t->Items[i];
  3371. Lock(sw->lock);
  3372. {
  3373. StrCpy(e->Name, sizeof(e->Name), sw->Name);
  3374. e->NumInterfaces = LIST_NUM(sw->IfList);
  3375. e->NumTables = LIST_NUM(sw->TableList);
  3376. e->Active = sw->Active;
  3377. e->Online = sw->Online;
  3378. }
  3379. Unlock(sw->lock);
  3380. }
  3381. }
  3382. UnlockList(c->L3SwList);
  3383. return ret;
  3384. }
  3385. // Delete a virtual layer-3 switch
  3386. UINT StDelL3Switch(ADMIN *a, RPC_L3SW *t)
  3387. {
  3388. SERVER *s = a->Server;
  3389. CEDAR *c = s->Cedar;
  3390. UINT ret = ERR_NO_ERROR;
  3391. if (IsEmptyStr(t->Name))
  3392. {
  3393. return ERR_INVALID_PARAMETER;
  3394. }
  3395. NO_SUPPORT_FOR_BRIDGE;
  3396. SERVER_ADMIN_ONLY;
  3397. if (L3DelSw(c, t->Name) == false)
  3398. {
  3399. ret = ERR_LAYER3_SW_NOT_FOUND;
  3400. }
  3401. else
  3402. {
  3403. ALog(a, NULL, "LA_DEL_L3_SW", t->Name);
  3404. IncrementServerConfigRevision(s);
  3405. }
  3406. return ret;
  3407. }
  3408. // Add a new virtual layer-3 switch
  3409. UINT StAddL3Switch(ADMIN *a, RPC_L3SW *t)
  3410. {
  3411. SERVER *s = a->Server;
  3412. CEDAR *c = s->Cedar;
  3413. UINT ret = ERR_NO_ERROR;
  3414. L3SW *sw;
  3415. NO_SUPPORT_FOR_BRIDGE;
  3416. if (IsEmptyStr(t->Name))
  3417. {
  3418. return ERR_INVALID_PARAMETER;
  3419. }
  3420. if (IsSafeStr(t->Name) == false)
  3421. {
  3422. return ERR_INVALID_PARAMETER;
  3423. }
  3424. SERVER_ADMIN_ONLY;
  3425. // Duplication check
  3426. sw = L3GetSw(c, t->Name);
  3427. if (sw != NULL)
  3428. {
  3429. // Already exists
  3430. ReleaseL3Sw(sw);
  3431. ret = ERR_LAYER3_SW_EXISTS;
  3432. }
  3433. else
  3434. {
  3435. LockList(c->L3SwList);
  3436. {
  3437. if (LIST_NUM(c->L3SwList) >= GetServerCapsInt(s, "i_max_l3_sw"))
  3438. {
  3439. // No more virtual interfaces
  3440. sw = NULL;
  3441. }
  3442. else
  3443. {
  3444. // Create
  3445. sw = L3AddSw(c, t->Name);
  3446. if (sw != NULL)
  3447. {
  3448. ALog(a, NULL, "LA_ADD_L3_SW", t->Name);
  3449. IncrementServerConfigRevision(s);
  3450. }
  3451. }
  3452. }
  3453. UnlockList(c->L3SwList);
  3454. if (sw == NULL)
  3455. {
  3456. // Failed
  3457. ret = ERR_INTERNAL_ERROR;
  3458. }
  3459. else
  3460. {
  3461. // Success
  3462. ReleaseL3Sw(sw);
  3463. }
  3464. }
  3465. return ret;
  3466. }
  3467. // Set hub extended options
  3468. UINT StSetHubExtOptions(ADMIN *a, RPC_ADMIN_OPTION *t)
  3469. {
  3470. SERVER *s = a->Server;
  3471. CEDAR *c = s->Cedar;
  3472. HUB *h;
  3473. bool not_server_admin = false;
  3474. if (t->NumItem > MAX_HUB_ADMIN_OPTIONS)
  3475. {
  3476. return ERR_TOO_MANT_ITEMS;
  3477. }
  3478. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  3479. {
  3480. return ERR_NOT_SUPPORTED;
  3481. }
  3482. CHECK_RIGHT;
  3483. if (a->ServerAdmin == false)
  3484. {
  3485. not_server_admin = true;
  3486. }
  3487. LockHubList(c);
  3488. {
  3489. h = GetHub(c, t->HubName);
  3490. }
  3491. UnlockHubList(c);
  3492. if (h == NULL)
  3493. {
  3494. return ERR_HUB_NOT_FOUND;
  3495. }
  3496. if (GetHubAdminOption(h, "deny_hub_admin_change_ext_option") && not_server_admin)
  3497. {
  3498. // Insufficient permission
  3499. ReleaseHub(h);
  3500. return ERR_NOT_ENOUGH_RIGHT;
  3501. }
  3502. // Update setting
  3503. Lock(h->lock);
  3504. {
  3505. DataToHubOptionStruct(h->Option, t);
  3506. }
  3507. Unlock(h->lock);
  3508. ALog(a, NULL, "LA_SET_HUB_EXT_OPTION", h->Name);
  3509. h->CurrentVersion++;
  3510. SiHubUpdateProc(h);
  3511. ReleaseHub(h);
  3512. IncrementServerConfigRevision(s);
  3513. return ERR_NO_ERROR;
  3514. }
  3515. // Get hub extended options
  3516. UINT StGetHubExtOptions(ADMIN *a, RPC_ADMIN_OPTION *t)
  3517. {
  3518. SERVER *s = a->Server;
  3519. CEDAR *c = s->Cedar;
  3520. HUB *h;
  3521. CHECK_RIGHT;
  3522. LockHubList(c);
  3523. {
  3524. h = GetHub(c, t->HubName);
  3525. }
  3526. UnlockHubList(c);
  3527. if (h == NULL)
  3528. {
  3529. return ERR_HUB_NOT_FOUND;
  3530. }
  3531. FreeRpcAdminOption(t);
  3532. Zero(t, sizeof(RPC_ADMIN_OPTION));
  3533. StrCpy(t->HubName, sizeof(t->HubName), h->Name);
  3534. // Get options
  3535. Lock(h->lock);
  3536. {
  3537. HubOptionStructToData(t, h->Option, h->Name);
  3538. }
  3539. Unlock(h->lock);
  3540. ReleaseHub(h);
  3541. return ERR_NO_ERROR;
  3542. }
  3543. // Set hub administration options
  3544. UINT StSetHubAdminOptions(ADMIN *a, RPC_ADMIN_OPTION *t)
  3545. {
  3546. UINT i;
  3547. SERVER *s = a->Server;
  3548. CEDAR *c = s->Cedar;
  3549. HUB *h;
  3550. bool not_server_admin = false;
  3551. if (t->NumItem > MAX_HUB_ADMIN_OPTIONS)
  3552. {
  3553. return ERR_TOO_MANT_ITEMS;
  3554. }
  3555. NO_SUPPORT_FOR_BRIDGE;
  3556. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  3557. {
  3558. return ERR_NOT_SUPPORTED;
  3559. }
  3560. CHECK_RIGHT;
  3561. if (a->ServerAdmin == false)
  3562. {
  3563. not_server_admin = true;
  3564. }
  3565. LockHubList(c);
  3566. {
  3567. h = GetHub(c, t->HubName);
  3568. }
  3569. UnlockHubList(c);
  3570. if (h == NULL)
  3571. {
  3572. return ERR_HUB_NOT_FOUND;
  3573. }
  3574. if (GetHubAdminOption(h, "allow_hub_admin_change_option") == false
  3575. && not_server_admin)
  3576. {
  3577. // Insufficient permission
  3578. ReleaseHub(h);
  3579. return ERR_NOT_ENOUGH_RIGHT;
  3580. }
  3581. LockList(h->AdminOptionList);
  3582. {
  3583. DeleteAllHubAdminOption(h, false);
  3584. for (i = 0;i < t->NumItem;i++)
  3585. {
  3586. ADMIN_OPTION *e = &t->Items[i];
  3587. ADMIN_OPTION *a = ZeroMalloc(sizeof(ADMIN_OPTION));
  3588. StrCpy(a->Name, sizeof(a->Name), e->Name);
  3589. a->Value = e->Value;
  3590. Insert(h->AdminOptionList, a);
  3591. }
  3592. AddHubAdminOptionsDefaults(h, false);
  3593. }
  3594. UnlockList(h->AdminOptionList);
  3595. ALog(a, NULL, "LA_SET_HUB_ADMIN_OPTION", h->Name);
  3596. h->CurrentVersion++;
  3597. SiHubUpdateProc(h);
  3598. ReleaseHub(h);
  3599. IncrementServerConfigRevision(s);
  3600. return ERR_NO_ERROR;
  3601. }
  3602. // Get hub administration options
  3603. UINT StGetHubAdminOptions(ADMIN *a, RPC_ADMIN_OPTION *t)
  3604. {
  3605. UINT i;
  3606. SERVER *s = a->Server;
  3607. CEDAR *c = s->Cedar;
  3608. HUB *h;
  3609. CHECK_RIGHT;
  3610. NO_SUPPORT_FOR_BRIDGE;
  3611. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  3612. {
  3613. return ERR_NOT_SUPPORTED;
  3614. }
  3615. LockHubList(c);
  3616. {
  3617. h = GetHub(c, t->HubName);
  3618. }
  3619. UnlockHubList(c);
  3620. if (h == NULL)
  3621. {
  3622. return ERR_HUB_NOT_FOUND;
  3623. }
  3624. FreeRpcAdminOption(t);
  3625. Zero(t, sizeof(RPC_ADMIN_OPTION));
  3626. StrCpy(t->HubName, sizeof(t->HubName), h->Name);
  3627. LockList(h->AdminOptionList);
  3628. {
  3629. t->NumItem = LIST_NUM(h->AdminOptionList);
  3630. t->Items = ZeroMalloc(sizeof(ADMIN_OPTION) * t->NumItem);
  3631. for (i = 0;i < t->NumItem;i++)
  3632. {
  3633. ADMIN_OPTION *a = LIST_DATA(h->AdminOptionList, i);
  3634. ADMIN_OPTION *e = &t->Items[i];
  3635. StrCpy(e->Name, sizeof(e->Name), a->Name);
  3636. e->Value = a->Value;
  3637. UniStrCpy(e->Descrption, sizeof(e->Descrption), GetHubAdminOptionHelpString(e->Name));
  3638. }
  3639. }
  3640. UnlockList(h->AdminOptionList);
  3641. ReleaseHub(h);
  3642. return ERR_NO_ERROR;
  3643. }
  3644. // Get default hub administration options
  3645. UINT StGetDefaultHubAdminOptions(ADMIN *a, RPC_ADMIN_OPTION *t)
  3646. {
  3647. UINT i;
  3648. NO_SUPPORT_FOR_BRIDGE;
  3649. if (a->Server->ServerType == SERVER_TYPE_FARM_MEMBER)
  3650. {
  3651. return ERR_NOT_SUPPORTED;
  3652. }
  3653. FreeRpcAdminOption(t);
  3654. Zero(t, sizeof(RPC_ADMIN_OPTION));
  3655. t->NumItem = num_admin_options;
  3656. t->Items = ZeroMalloc(sizeof(ADMIN_OPTION) * t->NumItem);
  3657. for (i = 0;i < t->NumItem;i++)
  3658. {
  3659. ADMIN_OPTION *a = &t->Items[i];
  3660. StrCpy(a->Name, sizeof(a->Name), admin_options[i].Name);
  3661. a->Value = admin_options[i].Value;
  3662. UniStrCpy(a->Descrption, sizeof(a->Descrption), GetHubAdminOptionHelpString(a->Name));
  3663. }
  3664. return ERR_NO_ERROR;
  3665. }
  3666. // Get configuration file stream
  3667. UINT StGetConfig(ADMIN *a, RPC_CONFIG *t)
  3668. {
  3669. SERVER *s;
  3670. SERVER_ADMIN_ONLY;
  3671. FreeRpcConfig(t);
  3672. Zero(t, sizeof(RPC_CONFIG));
  3673. s = a->Server;
  3674. ALog(a, NULL, "LA_GET_CONFIG");
  3675. if (s->CfgRw != NULL)
  3676. {
  3677. FOLDER *f = SiWriteConfigurationToCfg(s);
  3678. BUF *b = CfgFolderToBuf(f, true);
  3679. StrCpy(t->FileName, sizeof(t->FileName), s->CfgRw->FileName + (s->CfgRw->FileName[0] == '@' ? 1 : 0));
  3680. t->FileData = ZeroMalloc(b->Size + 1);
  3681. Copy(t->FileData, b->Buf, b->Size);
  3682. CfgDeleteFolder(f);
  3683. FreeBuf(b);
  3684. return ERR_NO_ERROR;
  3685. }
  3686. else
  3687. {
  3688. return ERR_INTERNAL_ERROR;
  3689. }
  3690. }
  3691. // Overwrite configuration file by specified data
  3692. UINT StSetConfig(ADMIN *a, RPC_CONFIG *t)
  3693. {
  3694. SERVER *s;
  3695. IO *o;
  3696. char filename[MAX_PATH];
  3697. SERVER_ADMIN_ONLY;
  3698. s = a->Server;
  3699. if (s->CfgRw == NULL)
  3700. {
  3701. return ERR_INTERNAL_ERROR;
  3702. }
  3703. // Write new configuration file
  3704. Format(filename, sizeof(filename), "%s.new", s->CfgRw->FileName);
  3705. o = FileCreate(filename);
  3706. FileWrite(o, t->FileData, StrLen(t->FileData));
  3707. FileClose(o);
  3708. IncrementServerConfigRevision(s);
  3709. ALog(a, NULL, "LA_SET_CONFIG");
  3710. // Reboot server itself
  3711. SiRebootServer(s->Cedar->Bridge);
  3712. return ERR_NO_ERROR;
  3713. }
  3714. // Get capabilities
  3715. UINT StGetCaps(ADMIN *a, CAPSLIST *t)
  3716. {
  3717. FreeRpcCapsList(t);
  3718. Zero(t, sizeof(CAPSLIST));
  3719. GetServerCapsMain(a->Server, t);
  3720. return ERR_NO_ERROR;
  3721. }
  3722. // Reboot server itself
  3723. UINT StRebootServer(ADMIN *a, RPC_TEST *t)
  3724. {
  3725. SERVER_ADMIN_ONLY;
  3726. ALog(a, NULL, "LA_REBOOT_SERVER");
  3727. SiRebootServerEx(a->Server->Cedar->Bridge, t->IntValue);
  3728. return ERR_NO_ERROR;
  3729. }
  3730. // Get availability to localbridge function
  3731. UINT StGetBridgeSupport(ADMIN *a, RPC_BRIDGE_SUPPORT *t)
  3732. {
  3733. Zero(t, sizeof(RPC_BRIDGE_SUPPORT));
  3734. t->IsBridgeSupportedOs = IsBridgeSupported();
  3735. t->IsWinPcapNeeded = IsNeedWinPcap();
  3736. return ERR_NO_ERROR;
  3737. }
  3738. // Enumerate Ethernet devices
  3739. UINT StEnumEthernet(ADMIN *a, RPC_ENUM_ETH *t)
  3740. {
  3741. TOKEN_LIST *o;
  3742. UINT i;
  3743. char tmp[MAX_SIZE];
  3744. bool unix_support = false;
  3745. SERVER_ADMIN_ONLY;
  3746. #ifdef OS_UNIX
  3747. unix_support = EthIsInterfaceDescriptionSupportedUnix();
  3748. #endif // OS_UNIX
  3749. o = GetEthList();
  3750. if (o == NULL)
  3751. {
  3752. return ERR_NOT_SUPPORTED;
  3753. }
  3754. FreeRpcEnumEth(t);
  3755. Zero(t, sizeof(RPC_ENUM_ETH));
  3756. t->NumItem = o->NumTokens;
  3757. t->Items = ZeroMalloc(sizeof(RPC_ENUM_ETH_ITEM) * t->NumItem);
  3758. for (i = 0;i < t->NumItem;i++)
  3759. {
  3760. RPC_ENUM_ETH_ITEM *e = &t->Items[i];
  3761. StrCpy(e->DeviceName, sizeof(e->DeviceName), o->Token[i]);
  3762. StrCpy(tmp, sizeof(tmp), e->DeviceName);
  3763. #ifdef OS_WIN32
  3764. GetEthNetworkConnectionName(e->NetworkConnectionName, sizeof(e->NetworkConnectionName), e->DeviceName);
  3765. #else
  3766. if (unix_support == false)
  3767. {
  3768. StrCpy(tmp, sizeof(tmp), "");
  3769. }
  3770. else
  3771. {
  3772. if (EthGetInterfaceDescriptionUnix(e->DeviceName, tmp, sizeof(tmp)) == false)
  3773. {
  3774. StrCpy(tmp, sizeof(tmp), e->DeviceName);
  3775. }
  3776. }
  3777. StrToUni(e->NetworkConnectionName, sizeof(e->NetworkConnectionName), tmp);
  3778. #endif
  3779. }
  3780. FreeToken(o);
  3781. return ERR_NO_ERROR;
  3782. }
  3783. // Add a new local bridge
  3784. UINT StAddLocalBridge(ADMIN *a, RPC_LOCALBRIDGE *t)
  3785. {
  3786. if (IsEmptyStr(t->DeviceName) || IsEmptyStr(t->HubName))
  3787. {
  3788. return ERR_INVALID_PARAMETER;
  3789. }
  3790. SERVER_ADMIN_ONLY;
  3791. if (IsEthSupported() == false)
  3792. {
  3793. return ERR_LOCAL_BRIDGE_UNSUPPORTED;
  3794. }
  3795. #ifdef OS_WIN32
  3796. if (true)
  3797. {
  3798. char tmp[MAX_SIZE];
  3799. UINT id = Win32EthGetNameAndIdFromCombinedName(tmp, sizeof(tmp), t->DeviceName);
  3800. if (id == 0)
  3801. {
  3802. // If a ID is not specified in Win32, adding will fail
  3803. return ERR_OBJECT_NOT_FOUND;
  3804. }
  3805. }
  3806. #endif // OS_WIN32
  3807. ALog(a, NULL, "LA_ADD_BRIDGE", t->HubName, t->DeviceName);
  3808. AddLocalBridge(a->Server->Cedar, t->HubName, t->DeviceName, false, false, t->TapMode, NULL, false);
  3809. IncrementServerConfigRevision(a->Server);
  3810. return ERR_NO_ERROR;
  3811. }
  3812. // Delete a local bridge
  3813. UINT StDeleteLocalBridge(ADMIN *a, RPC_LOCALBRIDGE *t)
  3814. {
  3815. if (IsEmptyStr(t->DeviceName) || IsEmptyStr(t->HubName))
  3816. {
  3817. return ERR_INVALID_PARAMETER;
  3818. }
  3819. SERVER_ADMIN_ONLY;
  3820. ALog(a, NULL, "LA_DELETE_BRIDGE", t->HubName, t->DeviceName);
  3821. if (DeleteLocalBridge(a->Server->Cedar, t->HubName, t->DeviceName) == false)
  3822. {
  3823. return ERR_OBJECT_NOT_FOUND;
  3824. }
  3825. IncrementServerConfigRevision(a->Server);
  3826. return ERR_NO_ERROR;
  3827. }
  3828. // Enumerate local bridges
  3829. UINT StEnumLocalBridge(ADMIN *a, RPC_ENUM_LOCALBRIDGE *t)
  3830. {
  3831. UINT i;
  3832. CEDAR *c;
  3833. if (IsEthSupported() == false)
  3834. {
  3835. return ERR_LOCAL_BRIDGE_UNSUPPORTED;
  3836. }
  3837. FreeRpcEnumLocalBridge(t);
  3838. Zero(t, sizeof(RPC_ENUM_LOCALBRIDGE));
  3839. c = a->Server->Cedar;
  3840. LockList(c->LocalBridgeList);
  3841. {
  3842. t->NumItem = LIST_NUM(c->LocalBridgeList);
  3843. t->Items = ZeroMalloc(sizeof(RPC_LOCALBRIDGE) * t->NumItem);
  3844. for (i = 0;i < t->NumItem;i++)
  3845. {
  3846. RPC_LOCALBRIDGE *e = &t->Items[i];
  3847. LOCALBRIDGE *br = LIST_DATA(c->LocalBridgeList, i);
  3848. if (br->Bridge == false)
  3849. {
  3850. e->Online = e->Active = false;
  3851. }
  3852. else
  3853. {
  3854. e->Online = true;
  3855. if (br->Bridge->Active)
  3856. {
  3857. e->Active = true;
  3858. }
  3859. else
  3860. {
  3861. e->Active = false;
  3862. }
  3863. }
  3864. StrCpy(e->DeviceName, sizeof(e->DeviceName), br->DeviceName);
  3865. StrCpy(e->HubName, sizeof(e->HubName), br->HubName);
  3866. e->TapMode = br->TapMode;
  3867. }
  3868. }
  3869. UnlockList(c->LocalBridgeList);
  3870. return ERR_NO_ERROR;
  3871. }
  3872. // Set syslog function setting
  3873. UINT StSetSysLog(ADMIN *a, SYSLOG_SETTING *t)
  3874. {
  3875. SERVER *s = a->Server;
  3876. SERVER_ADMIN_ONLY;
  3877. if (GetGlobalServerFlag(GSF_DISABLE_SYSLOG) != 0 && t->SaveType != SYSLOG_NONE)
  3878. {
  3879. return ERR_NOT_SUPPORTED_FUNCTION_ON_OPENSOURCE;
  3880. }
  3881. if (GetServerCapsBool(s, "b_support_syslog") == false)
  3882. {
  3883. return ERR_NOT_SUPPORTED;
  3884. }
  3885. SiSetSysLogSetting(s, t);
  3886. IncrementServerConfigRevision(s);
  3887. ALog(a, NULL, "LA_SET_SYSLOG");
  3888. return ERR_NO_ERROR;
  3889. }
  3890. // Get syslog function setting
  3891. UINT StGetSysLog(ADMIN *a, SYSLOG_SETTING *t)
  3892. {
  3893. SERVER *s = a->Server;
  3894. SiGetSysLogSetting(s, t);
  3895. if (a->ServerAdmin == false)
  3896. {
  3897. // Hide server name for non-administrator
  3898. if (t->SaveType == SYSLOG_NONE)
  3899. {
  3900. StrCpy(t->Hostname, sizeof(t->Hostname), "");
  3901. t->Port = 0;
  3902. }
  3903. else
  3904. {
  3905. StrCpy(t->Hostname, sizeof(t->Hostname), "Secret");
  3906. t->Port = 0;
  3907. }
  3908. }
  3909. return ERR_NO_ERROR;
  3910. }
  3911. // Set keep-alive function setting
  3912. UINT StSetKeep(ADMIN *a, RPC_KEEP *t)
  3913. {
  3914. SERVER *s = a->Server;
  3915. if (t->UseKeepConnect)
  3916. {
  3917. if (IsEmptyStr(t->KeepConnectHost) ||
  3918. t->KeepConnectPort == 0 ||
  3919. t->KeepConnectPort >= 65536)
  3920. {
  3921. return ERR_INVALID_PARAMETER;
  3922. }
  3923. }
  3924. SERVER_ADMIN_ONLY;
  3925. Lock(s->Keep->lock);
  3926. {
  3927. KEEP *keep = s->Keep;
  3928. keep->Enable = t->UseKeepConnect;
  3929. keep->Server = true;
  3930. StrCpy(keep->ServerName, sizeof(keep->ServerName), t->KeepConnectHost);
  3931. keep->ServerPort = t->KeepConnectPort;
  3932. keep->UdpMode = t->KeepConnectProtocol;
  3933. keep->Interval = t->KeepConnectInterval * 1000;
  3934. if (keep->Interval < 5000)
  3935. {
  3936. keep->Interval = 5000;
  3937. }
  3938. else if (keep->Interval > 600000)
  3939. {
  3940. keep->Interval = 600000;
  3941. }
  3942. }
  3943. Unlock(s->Keep->lock);
  3944. ALog(a, NULL, "LA_SET_KEEP");
  3945. IncrementServerConfigRevision(s);
  3946. return ERR_NO_ERROR;
  3947. }
  3948. // Get keep-alive function setting
  3949. UINT StGetKeep(ADMIN *a, RPC_KEEP *t)
  3950. {
  3951. SERVER *s = a->Server;
  3952. Zero(t, sizeof(RPC_KEEP));
  3953. Lock(s->Keep->lock);
  3954. {
  3955. KEEP *k = s->Keep;
  3956. t->UseKeepConnect = k->Enable;
  3957. StrCpy(t->KeepConnectHost, sizeof(t->KeepConnectHost), k->ServerName);
  3958. t->KeepConnectPort = k->ServerPort;
  3959. t->KeepConnectProtocol = k->UdpMode;
  3960. t->KeepConnectInterval = k->Interval / 1000;
  3961. }
  3962. Unlock(s->Keep->lock);
  3963. return ERR_NO_ERROR;
  3964. }
  3965. // Delete IP address table entry
  3966. UINT StDeleteIpTable(ADMIN *a, RPC_DELETE_TABLE *t)
  3967. {
  3968. SERVER *s = a->Server;
  3969. CEDAR *c = s->Cedar;
  3970. HUB *h = NULL;
  3971. UINT ret = ERR_NO_ERROR;
  3972. CHECK_RIGHT;
  3973. LockHubList(c);
  3974. {
  3975. h = GetHub(c, t->HubName);
  3976. }
  3977. UnlockHubList(c);
  3978. if (h == NULL)
  3979. {
  3980. return ERR_HUB_NOT_FOUND;
  3981. }
  3982. if (a->ServerAdmin == false && GetHubAdminOption(h, "no_delete_iptable") != 0)
  3983. {
  3984. ReleaseHub(h);
  3985. return ERR_NOT_ENOUGH_RIGHT;
  3986. }
  3987. LockList(h->IpTable);
  3988. {
  3989. if (IsInListKey(h->IpTable, t->Key))
  3990. {
  3991. IP_TABLE_ENTRY *e = ListKeyToPointer(h->IpTable, t->Key);
  3992. Free(e);
  3993. Delete(h->IpTable, e);
  3994. }
  3995. else
  3996. {
  3997. ret = ERR_OBJECT_NOT_FOUND;
  3998. }
  3999. }
  4000. UnlockList(h->IpTable);
  4001. if (ret == ERR_OBJECT_NOT_FOUND)
  4002. {
  4003. if (s->ServerType == SERVER_TYPE_FARM_CONTROLLER)
  4004. {
  4005. UINT i;
  4006. LockList(s->FarmMemberList);
  4007. {
  4008. for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
  4009. {
  4010. FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
  4011. if (f->Me == false)
  4012. {
  4013. SiCallDeleteIpTable(s, f, t->HubName, t->Key);
  4014. ret = ERR_NO_ERROR;
  4015. }
  4016. }
  4017. }
  4018. UnlockList(s->FarmMemberList);
  4019. }
  4020. }
  4021. ReleaseHub(h);
  4022. return ret;
  4023. }
  4024. // Get local IP address table
  4025. UINT SiEnumIpTable(SERVER *s, char *hubname, RPC_ENUM_IP_TABLE *t)
  4026. {
  4027. CEDAR *c;
  4028. UINT i;
  4029. HUB *h = NULL;
  4030. // Validate arguments
  4031. if (s == NULL || hubname == NULL || t == NULL)
  4032. {
  4033. return ERR_INTERNAL_ERROR;
  4034. }
  4035. c = s->Cedar;
  4036. LockHubList(c);
  4037. {
  4038. h = GetHub(c, hubname);
  4039. }
  4040. UnlockHubList(c);
  4041. if (h == NULL)
  4042. {
  4043. return ERR_HUB_NOT_FOUND;
  4044. }
  4045. StrCpy(t->HubName, sizeof(t->HubName), hubname);
  4046. LockList(h->IpTable);
  4047. {
  4048. t->NumIpTable = LIST_NUM(h->IpTable);
  4049. t->IpTables = ZeroMalloc(sizeof(RPC_ENUM_IP_TABLE_ITEM) * t->NumIpTable);
  4050. for (i = 0;i < t->NumIpTable;i++)
  4051. {
  4052. RPC_ENUM_IP_TABLE_ITEM *e = &t->IpTables[i];
  4053. IP_TABLE_ENTRY *table = LIST_DATA(h->IpTable, i);
  4054. e->Key = POINTER_TO_KEY(table);
  4055. StrCpy(e->SessionName, sizeof(e->SessionName), table->Session->Name);
  4056. e->Ip = IPToUINT(&table->Ip);
  4057. Copy(&e->IpV6, &table->Ip, sizeof(IP));
  4058. Copy(&e->IpAddress, &table->Ip, sizeof(IP));
  4059. e->DhcpAllocated = table->DhcpAllocated;
  4060. e->CreatedTime = TickToTime(table->CreatedTime);
  4061. e->UpdatedTime = TickToTime(table->UpdatedTime);
  4062. GetMachineName(e->RemoteHostname, sizeof(e->RemoteHostname));
  4063. }
  4064. }
  4065. UnlockList(h->IpTable);
  4066. ReleaseHub(h);
  4067. return ERR_NO_ERROR;
  4068. }
  4069. // Get IP address table
  4070. UINT StEnumIpTable(ADMIN *a, RPC_ENUM_IP_TABLE *t)
  4071. {
  4072. SERVER *s = a->Server;
  4073. CEDAR *c = s->Cedar;
  4074. UINT ret = ERR_NO_ERROR;
  4075. char hubname[MAX_HUBNAME_LEN + 1];
  4076. UINT i;
  4077. CHECK_RIGHT;
  4078. // Get local IP address table
  4079. StrCpy(hubname, sizeof(hubname), t->HubName);
  4080. FreeRpcEnumIpTable(t);
  4081. Zero(t, sizeof(RPC_ENUM_IP_TABLE));
  4082. StrCpy(t->HubName, sizeof(t->HubName), hubname);
  4083. ret = SiEnumIpTable(s, hubname, t);
  4084. if (ret != ERR_NO_ERROR)
  4085. {
  4086. return ret;
  4087. }
  4088. if (s->ServerType == SERVER_TYPE_FARM_CONTROLLER)
  4089. {
  4090. // Get remote IP address table
  4091. LockList(s->FarmMemberList);
  4092. {
  4093. for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
  4094. {
  4095. FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
  4096. if (f->Me == false)
  4097. {
  4098. RPC_ENUM_IP_TABLE tmp;
  4099. Zero(&tmp, sizeof(tmp));
  4100. SiCallEnumIpTable(s, f, hubname, &tmp);
  4101. AdjoinRpcEnumIpTable(t, &tmp);
  4102. FreeRpcEnumIpTable(&tmp);
  4103. }
  4104. }
  4105. }
  4106. UnlockList(s->FarmMemberList);
  4107. }
  4108. return ret;
  4109. }
  4110. // Delete MAC address table entry
  4111. UINT StDeleteMacTable(ADMIN *a, RPC_DELETE_TABLE *t)
  4112. {
  4113. SERVER *s = a->Server;
  4114. CEDAR *c = s->Cedar;
  4115. HUB *h = NULL;
  4116. UINT ret = ERR_NO_ERROR;
  4117. CHECK_RIGHT;
  4118. LockHubList(c);
  4119. {
  4120. h = GetHub(c, t->HubName);
  4121. }
  4122. UnlockHubList(c);
  4123. if (h == NULL)
  4124. {
  4125. return ERR_HUB_NOT_FOUND;
  4126. }
  4127. if (a->ServerAdmin == false && GetHubAdminOption(h, "no_delete_mactable") != 0)
  4128. {
  4129. ReleaseHub(h);
  4130. return ERR_NOT_ENOUGH_RIGHT;
  4131. }
  4132. LockHashList(h->MacHashTable);
  4133. {
  4134. if (IsInHashListKey(h->MacHashTable, t->Key))
  4135. {
  4136. MAC_TABLE_ENTRY *e = HashListKeyToPointer(h->MacHashTable, t->Key);
  4137. DeleteHash(h->MacHashTable, e);
  4138. Free(e);
  4139. }
  4140. else
  4141. {
  4142. ret = ERR_OBJECT_NOT_FOUND;
  4143. }
  4144. }
  4145. UnlockHashList(h->MacHashTable);
  4146. if (ret == ERR_OBJECT_NOT_FOUND)
  4147. {
  4148. if (s->ServerType == SERVER_TYPE_FARM_CONTROLLER)
  4149. {
  4150. UINT i;
  4151. LockList(s->FarmMemberList);
  4152. {
  4153. for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
  4154. {
  4155. FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
  4156. if (f->Me == false)
  4157. {
  4158. SiCallDeleteMacTable(s, f, t->HubName, t->Key);
  4159. ret = ERR_NO_ERROR;
  4160. }
  4161. }
  4162. }
  4163. UnlockList(s->FarmMemberList);
  4164. }
  4165. }
  4166. ReleaseHub(h);
  4167. return ret;
  4168. }
  4169. // Get local MAC address table
  4170. UINT SiEnumMacTable(SERVER *s, char *hubname, RPC_ENUM_MAC_TABLE *t)
  4171. {
  4172. CEDAR *c;
  4173. UINT i;
  4174. HUB *h = NULL;
  4175. // Validate arguments
  4176. if (s == NULL || hubname == NULL || t == NULL)
  4177. {
  4178. return ERR_INTERNAL_ERROR;
  4179. }
  4180. c = s->Cedar;
  4181. LockHubList(c);
  4182. {
  4183. h = GetHub(c, hubname);
  4184. }
  4185. UnlockHubList(c);
  4186. if (h == NULL)
  4187. {
  4188. return ERR_HUB_NOT_FOUND;
  4189. }
  4190. StrCpy(t->HubName, sizeof(t->HubName), hubname);
  4191. LockHashList(h->MacHashTable);
  4192. {
  4193. MAC_TABLE_ENTRY **pp = (MAC_TABLE_ENTRY **)HashListToArray(h->MacHashTable, &t->NumMacTable);
  4194. t->MacTables = ZeroMalloc(sizeof(RPC_ENUM_MAC_TABLE_ITEM) * t->NumMacTable);
  4195. for (i = 0;i < t->NumMacTable;i++)
  4196. {
  4197. RPC_ENUM_MAC_TABLE_ITEM *e = &t->MacTables[i];
  4198. MAC_TABLE_ENTRY *mac = pp[i];
  4199. e->Key = POINTER_TO_KEY(mac);
  4200. StrCpy(e->SessionName, sizeof(e->SessionName), mac->Session->Name);
  4201. Copy(e->MacAddress, mac->MacAddress, sizeof(e->MacAddress));
  4202. e->CreatedTime = TickToTime(mac->CreatedTime);
  4203. e->UpdatedTime = TickToTime(mac->UpdatedTime);
  4204. e->VlanId = mac->VlanId;
  4205. GetMachineName(e->RemoteHostname, sizeof(e->RemoteHostname));
  4206. }
  4207. Free(pp);
  4208. }
  4209. UnlockHashList(h->MacHashTable);
  4210. ReleaseHub(h);
  4211. return ERR_NO_ERROR;
  4212. }
  4213. // Get MAC address table
  4214. UINT StEnumMacTable(ADMIN *a, RPC_ENUM_MAC_TABLE *t)
  4215. {
  4216. SERVER *s = a->Server;
  4217. CEDAR *c = s->Cedar;
  4218. HUB *h = NULL;
  4219. UINT ret = ERR_NO_ERROR;
  4220. char hubname[MAX_HUBNAME_LEN + 1];
  4221. UINT i;
  4222. CHECK_RIGHT;
  4223. // Get local MAC address table
  4224. StrCpy(hubname, sizeof(hubname), t->HubName);
  4225. FreeRpcEnumMacTable(t);
  4226. Zero(t, sizeof(RPC_ENUM_MAC_TABLE));
  4227. ret = SiEnumMacTable(s, hubname, t);
  4228. if (ret != ERR_NO_ERROR)
  4229. {
  4230. return ret;
  4231. }
  4232. if (s->ServerType == SERVER_TYPE_FARM_CONTROLLER)
  4233. {
  4234. // Get remote MAC address table
  4235. LockList(s->FarmMemberList);
  4236. {
  4237. for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
  4238. {
  4239. FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
  4240. if (f->Me == false)
  4241. {
  4242. RPC_ENUM_MAC_TABLE tmp;
  4243. Zero(&tmp, sizeof(tmp));
  4244. SiCallEnumMacTable(s, f, hubname, &tmp);
  4245. AdjoinRpcEnumMacTable(t, &tmp);
  4246. FreeRpcEnumMacTable(&tmp);
  4247. }
  4248. }
  4249. }
  4250. UnlockList(s->FarmMemberList);
  4251. }
  4252. return ret;
  4253. }
  4254. // Delete a session
  4255. UINT StDeleteSession(ADMIN *a, RPC_DELETE_SESSION *t)
  4256. {
  4257. SERVER *s = a->Server;
  4258. CEDAR *c = s->Cedar;
  4259. HUB *h = NULL;
  4260. UINT ret = ERR_NO_ERROR;
  4261. char hubname[MAX_HUBNAME_LEN + 1];
  4262. char name[MAX_SESSION_NAME_LEN + 1];
  4263. SESSION *sess;
  4264. if (IsEmptyStr(t->Name))
  4265. {
  4266. return ERR_INVALID_PARAMETER;
  4267. }
  4268. StrCpy(hubname, sizeof(hubname), t->HubName);
  4269. StrCpy(name, sizeof(name), t->Name);
  4270. CHECK_RIGHT;
  4271. LockHubList(c);
  4272. {
  4273. h = GetHub(c, t->HubName);
  4274. }
  4275. UnlockHubList(c);
  4276. if (h == NULL)
  4277. {
  4278. return ERR_HUB_NOT_FOUND;
  4279. }
  4280. if (a->ServerAdmin == false && GetHubAdminOption(h, "no_disconnect_session") != 0)
  4281. {
  4282. ReleaseHub(h);
  4283. return ERR_NOT_ENOUGH_RIGHT;
  4284. }
  4285. sess = GetSessionByName(h, name);
  4286. if (sess == NULL)
  4287. {
  4288. if (s->ServerType == SERVER_TYPE_FARM_CONTROLLER)
  4289. {
  4290. // Cluster controller
  4291. UINT i;
  4292. LockList(s->FarmMemberList);
  4293. {
  4294. for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
  4295. {
  4296. FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
  4297. if (f->Me == false)
  4298. {
  4299. // Try to disconnect
  4300. SiCallDeleteSession(s, f, t->HubName, t->Name);
  4301. }
  4302. }
  4303. }
  4304. UnlockList(s->FarmMemberList);
  4305. }
  4306. else
  4307. {
  4308. ret = ERR_OBJECT_NOT_FOUND;
  4309. }
  4310. }
  4311. else
  4312. {
  4313. if (sess->LinkModeServer)
  4314. {
  4315. ret = ERR_LINK_CANT_DISCONNECT;
  4316. }
  4317. else if (sess->SecureNATMode)
  4318. {
  4319. ret = ERR_SNAT_CANT_DISCONNECT;
  4320. }
  4321. else if (sess->BridgeMode)
  4322. {
  4323. ret = ERR_BRIDGE_CANT_DISCONNECT;
  4324. }
  4325. else if (sess->L3SwitchMode)
  4326. {
  4327. ret = ERR_LAYER3_CANT_DISCONNECT;
  4328. }
  4329. else
  4330. {
  4331. StopSession(sess);
  4332. }
  4333. ReleaseSession(sess);
  4334. }
  4335. if (ret != ERR_NO_ERROR)
  4336. {
  4337. ALog(a, h, "LA_DELETE_SESSION", t->Name);
  4338. }
  4339. ReleaseHub(h);
  4340. return ret;
  4341. }
  4342. // Get session status
  4343. UINT StGetSessionStatus(ADMIN *a, RPC_SESSION_STATUS *t)
  4344. {
  4345. SERVER *s = a->Server;
  4346. CEDAR *c = s->Cedar;
  4347. HUB *h = NULL;
  4348. UINT ret = ERR_NO_ERROR;
  4349. char hubname[MAX_HUBNAME_LEN + 1];
  4350. char name[MAX_SESSION_NAME_LEN + 1];
  4351. SESSION *sess;
  4352. StrCpy(hubname, sizeof(hubname), t->HubName);
  4353. StrCpy(name, sizeof(name), t->Name);
  4354. if (IsEmptyStr(t->Name))
  4355. {
  4356. return ERR_INVALID_PARAMETER;
  4357. }
  4358. CHECK_RIGHT;
  4359. LockHubList(c);
  4360. {
  4361. h = GetHub(c, t->HubName);
  4362. }
  4363. UnlockHubList(c);
  4364. if (h == NULL)
  4365. {
  4366. return ERR_HUB_NOT_FOUND;
  4367. }
  4368. if (a->ServerAdmin == false && GetHubAdminOption(h, "no_query_session") != 0)
  4369. {
  4370. ReleaseHub(h);
  4371. return ERR_NOT_ENOUGH_RIGHT;
  4372. }
  4373. FreeRpcSessionStatus(t);
  4374. Zero(t, sizeof(RPC_SESSION_STATUS));
  4375. StrCpy(t->HubName, sizeof(t->HubName), hubname);
  4376. StrCpy(t->Name, sizeof(t->Name), name);
  4377. sess = GetSessionByName(h, t->Name);
  4378. if (sess == NULL)
  4379. {
  4380. if (s->ServerType != SERVER_TYPE_FARM_CONTROLLER)
  4381. {
  4382. // Session is not found
  4383. ret = ERR_OBJECT_NOT_FOUND;
  4384. }
  4385. else
  4386. {
  4387. UINT i;
  4388. // Try to find the session on other cluster member
  4389. LockList(s->FarmMemberList);
  4390. {
  4391. for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
  4392. {
  4393. FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
  4394. if (f->Me == false)
  4395. {
  4396. RPC_SESSION_STATUS tmp;
  4397. Zero(&tmp, sizeof(tmp));
  4398. StrCpy(tmp.HubName, sizeof(tmp.HubName), t->HubName);
  4399. StrCpy(tmp.Name, sizeof(tmp.Name), t->Name);
  4400. if (SiCallGetSessionStatus(s, f, &tmp))
  4401. {
  4402. if (StrLen(tmp.HubName) != 0)
  4403. {
  4404. // Success to get session status
  4405. Copy(t, &tmp, sizeof(RPC_SESSION_STATUS));
  4406. break;
  4407. }
  4408. else
  4409. {
  4410. FreeRpcSessionStatus(&tmp);
  4411. }
  4412. }
  4413. }
  4414. }
  4415. if (i == LIST_NUM(s->FarmMemberList))
  4416. {
  4417. // not found after all
  4418. //
  4419. ret = ERR_OBJECT_NOT_FOUND;
  4420. }
  4421. }
  4422. UnlockList(s->FarmMemberList);
  4423. }
  4424. }
  4425. else
  4426. {
  4427. SESSION *s = sess;
  4428. Lock(s->lock);
  4429. {
  4430. StrCpy(t->Username, sizeof(t->Username), s->Username);
  4431. StrCpy(t->RealUsername, sizeof(t->RealUsername), s->UserNameReal);
  4432. StrCpy(t->GroupName, sizeof(t->GroupName), s->GroupName);
  4433. Copy(&t->NodeInfo, &s->NodeInfo, sizeof(NODE_INFO));
  4434. if (s->Connection != NULL)
  4435. {
  4436. t->ClientIp = IPToUINT(&s->Connection->ClientIp);
  4437. if (IsIP6(&s->Connection->ClientIp))
  4438. {
  4439. Copy(&t->ClientIp6, &s->Connection->ClientIp.address, sizeof(t->ClientIp6));
  4440. }
  4441. CopyIP(&t->ClientIpAddress, &s->Connection->ClientIp);
  4442. StrCpy(t->ClientHostName, sizeof(t->ClientHostName), s->Connection->ClientHostname);
  4443. }
  4444. }
  4445. Unlock(s->lock);
  4446. CiGetSessionStatus(&t->Status, s);
  4447. ReleaseSession(s);
  4448. }
  4449. ReleaseHub(h);
  4450. return ret;
  4451. }
  4452. // Main routine of session enumeration
  4453. void SiEnumSessionMain(SERVER *s, RPC_ENUM_SESSION *t)
  4454. {
  4455. char hubname[MAX_HUBNAME_LEN + 1];
  4456. UINT ret = ERR_NO_ERROR;
  4457. UINT num;
  4458. UINT i;
  4459. // Validate arguments
  4460. if (s == NULL || t == NULL)
  4461. {
  4462. return;
  4463. }
  4464. StrCpy(hubname, sizeof(hubname), t->HubName);
  4465. FreeRpcEnumSession(t);
  4466. Zero(t, sizeof(RPC_ENUM_SESSION));
  4467. StrCpy(t->HubName, sizeof(t->HubName), hubname);
  4468. // Local session enumeration
  4469. num = 0;
  4470. SiEnumLocalSession(s, hubname, t);
  4471. if (s->ServerType == SERVER_TYPE_FARM_CONTROLLER)
  4472. {
  4473. LIST *fm_list;
  4474. fm_list = NewListFast(NULL);
  4475. // Remote session enumeration
  4476. LockList(s->FarmMemberList);
  4477. {
  4478. while (true)
  4479. {
  4480. bool escape = true;
  4481. for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
  4482. {
  4483. FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
  4484. if (IsInList(fm_list, f) == false)
  4485. {
  4486. Add(fm_list, f);
  4487. escape = false;
  4488. if (f->Me == false)
  4489. {
  4490. RPC_ENUM_SESSION tmp;
  4491. Zero(&tmp, sizeof(tmp));
  4492. SiCallEnumSession(s, f, hubname, &tmp);
  4493. AdjoinRpcEnumSession(t, &tmp);
  4494. FreeRpcEnumSession(&tmp);
  4495. }
  4496. break;
  4497. }
  4498. }
  4499. if (escape)
  4500. {
  4501. break;
  4502. }
  4503. UnlockList(s->FarmMemberList);
  4504. LockList(s->FarmMemberList);
  4505. }
  4506. }
  4507. UnlockList(s->FarmMemberList);
  4508. ReleaseList(fm_list);
  4509. }
  4510. }
  4511. // Enumerate sessions
  4512. UINT StEnumSession(ADMIN *a, RPC_ENUM_SESSION *t)
  4513. {
  4514. SERVER *s = a->Server;
  4515. CEDAR *c = s->Cedar;
  4516. HUB *h = NULL;
  4517. UINT ret = ERR_NO_ERROR;
  4518. CHECK_RIGHT;
  4519. LockHubList(c);
  4520. {
  4521. h = GetHub(c, t->HubName);
  4522. }
  4523. UnlockHubList(c);
  4524. if (h == NULL)
  4525. {
  4526. return ERR_HUB_NOT_FOUND;
  4527. }
  4528. if (a->ServerAdmin == false && GetHubAdminOption(h, "no_enum_session") != 0)
  4529. {
  4530. ReleaseHub(h);
  4531. return ERR_NOT_ENOUGH_RIGHT;
  4532. }
  4533. SiEnumSessionMain(s, t);
  4534. ReleaseHub(h);
  4535. return ret;
  4536. }
  4537. // Enumerate groups
  4538. UINT StEnumGroup(ADMIN *a, RPC_ENUM_GROUP *t)
  4539. {
  4540. SERVER *s = a->Server;
  4541. CEDAR *c = s->Cedar;
  4542. HUB *h = NULL;
  4543. UINT ret = ERR_NO_ERROR;
  4544. char hubname[MAX_HUBNAME_LEN + 1];
  4545. StrCpy(hubname, sizeof(hubname), t->HubName);
  4546. CHECK_RIGHT;
  4547. NO_SUPPORT_FOR_BRIDGE;
  4548. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  4549. {
  4550. return ERR_NOT_SUPPORTED;
  4551. }
  4552. LockHubList(c);
  4553. {
  4554. h = GetHub(c, t->HubName);
  4555. }
  4556. UnlockHubList(c);
  4557. if (h == NULL)
  4558. {
  4559. return ERR_HUB_NOT_FOUND;
  4560. }
  4561. AcLock(h);
  4562. {
  4563. UINT i, j;
  4564. FreeRpcEnumGroup(t);
  4565. Zero(t, sizeof(RPC_ENUM_GROUP));
  4566. StrCpy(t->HubName, sizeof(t->HubName), hubname);
  4567. t->NumGroup = LIST_NUM(h->HubDb->GroupList);
  4568. t->Groups = ZeroMalloc(sizeof(RPC_ENUM_GROUP_ITEM) * t->NumGroup);
  4569. for (i = 0;i < t->NumGroup;i++)
  4570. {
  4571. RPC_ENUM_GROUP_ITEM *e = &t->Groups[i];
  4572. USERGROUP *g = LIST_DATA(h->HubDb->GroupList, i);
  4573. Lock(g->lock);
  4574. {
  4575. StrCpy(e->Name, sizeof(e->Name), g->Name);
  4576. UniStrCpy(e->Realname, sizeof(e->Realname), g->RealName);
  4577. UniStrCpy(e->Note, sizeof(e->Note), g->Note);
  4578. if (g->Policy != NULL)
  4579. {
  4580. if (g->Policy->Access == false)
  4581. {
  4582. e->DenyAccess = true;
  4583. }
  4584. }
  4585. }
  4586. Unlock(g->lock);
  4587. e->NumUsers = 0;
  4588. LockList(h->HubDb->UserList);
  4589. {
  4590. for (j = 0;j < LIST_NUM(h->HubDb->UserList);j++)
  4591. {
  4592. USER *u = LIST_DATA(h->HubDb->UserList, j);
  4593. Lock(u->lock);
  4594. {
  4595. if (u->Group == g)
  4596. {
  4597. e->NumUsers++;
  4598. }
  4599. }
  4600. Unlock(u->lock);
  4601. }
  4602. }
  4603. UnlockList(h->HubDb->UserList);
  4604. }
  4605. }
  4606. AcUnlock(h);
  4607. ReleaseHub(h);
  4608. return ERR_NO_ERROR;
  4609. }
  4610. // Delete a group
  4611. UINT StDeleteGroup(ADMIN *a, RPC_DELETE_USER *t)
  4612. {
  4613. SERVER *s = a->Server;
  4614. CEDAR *c = s->Cedar;
  4615. HUB *h = NULL;
  4616. UINT ret = ERR_NO_ERROR;
  4617. if (IsEmptyStr(t->Name) || IsSafeStr(t->Name) == false)
  4618. {
  4619. return ERR_INVALID_PARAMETER;
  4620. }
  4621. CHECK_RIGHT;
  4622. NO_SUPPORT_FOR_BRIDGE;
  4623. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  4624. {
  4625. return ERR_NOT_SUPPORTED;
  4626. }
  4627. LockHubList(c);
  4628. {
  4629. h = GetHub(c, t->HubName);
  4630. }
  4631. UnlockHubList(c);
  4632. if (h == NULL)
  4633. {
  4634. return ERR_HUB_NOT_FOUND;
  4635. }
  4636. if (a->ServerAdmin == false && GetHubAdminOption(h, "no_change_groups") != 0)
  4637. {
  4638. ReleaseHub(h);
  4639. return ERR_NOT_ENOUGH_RIGHT;
  4640. }
  4641. AcLock(h);
  4642. {
  4643. if (AcDeleteGroup(h, t->Name) == false)
  4644. {
  4645. ret = ERR_OBJECT_NOT_FOUND;
  4646. }
  4647. }
  4648. AcUnlock(h);
  4649. if (ret == ERR_NO_ERROR)
  4650. {
  4651. ALog(a, h, "LA_DELETE_GROUP", t->Name);
  4652. }
  4653. ReleaseHub(h);
  4654. IncrementServerConfigRevision(s);
  4655. return ret;
  4656. }
  4657. // Get group information
  4658. UINT StGetGroup(ADMIN *a, RPC_SET_GROUP *t)
  4659. {
  4660. SERVER *s = a->Server;
  4661. CEDAR *c = s->Cedar;
  4662. HUB *h = NULL;
  4663. UINT ret = ERR_NO_ERROR;
  4664. char hubname[MAX_HUBNAME_LEN + 1];
  4665. if (IsEmptyStr(t->Name) || IsSafeStr(t->Name) == false)
  4666. {
  4667. return ERR_INVALID_PARAMETER;
  4668. }
  4669. CHECK_RIGHT;
  4670. NO_SUPPORT_FOR_BRIDGE;
  4671. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  4672. {
  4673. return ERR_NOT_SUPPORTED;
  4674. }
  4675. StrCpy(hubname, sizeof(hubname), t->HubName);
  4676. LockHubList(c);
  4677. {
  4678. h = GetHub(c, t->HubName);
  4679. }
  4680. UnlockHubList(c);
  4681. if (h == NULL)
  4682. {
  4683. return ERR_HUB_NOT_FOUND;
  4684. }
  4685. AcLock(h);
  4686. {
  4687. USERGROUP *g = AcGetGroup(h, t->Name);
  4688. if (g == NULL)
  4689. {
  4690. ret = ERR_OBJECT_NOT_FOUND;
  4691. }
  4692. else
  4693. {
  4694. FreeRpcSetGroup(t);
  4695. Zero(t, sizeof(RPC_SET_GROUP));
  4696. StrCpy(t->HubName, sizeof(t->HubName), hubname);
  4697. Lock(g->lock);
  4698. {
  4699. StrCpy(t->Name, sizeof(t->Name), g->Name);
  4700. UniStrCpy(t->Realname, sizeof(t->Realname), g->RealName);
  4701. UniStrCpy(t->Note, sizeof(t->Note), g->Note);
  4702. Copy(&t->Traffic, g->Traffic, sizeof(TRAFFIC));
  4703. }
  4704. Unlock(g->lock);
  4705. t->Policy = GetGroupPolicy(g);
  4706. ReleaseGroup(g);
  4707. }
  4708. }
  4709. AcUnlock(h);
  4710. ReleaseHub(h);
  4711. return ret;
  4712. }
  4713. // Set group setting
  4714. UINT StSetGroup(ADMIN *a, RPC_SET_GROUP *t)
  4715. {
  4716. SERVER *s = a->Server;
  4717. CEDAR *c = s->Cedar;
  4718. HUB *h = NULL;
  4719. UINT ret = ERR_NO_ERROR;
  4720. if (IsEmptyStr(t->Name) || IsSafeStr(t->Name) == false)
  4721. {
  4722. return ERR_INVALID_PARAMETER;
  4723. }
  4724. CHECK_RIGHT;
  4725. NO_SUPPORT_FOR_BRIDGE;
  4726. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  4727. {
  4728. return ERR_NOT_SUPPORTED;
  4729. }
  4730. LockHubList(c);
  4731. {
  4732. h = GetHub(c, t->HubName);
  4733. }
  4734. UnlockHubList(c);
  4735. if (h == NULL)
  4736. {
  4737. return ERR_HUB_NOT_FOUND;
  4738. }
  4739. if (a->ServerAdmin == false && GetHubAdminOption(h, "no_change_groups") != 0)
  4740. {
  4741. ReleaseHub(h);
  4742. return ERR_NOT_ENOUGH_RIGHT;
  4743. }
  4744. AcLock(h);
  4745. {
  4746. USERGROUP *g = AcGetGroup(h, t->Name);
  4747. if (g == NULL)
  4748. {
  4749. ret = ERR_OBJECT_NOT_FOUND;
  4750. }
  4751. else
  4752. {
  4753. Lock(g->lock);
  4754. {
  4755. Free(g->RealName);
  4756. Free(g->Note);
  4757. g->RealName = UniCopyStr(t->Realname);
  4758. g->Note = UniCopyStr(t->Note);
  4759. }
  4760. Unlock(g->lock);
  4761. SetGroupPolicy(g, t->Policy);
  4762. ReleaseGroup(g);
  4763. ALog(a, h, "LA_SET_GROUP", t->Name);
  4764. }
  4765. }
  4766. AcUnlock(h);
  4767. ReleaseHub(h);
  4768. IncrementServerConfigRevision(s);
  4769. return ret;
  4770. }
  4771. // Create a group
  4772. UINT StCreateGroup(ADMIN *a, RPC_SET_GROUP *t)
  4773. {
  4774. SERVER *s = a->Server;
  4775. CEDAR *c = s->Cedar;
  4776. HUB *h = NULL;
  4777. UINT ret = ERR_NO_ERROR;
  4778. if (IsEmptyStr(t->Name) || IsSafeStr(t->Name) == false)
  4779. {
  4780. return ERR_INVALID_PARAMETER;
  4781. }
  4782. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  4783. {
  4784. return ERR_NOT_FARM_CONTROLLER;
  4785. }
  4786. CHECK_RIGHT;
  4787. NO_SUPPORT_FOR_BRIDGE;
  4788. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  4789. {
  4790. return ERR_NOT_SUPPORTED;
  4791. }
  4792. LockHubList(c);
  4793. {
  4794. h = GetHub(c, t->HubName);
  4795. }
  4796. UnlockHubList(c);
  4797. if (h == NULL)
  4798. {
  4799. return ERR_HUB_NOT_FOUND;
  4800. }
  4801. if (a->ServerAdmin == false && GetHubAdminOption(h, "no_change_groups") != 0)
  4802. {
  4803. ReleaseHub(h);
  4804. return ERR_NOT_ENOUGH_RIGHT;
  4805. }
  4806. AcLock(h);
  4807. {
  4808. if (AcIsGroup(h, t->Name))
  4809. {
  4810. ret = ERR_GROUP_ALREADY_EXISTS;
  4811. }
  4812. else
  4813. {
  4814. USERGROUP *g = NewGroup(t->Name, t->Realname, t->Note);
  4815. SetGroupPolicy(g, t->Policy);
  4816. if ((LIST_NUM(h->HubDb->GroupList) >= GetServerCapsInt(a->Server, "i_max_users_per_hub")) ||
  4817. ((GetHubAdminOption(h, "max_groups") != 0) && (LIST_NUM(h->HubDb->GroupList) >= GetHubAdminOption(h, "max_groups"))))
  4818. {
  4819. ret = ERR_TOO_MANY_GROUP;
  4820. }
  4821. else
  4822. {
  4823. AcAddGroup(h, g);
  4824. }
  4825. ReleaseGroup(g);
  4826. ALog(a, h, "LA_CREATE_GROUP", t->Name);
  4827. }
  4828. }
  4829. AcUnlock(h);
  4830. ReleaseHub(h);
  4831. IncrementServerConfigRevision(s);
  4832. return ret;
  4833. }
  4834. // Enumerate users
  4835. UINT StEnumUser(ADMIN *a, RPC_ENUM_USER *t)
  4836. {
  4837. SERVER *s = a->Server;
  4838. CEDAR *c = s->Cedar;
  4839. HUB *h = NULL;
  4840. UINT ret = ERR_NO_ERROR;
  4841. char hubname[MAX_HUBNAME_LEN + 1];
  4842. UINT i, num;
  4843. CHECK_RIGHT;
  4844. NO_SUPPORT_FOR_BRIDGE;
  4845. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  4846. {
  4847. return ERR_NOT_SUPPORTED;
  4848. }
  4849. LockHubList(c);
  4850. {
  4851. h = GetHub(c, t->HubName);
  4852. }
  4853. UnlockHubList(c);
  4854. if (h == NULL)
  4855. {
  4856. return ERR_HUB_NOT_FOUND;
  4857. }
  4858. FreeRpcEnumUser(t);
  4859. StrCpy(hubname, sizeof(hubname), t->HubName);
  4860. Zero(t, sizeof(RPC_ENUM_USER));
  4861. StrCpy(t->HubName, sizeof(t->HubName), hubname);
  4862. LockList(h->HubDb->UserList);
  4863. {
  4864. num = LIST_NUM(h->HubDb->UserList);
  4865. t->NumUser = num;
  4866. t->Users = ZeroMalloc(sizeof(RPC_ENUM_USER_ITEM) * num);
  4867. for (i = 0;i < num;i++)
  4868. {
  4869. USER *u = LIST_DATA(h->HubDb->UserList, i);
  4870. Lock(u->lock);
  4871. {
  4872. RPC_ENUM_USER_ITEM *e = &t->Users[i];
  4873. StrCpy(e->Name, sizeof(e->Name), u->Name);
  4874. StrCpy(e->GroupName, sizeof(e->GroupName), u->GroupName);
  4875. UniStrCpy(e->Realname, sizeof(e->Realname), u->RealName);
  4876. UniStrCpy(e->Note, sizeof(e->Note), u->Note);
  4877. e->AuthType = u->AuthType;
  4878. e->LastLoginTime = u->LastLoginTime;
  4879. e->NumLogin = u->NumLogin;
  4880. if (u->Policy != NULL)
  4881. {
  4882. e->DenyAccess = u->Policy->Access ? false : true;
  4883. }
  4884. Copy(&e->Traffic, u->Traffic, sizeof(TRAFFIC));
  4885. e->IsTrafficFilled = true;
  4886. e->Expires = u->ExpireTime;
  4887. e->IsExpiresFilled = true;
  4888. }
  4889. Unlock(u->lock);
  4890. }
  4891. }
  4892. UnlockList(h->HubDb->UserList);
  4893. ReleaseHub(h);
  4894. IncrementServerConfigRevision(s);
  4895. return ERR_NO_ERROR;
  4896. }
  4897. // Delete a user
  4898. UINT StDeleteUser(ADMIN *a, RPC_DELETE_USER *t)
  4899. {
  4900. SERVER *s = a->Server;
  4901. CEDAR *c = s->Cedar;
  4902. HUB *h = NULL;
  4903. UINT ret = ERR_NO_ERROR;
  4904. if (IsEmptyStr(t->Name) || IsUserName(t->Name) == false)
  4905. {
  4906. return ERR_INVALID_PARAMETER;
  4907. }
  4908. CHECK_RIGHT;
  4909. NO_SUPPORT_FOR_BRIDGE;
  4910. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  4911. {
  4912. return ERR_NOT_SUPPORTED;
  4913. }
  4914. LockHubList(c);
  4915. {
  4916. h = GetHub(c, t->HubName);
  4917. }
  4918. UnlockHubList(c);
  4919. if (h == NULL)
  4920. {
  4921. return ERR_HUB_NOT_FOUND;
  4922. }
  4923. if (a->ServerAdmin == false && GetHubAdminOption(h, "no_change_users") != 0)
  4924. {
  4925. ReleaseHub(h);
  4926. return ERR_NOT_ENOUGH_RIGHT;
  4927. }
  4928. ALog(a, h, "LA_DELETE_USER", t->Name);
  4929. AcLock(h);
  4930. {
  4931. if (AcDeleteUser(h, t->Name) == false)
  4932. {
  4933. ret = ERR_OBJECT_NOT_FOUND;
  4934. }
  4935. }
  4936. AcUnlock(h);
  4937. ReleaseHub(h);
  4938. IncrementServerConfigRevision(s);
  4939. return ret;
  4940. }
  4941. // Get user setting
  4942. UINT StGetUser(ADMIN *a, RPC_SET_USER *t)
  4943. {
  4944. SERVER *s = a->Server;
  4945. CEDAR *c = s->Cedar;
  4946. HUB *h = NULL;
  4947. UINT ret = ERR_NO_ERROR;
  4948. USER *u = NULL;
  4949. USERGROUP *g = NULL;
  4950. char name[MAX_USERNAME_LEN + 1];
  4951. char hubname[MAX_HUBNAME_LEN + 1];
  4952. StrCpy(name, sizeof(name), t->Name);
  4953. StrCpy(hubname, sizeof(hubname), t->HubName);
  4954. if (IsEmptyStr(t->Name) || IsUserName(t->Name) == false)
  4955. {
  4956. return ERR_INVALID_PARAMETER;
  4957. }
  4958. CHECK_RIGHT;
  4959. NO_SUPPORT_FOR_BRIDGE;
  4960. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  4961. {
  4962. return ERR_NOT_SUPPORTED;
  4963. }
  4964. FreeRpcSetUser(t);
  4965. Zero(t, sizeof(RPC_SET_USER));
  4966. StrCpy(t->HubName, sizeof(t->HubName), hubname);
  4967. StrCpy(t->Name, sizeof(t->Name), name);
  4968. LockHubList(c);
  4969. {
  4970. h = GetHub(c, hubname);
  4971. }
  4972. UnlockHubList(c);
  4973. if (h == NULL)
  4974. {
  4975. return ERR_HUB_NOT_FOUND;
  4976. }
  4977. AcLock(h);
  4978. {
  4979. u = AcGetUser(h, name);
  4980. if (u == NULL)
  4981. {
  4982. ret = ERR_OBJECT_NOT_FOUND;
  4983. }
  4984. else
  4985. {
  4986. Lock(u->lock);
  4987. {
  4988. StrCpy(t->GroupName, sizeof(t->GroupName), u->GroupName);
  4989. UniStrCpy(t->Realname, sizeof(t->Realname), u->RealName);
  4990. UniStrCpy(t->Note, sizeof(t->Note), u->Note);
  4991. t->CreatedTime = u->CreatedTime;
  4992. t->UpdatedTime = u->UpdatedTime;
  4993. t->ExpireTime = u->ExpireTime;
  4994. t->AuthType = u->AuthType;
  4995. t->AuthData = CopyAuthData(u->AuthData, t->AuthType);
  4996. t->NumLogin = u->NumLogin;
  4997. Copy(&t->Traffic, u->Traffic, sizeof(TRAFFIC));
  4998. if (u->Policy != NULL)
  4999. {
  5000. t->Policy = ClonePolicy(u->Policy);
  5001. }
  5002. }
  5003. Unlock(u->lock);
  5004. ReleaseUser(u);
  5005. }
  5006. }
  5007. AcUnlock(h);
  5008. ReleaseHub(h);
  5009. return ret;
  5010. }
  5011. // Set user setting
  5012. UINT StSetUser(ADMIN *a, RPC_SET_USER *t)
  5013. {
  5014. SERVER *s = a->Server;
  5015. CEDAR *c = s->Cedar;
  5016. HUB *h = NULL;
  5017. UINT ret = ERR_NO_ERROR;
  5018. USER *u = NULL;
  5019. USERGROUP *g = NULL;
  5020. if (IsEmptyStr(t->Name) || IsUserName(t->Name) == false)
  5021. {
  5022. return ERR_INVALID_PARAMETER;
  5023. }
  5024. NO_SUPPORT_FOR_BRIDGE;
  5025. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  5026. {
  5027. return ERR_NOT_SUPPORTED;
  5028. }
  5029. CHECK_RIGHT;
  5030. if (GetGlobalServerFlag(GSF_DISABLE_RADIUS_AUTH) != 0)
  5031. {
  5032. if (t->AuthType == AUTHTYPE_USERCERT || t->AuthType == AUTHTYPE_RADIUS || t->AuthType == AUTHTYPE_ROOTCERT || t->AuthType == AUTHTYPE_NT)
  5033. {
  5034. return ERR_NOT_SUPPORTED_AUTH_ON_OPENSOURCE;
  5035. }
  5036. }
  5037. if (StrCmpi(t->Name, "*") == 0)
  5038. {
  5039. if (t->AuthType != AUTHTYPE_RADIUS && t->AuthType != AUTHTYPE_NT)
  5040. {
  5041. return ERR_INVALID_PARAMETER;
  5042. }
  5043. }
  5044. if (t->AuthType == AUTHTYPE_USERCERT)
  5045. {
  5046. AUTHUSERCERT *c = t->AuthData;
  5047. if (c != NULL && c->UserX != NULL &&
  5048. c->UserX->is_compatible_bit == false)
  5049. {
  5050. return ERR_NOT_RSA_1024;
  5051. }
  5052. if (c == NULL || c->UserX == NULL)
  5053. {
  5054. return ERR_INVALID_PARAMETER;
  5055. }
  5056. }
  5057. LockHubList(c);
  5058. {
  5059. h = GetHub(c, t->HubName);
  5060. }
  5061. UnlockHubList(c);
  5062. if (h == NULL)
  5063. {
  5064. return ERR_HUB_NOT_FOUND;
  5065. }
  5066. if (a->ServerAdmin == false && GetHubAdminOption(h, "no_change_users") != 0)
  5067. {
  5068. ReleaseHub(h);
  5069. return ERR_NOT_ENOUGH_RIGHT;
  5070. }
  5071. AcLock(h);
  5072. {
  5073. u = AcGetUser(h, t->Name);
  5074. if (u == NULL)
  5075. {
  5076. ret = ERR_OBJECT_NOT_FOUND;
  5077. }
  5078. else
  5079. {
  5080. Lock(u->lock);
  5081. {
  5082. if (StrLen(t->GroupName) != 0)
  5083. {
  5084. g = AcGetGroup(h, t->GroupName);
  5085. if (g != NULL)
  5086. {
  5087. JoinUserToGroup(u, g);
  5088. ReleaseGroup(g);
  5089. }
  5090. else
  5091. {
  5092. ret = ERR_GROUP_NOT_FOUND;
  5093. }
  5094. }
  5095. else
  5096. {
  5097. JoinUserToGroup(u, NULL);
  5098. }
  5099. if (ret != ERR_GROUP_NOT_FOUND)
  5100. {
  5101. Free(u->RealName);
  5102. Free(u->Note);
  5103. u->RealName = UniCopyStr(t->Realname);
  5104. u->Note = UniCopyStr(t->Note);
  5105. SetUserAuthData(u, t->AuthType, CopyAuthData(t->AuthData, t->AuthType));
  5106. u->ExpireTime = t->ExpireTime;
  5107. u->UpdatedTime = SystemTime64();
  5108. SetUserPolicy(u, t->Policy);
  5109. }
  5110. }
  5111. Unlock(u->lock);
  5112. IncrementServerConfigRevision(s);
  5113. ReleaseUser(u);
  5114. }
  5115. }
  5116. AcUnlock(h);
  5117. if (ret == ERR_NO_ERROR)
  5118. {
  5119. ALog(a, h, "LA_SET_USER", t->Name);
  5120. }
  5121. ReleaseHub(h);
  5122. return ret;
  5123. }
  5124. // Create a user
  5125. UINT StCreateUser(ADMIN *a, RPC_SET_USER *t)
  5126. {
  5127. SERVER *s = a->Server;
  5128. CEDAR *c = s->Cedar;
  5129. HUB *h = NULL;
  5130. UINT ret = ERR_NO_ERROR;
  5131. USER *u;
  5132. USERGROUP *g = NULL;
  5133. if (IsEmptyStr(t->Name) || IsUserName(t->Name) == false)
  5134. {
  5135. return ERR_INVALID_PARAMETER;
  5136. }
  5137. NO_SUPPORT_FOR_BRIDGE;
  5138. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  5139. {
  5140. return ERR_NOT_SUPPORTED;
  5141. }
  5142. CHECK_RIGHT;
  5143. if (GetGlobalServerFlag(GSF_DISABLE_RADIUS_AUTH) != 0)
  5144. {
  5145. if (t->AuthType == AUTHTYPE_USERCERT || t->AuthType == AUTHTYPE_RADIUS || t->AuthType == AUTHTYPE_ROOTCERT || t->AuthType == AUTHTYPE_NT)
  5146. {
  5147. return ERR_NOT_SUPPORTED_AUTH_ON_OPENSOURCE;
  5148. }
  5149. }
  5150. if (t->AuthType == AUTHTYPE_USERCERT)
  5151. {
  5152. AUTHUSERCERT *c = t->AuthData;
  5153. if (c != NULL && c->UserX != NULL &&
  5154. c->UserX->is_compatible_bit == false)
  5155. {
  5156. return ERR_NOT_RSA_1024;
  5157. }
  5158. if (c == NULL || c->UserX == NULL)
  5159. {
  5160. return ERR_INVALID_PARAMETER;
  5161. }
  5162. }
  5163. if (IsUserName(t->Name) == false)
  5164. {
  5165. return ERR_INVALID_PARAMETER;
  5166. }
  5167. if (StrCmpi(t->Name, "*") == 0)
  5168. {
  5169. if (t->AuthType != AUTHTYPE_RADIUS && t->AuthType != AUTHTYPE_NT)
  5170. {
  5171. return ERR_INVALID_PARAMETER;
  5172. }
  5173. }
  5174. LockHubList(c);
  5175. {
  5176. h = GetHub(c, t->HubName);
  5177. }
  5178. UnlockHubList(c);
  5179. if (h == NULL)
  5180. {
  5181. return ERR_HUB_NOT_FOUND;
  5182. }
  5183. if (a->ServerAdmin == false && GetHubAdminOption(h, "no_change_users") != 0)
  5184. {
  5185. ReleaseHub(h);
  5186. return ERR_NOT_ENOUGH_RIGHT;
  5187. }
  5188. u = NewUser(t->Name, t->Realname, t->Note, t->AuthType, CopyAuthData(t->AuthData, t->AuthType));
  5189. if (u == NULL)
  5190. {
  5191. ReleaseHub(h);
  5192. return ERR_INTERNAL_ERROR;
  5193. }
  5194. u->ExpireTime = t->ExpireTime;
  5195. SetUserPolicy(u, t->Policy);
  5196. AcLock(h);
  5197. {
  5198. if ((LIST_NUM(h->HubDb->UserList) >= GetServerCapsInt(a->Server, "i_max_users_per_hub")) ||
  5199. ((GetHubAdminOption(h, "max_users") != 0) && (LIST_NUM(h->HubDb->UserList) >= GetHubAdminOption(h, "max_users"))))
  5200. {
  5201. ret = ERR_TOO_MANY_USER;
  5202. }
  5203. else if (SiTooManyUserObjectsInServer(s, false))
  5204. {
  5205. ret = ERR_TOO_MANY_USERS_CREATED;
  5206. ALog(a, h, "ERR_128");
  5207. }
  5208. else if (AcIsUser(h, t->Name))
  5209. {
  5210. ret = ERR_USER_ALREADY_EXISTS;
  5211. }
  5212. else
  5213. {
  5214. if (StrLen(t->GroupName) != 0)
  5215. {
  5216. g = AcGetGroup(h, t->GroupName);
  5217. if (g == NULL)
  5218. {
  5219. ret = ERR_GROUP_NOT_FOUND;
  5220. }
  5221. }
  5222. if (ret != ERR_GROUP_NOT_FOUND)
  5223. {
  5224. if (g != NULL)
  5225. {
  5226. JoinUserToGroup(u, g);
  5227. ReleaseGroup(g);
  5228. }
  5229. AcAddUser(h, u);
  5230. ALog(a, h, "LA_CREATE_USER", t->Name);
  5231. IncrementServerConfigRevision(s);
  5232. }
  5233. }
  5234. }
  5235. AcUnlock(h);
  5236. ReleaseUser(u);
  5237. ReleaseHub(h);
  5238. return ret;
  5239. }
  5240. // Get access list
  5241. UINT StEnumAccess(ADMIN *a, RPC_ENUM_ACCESS_LIST *t)
  5242. {
  5243. SERVER *s = a->Server;
  5244. CEDAR *c = s->Cedar;
  5245. HUB *h;
  5246. UINT i;
  5247. char hubname[MAX_HUBNAME_LEN + 1];
  5248. CHECK_RIGHT;
  5249. NO_SUPPORT_FOR_BRIDGE;
  5250. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  5251. {
  5252. return ERR_NOT_SUPPORTED;
  5253. }
  5254. LockHubList(c);
  5255. {
  5256. h = GetHub(c, t->HubName);
  5257. }
  5258. UnlockHubList(c);
  5259. if (h == NULL)
  5260. {
  5261. return ERR_HUB_NOT_FOUND;
  5262. }
  5263. StrCpy(hubname, sizeof(hubname), t->HubName);
  5264. FreeRpcEnumAccessList(t);
  5265. Zero(t, sizeof(RPC_ENUM_ACCESS_LIST));
  5266. StrCpy(t->HubName, sizeof(t->HubName), hubname);
  5267. LockList(h->AccessList);
  5268. {
  5269. t->NumAccess = LIST_NUM(h->AccessList);
  5270. t->Accesses = ZeroMalloc(sizeof(ACCESS) * t->NumAccess);
  5271. for (i = 0;i < LIST_NUM(h->AccessList);i++)
  5272. {
  5273. ACCESS *a = &t->Accesses[i];
  5274. Copy(a, LIST_DATA(h->AccessList, i), sizeof(ACCESS));
  5275. a->UniqueId = HashPtrToUINT(LIST_DATA(h->AccessList, i));
  5276. }
  5277. }
  5278. UnlockList(h->AccessList);
  5279. ReleaseHub(h);
  5280. return ERR_NO_ERROR;
  5281. }
  5282. // Delete access list entry
  5283. UINT StDeleteAccess(ADMIN *a, RPC_DELETE_ACCESS *t)
  5284. {
  5285. SERVER *s = a->Server;
  5286. CEDAR *c = s->Cedar;
  5287. HUB *h;
  5288. UINT i;
  5289. bool exists;
  5290. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  5291. {
  5292. return ERR_NOT_FARM_CONTROLLER;
  5293. }
  5294. CHECK_RIGHT;
  5295. NO_SUPPORT_FOR_BRIDGE;
  5296. LockHubList(c);
  5297. {
  5298. h = GetHub(c, t->HubName);
  5299. }
  5300. UnlockHubList(c);
  5301. if (h == NULL)
  5302. {
  5303. return ERR_HUB_NOT_FOUND;
  5304. }
  5305. if (a->ServerAdmin == false && GetHubAdminOption(h, "no_change_access_list") != 0)
  5306. {
  5307. ReleaseHub(h);
  5308. return ERR_NOT_ENOUGH_RIGHT;
  5309. }
  5310. exists = false;
  5311. LockList(h->AccessList);
  5312. {
  5313. for (i = 0;i < LIST_NUM(h->AccessList);i++)
  5314. {
  5315. ACCESS *access = LIST_DATA(h->AccessList, i);
  5316. if ((t->Id < MAX_ACCESSLISTS && access->Id == t->Id) ||
  5317. (t->Id >= MAX_ACCESSLISTS && HashPtrToUINT(access) == t->Id))
  5318. {
  5319. Free(access);
  5320. Delete(h->AccessList, access);
  5321. exists = true;
  5322. break;
  5323. }
  5324. }
  5325. }
  5326. UnlockList(h->AccessList);
  5327. if (exists == false)
  5328. {
  5329. ReleaseHub(h);
  5330. return ERR_OBJECT_NOT_FOUND;
  5331. }
  5332. ALog(a, h, "LA_DELETE_ACCESS");
  5333. IncrementServerConfigRevision(s);
  5334. ReleaseHub(h);
  5335. return ERR_NO_ERROR;
  5336. }
  5337. // Set access list
  5338. UINT StSetAccessList(ADMIN *a, RPC_ENUM_ACCESS_LIST *t)
  5339. {
  5340. SERVER *s = a->Server;
  5341. CEDAR *c = s->Cedar;
  5342. HUB *h;
  5343. UINT i;
  5344. bool no_jitter = false;
  5345. bool no_include = false;
  5346. NO_SUPPORT_FOR_BRIDGE;
  5347. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  5348. {
  5349. return ERR_NOT_SUPPORTED;
  5350. }
  5351. CHECK_RIGHT;
  5352. if (t->NumAccess > GetServerCapsInt(a->Server, "i_max_access_lists"))
  5353. {
  5354. return ERR_TOO_MANY_ACCESS_LIST;
  5355. }
  5356. LockHubList(c);
  5357. {
  5358. h = GetHub(c, t->HubName);
  5359. }
  5360. UnlockHubList(c);
  5361. if (h == NULL)
  5362. {
  5363. return ERR_HUB_NOT_FOUND;
  5364. }
  5365. no_jitter = GetHubAdminOption(h, "no_delay_jitter_packet_loss");
  5366. no_include = GetHubAdminOption(h, "no_access_list_include_file");
  5367. if (a->ServerAdmin == false && GetHubAdminOption(h, "no_change_access_list") != 0)
  5368. {
  5369. ReleaseHub(h);
  5370. return ERR_NOT_ENOUGH_RIGHT;
  5371. }
  5372. if (a->ServerAdmin == false && GetHubAdminOption(h, "max_accesslists") != 0 &&
  5373. t->NumAccess > GetHubAdminOption(h, "max_accesslists"))
  5374. {
  5375. ReleaseHub(h);
  5376. return ERR_TOO_MANY_ACCESS_LIST;
  5377. }
  5378. LockList(h->AccessList);
  5379. {
  5380. // Delete whole access list
  5381. for (i = 0; i < LIST_NUM(h->AccessList); ++i)
  5382. {
  5383. ACCESS *access = LIST_DATA(h->AccessList, i);
  5384. Free(access);
  5385. }
  5386. DeleteAll(h->AccessList);
  5387. ALog(a, h, "LA_SET_ACCESS_LIST", t->NumAccess);
  5388. // Add whole access list
  5389. for (i = 0; i < t->NumAccess; ++i)
  5390. {
  5391. ACCESS *a = &t->Accesses[i];
  5392. if (no_jitter)
  5393. {
  5394. a->Jitter = a->Loss = a->Delay = 0;
  5395. }
  5396. if (no_include)
  5397. {
  5398. if (StartWith(a->SrcUsername, ACCESS_LIST_INCLUDED_PREFIX) ||
  5399. StartWith(a->SrcUsername, ACCESS_LIST_EXCLUDED_PREFIX))
  5400. {
  5401. ClearStr(a->SrcUsername, sizeof(a->SrcUsername));
  5402. }
  5403. if (StartWith(a->DestUsername, ACCESS_LIST_INCLUDED_PREFIX) ||
  5404. StartWith(a->DestUsername, ACCESS_LIST_EXCLUDED_PREFIX))
  5405. {
  5406. ClearStr(a->DestUsername, sizeof(a->DestUsername));
  5407. }
  5408. }
  5409. if (i == (t->NumAccess - 1))
  5410. {
  5411. Sort(h->AccessList);
  5412. }
  5413. AddAccessListEx(h, a, ((i != (t->NumAccess - 1)) ? true : false), ((i != (t->NumAccess - 1)) ? true : false));
  5414. }
  5415. UnlockList(h->AccessList);
  5416. IncrementServerConfigRevision(s);
  5417. h->CurrentVersion++;
  5418. SiHubUpdateProc(h);
  5419. }
  5420. ReleaseHub(h);
  5421. return ERR_NO_ERROR;
  5422. }
  5423. // Add access list entry
  5424. UINT StAddAccess(ADMIN *a, RPC_ADD_ACCESS *t)
  5425. {
  5426. SERVER *s = a->Server;
  5427. CEDAR *c = s->Cedar;
  5428. HUB *h;
  5429. bool no_jitter = false;
  5430. bool no_include = false;
  5431. NO_SUPPORT_FOR_BRIDGE;
  5432. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  5433. {
  5434. return ERR_NOT_SUPPORTED;
  5435. }
  5436. CHECK_RIGHT;
  5437. LockHubList(c);
  5438. {
  5439. h = GetHub(c, t->HubName);
  5440. }
  5441. UnlockHubList(c);
  5442. if (h == NULL)
  5443. {
  5444. return ERR_HUB_NOT_FOUND;
  5445. }
  5446. no_jitter = GetHubAdminOption(h, "no_delay_jitter_packet_loss");
  5447. no_include = GetHubAdminOption(h, "no_access_list_include_file");
  5448. if (a->ServerAdmin == false && GetHubAdminOption(h, "no_change_access_list") != 0)
  5449. {
  5450. ReleaseHub(h);
  5451. return ERR_NOT_ENOUGH_RIGHT;
  5452. }
  5453. if ((LIST_NUM(h->AccessList) >= GetServerCapsInt(a->Server, "i_max_access_lists") ||
  5454. (GetHubAdminOption(h, "max_accesslists") != 0) && (LIST_NUM(h->AccessList) >= GetHubAdminOption(h, "max_accesslists"))))
  5455. {
  5456. ReleaseHub(h);
  5457. return ERR_TOO_MANY_ACCESS_LIST;
  5458. }
  5459. ALog(a, h, "LA_ADD_ACCESS");
  5460. if (no_jitter)
  5461. {
  5462. t->Access.Jitter = t->Access.Delay = t->Access.Loss = 0;
  5463. }
  5464. if (no_include)
  5465. {
  5466. if (StartWith(t->Access.SrcUsername, ACCESS_LIST_INCLUDED_PREFIX) ||
  5467. StartWith(t->Access.SrcUsername, ACCESS_LIST_EXCLUDED_PREFIX))
  5468. {
  5469. ClearStr(t->Access.SrcUsername, sizeof(t->Access.SrcUsername));
  5470. }
  5471. if (StartWith(t->Access.DestUsername, ACCESS_LIST_INCLUDED_PREFIX) ||
  5472. StartWith(t->Access.DestUsername, ACCESS_LIST_EXCLUDED_PREFIX))
  5473. {
  5474. ClearStr(t->Access.DestUsername, sizeof(t->Access.DestUsername));
  5475. }
  5476. }
  5477. AddAccessList(h, &t->Access);
  5478. h->CurrentVersion++;
  5479. SiHubUpdateProc(h);
  5480. ReleaseHub(h);
  5481. IncrementServerConfigRevision(s);
  5482. return ERR_NO_ERROR;
  5483. }
  5484. // Rename link (cascade connection)
  5485. UINT StRenameLink(ADMIN *a, RPC_RENAME_LINK *t)
  5486. {
  5487. UINT i;
  5488. SERVER *s = a->Server;
  5489. CEDAR *c = s->Cedar;
  5490. HUB *h;
  5491. UINT ret = ERR_NO_ERROR;
  5492. LINK *k;
  5493. bool exists = false;
  5494. if (UniIsEmptyStr(t->OldAccountName) || UniIsEmptyStr(t->NewAccountName))
  5495. {
  5496. return ERR_INVALID_PARAMETER;
  5497. }
  5498. if (s->ServerType != SERVER_TYPE_STANDALONE)
  5499. {
  5500. return ERR_NOT_SUPPORTED;
  5501. }
  5502. CHECK_RIGHT;
  5503. if (UniStrCmpi(t->NewAccountName, t->OldAccountName) == 0)
  5504. {
  5505. // Noop if new name is same to old name
  5506. return ERR_NO_ERROR;
  5507. }
  5508. h = GetHub(c, t->HubName);
  5509. if (h == NULL)
  5510. {
  5511. return ERR_HUB_NOT_FOUND;
  5512. }
  5513. if (a->ServerAdmin == false && GetHubAdminOption(h, "no_cascade") != 0)
  5514. {
  5515. ReleaseHub(h);
  5516. return ERR_NOT_ENOUGH_RIGHT;
  5517. }
  5518. k = NULL;
  5519. // Find specified link
  5520. LockList(h->LinkList);
  5521. {
  5522. for (i = 0;i < LIST_NUM(h->LinkList);i++)
  5523. {
  5524. LINK *kk = LIST_DATA(h->LinkList, i);
  5525. Lock(kk->lock);
  5526. {
  5527. if (UniStrCmpi(kk->Option->AccountName, t->OldAccountName) == 0)
  5528. {
  5529. k = kk;
  5530. AddRef(kk->ref);
  5531. }
  5532. }
  5533. Unlock(kk->lock);
  5534. if (k != NULL)
  5535. {
  5536. break;
  5537. }
  5538. }
  5539. exists = false;
  5540. if (k != NULL)
  5541. {
  5542. // Check whether the new link name is same to other links
  5543. for (i = 0;i < LIST_NUM(h->LinkList);i++)
  5544. {
  5545. LINK *kk = LIST_DATA(h->LinkList, i);
  5546. Lock(kk->lock);
  5547. {
  5548. if (UniStrCmpi(kk->Option->AccountName, t->NewAccountName) == 0)
  5549. {
  5550. // duplicated
  5551. exists = true;
  5552. }
  5553. }
  5554. Unlock(kk->lock);
  5555. }
  5556. if (exists)
  5557. {
  5558. // Already same name exists
  5559. ret = ERR_LINK_ALREADY_EXISTS;
  5560. }
  5561. else
  5562. {
  5563. // Do rename
  5564. UniStrCpy(k->Option->AccountName, sizeof(k->Option->AccountName), t->NewAccountName);
  5565. ALog(a, h, "LA_RENAME_LINK", t->OldAccountName, t->NewAccountName);
  5566. IncrementServerConfigRevision(s);
  5567. }
  5568. }
  5569. }
  5570. UnlockList(h->LinkList);
  5571. if (k == NULL)
  5572. {
  5573. // specified link is not found
  5574. ReleaseHub(h);
  5575. return ERR_OBJECT_NOT_FOUND;
  5576. }
  5577. ReleaseLink(k);
  5578. ReleaseHub(h);
  5579. return ret;
  5580. }
  5581. // Delete a link
  5582. UINT StDeleteLink(ADMIN *a, RPC_LINK *t)
  5583. {
  5584. UINT i;
  5585. SERVER *s = a->Server;
  5586. CEDAR *c = s->Cedar;
  5587. HUB *h;
  5588. UINT ret = ERR_NO_ERROR;
  5589. char hubname[MAX_HUBNAME_LEN + 1];
  5590. wchar_t accountname[MAX_ACCOUNT_NAME_LEN + 1];
  5591. LINK *k;
  5592. if (UniIsEmptyStr(t->AccountName))
  5593. {
  5594. return ERR_INVALID_PARAMETER;
  5595. }
  5596. if (s->ServerType != SERVER_TYPE_STANDALONE)
  5597. {
  5598. return ERR_NOT_SUPPORTED;
  5599. }
  5600. CHECK_RIGHT;
  5601. LockHubList(c);
  5602. {
  5603. h = GetHub(c, t->HubName);
  5604. }
  5605. UnlockHubList(c);
  5606. if (h == NULL)
  5607. {
  5608. return ERR_HUB_NOT_FOUND;
  5609. }
  5610. if (a->ServerAdmin == false && GetHubAdminOption(h, "no_cascade") != 0)
  5611. {
  5612. ReleaseHub(h);
  5613. return ERR_NOT_ENOUGH_RIGHT;
  5614. }
  5615. StrCpy(hubname, sizeof(hubname), t->HubName);
  5616. UniStrCpy(accountname, sizeof(accountname), t->AccountName);
  5617. k = NULL;
  5618. // Find specified link
  5619. LockList(h->LinkList);
  5620. {
  5621. for (i = 0;i < LIST_NUM(h->LinkList);i++)
  5622. {
  5623. LINK *kk = LIST_DATA(h->LinkList, i);
  5624. Lock(kk->lock);
  5625. {
  5626. if (UniStrCmpi(kk->Option->AccountName, accountname) == 0)
  5627. {
  5628. k = kk;
  5629. AddRef(kk->ref);
  5630. }
  5631. }
  5632. Unlock(kk->lock);
  5633. if (k != NULL)
  5634. {
  5635. break;
  5636. }
  5637. }
  5638. }
  5639. UnlockList(h->LinkList);
  5640. if (k == NULL)
  5641. {
  5642. // Specified link is not found
  5643. ReleaseHub(h);
  5644. return ERR_OBJECT_NOT_FOUND;
  5645. }
  5646. k->NoOnline = true;
  5647. ALog(a, h, "LA_DELETE_LINK", t->AccountName);
  5648. SetLinkOffline(k);
  5649. IncrementServerConfigRevision(s);
  5650. DelLink(h, k);
  5651. ReleaseLink(k);
  5652. ReleaseHub(h);
  5653. return ret;
  5654. }
  5655. // Make a link into off-line
  5656. UINT StSetLinkOffline(ADMIN *a, RPC_LINK *t)
  5657. {
  5658. UINT i;
  5659. SERVER *s = a->Server;
  5660. CEDAR *c = s->Cedar;
  5661. HUB *h;
  5662. UINT ret = ERR_NO_ERROR;
  5663. char hubname[MAX_HUBNAME_LEN + 1];
  5664. wchar_t accountname[MAX_ACCOUNT_NAME_LEN + 1];
  5665. LINK *k;
  5666. if (UniIsEmptyStr(t->AccountName))
  5667. {
  5668. return ERR_INVALID_PARAMETER;
  5669. }
  5670. if (s->ServerType != SERVER_TYPE_STANDALONE)
  5671. {
  5672. return ERR_NOT_SUPPORTED;
  5673. }
  5674. CHECK_RIGHT;
  5675. LockHubList(c);
  5676. {
  5677. h = GetHub(c, t->HubName);
  5678. }
  5679. UnlockHubList(c);
  5680. if (h == NULL)
  5681. {
  5682. return ERR_HUB_NOT_FOUND;
  5683. }
  5684. if (a->ServerAdmin == false && GetHubAdminOption(h, "no_cascade") != 0)
  5685. {
  5686. ReleaseHub(h);
  5687. return ERR_NOT_ENOUGH_RIGHT;
  5688. }
  5689. StrCpy(hubname, sizeof(hubname), t->HubName);
  5690. UniStrCpy(accountname, sizeof(accountname), t->AccountName);
  5691. k = NULL;
  5692. // Find specified link
  5693. LockList(h->LinkList);
  5694. {
  5695. for (i = 0;i < LIST_NUM(h->LinkList);i++)
  5696. {
  5697. LINK *kk = LIST_DATA(h->LinkList, i);
  5698. Lock(kk->lock);
  5699. {
  5700. if (UniStrCmpi(kk->Option->AccountName, accountname) == 0)
  5701. {
  5702. k = kk;
  5703. AddRef(kk->ref);
  5704. }
  5705. }
  5706. Unlock(kk->lock);
  5707. if (k != NULL)
  5708. {
  5709. break;
  5710. }
  5711. }
  5712. }
  5713. UnlockList(h->LinkList);
  5714. if (k == NULL)
  5715. {
  5716. // Link is not found
  5717. ReleaseHub(h);
  5718. return ERR_OBJECT_NOT_FOUND;
  5719. }
  5720. ALog(a, h, "LA_SET_LINK_OFFLINE", t->AccountName);
  5721. SetLinkOffline(k);
  5722. IncrementServerConfigRevision(s);
  5723. ReleaseLink(k);
  5724. ReleaseHub(h);
  5725. return ret;
  5726. }
  5727. // Make a link into on-line
  5728. UINT StSetLinkOnline(ADMIN *a, RPC_LINK *t)
  5729. {
  5730. UINT i;
  5731. SERVER *s = a->Server;
  5732. CEDAR *c = s->Cedar;
  5733. HUB *h;
  5734. UINT ret = ERR_NO_ERROR;
  5735. char hubname[MAX_HUBNAME_LEN + 1];
  5736. wchar_t accountname[MAX_ACCOUNT_NAME_LEN + 1];
  5737. LINK *k;
  5738. if (UniIsEmptyStr(t->AccountName))
  5739. {
  5740. return ERR_INVALID_PARAMETER;
  5741. }
  5742. if (s->ServerType != SERVER_TYPE_STANDALONE)
  5743. {
  5744. return ERR_NOT_SUPPORTED;
  5745. }
  5746. CHECK_RIGHT;
  5747. LockHubList(c);
  5748. {
  5749. h = GetHub(c, t->HubName);
  5750. }
  5751. UnlockHubList(c);
  5752. if (h == NULL)
  5753. {
  5754. return ERR_HUB_NOT_FOUND;
  5755. }
  5756. if (a->ServerAdmin == false && GetHubAdminOption(h, "no_cascade") != 0)
  5757. {
  5758. ReleaseHub(h);
  5759. return ERR_NOT_ENOUGH_RIGHT;
  5760. }
  5761. StrCpy(hubname, sizeof(hubname), t->HubName);
  5762. UniStrCpy(accountname, sizeof(accountname), t->AccountName);
  5763. k = NULL;
  5764. // Find specified link
  5765. LockList(h->LinkList);
  5766. {
  5767. for (i = 0;i < LIST_NUM(h->LinkList);i++)
  5768. {
  5769. LINK *kk = LIST_DATA(h->LinkList, i);
  5770. Lock(kk->lock);
  5771. {
  5772. if (UniStrCmpi(kk->Option->AccountName, accountname) == 0)
  5773. {
  5774. k = kk;
  5775. AddRef(kk->ref);
  5776. }
  5777. }
  5778. Unlock(kk->lock);
  5779. if (k != NULL)
  5780. {
  5781. break;
  5782. }
  5783. }
  5784. }
  5785. UnlockList(h->LinkList);
  5786. if (k == NULL)
  5787. {
  5788. // Specified link is not found
  5789. ReleaseHub(h);
  5790. return ERR_OBJECT_NOT_FOUND;
  5791. }
  5792. ALog(a, h, "LA_SET_LINK_ONLINE", t->AccountName);
  5793. SetLinkOnline(k);
  5794. ReleaseLink(k);
  5795. ReleaseHub(h);
  5796. IncrementServerConfigRevision(s);
  5797. return ret;
  5798. }
  5799. // Get link status
  5800. UINT StGetLinkStatus(ADMIN *a, RPC_LINK_STATUS *t)
  5801. {
  5802. UINT i;
  5803. SERVER *s = a->Server;
  5804. CEDAR *c = s->Cedar;
  5805. HUB *h;
  5806. UINT ret = ERR_NO_ERROR;
  5807. char hubname[MAX_HUBNAME_LEN + 1];
  5808. wchar_t accountname[MAX_ACCOUNT_NAME_LEN + 1];
  5809. LINK *k;
  5810. SESSION *sess;
  5811. if (UniIsEmptyStr(t->AccountName))
  5812. {
  5813. return ERR_INVALID_PARAMETER;
  5814. }
  5815. if (s->ServerType != SERVER_TYPE_STANDALONE)
  5816. {
  5817. return ERR_NOT_SUPPORTED;
  5818. }
  5819. CHECK_RIGHT;
  5820. LockHubList(c);
  5821. {
  5822. h = GetHub(c, t->HubName);
  5823. }
  5824. UnlockHubList(c);
  5825. if (h == NULL)
  5826. {
  5827. return ERR_HUB_NOT_FOUND;
  5828. }
  5829. StrCpy(hubname, sizeof(hubname), t->HubName);
  5830. UniStrCpy(accountname, sizeof(accountname), t->AccountName);
  5831. FreeRpcLinkStatus(t);
  5832. Zero(t, sizeof(RPC_LINK_STATUS));
  5833. StrCpy(t->HubName, sizeof(t->HubName), hubname);
  5834. UniStrCpy(t->AccountName, sizeof(t->AccountName), accountname);
  5835. k = NULL;
  5836. // Find the link
  5837. LockList(h->LinkList);
  5838. {
  5839. for (i = 0;i < LIST_NUM(h->LinkList);i++)
  5840. {
  5841. LINK *kk = LIST_DATA(h->LinkList, i);
  5842. Lock(kk->lock);
  5843. {
  5844. if (UniStrCmpi(kk->Option->AccountName, accountname) == 0)
  5845. {
  5846. k = kk;
  5847. AddRef(kk->ref);
  5848. }
  5849. }
  5850. Unlock(kk->lock);
  5851. if (k != NULL)
  5852. {
  5853. break;
  5854. }
  5855. }
  5856. }
  5857. UnlockList(h->LinkList);
  5858. if (k == NULL)
  5859. {
  5860. // Specified link is not found
  5861. ReleaseHub(h);
  5862. return ERR_OBJECT_NOT_FOUND;
  5863. }
  5864. // Get status information from session
  5865. Lock(k->lock);
  5866. {
  5867. sess = k->ClientSession;
  5868. if (sess != NULL)
  5869. {
  5870. AddRef(sess->ref);
  5871. }
  5872. }
  5873. Unlock(k->lock);
  5874. if (sess != NULL && k->Offline == false)
  5875. {
  5876. CiGetSessionStatus(&t->Status, sess);
  5877. }
  5878. else
  5879. {
  5880. ret = ERR_LINK_IS_OFFLINE;
  5881. }
  5882. ReleaseSession(sess);
  5883. ReleaseLink(k);
  5884. ReleaseHub(h);
  5885. return ret;
  5886. }
  5887. // Enumerate links
  5888. UINT StEnumLink(ADMIN *a, RPC_ENUM_LINK *t)
  5889. {
  5890. SERVER *s = a->Server;
  5891. CEDAR *c = s->Cedar;
  5892. HUB *h;
  5893. char hubname[MAX_HUBNAME_LEN + 1];
  5894. UINT i;
  5895. if (s->ServerType != SERVER_TYPE_STANDALONE)
  5896. {
  5897. return ERR_NOT_SUPPORTED;
  5898. }
  5899. CHECK_RIGHT;
  5900. LockHubList(c);
  5901. {
  5902. h = GetHub(c, t->HubName);
  5903. }
  5904. UnlockHubList(c);
  5905. if (h == NULL)
  5906. {
  5907. return ERR_HUB_NOT_FOUND;
  5908. }
  5909. StrCpy(hubname, sizeof(hubname), t->HubName);
  5910. FreeRpcEnumLink(t);
  5911. Zero(t, sizeof(RPC_ENUM_LINK));
  5912. StrCpy(t->HubName, sizeof(t->HubName), hubname);
  5913. LockList(h->LinkList);
  5914. {
  5915. t->NumLink = LIST_NUM(h->LinkList);
  5916. t->Links = ZeroMalloc(sizeof(RPC_ENUM_LINK_ITEM) * t->NumLink);
  5917. for (i = 0;i < LIST_NUM(h->LinkList);i++)
  5918. {
  5919. LINK *k = LIST_DATA(h->LinkList, i);
  5920. RPC_ENUM_LINK_ITEM *e = &t->Links[i];
  5921. Lock(k->lock);
  5922. {
  5923. UniStrCpy(e->AccountName, sizeof(e->AccountName), k->Option->AccountName);
  5924. StrCpy(e->Hostname, sizeof(e->Hostname), k->Option->Hostname);
  5925. StrCpy(e->HubName, sizeof(e->HubName), k->Option->HubName);
  5926. e->Online = k->Offline ? false : true;
  5927. if (e->Online)
  5928. {
  5929. if (k->ClientSession != NULL)
  5930. {
  5931. e->ConnectedTime = TickToTime(k->ClientSession->CurrentConnectionEstablishTime);
  5932. e->Connected = (k->ClientSession->ClientStatus == CLIENT_STATUS_ESTABLISHED);
  5933. e->LastError = k->ClientSession->Err;
  5934. }
  5935. }
  5936. }
  5937. Unlock(k->lock);
  5938. }
  5939. }
  5940. UnlockList(h->LinkList);
  5941. ReleaseHub(h);
  5942. return ERR_NO_ERROR;
  5943. }
  5944. // Get link configuration
  5945. UINT StGetLink(ADMIN *a, RPC_CREATE_LINK *t)
  5946. {
  5947. SERVER *s = a->Server;
  5948. CEDAR *c = s->Cedar;
  5949. HUB *h;
  5950. UINT ret = ERR_NO_ERROR;
  5951. UINT i;
  5952. char hubname[MAX_SIZE];
  5953. LINK *k;
  5954. if (s->ServerType != SERVER_TYPE_STANDALONE)
  5955. {
  5956. return ERR_NOT_SUPPORTED;
  5957. }
  5958. CHECK_RIGHT;
  5959. if (s->ServerType != SERVER_TYPE_STANDALONE)
  5960. {
  5961. return ERR_LINK_CANT_CREATE_ON_FARM;
  5962. }
  5963. LockHubList(c);
  5964. {
  5965. h = GetHub(c, t->HubName);
  5966. }
  5967. UnlockHubList(c);
  5968. if (h == NULL)
  5969. {
  5970. return ERR_HUB_NOT_FOUND;
  5971. }
  5972. k = NULL;
  5973. // Find the link
  5974. LockList(h->LinkList);
  5975. {
  5976. for (i = 0;i < LIST_NUM(h->LinkList);i++)
  5977. {
  5978. LINK *kk = LIST_DATA(h->LinkList, i);
  5979. Lock(kk->lock);
  5980. {
  5981. if (UniStrCmpi(kk->Option->AccountName, t->ClientOption->AccountName) == 0)
  5982. {
  5983. k = kk;
  5984. AddRef(kk->ref);
  5985. }
  5986. }
  5987. Unlock(kk->lock);
  5988. if (k != NULL)
  5989. {
  5990. break;
  5991. }
  5992. }
  5993. }
  5994. UnlockList(h->LinkList);
  5995. if (k == NULL)
  5996. {
  5997. // The link is not found
  5998. ReleaseHub(h);
  5999. return ERR_OBJECT_NOT_FOUND;
  6000. }
  6001. StrCpy(hubname, sizeof(hubname), t->HubName);
  6002. FreeRpcCreateLink(t);
  6003. Zero(t, sizeof(RPC_CREATE_LINK));
  6004. StrCpy(t->HubName, sizeof(t->HubName), hubname);
  6005. Lock(k->lock);
  6006. {
  6007. // Get configuration
  6008. t->Online = k->Offline ? false : true;
  6009. t->ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
  6010. Copy(t->ClientOption, k->Option, sizeof(CLIENT_OPTION));
  6011. t->ClientAuth = CopyClientAuth(k->Auth);
  6012. Copy(&t->Policy, k->Policy, sizeof(POLICY));
  6013. t->CheckServerCert = k->CheckServerCert;
  6014. t->ServerCert = CloneX(k->ServerCert);
  6015. }
  6016. Unlock(k->lock);
  6017. ReleaseLink(k);
  6018. ReleaseHub(h);
  6019. return ret;
  6020. }
  6021. // Set link configuration
  6022. UINT StSetLink(ADMIN *a, RPC_CREATE_LINK *t)
  6023. {
  6024. SERVER *s = a->Server;
  6025. CEDAR *c = s->Cedar;
  6026. HUB *h;
  6027. UINT ret = ERR_NO_ERROR;
  6028. UINT i;
  6029. LINK *k;
  6030. if (s->ServerType != SERVER_TYPE_STANDALONE)
  6031. {
  6032. return ERR_NOT_SUPPORTED;
  6033. }
  6034. CHECK_RIGHT;
  6035. if (s->ServerType != SERVER_TYPE_STANDALONE)
  6036. {
  6037. return ERR_LINK_CANT_CREATE_ON_FARM;
  6038. }
  6039. LockHubList(c);
  6040. {
  6041. h = GetHub(c, t->HubName);
  6042. }
  6043. UnlockHubList(c);
  6044. if (h == NULL)
  6045. {
  6046. return ERR_HUB_NOT_FOUND;
  6047. }
  6048. if (a->ServerAdmin == false && GetHubAdminOption(h, "no_cascade") != 0)
  6049. {
  6050. ReleaseHub(h);
  6051. return ERR_NOT_ENOUGH_RIGHT;
  6052. }
  6053. k = NULL;
  6054. // Find the link
  6055. LockList(h->LinkList);
  6056. {
  6057. for (i = 0;i < LIST_NUM(h->LinkList);i++)
  6058. {
  6059. LINK *kk = LIST_DATA(h->LinkList, i);
  6060. Lock(kk->lock);
  6061. {
  6062. if (UniStrCmpi(kk->Option->AccountName, t->ClientOption->AccountName) == 0)
  6063. {
  6064. k = kk;
  6065. AddRef(kk->ref);
  6066. }
  6067. }
  6068. Unlock(kk->lock);
  6069. if (k != NULL)
  6070. {
  6071. break;
  6072. }
  6073. }
  6074. }
  6075. UnlockList(h->LinkList);
  6076. if (k == NULL)
  6077. {
  6078. // The link is not found
  6079. ReleaseHub(h);
  6080. return ERR_OBJECT_NOT_FOUND;
  6081. }
  6082. ALog(a, h, "LA_SET_LINK", t->ClientOption->AccountName);
  6083. Lock(k->lock);
  6084. {
  6085. // Update the configuration of the link
  6086. if (k->ServerCert != NULL)
  6087. {
  6088. FreeX(k->ServerCert);
  6089. k->ServerCert = NULL;
  6090. }
  6091. Copy(k->Option, t->ClientOption, sizeof(CLIENT_OPTION));
  6092. StrCpy(k->Option->DeviceName, sizeof(k->Option->DeviceName), LINK_DEVICE_NAME);
  6093. k->Option->NumRetry = INFINITE;
  6094. k->Option->RetryInterval = 10;
  6095. k->Option->NoRoutingTracking = true;
  6096. CiFreeClientAuth(k->Auth);
  6097. k->Auth = CopyClientAuth(t->ClientAuth);
  6098. if (t->Policy.Ver3 == false)
  6099. {
  6100. Copy(k->Policy, &t->Policy, sizeof(UINT) * NUM_POLICY_ITEM_FOR_VER2);
  6101. }
  6102. else
  6103. {
  6104. Copy(k->Policy, &t->Policy, sizeof(POLICY));
  6105. }
  6106. k->Option->RequireBridgeRoutingMode = true; // Enable Bridge / Routing mode
  6107. k->Option->RequireMonitorMode = false; // Disable monitor mode
  6108. k->CheckServerCert = t->CheckServerCert;
  6109. k->ServerCert = CloneX(t->ServerCert);
  6110. }
  6111. Unlock(k->lock);
  6112. IncrementServerConfigRevision(s);
  6113. ReleaseLink(k);
  6114. ReleaseHub(h);
  6115. return ret;
  6116. }
  6117. // Create a new link(cascade)
  6118. UINT StCreateLink(ADMIN *a, RPC_CREATE_LINK *t)
  6119. {
  6120. SERVER *s = a->Server;
  6121. CEDAR *c = s->Cedar;
  6122. HUB *h;
  6123. UINT ret = ERR_NO_ERROR;
  6124. UINT i;
  6125. LINK *k;
  6126. CHECK_RIGHT;
  6127. if (s->ServerType != SERVER_TYPE_STANDALONE)
  6128. {
  6129. return ERR_LINK_CANT_CREATE_ON_FARM;
  6130. }
  6131. LockHubList(c);
  6132. {
  6133. h = GetHub(c, t->HubName);
  6134. }
  6135. UnlockHubList(c);
  6136. if (h == NULL)
  6137. {
  6138. return ERR_HUB_NOT_FOUND;
  6139. }
  6140. if (a->ServerAdmin == false && GetHubAdminOption(h, "no_cascade") != 0)
  6141. {
  6142. ReleaseHub(h);
  6143. return ERR_NOT_ENOUGH_RIGHT;
  6144. }
  6145. k = NULL;
  6146. // Check for existing a link which has same name
  6147. LockList(h->LinkList);
  6148. {
  6149. for (i = 0;i < LIST_NUM(h->LinkList);i++)
  6150. {
  6151. LINK *kk = LIST_DATA(h->LinkList, i);
  6152. Lock(kk->lock);
  6153. {
  6154. if (UniStrCmpi(kk->Option->AccountName, t->ClientOption->AccountName) == 0)
  6155. {
  6156. k = kk;
  6157. AddRef(kk->ref);
  6158. }
  6159. }
  6160. Unlock(kk->lock);
  6161. if (k != NULL)
  6162. {
  6163. break;
  6164. }
  6165. }
  6166. }
  6167. UnlockList(h->LinkList);
  6168. if (k != NULL)
  6169. {
  6170. // There is a link which has same name
  6171. ReleaseLink(k);
  6172. ReleaseHub(h);
  6173. return ERR_LINK_ALREADY_EXISTS;
  6174. }
  6175. ALog(a, h, "LA_CREATE_LINK", t->ClientOption->AccountName);
  6176. // Create a new link
  6177. k = NewLink(c, h, t->ClientOption, t->ClientAuth, &t->Policy);
  6178. if (k == NULL)
  6179. {
  6180. // Link creation failed
  6181. ret = ERR_INTERNAL_ERROR;
  6182. }
  6183. else
  6184. {
  6185. // setting of verifying server certification
  6186. //
  6187. k->CheckServerCert = t->CheckServerCert;
  6188. k->ServerCert = CloneX(t->ServerCert);
  6189. // stay this off-line
  6190. k->Offline = false;
  6191. SetLinkOffline(k);
  6192. ReleaseLink(k);
  6193. IncrementServerConfigRevision(s);
  6194. }
  6195. ReleaseHub(h);
  6196. return ret;
  6197. }
  6198. // Delete a CA(Certificate Authority) setting from the hub
  6199. UINT StDeleteCa(ADMIN *a, RPC_HUB_DELETE_CA *t)
  6200. {
  6201. SERVER *s = a->Server;
  6202. CEDAR *c = s->Cedar;
  6203. HUB *h;
  6204. UINT ret = ERR_NO_ERROR;
  6205. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  6206. {
  6207. return ERR_NOT_FARM_CONTROLLER;
  6208. }
  6209. NO_SUPPORT_FOR_BRIDGE;
  6210. CHECK_RIGHT;
  6211. LockHubList(c);
  6212. {
  6213. h = GetHub(c, t->HubName);
  6214. }
  6215. UnlockHubList(c);
  6216. if (h == NULL)
  6217. {
  6218. return ERR_HUB_NOT_FOUND;
  6219. }
  6220. if (a->ServerAdmin == false && GetHubAdminOption(h, "no_change_cert_list") != 0)
  6221. {
  6222. ReleaseHub(h);
  6223. return ERR_NOT_ENOUGH_RIGHT;
  6224. }
  6225. LockList(h->HubDb->RootCertList);
  6226. {
  6227. if (IsInListKey(h->HubDb->RootCertList, t->Key))
  6228. {
  6229. X *x = ListKeyToPointer(h->HubDb->RootCertList, t->Key);
  6230. Delete(h->HubDb->RootCertList, x);
  6231. FreeX(x);
  6232. ALog(a, h, "LA_DELETE_CA");
  6233. IncrementServerConfigRevision(s);
  6234. }
  6235. else
  6236. {
  6237. ret = ERR_OBJECT_NOT_FOUND;
  6238. }
  6239. }
  6240. UnlockList(h->HubDb->RootCertList);
  6241. ReleaseHub(h);
  6242. return ret;
  6243. }
  6244. // Get CA(Certificate Authority) setting from the hub
  6245. UINT StGetCa(ADMIN *a, RPC_HUB_GET_CA *t)
  6246. {
  6247. SERVER *s = a->Server;
  6248. CEDAR *c = s->Cedar;
  6249. HUB *h;
  6250. UINT ret = ERR_NO_ERROR;
  6251. char hubname[MAX_HUBNAME_LEN + 1];
  6252. UINT key;
  6253. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  6254. {
  6255. return ERR_NOT_FARM_CONTROLLER;
  6256. }
  6257. NO_SUPPORT_FOR_BRIDGE;
  6258. StrCpy(hubname, sizeof(hubname), t->HubName);
  6259. key = t->Key;
  6260. FreeRpcHubGetCa(t);
  6261. Zero(t, sizeof(RPC_HUB_GET_CA));
  6262. t->Key = key;
  6263. StrCpy(t->HubName, sizeof(t->HubName), hubname);
  6264. CHECK_RIGHT;
  6265. LockHubList(c);
  6266. {
  6267. h = GetHub(c, t->HubName);
  6268. }
  6269. UnlockHubList(c);
  6270. if (h == NULL)
  6271. {
  6272. return ERR_HUB_NOT_FOUND;
  6273. }
  6274. LockList(h->HubDb->RootCertList);
  6275. {
  6276. if (IsInListKey(h->HubDb->RootCertList, key))
  6277. {
  6278. X *x = ListKeyToPointer(h->HubDb->RootCertList, key);
  6279. t->Cert = CloneX(x);
  6280. }
  6281. else
  6282. {
  6283. ret = ERR_OBJECT_NOT_FOUND;
  6284. }
  6285. }
  6286. UnlockList(h->HubDb->RootCertList);
  6287. ReleaseHub(h);
  6288. return ret;
  6289. }
  6290. // Enumerate CA(Certificate Authority) in the hub
  6291. UINT StEnumCa(ADMIN *a, RPC_HUB_ENUM_CA *t)
  6292. {
  6293. SERVER *s = a->Server;
  6294. CEDAR *c = s->Cedar;
  6295. HUB *h;
  6296. char hubname[MAX_HUBNAME_LEN + 1];
  6297. UINT i;
  6298. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  6299. {
  6300. return ERR_NOT_FARM_CONTROLLER;
  6301. }
  6302. NO_SUPPORT_FOR_BRIDGE;
  6303. StrCpy(hubname, sizeof(hubname), t->HubName);
  6304. FreeRpcHubEnumCa(t);
  6305. Zero(t, sizeof(RPC_HUB_ENUM_CA));
  6306. StrCpy(t->HubName, sizeof(t->HubName), hubname);
  6307. CHECK_RIGHT;
  6308. LockHubList(c);
  6309. {
  6310. h = GetHub(c, hubname);
  6311. }
  6312. UnlockHubList(c);
  6313. if (h == NULL)
  6314. {
  6315. return ERR_HUB_NOT_FOUND;
  6316. }
  6317. Zero(t, sizeof(RPC_HUB_ENUM_CA));
  6318. StrCpy(t->HubName, sizeof(t->HubName), hubname);
  6319. if (h->HubDb->RootCertList != NULL)
  6320. {
  6321. LockList(h->HubDb->RootCertList);
  6322. {
  6323. t->NumCa = LIST_NUM(h->HubDb->RootCertList);
  6324. t->Ca = ZeroMalloc(sizeof(RPC_HUB_ENUM_CA_ITEM) * t->NumCa);
  6325. for (i = 0;i < t->NumCa;i++)
  6326. {
  6327. RPC_HUB_ENUM_CA_ITEM *e = &t->Ca[i];
  6328. X *x = LIST_DATA(h->HubDb->RootCertList, i);
  6329. e->Key = POINTER_TO_KEY(x);
  6330. GetAllNameFromNameEx(e->SubjectName, sizeof(e->SubjectName), x->subject_name);
  6331. GetAllNameFromNameEx(e->IssuerName, sizeof(e->IssuerName), x->issuer_name);
  6332. e->Expires = x->notAfter;
  6333. }
  6334. }
  6335. UnlockList(h->HubDb->RootCertList);
  6336. }
  6337. ReleaseHub(h);
  6338. return ERR_NO_ERROR;
  6339. }
  6340. // Add CA(Certificate Authority) into the hub
  6341. UINT StAddCa(ADMIN *a, RPC_HUB_ADD_CA *t)
  6342. {
  6343. SERVER *s = a->Server;
  6344. CEDAR *c = s->Cedar;
  6345. HUB *h;
  6346. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  6347. {
  6348. return ERR_NOT_FARM_CONTROLLER;
  6349. }
  6350. if (c->Bridge)
  6351. {
  6352. return ERR_NOT_SUPPORTED;
  6353. }
  6354. if (t->Cert == NULL)
  6355. {
  6356. return ERR_INVALID_PARAMETER;
  6357. }
  6358. CHECK_RIGHT;
  6359. LockHubList(c);
  6360. {
  6361. h = GetHub(c, t->HubName);
  6362. }
  6363. UnlockHubList(c);
  6364. if (h == NULL)
  6365. {
  6366. return ERR_HUB_NOT_FOUND;
  6367. }
  6368. if (a->ServerAdmin == false && GetHubAdminOption(h, "no_change_cert_list") != 0)
  6369. {
  6370. ReleaseHub(h);
  6371. return ERR_NOT_ENOUGH_RIGHT;
  6372. }
  6373. IncrementServerConfigRevision(s);
  6374. ALog(a, h, "LA_ADD_CA");
  6375. AddRootCert(h, t->Cert);
  6376. ReleaseHub(h);
  6377. return ERR_NO_ERROR;
  6378. }
  6379. // Get logging configuration of the hub
  6380. UINT StGetHubLog(ADMIN *a, RPC_HUB_LOG *t)
  6381. {
  6382. SERVER *s = a->Server;
  6383. CEDAR *c = s->Cedar;
  6384. HUB *h;
  6385. CHECK_RIGHT;
  6386. LockHubList(c);
  6387. {
  6388. h = GetHub(c, t->HubName);
  6389. }
  6390. UnlockHubList(c);
  6391. if (h == NULL)
  6392. {
  6393. return ERR_HUB_NOT_FOUND;
  6394. }
  6395. GetHubLogSetting(h, &t->LogSetting);
  6396. ReleaseHub(h);
  6397. return ERR_NO_ERROR;
  6398. }
  6399. // Set logging configuration into the hub
  6400. UINT StSetHubLog(ADMIN *a, RPC_HUB_LOG *t)
  6401. {
  6402. SERVER *s = a->Server;
  6403. CEDAR *c = s->Cedar;
  6404. HUB *h;
  6405. CHECK_RIGHT;
  6406. LockHubList(c);
  6407. {
  6408. h = GetHub(c, t->HubName);
  6409. }
  6410. UnlockHubList(c);
  6411. if (h == NULL)
  6412. {
  6413. return ERR_HUB_NOT_FOUND;
  6414. }
  6415. if (a->ServerAdmin == false && GetHubAdminOption(h, "no_change_log_config") != 0)
  6416. {
  6417. ReleaseHub(h);
  6418. return ERR_NOT_ENOUGH_RIGHT;
  6419. }
  6420. ALog(a, h, "LA_SET_HUB_LOG");
  6421. SetHubLogSettingEx(h, &t->LogSetting,
  6422. (a->ServerAdmin == false && GetHubAdminOption(h, "no_change_log_switch_type") != 0));
  6423. h->CurrentVersion++;
  6424. SiHubUpdateProc(h);
  6425. ReleaseHub(h);
  6426. IncrementServerConfigRevision(s);
  6427. return ERR_NO_ERROR;
  6428. }
  6429. // Get hub status
  6430. UINT StGetHubStatus(ADMIN *a, RPC_HUB_STATUS *t)
  6431. {
  6432. SERVER *s = a->Server;
  6433. CEDAR *c = s->Cedar;
  6434. HUB *h;
  6435. CHECK_RIGHT;
  6436. LockHubList(c);
  6437. {
  6438. h = GetHub(c, t->HubName);
  6439. }
  6440. UnlockHubList(c);
  6441. if (h == NULL)
  6442. {
  6443. return ERR_HUB_NOT_FOUND;
  6444. }
  6445. Zero(t, sizeof(RPC_HUB_STATUS));
  6446. Lock(h->lock);
  6447. {
  6448. StrCpy(t->HubName, sizeof(t->HubName), h->Name);
  6449. t->HubType = h->Type;
  6450. t->Online = h->Offline ? false : true;
  6451. t->NumSessions = LIST_NUM(h->SessionList);
  6452. t->NumSessionsClient = Count(h->NumSessionsClient);
  6453. t->NumSessionsBridge = Count(h->NumSessionsBridge);
  6454. t->NumAccessLists = LIST_NUM(h->AccessList);
  6455. if (h->HubDb != NULL)
  6456. {
  6457. t->NumUsers = LIST_NUM(h->HubDb->UserList);
  6458. t->NumGroups = LIST_NUM(h->HubDb->GroupList);
  6459. }
  6460. t->NumMacTables = HASH_LIST_NUM(h->MacHashTable);
  6461. t->NumIpTables = LIST_NUM(h->IpTable);
  6462. Lock(h->TrafficLock);
  6463. {
  6464. Copy(&t->Traffic, h->Traffic, sizeof(TRAFFIC));
  6465. }
  6466. Unlock(h->TrafficLock);
  6467. t->NumLogin = h->NumLogin;
  6468. t->LastCommTime = h->LastCommTime;
  6469. t->LastLoginTime = h->LastLoginTime;
  6470. t->CreatedTime = h->CreatedTime;
  6471. }
  6472. Unlock(h->lock);
  6473. if (s->ServerType == SERVER_TYPE_FARM_CONTROLLER)
  6474. {
  6475. UINT i;
  6476. LockList(s->FarmMemberList);
  6477. {
  6478. for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
  6479. {
  6480. UINT k;
  6481. FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
  6482. if (f->Me == false)
  6483. {
  6484. LockList(f->HubList);
  6485. {
  6486. for (k = 0;k < LIST_NUM(f->HubList);k++)
  6487. {
  6488. HUB_LIST *h = LIST_DATA(f->HubList, k);
  6489. if (StrCmpi(h->Name, t->HubName) == 0)
  6490. {
  6491. t->NumSessions += h->NumSessions;
  6492. t->NumSessionsClient += h->NumSessionsClient;
  6493. t->NumSessionsBridge += h->NumSessionsBridge;
  6494. t->NumMacTables += h->NumMacTables;
  6495. t->NumIpTables += h->NumIpTables;
  6496. }
  6497. }
  6498. }
  6499. UnlockList(f->HubList);
  6500. }
  6501. }
  6502. }
  6503. UnlockList(s->FarmMemberList);
  6504. }
  6505. if (h->Type != HUB_TYPE_FARM_STATIC)
  6506. {
  6507. t->SecureNATEnabled = h->EnableSecureNAT;
  6508. }
  6509. ReleaseHub(h);
  6510. return ERR_NO_ERROR;
  6511. }
  6512. // Enable SecureNAT function of the hub
  6513. UINT StEnableSecureNAT(ADMIN *a, RPC_HUB *t)
  6514. {
  6515. SERVER *s = a->Server;
  6516. CEDAR *c = s->Cedar;
  6517. HUB *h;
  6518. CHECK_RIGHT;
  6519. LockHubList(c);
  6520. {
  6521. h = GetHub(c, t->HubName);
  6522. }
  6523. UnlockHubList(c);
  6524. if (h == NULL)
  6525. {
  6526. return ERR_HUB_NOT_FOUND;
  6527. }
  6528. if (h->Type == HUB_TYPE_FARM_STATIC || GetServerCapsBool(s, "b_support_securenat") == false)
  6529. {
  6530. ReleaseHub(h);
  6531. return ERR_NOT_SUPPORTED;
  6532. }
  6533. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  6534. {
  6535. ReleaseHub(h);
  6536. return ERR_NOT_FARM_CONTROLLER;
  6537. }
  6538. if (a->ServerAdmin == false && GetHubAdminOption(h, "no_securenat") != 0)
  6539. {
  6540. ReleaseHub(h);
  6541. return ERR_NOT_ENOUGH_RIGHT;
  6542. }
  6543. ALog(a, h, "LA_ENABLE_SNAT");
  6544. EnableSecureNAT(h, true);
  6545. h->CurrentVersion++;
  6546. SiHubUpdateProc(h);
  6547. IncrementServerConfigRevision(s);
  6548. ReleaseHub(h);
  6549. return ERR_NO_ERROR;
  6550. }
  6551. // Disable the SecureNAT function of the hub
  6552. UINT StDisableSecureNAT(ADMIN *a, RPC_HUB *t)
  6553. {
  6554. SERVER *s = a->Server;
  6555. CEDAR *c = s->Cedar;
  6556. HUB *h;
  6557. CHECK_RIGHT;
  6558. LockHubList(c);
  6559. {
  6560. h = GetHub(c, t->HubName);
  6561. }
  6562. UnlockHubList(c);
  6563. if (h == NULL)
  6564. {
  6565. return ERR_HUB_NOT_FOUND;
  6566. }
  6567. if (h->Type == HUB_TYPE_FARM_STATIC || GetServerCapsBool(s, "b_support_securenat") == false)
  6568. {
  6569. ReleaseHub(h);
  6570. return ERR_NOT_SUPPORTED;
  6571. }
  6572. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  6573. {
  6574. ReleaseHub(h);
  6575. return ERR_NOT_FARM_CONTROLLER;
  6576. }
  6577. if (a->ServerAdmin == false && GetHubAdminOption(h, "no_securenat") != 0)
  6578. {
  6579. ReleaseHub(h);
  6580. return ERR_NOT_ENOUGH_RIGHT;
  6581. }
  6582. ALog(a, h, "LA_DISABLE_SNAT");
  6583. EnableSecureNAT(h, false);
  6584. h->CurrentVersion++;
  6585. SiHubUpdateProc(h);
  6586. IncrementServerConfigRevision(s);
  6587. ReleaseHub(h);
  6588. return ERR_NO_ERROR;
  6589. }
  6590. // Enumerate NAT entries of the SecureNAT
  6591. UINT StEnumNAT(ADMIN *a, RPC_ENUM_NAT *t)
  6592. {
  6593. SERVER *s = a->Server;
  6594. CEDAR *c = s->Cedar;
  6595. HUB *h;
  6596. UINT ret = ERR_NO_ERROR;
  6597. char hubname[MAX_HUBNAME_LEN + 1];
  6598. UINT i;
  6599. CHECK_RIGHT;
  6600. StrCpy(hubname, sizeof(hubname), t->HubName);
  6601. LockHubList(c);
  6602. {
  6603. h = GetHub(c, t->HubName);
  6604. }
  6605. UnlockHubList(c);
  6606. if (h == NULL)
  6607. {
  6608. return ERR_HUB_NOT_FOUND;
  6609. }
  6610. if (h->Type == HUB_TYPE_FARM_STATIC || GetServerCapsBool(s, "b_support_securenat") == false)
  6611. {
  6612. ReleaseHub(h);
  6613. return ERR_NOT_SUPPORTED;
  6614. }
  6615. Lock(h->lock_online);
  6616. {
  6617. if (h->SecureNAT == NULL)
  6618. {
  6619. ret = ERR_SNAT_NOT_RUNNING;
  6620. }
  6621. else
  6622. {
  6623. NtEnumNatList(h->SecureNAT->Nat, t);
  6624. }
  6625. }
  6626. Unlock(h->lock_online);
  6627. if (h->Type == HUB_TYPE_FARM_DYNAMIC)
  6628. {
  6629. if (ret == ERR_SNAT_NOT_RUNNING)
  6630. {
  6631. // Get status of remote SecureNAT
  6632. LockList(s->FarmMemberList);
  6633. {
  6634. for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
  6635. {
  6636. FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
  6637. if (f->Me == false)
  6638. {
  6639. RPC_ENUM_NAT tmp;
  6640. Zero(&tmp, sizeof(tmp));
  6641. SiCallEnumNat(s, f, hubname, &tmp);
  6642. if (tmp.NumItem >= 1)
  6643. {
  6644. FreeRpcEnumNat(t);
  6645. Copy(t, &tmp, sizeof(RPC_ENUM_NAT));
  6646. ret = ERR_NO_ERROR;
  6647. break;
  6648. }
  6649. else
  6650. {
  6651. FreeRpcEnumNat(&tmp);
  6652. }
  6653. }
  6654. }
  6655. }
  6656. UnlockList(s->FarmMemberList);
  6657. }
  6658. }
  6659. ReleaseHub(h);
  6660. ret = ERR_NO_ERROR;
  6661. return ret;
  6662. }
  6663. // Get status of the SecureNAT
  6664. UINT StGetSecureNATStatus(ADMIN *a, RPC_NAT_STATUS *t)
  6665. {
  6666. SERVER *s = a->Server;
  6667. CEDAR *c = s->Cedar;
  6668. HUB *h;
  6669. UINT ret = ERR_NO_ERROR;
  6670. char hubname[MAX_HUBNAME_LEN + 1];
  6671. UINT i;
  6672. CHECK_RIGHT;
  6673. StrCpy(hubname, sizeof(hubname), t->HubName);
  6674. LockHubList(c);
  6675. {
  6676. h = GetHub(c, t->HubName);
  6677. }
  6678. UnlockHubList(c);
  6679. if (h == NULL)
  6680. {
  6681. return ERR_HUB_NOT_FOUND;
  6682. }
  6683. if (h->Type == HUB_TYPE_FARM_STATIC || GetServerCapsBool(s, "b_support_securenat") == false)
  6684. {
  6685. ReleaseHub(h);
  6686. return ERR_NOT_SUPPORTED;
  6687. }
  6688. Lock(h->lock_online);
  6689. {
  6690. if (h->SecureNAT == NULL)
  6691. {
  6692. ret = ERR_SNAT_NOT_RUNNING;
  6693. }
  6694. else
  6695. {
  6696. NtGetStatus(h->SecureNAT->Nat, t);
  6697. }
  6698. }
  6699. Unlock(h->lock_online);
  6700. if (h->Type == HUB_TYPE_FARM_DYNAMIC)
  6701. {
  6702. if (ret == ERR_SNAT_NOT_RUNNING)
  6703. {
  6704. // Get status of remote secureNAT
  6705. LockList(s->FarmMemberList);
  6706. {
  6707. for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
  6708. {
  6709. FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
  6710. if (f->Me == false)
  6711. {
  6712. RPC_NAT_STATUS tmp;
  6713. Zero(&tmp, sizeof(tmp));
  6714. SiCallGetNatStatus(s, f, hubname, &tmp);
  6715. if (tmp.NumDhcpClients == 0 && tmp.NumTcpSessions == 0 && tmp.NumUdpSessions == 0)
  6716. {
  6717. }
  6718. else
  6719. {
  6720. Copy(t, &tmp, sizeof(RPC_NAT_STATUS));
  6721. ret = ERR_NO_ERROR;
  6722. break;
  6723. }
  6724. }
  6725. }
  6726. }
  6727. UnlockList(s->FarmMemberList);
  6728. }
  6729. }
  6730. ReleaseHub(h);
  6731. StrCpy(t->HubName, sizeof(t->HubName), hubname);
  6732. ret = ERR_NO_ERROR;
  6733. return ret;
  6734. }
  6735. // Enumerate DHCP entries
  6736. UINT StEnumDHCP(ADMIN *a, RPC_ENUM_DHCP *t)
  6737. {
  6738. SERVER *s = a->Server;
  6739. CEDAR *c = s->Cedar;
  6740. HUB *h;
  6741. UINT ret = ERR_NO_ERROR;
  6742. char hubname[MAX_HUBNAME_LEN + 1];
  6743. UINT i;
  6744. StrCpy(hubname, sizeof(hubname), t->HubName);
  6745. CHECK_RIGHT;
  6746. LockHubList(c);
  6747. {
  6748. h = GetHub(c, t->HubName);
  6749. }
  6750. UnlockHubList(c);
  6751. if (h == NULL)
  6752. {
  6753. return ERR_HUB_NOT_FOUND;
  6754. }
  6755. if (h->Type == HUB_TYPE_FARM_STATIC || GetServerCapsBool(s, "b_support_securenat") == false)
  6756. {
  6757. ReleaseHub(h);
  6758. return ERR_NOT_SUPPORTED;
  6759. }
  6760. Lock(h->lock_online);
  6761. {
  6762. if (h->SecureNAT == NULL)
  6763. {
  6764. ret = ERR_SNAT_NOT_RUNNING;
  6765. }
  6766. else
  6767. {
  6768. NtEnumDhcpList(h->SecureNAT->Nat, t);
  6769. }
  6770. }
  6771. Unlock(h->lock_online);
  6772. if (h->Type == HUB_TYPE_FARM_DYNAMIC)
  6773. {
  6774. if (ret == ERR_SNAT_NOT_RUNNING)
  6775. {
  6776. // Get status of remote DHCP service
  6777. LockList(s->FarmMemberList);
  6778. {
  6779. for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
  6780. {
  6781. FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
  6782. if (f->Me == false)
  6783. {
  6784. RPC_ENUM_DHCP tmp;
  6785. Zero(&tmp, sizeof(tmp));
  6786. SiCallEnumDhcp(s, f, hubname, &tmp);
  6787. if (tmp.NumItem >= 1)
  6788. {
  6789. FreeRpcEnumDhcp(t);
  6790. Copy(t, &tmp, sizeof(RPC_ENUM_DHCP));
  6791. ret = ERR_NO_ERROR;
  6792. break;
  6793. }
  6794. else
  6795. {
  6796. FreeRpcEnumDhcp(&tmp);
  6797. }
  6798. }
  6799. }
  6800. }
  6801. UnlockList(s->FarmMemberList);
  6802. }
  6803. }
  6804. ReleaseHub(h);
  6805. ret = ERR_NO_ERROR;
  6806. return ret;
  6807. }
  6808. // Set SecureNAT options
  6809. UINT StSetSecureNATOption(ADMIN *a, VH_OPTION *t)
  6810. {
  6811. SERVER *s = a->Server;
  6812. CEDAR *c = s->Cedar;
  6813. HUB *h;
  6814. char push_routes_str_old[MAX_DHCP_CLASSLESS_ROUTE_TABLE_STR_SIZE];
  6815. if (IsZero(t->MacAddress, sizeof(t->MacAddress)) ||
  6816. IsHostIPAddress4(&t->Ip) == false ||
  6817. IsSubnetMask4(&t->Mask) == false)
  6818. {
  6819. return ERR_INVALID_PARAMETER;
  6820. }
  6821. if ((IPToUINT(&t->Ip) & (~(IPToUINT(&t->Mask)))) == 0)
  6822. {
  6823. return ERR_INVALID_PARAMETER;
  6824. }
  6825. if (GetServerCapsBool(s, "b_support_securenat") == false)
  6826. {
  6827. t->ApplyDhcpPushRoutes = false;
  6828. }
  6829. if (t->ApplyDhcpPushRoutes)
  6830. {
  6831. if (NormalizeClasslessRouteTableStr(t->DhcpPushRoutes, sizeof(t->DhcpPushRoutes), t->DhcpPushRoutes) == false)
  6832. {
  6833. return ERR_INVALID_PARAMETER;
  6834. }
  6835. }
  6836. CHECK_RIGHT;
  6837. LockHubList(c);
  6838. {
  6839. h = GetHub(c, t->HubName);
  6840. }
  6841. UnlockHubList(c);
  6842. if (h == NULL)
  6843. {
  6844. return ERR_HUB_NOT_FOUND;
  6845. }
  6846. if (h->Type == HUB_TYPE_FARM_STATIC || GetServerCapsBool(s, "b_support_securenat") == false)
  6847. {
  6848. ReleaseHub(h);
  6849. return ERR_NOT_SUPPORTED;
  6850. }
  6851. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  6852. {
  6853. ReleaseHub(h);
  6854. return ERR_NOT_FARM_CONTROLLER;
  6855. }
  6856. if (a->ServerAdmin == false && GetHubAdminOption(h, "no_securenat") != 0)
  6857. {
  6858. ReleaseHub(h);
  6859. return ERR_NOT_ENOUGH_RIGHT;
  6860. }
  6861. if (h->SecureNATOption->UseNat == false && t->UseNat)
  6862. {
  6863. if (a->ServerAdmin == false && GetHubAdminOption(h, "no_securenat_enablenat") != 0)
  6864. {
  6865. ReleaseHub(h);
  6866. return ERR_NOT_ENOUGH_RIGHT;
  6867. }
  6868. }
  6869. if (h->SecureNATOption->UseDhcp == false && t->UseDhcp)
  6870. {
  6871. if (a->ServerAdmin == false && GetHubAdminOption(h, "no_securenat_enabledhcp") != 0)
  6872. {
  6873. ReleaseHub(h);
  6874. return ERR_NOT_ENOUGH_RIGHT;
  6875. }
  6876. }
  6877. StrCpy(push_routes_str_old, sizeof(push_routes_str_old), h->SecureNATOption->DhcpPushRoutes);
  6878. Copy(h->SecureNATOption, t, sizeof(VH_OPTION));
  6879. if (t->ApplyDhcpPushRoutes == false)
  6880. {
  6881. StrCpy(h->SecureNATOption->DhcpPushRoutes, sizeof(h->SecureNATOption->DhcpPushRoutes), push_routes_str_old);
  6882. }
  6883. if (h->Type != HUB_TYPE_STANDALONE && h->Cedar != NULL && h->Cedar->Server != NULL &&
  6884. h->Cedar->Server->ServerType == SERVER_TYPE_FARM_CONTROLLER)
  6885. {
  6886. NiClearUnsupportedVhOptionForDynamicHub(h->SecureNATOption, false);
  6887. }
  6888. Lock(h->lock_online);
  6889. {
  6890. if (h->SecureNAT != NULL)
  6891. {
  6892. SetVirtualHostOption(h->SecureNAT->Nat->Virtual, t);
  6893. }
  6894. }
  6895. Unlock(h->lock_online);
  6896. ALog(a, h, "LA_SET_SNAT_OPTION");
  6897. h->CurrentVersion++;
  6898. SiHubUpdateProc(h);
  6899. IncrementServerConfigRevision(s);
  6900. ReleaseHub(h);
  6901. return ERR_NO_ERROR;
  6902. }
  6903. // Get SecureNAT options
  6904. UINT StGetSecureNATOption(ADMIN *a, VH_OPTION *t)
  6905. {
  6906. SERVER *s = a->Server;
  6907. CEDAR *c = s->Cedar;
  6908. HUB *h;
  6909. char hubname[MAX_HUBNAME_LEN + 1];
  6910. StrCpy(hubname, sizeof(hubname), t->HubName);
  6911. CHECK_RIGHT;
  6912. LockHubList(c);
  6913. {
  6914. h = GetHub(c, t->HubName);
  6915. }
  6916. UnlockHubList(c);
  6917. if (h == NULL)
  6918. {
  6919. return ERR_HUB_NOT_FOUND;
  6920. }
  6921. if (h->Type == HUB_TYPE_FARM_STATIC || GetServerCapsBool(s, "b_support_securenat") == false)
  6922. {
  6923. ReleaseHub(h);
  6924. return ERR_NOT_SUPPORTED;
  6925. }
  6926. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  6927. {
  6928. ReleaseHub(h);
  6929. return ERR_NOT_FARM_CONTROLLER;
  6930. }
  6931. Zero(t, sizeof(VH_OPTION));
  6932. Copy(t, h->SecureNATOption, sizeof(VH_OPTION));
  6933. StrCpy(t->HubName, sizeof(t->HubName), h->Name);
  6934. t->ApplyDhcpPushRoutes = true;
  6935. ReleaseHub(h);
  6936. return ERR_NO_ERROR;
  6937. }
  6938. // Make a hub on-line or off-line
  6939. UINT StSetHubOnline(ADMIN *a, RPC_SET_HUB_ONLINE *t)
  6940. {
  6941. SERVER *s = a->Server;
  6942. CEDAR *c = s->Cedar;
  6943. HUB *h;
  6944. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  6945. {
  6946. return ERR_NOT_FARM_CONTROLLER;
  6947. }
  6948. NO_SUPPORT_FOR_BRIDGE;
  6949. CHECK_RIGHT;
  6950. LockHubList(c);
  6951. {
  6952. h = GetHub(c, t->HubName);
  6953. }
  6954. UnlockHubList(c);
  6955. if (h == NULL)
  6956. {
  6957. return ERR_HUB_NOT_FOUND;
  6958. }
  6959. if (a->ServerAdmin == false && t->Online && GetHubAdminOption(h, "no_online") != 0)
  6960. {
  6961. ReleaseHub(h);
  6962. return ERR_NOT_ENOUGH_RIGHT;
  6963. }
  6964. if (a->ServerAdmin == false && t->Online == false && GetHubAdminOption(h, "no_offline") != 0)
  6965. {
  6966. ReleaseHub(h);
  6967. return ERR_NOT_ENOUGH_RIGHT;
  6968. }
  6969. if (t->Online)
  6970. {
  6971. ALog(a, h, "LA_SET_HUB_ONLINE");
  6972. SetHubOnline(h);
  6973. }
  6974. else
  6975. {
  6976. ALog(a, h, "LA_SET_HUB_OFFLINE");
  6977. SetHubOffline(h);
  6978. }
  6979. h->CurrentVersion++;
  6980. SiHubUpdateProc(h);
  6981. IncrementServerConfigRevision(s);
  6982. ReleaseHub(h);
  6983. return ERR_NO_ERROR;
  6984. }
  6985. // Get connection information
  6986. UINT StGetConnectionInfo(ADMIN *a, RPC_CONNECTION_INFO *t)
  6987. {
  6988. SERVER *s = a->Server;
  6989. CEDAR *c = s->Cedar;
  6990. CONNECTION *connection;
  6991. char name[MAX_CONNECTION_NAME_LEN + 1];
  6992. if (IsEmptyStr(t->Name))
  6993. {
  6994. return ERR_INVALID_PARAMETER;
  6995. }
  6996. SERVER_ADMIN_ONLY;
  6997. LockList(c->ConnectionList);
  6998. {
  6999. CONNECTION tt;
  7000. Zero(&tt, sizeof(tt));
  7001. tt.Name = t->Name;
  7002. StrCpy(name, sizeof(name), t->Name);
  7003. connection = Search(c->ConnectionList, &tt);
  7004. if (connection != NULL)
  7005. {
  7006. AddRef(connection->ref);
  7007. }
  7008. }
  7009. UnlockList(c->ConnectionList);
  7010. if (connection == NULL)
  7011. {
  7012. return ERR_OBJECT_NOT_FOUND;
  7013. }
  7014. Zero(t, sizeof(RPC_CONNECTION_INFO));
  7015. StrCpy(t->Name, sizeof(t->Name), name);
  7016. Lock(connection->lock);
  7017. {
  7018. SOCK *s = connection->FirstSock;
  7019. if (s != NULL)
  7020. {
  7021. t->Ip = IPToUINT(&s->RemoteIP);
  7022. t->Port = s->RemotePort;
  7023. StrCpy(t->Hostname, sizeof(t->Hostname), s->RemoteHostname);
  7024. }
  7025. StrCpy(t->Name, sizeof(t->Name), connection->Name);
  7026. t->ConnectedTime = TickToTime(connection->ConnectedTick);
  7027. t->Type = connection->Type;
  7028. StrCpy(t->ServerStr, sizeof(t->ServerStr), connection->ServerStr);
  7029. StrCpy(t->ClientStr, sizeof(t->ClientStr), connection->ClientStr);
  7030. t->ServerVer = connection->ServerVer;
  7031. t->ServerBuild = connection->ServerBuild;
  7032. t->ClientVer = connection->ClientVer;
  7033. t->ClientBuild = connection->ClientBuild;
  7034. }
  7035. Unlock(connection->lock);
  7036. ReleaseConnection(connection);
  7037. return ERR_NO_ERROR;
  7038. }
  7039. // Disconnect a connection
  7040. UINT StDisconnectConnection(ADMIN *a, RPC_DISCONNECT_CONNECTION *t)
  7041. {
  7042. SERVER *s = a->Server;
  7043. CEDAR *c = s->Cedar;
  7044. CONNECTION *connection;
  7045. if (IsEmptyStr(t->Name))
  7046. {
  7047. return ERR_INVALID_PARAMETER;
  7048. }
  7049. SERVER_ADMIN_ONLY;
  7050. LockList(c->ConnectionList);
  7051. {
  7052. CONNECTION tt;
  7053. Zero(&tt, sizeof(tt));
  7054. tt.Name = t->Name;
  7055. connection = Search(c->ConnectionList, &tt);
  7056. if (connection != NULL)
  7057. {
  7058. AddRef(connection->ref);
  7059. }
  7060. }
  7061. UnlockList(c->ConnectionList);
  7062. if (connection == NULL)
  7063. {
  7064. return ERR_OBJECT_NOT_FOUND;
  7065. }
  7066. StopConnection(connection, true);
  7067. ReleaseConnection(connection);
  7068. ALog(a, NULL, "LA_DISCONNECT_CONN", t->Name);
  7069. return ERR_NO_ERROR;
  7070. }
  7071. // Enumerate connections
  7072. UINT StEnumConnection(ADMIN *a, RPC_ENUM_CONNECTION *t)
  7073. {
  7074. SERVER *s = a->Server;
  7075. CEDAR *c = s->Cedar;
  7076. SERVER_ADMIN_ONLY;
  7077. FreeRpcEnumConnection(t);
  7078. Zero(t, sizeof(RPC_ENUM_CONNECTION));
  7079. LockList(c->ConnectionList);
  7080. {
  7081. UINT i;
  7082. t->NumConnection = LIST_NUM(c->ConnectionList);
  7083. t->Connections = ZeroMalloc(sizeof(RPC_ENUM_CONNECTION_ITEM) * t->NumConnection);
  7084. for (i = 0;i < t->NumConnection;i++)
  7085. {
  7086. RPC_ENUM_CONNECTION_ITEM *e = &t->Connections[i];
  7087. CONNECTION *connection = LIST_DATA(c->ConnectionList, i);
  7088. Lock(connection->lock);
  7089. {
  7090. SOCK *s = connection->FirstSock;
  7091. if (s != NULL)
  7092. {
  7093. e->Ip = IPToUINT(&s->RemoteIP);
  7094. e->Port = s->RemotePort;
  7095. StrCpy(e->Hostname, sizeof(e->Hostname), s->RemoteHostname);
  7096. }
  7097. StrCpy(e->Name, sizeof(e->Name), connection->Name);
  7098. e->ConnectedTime = TickToTime(connection->ConnectedTick);
  7099. e->Type = connection->Type;
  7100. }
  7101. Unlock(connection->lock);
  7102. }
  7103. }
  7104. UnlockList(c->ConnectionList);
  7105. return ERR_NO_ERROR;
  7106. }
  7107. // Set Radius options of the hub
  7108. UINT StSetHubRadius(ADMIN *a, RPC_RADIUS *t)
  7109. {
  7110. SERVER *s = a->Server;
  7111. CEDAR *c = s->Cedar;
  7112. HUB *h = NULL;
  7113. NO_SUPPORT_FOR_BRIDGE;
  7114. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  7115. {
  7116. return ERR_NOT_SUPPORTED;
  7117. }
  7118. if (GetGlobalServerFlag(GSF_DISABLE_RADIUS_AUTH) != 0 && IsEmptyStr(t->RadiusServerName) == false)
  7119. {
  7120. return ERR_NOT_SUPPORTED_FUNCTION_ON_OPENSOURCE;
  7121. }
  7122. CHECK_RIGHT;
  7123. LockHubList(c);
  7124. {
  7125. h = GetHub(c, t->HubName);
  7126. }
  7127. UnlockHubList(c);
  7128. if (h == NULL)
  7129. {
  7130. return ERR_HUB_NOT_FOUND;
  7131. }
  7132. //SetRadiusServer(h, t->RadiusServerName, t->RadiusPort, t->RadiusSecret);
  7133. SetRadiusServerEx(h, t->RadiusServerName, t->RadiusPort, t->RadiusSecret, t->RadiusRetryInterval);
  7134. ALog(a, h, "LA_SET_HUB_RADIUS");
  7135. ReleaseHub(h);
  7136. IncrementServerConfigRevision(s);
  7137. return ERR_NO_ERROR;
  7138. }
  7139. // Get Radius options of the hub
  7140. UINT StGetHubRadius(ADMIN *a, RPC_RADIUS *t)
  7141. {
  7142. SERVER *s = a->Server;
  7143. CEDAR *c = s->Cedar;
  7144. HUB *h = NULL;
  7145. CHECK_RIGHT;
  7146. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  7147. {
  7148. return ERR_NOT_SUPPORTED;
  7149. }
  7150. LockHubList(c);
  7151. {
  7152. h = GetHub(c, t->HubName);
  7153. }
  7154. UnlockHubList(c);
  7155. if (h == NULL)
  7156. {
  7157. return ERR_HUB_NOT_FOUND;
  7158. }
  7159. Zero(t, sizeof(RPC_RADIUS));
  7160. //GetRadiusServer(h, t->RadiusServerName, sizeof(t->RadiusServerName),
  7161. // &t->RadiusPort, t->RadiusSecret, sizeof(t->RadiusSecret));
  7162. GetRadiusServerEx(h, t->RadiusServerName, sizeof(t->RadiusServerName),
  7163. &t->RadiusPort, t->RadiusSecret, sizeof(t->RadiusSecret), &t->RadiusRetryInterval);
  7164. ReleaseHub(h);
  7165. return ERR_NO_ERROR;
  7166. }
  7167. // Delete a hub
  7168. UINT StDeleteHub(ADMIN *a, RPC_DELETE_HUB *t)
  7169. {
  7170. SERVER *s = a->Server;
  7171. CEDAR *c = s->Cedar;
  7172. HUB *h = NULL;
  7173. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  7174. {
  7175. return ERR_NOT_FARM_CONTROLLER;
  7176. }
  7177. if (IsEmptyStr(t->HubName) || IsSafeStr(t->HubName) == false)
  7178. {
  7179. return ERR_INVALID_PARAMETER;
  7180. }
  7181. NO_SUPPORT_FOR_BRIDGE;
  7182. SERVER_ADMIN_ONLY;
  7183. LockHubList(c);
  7184. {
  7185. h = GetHub(c, t->HubName);
  7186. }
  7187. UnlockHubList(c);
  7188. if (h == NULL)
  7189. {
  7190. return ERR_HUB_NOT_FOUND;
  7191. }
  7192. StopHub(h);
  7193. IncrementServerConfigRevision(s);
  7194. DelHub(c, h);
  7195. ReleaseHub(h);
  7196. ALog(a, NULL, "LA_DELETE_HUB", t->HubName);
  7197. return ERR_NO_ERROR;
  7198. }
  7199. // Enumerate hubs
  7200. UINT StEnumHub(ADMIN *a, RPC_ENUM_HUB *t)
  7201. {
  7202. SERVER *s = a->Server;
  7203. CEDAR *c = s->Cedar;
  7204. HUB *h = NULL;
  7205. FreeRpcEnumHub(t);
  7206. Zero(t, sizeof(RPC_ENUM_HUB));
  7207. LockHubList(c);
  7208. {
  7209. UINT i, num, j;
  7210. num = 0;
  7211. for (i = 0;i < LIST_NUM(c->HubList);i++)
  7212. {
  7213. HUB *h = LIST_DATA(c->HubList, i);
  7214. Lock(h->lock);
  7215. if (a->ServerAdmin == false &&
  7216. h->Option != NULL &&
  7217. StrCmpi(h->Name, a->HubName) != 0)
  7218. {
  7219. // This hub is not listed
  7220. }
  7221. else
  7222. {
  7223. // This hub is listed
  7224. num++;
  7225. }
  7226. }
  7227. t->NumHub = num;
  7228. t->Hubs = ZeroMalloc(sizeof(RPC_ENUM_HUB_ITEM) * num);
  7229. i = 0;
  7230. for (j = 0;j < LIST_NUM(c->HubList);j++)
  7231. {
  7232. HUB *h = LIST_DATA(c->HubList, j);
  7233. if (a->ServerAdmin == false &&
  7234. h->Option != NULL &&
  7235. StrCmpi(h->Name, a->HubName) != 0)
  7236. {
  7237. // This hub is not listed
  7238. }
  7239. else
  7240. {
  7241. // This hub is listed
  7242. RPC_ENUM_HUB_ITEM *e = &t->Hubs[i++];
  7243. StrCpy(e->HubName, sizeof(e->HubName), h->Name);
  7244. e->Online = h->Offline ? false : true;
  7245. e->HubType = h->Type;
  7246. e->NumSessions = LIST_NUM(h->SessionList);
  7247. LockHashList(h->MacHashTable);
  7248. {
  7249. e->NumMacTables = HASH_LIST_NUM(h->MacHashTable);
  7250. }
  7251. UnlockHashList(h->MacHashTable);
  7252. LockList(h->IpTable);
  7253. {
  7254. e->NumIpTables = LIST_NUM(h->IpTable);
  7255. }
  7256. UnlockList(h->IpTable);
  7257. if (h->HubDb != NULL)
  7258. {
  7259. LockList(h->HubDb->UserList);
  7260. {
  7261. e->NumUsers = LIST_NUM(h->HubDb->UserList);
  7262. }
  7263. UnlockList(h->HubDb->UserList);
  7264. LockList(h->HubDb->GroupList);
  7265. {
  7266. e->NumGroups = LIST_NUM(h->HubDb->GroupList);
  7267. }
  7268. UnlockList(h->HubDb->GroupList);
  7269. }
  7270. e->LastCommTime = h->LastCommTime;
  7271. e->LastLoginTime = h->LastLoginTime;
  7272. e->NumLogin = h->NumLogin;
  7273. e->CreatedTime = h->CreatedTime;
  7274. Lock(h->TrafficLock);
  7275. {
  7276. Copy(&e->Traffic, h->Traffic, sizeof(TRAFFIC));
  7277. }
  7278. Unlock(h->TrafficLock);
  7279. e->IsTrafficFilled = true;
  7280. }
  7281. Unlock(h->lock);
  7282. }
  7283. }
  7284. UnlockHubList(c);
  7285. if (s->ServerType == SERVER_TYPE_FARM_CONTROLLER)
  7286. {
  7287. UINT i, j, k;
  7288. LockList(s->FarmMemberList);
  7289. {
  7290. for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
  7291. {
  7292. FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
  7293. LockList(f->HubList);
  7294. {
  7295. if (f->Me == false)
  7296. {
  7297. for (j = 0;j < LIST_NUM(f->HubList);j++)
  7298. {
  7299. HUB_LIST *o = LIST_DATA(f->HubList, j);
  7300. for (k = 0;k < t->NumHub;k++)
  7301. {
  7302. RPC_ENUM_HUB_ITEM *e = &t->Hubs[k];
  7303. if (StrCmpi(e->HubName, o->Name) == 0)
  7304. {
  7305. e->NumIpTables += o->NumIpTables;
  7306. e->NumMacTables += o->NumMacTables;
  7307. e->NumSessions += o->NumSessions;
  7308. }
  7309. }
  7310. }
  7311. }
  7312. }
  7313. UnlockList(f->HubList);
  7314. }
  7315. }
  7316. UnlockList(s->FarmMemberList);
  7317. }
  7318. return ERR_NO_ERROR;
  7319. }
  7320. // Get hub configuration
  7321. UINT StGetHub(ADMIN *a, RPC_CREATE_HUB *t)
  7322. {
  7323. SERVER *s = a->Server;
  7324. CEDAR *c = s->Cedar;
  7325. UINT ret = ERR_NO_ERROR;
  7326. HUB *h;
  7327. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  7328. {
  7329. return ERR_NOT_FARM_CONTROLLER;
  7330. }
  7331. if (IsEmptyStr(t->HubName) || IsSafeStr(t->HubName) == false)
  7332. {
  7333. return ERR_INVALID_PARAMETER;
  7334. }
  7335. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  7336. {
  7337. return ERR_NOT_FARM_CONTROLLER;
  7338. }
  7339. NO_SUPPORT_FOR_BRIDGE;
  7340. CHECK_RIGHT;
  7341. LockHubList(c);
  7342. {
  7343. h = GetHub(c, t->HubName);
  7344. }
  7345. UnlockHubList(c);
  7346. Zero(t, sizeof(RPC_CREATE_HUB));
  7347. if (h == NULL)
  7348. {
  7349. return ERR_HUB_NOT_FOUND;
  7350. }
  7351. Lock(h->lock);
  7352. {
  7353. StrCpy(t->HubName, sizeof(t->HubName), h->Name);
  7354. t->Online = h->Offline ? false : true;
  7355. t->HubType = h->Type;
  7356. t->HubOption.DefaultGateway = h->Option->DefaultGateway;
  7357. t->HubOption.DefaultSubnet = h->Option->DefaultSubnet;
  7358. t->HubOption.MaxSession = h->Option->MaxSession;
  7359. t->HubOption.NoEnum = h->Option->NoEnum;
  7360. }
  7361. Unlock(h->lock);
  7362. ReleaseHub(h);
  7363. return ret;
  7364. }
  7365. // Set hub configuration
  7366. UINT StSetHub(ADMIN *a, RPC_CREATE_HUB *t)
  7367. {
  7368. SERVER *s = a->Server;
  7369. CEDAR *c = s->Cedar;
  7370. HUB *h;
  7371. UINT ret = ERR_NO_ERROR;
  7372. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  7373. {
  7374. return ERR_NOT_FARM_CONTROLLER;
  7375. }
  7376. if (IsEmptyStr(t->HubName) || IsSafeStr(t->HubName) == false)
  7377. {
  7378. return ERR_INVALID_PARAMETER;
  7379. }
  7380. CHECK_RIGHT;
  7381. NO_SUPPORT_FOR_BRIDGE;
  7382. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  7383. {
  7384. return ERR_NOT_FARM_CONTROLLER;
  7385. }
  7386. if (s->ServerType == SERVER_TYPE_STANDALONE)
  7387. {
  7388. if (t->HubType != HUB_TYPE_STANDALONE)
  7389. {
  7390. return ERR_INVALID_PARAMETER;
  7391. }
  7392. }
  7393. if (s->ServerType == SERVER_TYPE_FARM_CONTROLLER)
  7394. {
  7395. if (t->HubType == HUB_TYPE_STANDALONE)
  7396. {
  7397. return ERR_INVALID_PARAMETER;
  7398. }
  7399. }
  7400. LockHubList(c);
  7401. {
  7402. h = GetHub(c, t->HubName);
  7403. }
  7404. UnlockHubList(c);
  7405. if (h == NULL)
  7406. {
  7407. return ERR_HUB_NOT_FOUND;
  7408. }
  7409. if (h->Type != t->HubType)
  7410. {
  7411. ReleaseHub(h);
  7412. return ERR_NOT_SUPPORTED;
  7413. }
  7414. // For JSON-RPC
  7415. if (StrLen(t->AdminPasswordPlainText) != 0)
  7416. {
  7417. Sha0(t->HashedPassword, t->AdminPasswordPlainText, StrLen(t->AdminPasswordPlainText));
  7418. HashPassword(t->SecurePassword, ADMINISTRATOR_USERNAME, t->AdminPasswordPlainText);
  7419. }
  7420. if (IsZero(t->HashedPassword, sizeof(t->HashedPassword)) == false &&
  7421. IsZero(t->SecurePassword, sizeof(t->SecurePassword)) == false)
  7422. {
  7423. if (a->ServerAdmin == false && GetHubAdminOption(h, "no_change_admin_password") != 0)
  7424. {
  7425. ReleaseHub(h);
  7426. return ERR_NOT_ENOUGH_RIGHT;
  7427. }
  7428. }
  7429. // Is the password to be set blank
  7430. {
  7431. UCHAR hash1[SHA1_SIZE], hash2[SHA1_SIZE];
  7432. HashPassword(hash1, ADMINISTRATOR_USERNAME, "");
  7433. Sha0(hash2, "", 0);
  7434. if (Cmp(t->HashedPassword, hash2, SHA1_SIZE) == 0 || Cmp(t->SecurePassword, hash1, SHA1_SIZE) == 0)
  7435. {
  7436. if (a->ServerAdmin == false && IsLocalHostIP(&a->Rpc->Sock->RemoteIP) == false)
  7437. {
  7438. // Refuse to set a blank password to hub admin from remote host
  7439. ReleaseHub(h);
  7440. return ERR_INVALID_PARAMETER;
  7441. }
  7442. }
  7443. }
  7444. Lock(h->lock);
  7445. {
  7446. if (a->ServerAdmin == false && h->Type != t->HubType)
  7447. {
  7448. ret = ERR_NOT_ENOUGH_RIGHT;
  7449. }
  7450. else
  7451. {
  7452. h->Type = t->HubType;
  7453. h->Option->DefaultGateway = t->HubOption.DefaultGateway;
  7454. h->Option->DefaultSubnet = t->HubOption.DefaultSubnet;
  7455. h->Option->MaxSession = t->HubOption.MaxSession;
  7456. h->Option->NoEnum = t->HubOption.NoEnum;
  7457. if (IsZero(t->HashedPassword, sizeof(t->HashedPassword)) == false &&
  7458. IsZero(t->SecurePassword, sizeof(t->SecurePassword)) == false)
  7459. {
  7460. Copy(h->HashedPassword, t->HashedPassword, SHA1_SIZE);
  7461. Copy(h->SecurePassword, t->SecurePassword, SHA1_SIZE);
  7462. }
  7463. }
  7464. }
  7465. Unlock(h->lock);
  7466. if (t->Online)
  7467. {
  7468. if (a->ServerAdmin || GetHubAdminOption(h, "no_online") == 0)
  7469. {
  7470. SetHubOnline(h);
  7471. }
  7472. }
  7473. else
  7474. {
  7475. if (a->ServerAdmin || GetHubAdminOption(h, "no_offline") == 0)
  7476. {
  7477. SetHubOffline(h);
  7478. }
  7479. }
  7480. if (h->Type == HUB_TYPE_FARM_STATIC)
  7481. {
  7482. EnableSecureNAT(h, false);
  7483. }
  7484. h->CurrentVersion++;
  7485. SiHubUpdateProc(h);
  7486. IncrementServerConfigRevision(s);
  7487. ALog(a, h, "LA_SET_HUB");
  7488. ReleaseHub(h);
  7489. return ret;
  7490. }
  7491. // Create a hub
  7492. UINT StCreateHub(ADMIN *a, RPC_CREATE_HUB *t)
  7493. {
  7494. SERVER *s = a->Server;
  7495. CEDAR *c = s->Cedar;
  7496. HUB *h;
  7497. HUB_OPTION o;
  7498. UINT current_hub_num;
  7499. bool b;
  7500. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  7501. {
  7502. return ERR_NOT_FARM_CONTROLLER;
  7503. }
  7504. if (IsEmptyStr(t->HubName) || IsSafeStr(t->HubName) == false)
  7505. {
  7506. return ERR_INVALID_PARAMETER;
  7507. }
  7508. NO_SUPPORT_FOR_BRIDGE;
  7509. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  7510. {
  7511. return ERR_NOT_FARM_CONTROLLER;
  7512. }
  7513. SERVER_ADMIN_ONLY;
  7514. Trim(t->HubName);
  7515. if (StrLen(t->HubName) == 0)
  7516. {
  7517. return ERR_INVALID_PARAMETER;
  7518. }
  7519. if (StartWith(t->HubName, ".") || EndWith(t->HubName, "."))
  7520. {
  7521. return ERR_INVALID_PARAMETER;
  7522. }
  7523. if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
  7524. {
  7525. return ERR_NOT_FARM_CONTROLLER;
  7526. }
  7527. if (s->ServerType == SERVER_TYPE_STANDALONE)
  7528. {
  7529. if (t->HubType != HUB_TYPE_STANDALONE)
  7530. {
  7531. return ERR_INVALID_PARAMETER;
  7532. }
  7533. }
  7534. else if (t->HubType != HUB_TYPE_FARM_DYNAMIC && t->HubType != HUB_TYPE_FARM_STATIC)
  7535. {
  7536. return ERR_INVALID_PARAMETER;
  7537. }
  7538. // Create a hub object
  7539. Zero(&o, sizeof(o));
  7540. o.DefaultGateway = t->HubOption.DefaultGateway;
  7541. o.DefaultSubnet = t->HubOption.DefaultSubnet;
  7542. o.MaxSession = t->HubOption.MaxSession;
  7543. o.NoEnum = t->HubOption.NoEnum;
  7544. // Default setting for hub admin options
  7545. SiSetDefaultHubOption(&o);
  7546. LockList(c->HubList);
  7547. {
  7548. current_hub_num = LIST_NUM(c->HubList);
  7549. }
  7550. UnlockList(c->HubList);
  7551. if (current_hub_num > GetServerCapsInt(a->Server, "i_max_hubs"))
  7552. {
  7553. return ERR_TOO_MANY_HUBS;
  7554. }
  7555. LockList(c->HubList);
  7556. {
  7557. b = IsHub(c, t->HubName);
  7558. }
  7559. UnlockList(c->HubList);
  7560. if (b)
  7561. {
  7562. return ERR_HUB_ALREADY_EXISTS;
  7563. }
  7564. ALog(a, NULL, "LA_CREATE_HUB", t->HubName);
  7565. // For JSON-RPC
  7566. if ((IsZero(t->HashedPassword, sizeof(t->HashedPassword)) &&
  7567. IsZero(t->SecurePassword, sizeof(t->SecurePassword))) ||
  7568. StrLen(t->AdminPasswordPlainText) != 0)
  7569. {
  7570. Sha0(t->HashedPassword, t->AdminPasswordPlainText, StrLen(t->AdminPasswordPlainText));
  7571. HashPassword(t->SecurePassword, ADMINISTRATOR_USERNAME, t->AdminPasswordPlainText);
  7572. }
  7573. h = NewHub(c, t->HubName, &o);
  7574. Copy(h->HashedPassword, t->HashedPassword, SHA1_SIZE);
  7575. Copy(h->SecurePassword, t->SecurePassword, SHA1_SIZE);
  7576. h->Type = t->HubType;
  7577. AddHub(c, h);
  7578. if (t->Online)
  7579. {
  7580. h->Offline = true;
  7581. SetHubOnline(h);
  7582. }
  7583. else
  7584. {
  7585. h->Offline = false;
  7586. SetHubOffline(h);
  7587. }
  7588. h->CreatedTime = SystemTime64();
  7589. ReleaseHub(h);
  7590. IncrementServerConfigRevision(s);
  7591. return ERR_NO_ERROR;
  7592. }
  7593. // Set cipher for SSL to the server
  7594. UINT StSetServerCipher(ADMIN *a, RPC_STR *t)
  7595. {
  7596. SERVER *s = a->Server;
  7597. CEDAR *c = s->Cedar;
  7598. if (IsEmptyStr(t->String))
  7599. {
  7600. return ERR_INVALID_PARAMETER;
  7601. }
  7602. SERVER_ADMIN_ONLY;
  7603. StrUpper(t->String);
  7604. ALog(a, NULL, "LA_SET_SERVER_CIPHER", t->String);
  7605. Lock(c->lock);
  7606. {
  7607. SetCedarCipherList(c, t->String);
  7608. }
  7609. Unlock(c->lock);
  7610. IncrementServerConfigRevision(s);
  7611. return ERR_NO_ERROR;
  7612. }
  7613. // Get cipher for SSL
  7614. UINT StGetServerCipher(ADMIN *a, RPC_STR *t)
  7615. {
  7616. SERVER *s = a->Server;
  7617. CEDAR *c = s->Cedar;
  7618. FreeRpcStr(t);
  7619. Zero(t, sizeof(RPC_STR));
  7620. Lock(c->lock);
  7621. {
  7622. t->String = CopyStr(c->CipherList);
  7623. }
  7624. Unlock(c->lock);
  7625. return ERR_NO_ERROR;
  7626. }
  7627. // Get list of available ciphers for SSL
  7628. UINT StGetServerCipherList(ADMIN *a, RPC_STR *t)
  7629. {
  7630. SERVER *s = a->Server;
  7631. CEDAR *c = s->Cedar;
  7632. FreeRpcStr(t);
  7633. Zero(t, sizeof(RPC_STR));
  7634. Lock(c->lock);
  7635. {
  7636. UINT i;
  7637. TOKEN_LIST *ciphers = GetCipherList();
  7638. if (ciphers->NumTokens > 0)
  7639. {
  7640. UINT size = StrSize(ciphers->Token[0]);
  7641. t->String = Malloc(size);
  7642. StrCpy(t->String, size, ciphers->Token[0]);
  7643. i = 1;
  7644. for (; i < ciphers->NumTokens; i++)
  7645. {
  7646. // We use StrSize() because we need the extra space for ';'
  7647. size += StrSize(ciphers->Token[i]);
  7648. t->String = ReAlloc(t->String, size);
  7649. StrCat(t->String, size, ";");
  7650. StrCat(t->String, size, ciphers->Token[i]);
  7651. }
  7652. }
  7653. FreeToken(ciphers);
  7654. }
  7655. Unlock(c->lock);
  7656. return ERR_NO_ERROR;
  7657. }
  7658. // Get the server certification
  7659. UINT StGetServerCert(ADMIN *a, RPC_KEY_PAIR *t)
  7660. {
  7661. bool admin;
  7662. SERVER *s = a->Server;
  7663. CEDAR *c = s->Cedar;
  7664. bool is_vgs_cert = false;
  7665. admin = a->ServerAdmin;
  7666. FreeRpcKeyPair(t);
  7667. Zero(t, sizeof(RPC_KEY_PAIR));
  7668. Lock(c->lock);
  7669. {
  7670. t->Cert = CloneX(c->ServerX);
  7671. if (admin && is_vgs_cert == false)
  7672. {
  7673. t->Key = CloneK(c->ServerK);
  7674. }
  7675. }
  7676. Unlock(c->lock);
  7677. return ERR_NO_ERROR;
  7678. }
  7679. // Set the server certification
  7680. UINT StSetServerCert(ADMIN *a, RPC_KEY_PAIR *t)
  7681. {
  7682. SERVER *s = a->Server;
  7683. CEDAR *c = s->Cedar;
  7684. SERVER_ADMIN_ONLY;
  7685. if (t->Cert == NULL || t->Key == NULL)
  7686. {
  7687. return ERR_PROTOCOL_ERROR;
  7688. }
  7689. if (CheckXandK(t->Cert, t->Key) == false)
  7690. {
  7691. return ERR_PROTOCOL_ERROR;
  7692. }
  7693. t->Flag1 = 1;
  7694. if (t->Cert->root_cert == false)
  7695. {
  7696. if (DownloadAndSaveIntermediateCertificatesIfNecessary(t->Cert) == false)
  7697. {
  7698. t->Flag1 = 0;
  7699. }
  7700. }
  7701. SetCedarCert(c, t->Cert, t->Key);
  7702. ALog(a, NULL, "LA_SET_SERVER_CERT");
  7703. IncrementServerConfigRevision(s);
  7704. return ERR_NO_ERROR;
  7705. }
  7706. // Add a WireGuard key to the allowed key list
  7707. UINT StAddWgk(ADMIN *a, RPC_WGK *t)
  7708. {
  7709. UINT ret = ERR_NO_ERROR;
  7710. SERVER *s = a->Server;
  7711. CEDAR *c = s->Cedar;
  7712. LIST *to_add;
  7713. SERVER_ADMIN_ONLY;
  7714. to_add = NewListFast(NULL);
  7715. LockList(c->WgkList);
  7716. {
  7717. UINT i;
  7718. for (i = 0; i < t->Num; ++i)
  7719. {
  7720. WGK *rpc_wgk = &t->Wgks[i];
  7721. WGK *wgk;
  7722. if (IsEmptyStr(rpc_wgk->Key))
  7723. {
  7724. ret = ERR_INVALID_PARAMETER;
  7725. break;
  7726. }
  7727. if (Search(c->WgkList, rpc_wgk) != NULL)
  7728. {
  7729. ret = ERR_OBJECT_EXISTS;
  7730. break;
  7731. }
  7732. wgk = Malloc(sizeof(WGK));
  7733. StrCpy(wgk->Key, sizeof(wgk->Key), rpc_wgk->Key);
  7734. StrCpy(wgk->Hub, sizeof(wgk->Hub), rpc_wgk->Hub);
  7735. StrCpy(wgk->User, sizeof(wgk->User), rpc_wgk->User);
  7736. Add(to_add, wgk);
  7737. }
  7738. for (i = 0; i < LIST_NUM(to_add); ++i)
  7739. {
  7740. WGK *wgk = LIST_DATA(to_add, i);
  7741. ret == ERR_NO_ERROR ? Add(c->WgkList, wgk) : Free(wgk);
  7742. }
  7743. }
  7744. UnlockList(c->WgkList);
  7745. if (ret == ERR_NO_ERROR)
  7746. {
  7747. ALog(a, NULL, "LA_ADD_WGK", LIST_NUM(to_add));
  7748. IncrementServerConfigRevision(a->Server);
  7749. }
  7750. ReleaseList(to_add);
  7751. return ret;
  7752. }
  7753. // Delete a WireGuard key from the allowed key list
  7754. UINT StDeleteWgk(ADMIN *a, RPC_WGK *t)
  7755. {
  7756. UINT ret = ERR_NO_ERROR;
  7757. SERVER *s = a->Server;
  7758. CEDAR *c = s->Cedar;
  7759. LIST *to_delete;
  7760. SERVER_ADMIN_ONLY;
  7761. to_delete = NewListFast(NULL);
  7762. LockList(c->WgkList);
  7763. {
  7764. UINT i;
  7765. for (i = 0; i < t->Num; ++i)
  7766. {
  7767. WGK *wgk = Search(c->WgkList, &t->Wgks[i]);
  7768. if (wgk == NULL)
  7769. {
  7770. ret = ERR_OBJECT_NOT_FOUND;
  7771. break;
  7772. }
  7773. Add(to_delete, wgk);
  7774. }
  7775. if (ret == ERR_NO_ERROR)
  7776. {
  7777. for (i = 0; i < LIST_NUM(to_delete); ++i)
  7778. {
  7779. WGK *wgk = LIST_DATA(to_delete, i);
  7780. Delete(c->WgkList, wgk);
  7781. Free(wgk);
  7782. }
  7783. }
  7784. }
  7785. UnlockList(c->WgkList);
  7786. if (ret == ERR_NO_ERROR)
  7787. {
  7788. ALog(a, NULL, "LA_DELETE_WGK", LIST_NUM(to_delete));
  7789. IncrementServerConfigRevision(a->Server);
  7790. }
  7791. ReleaseList(to_delete);
  7792. return ret;
  7793. }
  7794. // List the allowed WireGuard keys
  7795. UINT StEnumWgk(ADMIN *a, RPC_WGK *t)
  7796. {
  7797. SERVER *s = a->Server;
  7798. CEDAR *c = s->Cedar;
  7799. SERVER_ADMIN_ONLY;
  7800. LockList(c->WgkList);
  7801. {
  7802. UINT i;
  7803. t->Num = LIST_NUM(c->WgkList);
  7804. t->Wgks = Malloc(sizeof(WGK) * t->Num);
  7805. for (i = 0; i < t->Num; ++i)
  7806. {
  7807. WGK *wgk = LIST_DATA(c->WgkList, i);
  7808. WGK *rpc_wgk = &t->Wgks[i];
  7809. StrCpy(rpc_wgk->Key, sizeof(rpc_wgk->Key), wgk->Key);
  7810. StrCpy(rpc_wgk->Hub, sizeof(rpc_wgk->Hub), wgk->Hub);
  7811. StrCpy(rpc_wgk->User, sizeof(rpc_wgk->User), wgk->User);
  7812. }
  7813. }
  7814. UnlockList(c->WgkList);
  7815. return ERR_NO_ERROR;
  7816. }
  7817. // Get status of connection to cluster controller
  7818. UINT StGetFarmConnectionStatus(ADMIN *a, RPC_FARM_CONNECTION_STATUS *t)
  7819. {
  7820. SERVER *s = a->Server;
  7821. CEDAR *c = s->Cedar;
  7822. FARM_CONTROLLER *fc;
  7823. if (s->ServerType != SERVER_TYPE_FARM_MEMBER)
  7824. {
  7825. return ERR_NOT_FARM_MEMBER;
  7826. }
  7827. Zero(t, sizeof(RPC_FARM_CONNECTION_STATUS));
  7828. fc = s->FarmController;
  7829. Lock(fc->lock);
  7830. {
  7831. if (fc->Sock != NULL)
  7832. {
  7833. t->Ip = IPToUINT(&fc->Sock->RemoteIP);
  7834. t->Port = fc->Sock->RemotePort;
  7835. }
  7836. t->Online = fc->Online;
  7837. t->LastError = ERR_NO_ERROR;
  7838. if (t->Online == false)
  7839. {
  7840. t->LastError = fc->LastError;
  7841. }
  7842. else
  7843. {
  7844. t->CurrentConnectedTime = fc->CurrentConnectedTime;
  7845. }
  7846. t->StartedTime = fc->StartedTime;
  7847. t->FirstConnectedTime = fc->FirstConnectedTime;
  7848. t->NumConnected = fc->NumConnected;
  7849. t->NumTry = fc->NumTry;
  7850. t->NumFailed = fc->NumFailed;
  7851. }
  7852. Unlock(fc->lock);
  7853. return ERR_NO_ERROR;
  7854. }
  7855. // Enumerate cluster members
  7856. UINT StEnumFarmMember(ADMIN *a, RPC_ENUM_FARM *t)
  7857. {
  7858. SERVER *s = a->Server;
  7859. CEDAR *c = s->Cedar;
  7860. UINT i;
  7861. FreeRpcEnumFarm(t);
  7862. Zero(t, sizeof(RPC_ENUM_FARM));
  7863. if (s->ServerType != SERVER_TYPE_FARM_CONTROLLER)
  7864. {
  7865. return ERR_NOT_FARM_CONTROLLER;
  7866. }
  7867. Zero(t, sizeof(RPC_ENUM_FARM));
  7868. LockList(s->FarmMemberList);
  7869. {
  7870. t->NumFarm = LIST_NUM(s->FarmMemberList);
  7871. t->Farms = ZeroMalloc(sizeof(RPC_ENUM_FARM_ITEM) * t->NumFarm);
  7872. for (i = 0;i < t->NumFarm;i++)
  7873. {
  7874. FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
  7875. RPC_ENUM_FARM_ITEM *e = &t->Farms[i];
  7876. e->Id = POINTER_TO_KEY(f);
  7877. e->Controller = f->Me;
  7878. if (e->Controller)
  7879. {
  7880. e->ConnectedTime = TickToTime(c->CreatedTick);
  7881. e->Ip = 0x0100007f;
  7882. GetMachineName(e->Hostname, sizeof(e->Hostname));
  7883. e->Point = f->Point;
  7884. e->NumSessions = Count(c->CurrentSessions);
  7885. e->NumTcpConnections = Count(c->CurrentTcpConnections);
  7886. e->AssignedBridgeLicense = Count(c->AssignedBridgeLicense);
  7887. e->AssignedClientLicense = Count(c->AssignedClientLicense);
  7888. }
  7889. else
  7890. {
  7891. e->ConnectedTime = f->ConnectedTime;
  7892. e->Ip = f->Ip;
  7893. StrCpy(e->Hostname, sizeof(e->Hostname), f->hostname);
  7894. e->Point = f->Point;
  7895. e->NumSessions = f->NumSessions;
  7896. e->NumTcpConnections = f->NumTcpConnections;
  7897. e->AssignedBridgeLicense = f->AssignedBridgeLicense;
  7898. e->AssignedClientLicense = f->AssignedClientLicense;
  7899. }
  7900. e->NumHubs = LIST_NUM(f->HubList);
  7901. }
  7902. }
  7903. UnlockList(s->FarmMemberList);
  7904. return ERR_NO_ERROR;
  7905. }
  7906. // Get cluster member information
  7907. UINT StGetFarmInfo(ADMIN *a, RPC_FARM_INFO *t)
  7908. {
  7909. SERVER *s = a->Server;
  7910. UINT id = t->Id;
  7911. UINT i;
  7912. UINT ret = ERR_NO_ERROR;
  7913. FreeRpcFarmInfo(t);
  7914. Zero(t, sizeof(RPC_FARM_INFO));
  7915. if (s->ServerType != SERVER_TYPE_FARM_CONTROLLER)
  7916. {
  7917. return ERR_NOT_FARM_CONTROLLER;
  7918. }
  7919. LockList(s->FarmMemberList);
  7920. {
  7921. if (IsInListKey(s->FarmMemberList, id))
  7922. {
  7923. FARM_MEMBER *f = ListKeyToPointer(s->FarmMemberList, id);
  7924. t->Id = id;
  7925. t->Controller = f->Me;
  7926. t->Weight = f->Weight;
  7927. LockList(f->HubList);
  7928. {
  7929. t->NumFarmHub = LIST_NUM(f->HubList);
  7930. t->FarmHubs = ZeroMalloc(sizeof(RPC_FARM_HUB) * t->NumFarmHub);
  7931. for (i = 0;i < t->NumFarmHub;i++)
  7932. {
  7933. RPC_FARM_HUB *h = &t->FarmHubs[i];
  7934. HUB_LIST *hh = LIST_DATA(f->HubList, i);
  7935. h->DynamicHub = hh->DynamicHub;
  7936. StrCpy(h->HubName, sizeof(h->HubName), hh->Name);
  7937. }
  7938. }
  7939. UnlockList(f->HubList);
  7940. if (t->Controller)
  7941. {
  7942. t->ConnectedTime = TickToTime(s->Cedar->CreatedTick);
  7943. t->Ip = 0x0100007f;
  7944. GetMachineName(t->Hostname, sizeof(t->Hostname));
  7945. t->Point = f->Point;
  7946. LockList(s->ServerListenerList);
  7947. {
  7948. UINT i, n;
  7949. t->NumPort = 0;
  7950. for (i = 0;i < LIST_NUM(s->ServerListenerList);i++)
  7951. {
  7952. SERVER_LISTENER *o = LIST_DATA(s->ServerListenerList, i);
  7953. if (o->Enabled)
  7954. {
  7955. t->NumPort++;
  7956. }
  7957. }
  7958. t->Ports = ZeroMalloc(sizeof(UINT) * t->NumPort);
  7959. n = 0;
  7960. for (i = 0;i < LIST_NUM(s->ServerListenerList);i++)
  7961. {
  7962. SERVER_LISTENER *o = LIST_DATA(s->ServerListenerList, i);
  7963. if (o->Enabled)
  7964. {
  7965. t->Ports[n++] = o->Port;
  7966. }
  7967. }
  7968. }
  7969. UnlockList(s->ServerListenerList);
  7970. t->ServerCert = CloneX(s->Cedar->ServerX);
  7971. t->NumSessions = Count(s->Cedar->CurrentSessions);
  7972. t->NumTcpConnections = Count(s->Cedar->CurrentTcpConnections);
  7973. }
  7974. else
  7975. {
  7976. t->ConnectedTime = f->ConnectedTime;
  7977. t->Ip = f->Ip;
  7978. StrCpy(t->Hostname, sizeof(t->Hostname), f->hostname);
  7979. t->Point = f->Point;
  7980. t->NumPort = f->NumPort;
  7981. t->Ports = ZeroMalloc(sizeof(UINT) * t->NumPort);
  7982. Copy(t->Ports, f->Ports, sizeof(UINT) * t->NumPort);
  7983. t->ServerCert = CloneX(f->ServerCert);
  7984. t->NumSessions = f->NumSessions;
  7985. t->NumTcpConnections = f->NumTcpConnections;
  7986. }
  7987. }
  7988. else
  7989. {
  7990. ret = ERR_OBJECT_NOT_FOUND;
  7991. }
  7992. }
  7993. UnlockList(s->FarmMemberList);
  7994. return ret;
  7995. }
  7996. // Get clustering configuration
  7997. UINT StGetFarmSetting(ADMIN *a, RPC_FARM *t)
  7998. {
  7999. SERVER *s;
  8000. FreeRpcFarm(t);
  8001. Zero(t, sizeof(RPC_FARM));
  8002. s = a->Server;
  8003. t->ServerType = s->ServerType;
  8004. t->ControllerOnly = s->ControllerOnly;
  8005. t->Weight = s->Weight;
  8006. if (t->ServerType == SERVER_TYPE_FARM_MEMBER)
  8007. {
  8008. t->NumPort = s->NumPublicPort;
  8009. t->Ports = ZeroMalloc(sizeof(UINT) * t->NumPort);
  8010. Copy(t->Ports, s->PublicPorts, sizeof(UINT) * t->NumPort);
  8011. t->PublicIp = s->PublicIp;
  8012. StrCpy(t->ControllerName, sizeof(t->ControllerName), s->ControllerName);
  8013. t->ControllerPort = s->ControllerPort;
  8014. }
  8015. else
  8016. {
  8017. t->NumPort = 0;
  8018. t->Ports = ZeroMalloc(0);
  8019. }
  8020. return ERR_NO_ERROR;
  8021. }
  8022. // Set clustering configuration
  8023. UINT StSetFarmSetting(ADMIN *a, RPC_FARM *t)
  8024. {
  8025. bool cluster_allowed = false;
  8026. SERVER_ADMIN_ONLY;
  8027. NO_SUPPORT_FOR_BRIDGE;
  8028. cluster_allowed = GetServerCapsInt(a->Server, "b_support_cluster");
  8029. if (t->ServerType != SERVER_TYPE_STANDALONE && cluster_allowed == false)
  8030. {
  8031. // When clustering function is disabled, deny turning into clustering mode
  8032. return ERR_NOT_SUPPORTED;
  8033. }
  8034. if (IsZero(t->MemberPassword, sizeof(t->MemberPassword)))
  8035. {
  8036. if (IsEmptyStr(t->MemberPasswordPlaintext) == false)
  8037. {
  8038. // For JSON-RPC
  8039. HashAdminPassword(t->MemberPassword, t->MemberPasswordPlaintext);
  8040. }
  8041. }
  8042. ALog(a, NULL, "LA_SET_FARM_SETTING");
  8043. IncrementServerConfigRevision(a->Server);
  8044. SiSetServerType(a->Server, t->ServerType, t->PublicIp, t->NumPort, t->Ports,
  8045. t->ControllerName, t->ControllerPort, t->MemberPassword, t->Weight, t->ControllerOnly);
  8046. return ERR_NO_ERROR;
  8047. }
  8048. // Set server password
  8049. UINT StSetServerPassword(ADMIN *a, RPC_SET_PASSWORD *t)
  8050. {
  8051. SERVER_ADMIN_ONLY;
  8052. if (IsZero(t->HashedPassword, sizeof(t->HashedPassword)))
  8053. {
  8054. // For JSON-RPC
  8055. HashAdminPassword(t->HashedPassword, t->PlainTextPassword);
  8056. }
  8057. Copy(a->Server->HashedPassword, t->HashedPassword, SHA1_SIZE);
  8058. ALog(a, NULL, "LA_SET_SERVER_PASSWORD");
  8059. IncrementServerConfigRevision(a->Server);
  8060. return ERR_NO_ERROR;
  8061. }
  8062. // Enable / Disable listener
  8063. UINT StEnableListener(ADMIN *a, RPC_LISTENER *t)
  8064. {
  8065. UINT ret = ERR_NO_ERROR;
  8066. SERVER_ADMIN_ONLY;
  8067. LockList(a->Server->ServerListenerList);
  8068. {
  8069. if (t->Enable)
  8070. {
  8071. if (SiEnableListener(a->Server, t->Port) == false)
  8072. {
  8073. ret = ERR_LISTENER_NOT_FOUND;
  8074. }
  8075. else
  8076. {
  8077. ALog(a, NULL, "LA_ENABLE_LISTENER", t->Port);
  8078. }
  8079. }
  8080. else
  8081. {
  8082. if (SiDisableListener(a->Server, t->Port) == false)
  8083. {
  8084. ret = ERR_LISTENER_NOT_FOUND;
  8085. }
  8086. else
  8087. {
  8088. ALog(a, NULL, "LA_DISABLE_LISTENER", t->Port);
  8089. }
  8090. }
  8091. }
  8092. UnlockList(a->Server->ServerListenerList);
  8093. IncrementServerConfigRevision(a->Server);
  8094. SleepThread(250);
  8095. return ret;
  8096. }
  8097. // Delete a listener
  8098. UINT StDeleteListener(ADMIN *a, RPC_LISTENER *t)
  8099. {
  8100. UINT ret = ERR_NO_ERROR;
  8101. SERVER_ADMIN_ONLY;
  8102. LockList(a->Server->ServerListenerList);
  8103. {
  8104. if (SiDeleteListener(a->Server, t->Port) == false)
  8105. {
  8106. ret = ERR_LISTENER_NOT_FOUND;
  8107. }
  8108. else
  8109. {
  8110. ALog(a, NULL, "LA_DELETE_LISTENER", t->Port);
  8111. IncrementServerConfigRevision(a->Server);
  8112. }
  8113. }
  8114. UnlockList(a->Server->ServerListenerList);
  8115. return ret;
  8116. }
  8117. // Enumerating listeners
  8118. UINT StEnumListener(ADMIN *a, RPC_LISTENER_LIST *t)
  8119. {
  8120. CEDAR *c = a->Server->Cedar;
  8121. UINT i;
  8122. FreeRpcListenerList(t);
  8123. Zero(t, sizeof(RPC_LISTENER_LIST));
  8124. LockList(a->Server->ServerListenerList);
  8125. {
  8126. t->NumPort = LIST_NUM(a->Server->ServerListenerList);
  8127. t->Ports = ZeroMalloc(sizeof(UINT) * t->NumPort);
  8128. t->Enables = ZeroMalloc(sizeof(bool) * t->NumPort);
  8129. t->Errors = ZeroMalloc(sizeof(bool) * t->NumPort);
  8130. for (i = 0;i < t->NumPort;i++)
  8131. {
  8132. SERVER_LISTENER *o = LIST_DATA(a->Server->ServerListenerList, i);
  8133. t->Ports[i] = o->Port;
  8134. t->Enables[i] = o->Enabled;
  8135. if (t->Enables[i])
  8136. {
  8137. if (o->Listener->Status == LISTENER_STATUS_TRYING)
  8138. {
  8139. t->Errors[i] = true;
  8140. }
  8141. }
  8142. }
  8143. }
  8144. UnlockList(a->Server->ServerListenerList);
  8145. return ERR_NO_ERROR;
  8146. }
  8147. // Create a listener
  8148. UINT StCreateListener(ADMIN *a, RPC_LISTENER *t)
  8149. {
  8150. UINT ret = ERR_NO_ERROR;
  8151. CEDAR *c = a->Server->Cedar;
  8152. if (t->Port == 0 || t->Port > 65535)
  8153. {
  8154. return ERR_INVALID_PARAMETER;
  8155. }
  8156. SERVER_ADMIN_ONLY;
  8157. LockList(a->Server->ServerListenerList);
  8158. {
  8159. if (SiAddListener(a->Server, t->Port, t->Enable) == false)
  8160. {
  8161. ret = ERR_LISTENER_ALREADY_EXISTS;
  8162. }
  8163. else
  8164. {
  8165. ALog(a, NULL, "LA_CREATE_LISTENER", t->Port);
  8166. IncrementServerConfigRevision(a->Server);
  8167. }
  8168. }
  8169. UnlockList(a->Server->ServerListenerList);
  8170. SleepThread(250);
  8171. return ret;
  8172. }
  8173. // Set UDP ports the server should listen on
  8174. UINT StSetPortsUDP(ADMIN *a, RPC_PORTS *t)
  8175. {
  8176. UINT i;
  8177. LIST *ports, *server_ports;
  8178. SERVER_ADMIN_ONLY;
  8179. ports = NewIntList(true);
  8180. for (i = 0; i < t->Num; ++i)
  8181. {
  8182. const UINT port = t->Ports[i];
  8183. if (port < 1 || port > 65535)
  8184. {
  8185. ReleaseIntList(ports);
  8186. return ERR_INVALID_PARAMETER;
  8187. }
  8188. AddIntDistinct(ports, port);
  8189. }
  8190. server_ports = a->Server->PortsUDP;
  8191. LockList(server_ports);
  8192. {
  8193. char str[MAX_SIZE];
  8194. for (i = 0; i < LIST_NUM(server_ports); ++i)
  8195. {
  8196. Free(LIST_DATA(server_ports, i));
  8197. }
  8198. DeleteAll(server_ports);
  8199. for (i = 0; i < LIST_NUM(ports); ++i)
  8200. {
  8201. const UINT port = *(UINT *)LIST_DATA(ports, i);
  8202. AddInt(server_ports, port);
  8203. }
  8204. ProtoSetUdpPorts(a->Server->Proto, server_ports);
  8205. IntListToStr(str, sizeof(str), server_ports, ", ");
  8206. ALog(a, NULL, "LA_SET_PORTS_UDP", str);
  8207. }
  8208. UnlockList(server_ports);
  8209. ReleaseIntList(ports);
  8210. IncrementServerConfigRevision(a->Server);
  8211. return ERR_NO_ERROR;
  8212. }
  8213. // List UDP ports the server is listening on
  8214. UINT StGetPortsUDP(ADMIN *a, RPC_PORTS *t)
  8215. {
  8216. LIST *ports = a->Server->PortsUDP;
  8217. FreeRpcPorts(t);
  8218. LockList(ports);
  8219. {
  8220. t->Num = LIST_NUM(ports);
  8221. t->Ports = t->Num > 0 ? Malloc(sizeof(UINT) * t->Num) : NULL;
  8222. if (t->Ports != NULL)
  8223. {
  8224. UINT i;
  8225. for (i = 0; i < t->Num; ++i)
  8226. {
  8227. const UINT port = *(UINT *)LIST_DATA(ports, i);
  8228. t->Ports[i] = port;
  8229. }
  8230. }
  8231. }
  8232. UnlockList(ports);
  8233. return ERR_NO_ERROR;
  8234. }
  8235. UINT StGetProtoOptions(ADMIN *a, RPC_PROTO_OPTIONS *t)
  8236. {
  8237. PROTO *proto = a->Server->Proto;
  8238. PROTO_CONTAINER *container, tmp;
  8239. UINT ret = ERR_NO_ERROR;
  8240. LIST *options;
  8241. SERVER_ADMIN_ONLY;
  8242. if (proto == NULL)
  8243. {
  8244. return ERR_NOT_SUPPORTED;
  8245. }
  8246. tmp.Name = t->Protocol;
  8247. container = Search(proto->Containers, &tmp);
  8248. if (container == NULL)
  8249. {
  8250. return ERR_INVALID_PARAMETER;
  8251. }
  8252. options = container->Options;
  8253. LockList(options);
  8254. {
  8255. UINT i;
  8256. t->Num = LIST_NUM(options);
  8257. t->Options = Malloc(sizeof(PROTO_OPTION) * t->Num);
  8258. for (i = 0; i < t->Num; ++i)
  8259. {
  8260. const PROTO_OPTION *option = LIST_DATA(options, i);
  8261. PROTO_OPTION *rpc_option = &t->Options[i];
  8262. switch (option->Type)
  8263. {
  8264. case PROTO_OPTION_BOOL:
  8265. rpc_option->Bool = option->Bool;
  8266. break;
  8267. case PROTO_OPTION_UINT32:
  8268. rpc_option->UInt32 = option->UInt32;
  8269. break;
  8270. case PROTO_OPTION_STRING:
  8271. rpc_option->String = CopyStr(option->String);
  8272. break;
  8273. default:
  8274. Debug("StGetProtoOptions(): unhandled option type %u!\n", option->Type);
  8275. ret = ERR_INTERNAL_ERROR;
  8276. }
  8277. if (ret == ERR_NO_ERROR)
  8278. {
  8279. rpc_option->Name = CopyStr(option->Name);
  8280. rpc_option->Type = option->Type;
  8281. }
  8282. else
  8283. {
  8284. break;
  8285. }
  8286. }
  8287. }
  8288. UnlockList(options);
  8289. return ret;
  8290. }
  8291. UINT StSetProtoOptions(ADMIN *a, RPC_PROTO_OPTIONS *t)
  8292. {
  8293. PROTO *proto = a->Server->Proto;
  8294. PROTO_CONTAINER *container, tmp;
  8295. UINT ret = ERR_NO_ERROR;
  8296. bool changed = false;
  8297. LIST *options;
  8298. SERVER_ADMIN_ONLY;
  8299. if (proto == NULL)
  8300. {
  8301. return ERR_NOT_SUPPORTED;
  8302. }
  8303. tmp.Name = t->Protocol;
  8304. container = Search(proto->Containers, &tmp);
  8305. if (container == NULL)
  8306. {
  8307. return ERR_INVALID_PARAMETER;
  8308. }
  8309. options = container->Options;
  8310. LockList(options);
  8311. {
  8312. UINT i;
  8313. for (i = 0; i < t->Num; ++i)
  8314. {
  8315. PROTO_OPTION *rpc_option = &t->Options[i];
  8316. PROTO_OPTION *option = Search(options, rpc_option);
  8317. if (option == NULL || rpc_option->Type != option->Type)
  8318. {
  8319. ret = ERR_INVALID_PARAMETER;
  8320. break;
  8321. }
  8322. switch (option->Type)
  8323. {
  8324. case PROTO_OPTION_BOOL:
  8325. option->Bool = rpc_option->Bool;
  8326. break;
  8327. case PROTO_OPTION_UINT32:
  8328. option->UInt32 = rpc_option->UInt32;
  8329. break;
  8330. case PROTO_OPTION_STRING:
  8331. Free(option->String);
  8332. option->String = CopyStr(rpc_option->String);
  8333. break;
  8334. default:
  8335. Debug("StSetProtoOptions(): unhandled option type %u!\n", option->Type);
  8336. ret = ERR_INTERNAL_ERROR;
  8337. }
  8338. if (ret == ERR_NO_ERROR)
  8339. {
  8340. changed = true;
  8341. }
  8342. else
  8343. {
  8344. break;
  8345. }
  8346. }
  8347. }
  8348. UnlockList(options);
  8349. if (changed)
  8350. {
  8351. ALog(a, NULL, "LA_SET_PROTO_OPTIONS", t->Protocol);
  8352. IncrementServerConfigRevision(a->Server);
  8353. }
  8354. return ret;
  8355. }
  8356. // Get server status
  8357. UINT StGetServerStatus(ADMIN *a, RPC_SERVER_STATUS *t)
  8358. {
  8359. CEDAR *c;
  8360. UINT i;
  8361. c = a->Server->Cedar;
  8362. Zero(t, sizeof(RPC_SERVER_STATUS));
  8363. Lock(c->TrafficLock);
  8364. {
  8365. Copy(&t->Traffic, c->Traffic, sizeof(TRAFFIC));
  8366. }
  8367. Unlock(c->TrafficLock);
  8368. GetMemInfo(&t->MemInfo);
  8369. t->ServerType = a->Server->ServerType;
  8370. t->NumTcpConnections = t->NumTcpConnectionsLocal = t->NumTcpConnectionsRemote = 0;
  8371. t->NumSessionsTotal = t->NumSessionsLocal = t->NumSessionsRemote = 0;
  8372. t->NumTcpConnectionsLocal = Count(c->CurrentTcpConnections);
  8373. if (a->Server->ServerType == SERVER_TYPE_FARM_CONTROLLER)
  8374. {
  8375. LockList(a->Server->FarmMemberList);
  8376. {
  8377. for (i = 0;i < LIST_NUM(a->Server->FarmMemberList);i++)
  8378. {
  8379. FARM_MEMBER *f = LIST_DATA(a->Server->FarmMemberList, i);
  8380. if (f->Me == false)
  8381. {
  8382. t->NumTcpConnectionsRemote += f->NumTcpConnections;
  8383. t->NumSessionsRemote += f->NumSessions;
  8384. AddTraffic(&t->Traffic, &f->Traffic);
  8385. }
  8386. }
  8387. }
  8388. UnlockList(a->Server->FarmMemberList);
  8389. }
  8390. t->NumMacTables = t->NumIpTables = t->NumUsers = t->NumGroups = 0;
  8391. // The number of hubs
  8392. LockList(c->HubList);
  8393. {
  8394. t->NumHubTotal = LIST_NUM(c->HubList);
  8395. t->NumHubStandalone = t->NumHubDynamic = t->NumHubStatic = 0;
  8396. for (i = 0;i < LIST_NUM(c->HubList);i++)
  8397. {
  8398. HUB *h = LIST_DATA(c->HubList, i);
  8399. Lock(h->lock);
  8400. {
  8401. switch (h->Type)
  8402. {
  8403. case HUB_TYPE_STANDALONE:
  8404. t->NumHubStandalone++;
  8405. break;
  8406. case HUB_TYPE_FARM_STATIC:
  8407. t->NumHubStatic++;
  8408. break;
  8409. case HUB_TYPE_FARM_DYNAMIC:
  8410. t->NumHubDynamic++;
  8411. break;
  8412. }
  8413. }
  8414. t->NumMacTables += HASH_LIST_NUM(h->MacHashTable);
  8415. t->NumIpTables += LIST_NUM(h->IpTable);
  8416. if (h->HubDb != NULL)
  8417. {
  8418. t->NumUsers += LIST_NUM(h->HubDb->UserList);
  8419. t->NumGroups += LIST_NUM(h->HubDb->GroupList);
  8420. }
  8421. Unlock(h->lock);
  8422. }
  8423. }
  8424. UnlockList(c->HubList);
  8425. // The number of sessions
  8426. t->NumSessionsLocal = Count(c->CurrentSessions);
  8427. t->NumSessionsTotal = t->NumSessionsLocal + t->NumSessionsRemote;
  8428. t->NumTcpConnections = t->NumTcpConnectionsLocal + t->NumTcpConnectionsRemote;
  8429. t->AssignedBridgeLicenses = Count(c->AssignedBridgeLicense);
  8430. t->AssignedClientLicenses = Count(c->AssignedClientLicense);
  8431. t->AssignedBridgeLicensesTotal = a->Server->CurrentAssignedBridgeLicense;
  8432. t->AssignedClientLicensesTotal = a->Server->CurrentAssignedClientLicense;
  8433. t->CurrentTick = Tick64();
  8434. t->CurrentTime = SystemTime64();
  8435. t->StartTime = a->Server->StartTime;
  8436. return ERR_NO_ERROR;
  8437. }
  8438. // Get server information
  8439. UINT StGetServerInfo(ADMIN *a, RPC_SERVER_INFO *t)
  8440. {
  8441. CEDAR *c;
  8442. OS_INFO *info;
  8443. SYSTEMTIME st;
  8444. // Validate arguments
  8445. if (a == NULL || t == NULL)
  8446. {
  8447. return ERR_INTERNAL_ERROR;
  8448. }
  8449. FreeRpcServerInfo(t);
  8450. Zero(t, sizeof(RPC_SERVER_INFO));
  8451. c = a->Server->Cedar;
  8452. GetServerProductName(a->Server, t->ServerProductName, sizeof(t->ServerProductName));
  8453. StrCpy(t->ServerVersionString, sizeof(t->ServerVersionString), c->VerString);
  8454. StrCpy(t->ServerBuildInfoString, sizeof(t->ServerBuildInfoString), c->BuildInfo);
  8455. t->ServerVerInt = c->Version;
  8456. t->ServerBuildInt = c->Build;
  8457. GetMachineName(t->ServerHostName, sizeof(t->ServerHostName));
  8458. t->ServerType = c->Server->ServerType;
  8459. Zero(&st, sizeof(st));
  8460. st.wYear = BUILD_DATE_Y;
  8461. st.wMonth = BUILD_DATE_M;
  8462. st.wDay = BUILD_DATE_D;
  8463. st.wHour = BUILD_DATE_HO;
  8464. st.wMinute = BUILD_DATE_MI;
  8465. st.wSecond = BUILD_DATE_SE;
  8466. t->ServerBuildDate = SystemToUINT64(&st);
  8467. StrCpy(t->ServerFamilyName, sizeof(t->ServerFamilyName), UPDATE_FAMILY_NAME);
  8468. info = GetOsInfo();
  8469. if (info != NULL)
  8470. {
  8471. CopyOsInfo(&t->OsInfo, info);
  8472. }
  8473. return ERR_NO_ERROR;
  8474. }
  8475. // Copy OS_INFO
  8476. void CopyOsInfo(OS_INFO *dst, OS_INFO *info)
  8477. {
  8478. // Validate arguments
  8479. if (info == NULL || dst == NULL)
  8480. {
  8481. return;
  8482. }
  8483. dst->OsType = info->OsType;
  8484. dst->OsServicePack = info->OsServicePack;
  8485. dst->OsSystemName = CopyStr(info->OsSystemName);
  8486. dst->OsProductName = CopyStr(info->OsProductName);
  8487. dst->OsVendorName = CopyStr(info->OsVendorName);
  8488. dst->OsVersion = CopyStr(info->OsVersion);
  8489. dst->KernelName = CopyStr(info->KernelName);
  8490. dst->KernelVersion = CopyStr(info->KernelVersion);
  8491. }
  8492. // OPENVPN_SSTP_CONFIG
  8493. void InOpenVpnSstpConfig(OPENVPN_SSTP_CONFIG *t, PACK *p)
  8494. {
  8495. // Validate arguments
  8496. if (t == NULL || p == NULL)
  8497. {
  8498. return;
  8499. }
  8500. Zero(t, sizeof(OPENVPN_SSTP_CONFIG));
  8501. t->EnableOpenVPN = PackGetBool(p, "EnableOpenVPN");
  8502. t->EnableSSTP = PackGetBool(p, "EnableSSTP");
  8503. }
  8504. void OutOpenVpnSstpConfig(PACK *p, OPENVPN_SSTP_CONFIG *t)
  8505. {
  8506. // Validate arguments
  8507. if (t == NULL || p == NULL)
  8508. {
  8509. return;
  8510. }
  8511. PackAddBool(p, "EnableOpenVPN", t->EnableOpenVPN);
  8512. PackAddBool(p, "EnableSSTP", t->EnableSSTP);
  8513. }
  8514. // DDNS_CLIENT_STATUS
  8515. void InDDnsClientStatus(DDNS_CLIENT_STATUS *t, PACK *p)
  8516. {
  8517. // Validate arguments
  8518. if (t == NULL || p == NULL)
  8519. {
  8520. return;
  8521. }
  8522. Zero(t, sizeof(DDNS_CLIENT_STATUS));
  8523. t->Err_IPv4 = PackGetInt(p, "Err_IPv4");
  8524. t->Err_IPv6 = PackGetInt(p, "Err_IPv6");
  8525. PackGetStr(p, "CurrentHostName", t->CurrentHostName, sizeof(t->CurrentHostName));
  8526. PackGetStr(p, "CurrentFqdn", t->CurrentFqdn, sizeof(t->CurrentFqdn));
  8527. PackGetStr(p, "DnsSuffix", t->DnsSuffix, sizeof(t->DnsSuffix));
  8528. PackGetStr(p, "CurrentIPv4", t->CurrentIPv4, sizeof(t->CurrentIPv4));
  8529. PackGetStr(p, "CurrentIPv6", t->CurrentIPv6, sizeof(t->CurrentIPv6));
  8530. PackGetUniStr(p, "ErrStr_IPv4", t->ErrStr_IPv4, sizeof(t->ErrStr_IPv4));
  8531. PackGetUniStr(p, "ErrStr_IPv6", t->ErrStr_IPv6, sizeof(t->ErrStr_IPv6));
  8532. }
  8533. void OutDDnsClientStatus(PACK *p, DDNS_CLIENT_STATUS *t)
  8534. {
  8535. // Validate arguments
  8536. if (t == NULL || p == NULL)
  8537. {
  8538. return;
  8539. }
  8540. PackAddInt(p, "Err_IPv4", t->Err_IPv4);
  8541. PackAddInt(p, "Err_IPv6", t->Err_IPv6);
  8542. PackAddStr(p, "CurrentHostName", t->CurrentHostName);
  8543. PackAddStr(p, "CurrentFqdn", t->CurrentFqdn);
  8544. PackAddStr(p, "DnsSuffix", t->DnsSuffix);
  8545. PackAddStr(p, "CurrentIPv4", t->CurrentIPv4);
  8546. PackAddStr(p, "CurrentIPv6", t->CurrentIPv6);
  8547. PackAddUniStr(p, "ErrStr_IPv4", t->ErrStr_IPv4);
  8548. PackAddUniStr(p, "ErrStr_IPv6", t->ErrStr_IPv6);
  8549. }
  8550. // INTERNET_SETTING
  8551. void InRpcInternetSetting(INTERNET_SETTING *t, PACK *p)
  8552. {
  8553. // Validate arguments
  8554. if (t == NULL || p == NULL)
  8555. {
  8556. return;
  8557. }
  8558. t->ProxyType = PackGetInt(p, "ProxyType");
  8559. PackGetStr(p, "ProxyHostName", t->ProxyHostName, sizeof(t->ProxyHostName));
  8560. t->ProxyPort = PackGetInt(p, "ProxyPort");
  8561. PackGetStr(p, "ProxyUsername", t->ProxyUsername, sizeof(t->ProxyUsername));
  8562. PackGetStr(p, "ProxyPassword", t->ProxyPassword, sizeof(t->ProxyPassword));
  8563. PackGetStr(p, "CustomHttpHeader", t->CustomHttpHeader, sizeof(t->CustomHttpHeader));
  8564. }
  8565. void OutRpcInternetSetting(PACK *p, INTERNET_SETTING *t)
  8566. {
  8567. // Validate arguments
  8568. if (t == NULL || p == NULL)
  8569. {
  8570. return;
  8571. }
  8572. PackAddInt(p, "ProxyType", t->ProxyType);
  8573. PackAddStr(p, "ProxyHostName", t->ProxyHostName);
  8574. PackAddInt(p, "ProxyPort", t->ProxyPort);
  8575. PackAddStr(p, "ProxyUsername", t->ProxyUsername);
  8576. PackAddStr(p, "ProxyPassword", t->ProxyPassword);
  8577. PackAddStr(p, "CustomHttpHeader", t->CustomHttpHeader);
  8578. }
  8579. // RPC_AZURE_STATUS
  8580. void InRpcAzureStatus(RPC_AZURE_STATUS *t, PACK *p)
  8581. {
  8582. // Validate arguments
  8583. if (t == NULL || p == NULL)
  8584. {
  8585. return;
  8586. }
  8587. Zero(t, sizeof(RPC_AZURE_STATUS));
  8588. t->IsConnected = PackGetBool(p, "IsConnected");
  8589. t->IsEnabled = PackGetBool(p, "IsEnabled");
  8590. }
  8591. void OutRpcAzureStatus(PACK *p, RPC_AZURE_STATUS *t)
  8592. {
  8593. // Validate arguments
  8594. if (t == NULL || p == NULL)
  8595. {
  8596. return;
  8597. }
  8598. PackAddBool(p, "IsConnected", t->IsConnected);
  8599. PackAddBool(p, "IsEnabled", t->IsEnabled);
  8600. }
  8601. // RPC_SPECIAL_LISTENER
  8602. void InRpcSpecialListener(RPC_SPECIAL_LISTENER *t, PACK *p)
  8603. {
  8604. // Validate arguments
  8605. if (t == NULL || p == NULL)
  8606. {
  8607. return;
  8608. }
  8609. Zero(t, sizeof(RPC_SPECIAL_LISTENER));
  8610. t->VpnOverIcmpListener = PackGetBool(p, "VpnOverIcmpListener");
  8611. t->VpnOverDnsListener = PackGetBool(p, "VpnOverDnsListener");
  8612. }
  8613. void OutRpcSpecialListener(PACK *p, RPC_SPECIAL_LISTENER *t)
  8614. {
  8615. // Validate arguments
  8616. if (t == NULL || p == NULL)
  8617. {
  8618. return;
  8619. }
  8620. PackAddBool(p, "VpnOverIcmpListener", t->VpnOverIcmpListener);
  8621. PackAddBool(p, "VpnOverDnsListener", t->VpnOverDnsListener);
  8622. }
  8623. // ETHERIP_ID
  8624. void InEtherIpId(ETHERIP_ID *t, PACK *p)
  8625. {
  8626. // Validate arguments
  8627. if (t == NULL || p == NULL)
  8628. {
  8629. return;
  8630. }
  8631. Zero(t, sizeof(ETHERIP_ID));
  8632. PackGetStr(p, "Id", t->Id, sizeof(t->Id));
  8633. PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
  8634. PackGetStr(p, "UserName", t->UserName, sizeof(t->UserName));
  8635. PackGetStr(p, "Password", t->Password, sizeof(t->Password));
  8636. }
  8637. void OutEtherIpId(PACK *p, ETHERIP_ID *t)
  8638. {
  8639. // Validate arguments
  8640. if (t == NULL || p == NULL)
  8641. {
  8642. return;
  8643. }
  8644. PackAddStr(p, "Id", t->Id);
  8645. PackAddStr(p, "HubName", t->HubName);
  8646. PackAddStr(p, "UserName", t->UserName);
  8647. PackAddStr(p, "Password", t->Password);
  8648. }
  8649. // RPC_ENUM_ETHERIP_ID
  8650. void InRpcEnumEtherIpId(RPC_ENUM_ETHERIP_ID *t, PACK *p)
  8651. {
  8652. UINT i;
  8653. // Validate arguments
  8654. if (t == NULL || p == NULL)
  8655. {
  8656. return;
  8657. }
  8658. Zero(t, sizeof(RPC_ENUM_ETHERIP_ID));
  8659. t->NumItem = PackGetInt(p, "NumItem");
  8660. t->IdList = ZeroMalloc(sizeof(ETHERIP_ID) * t->NumItem);
  8661. for (i = 0;i < t->NumItem;i++)
  8662. {
  8663. ETHERIP_ID *e = &t->IdList[i];
  8664. PackGetStrEx(p, "Id", e->Id, sizeof(e->Id), i);
  8665. PackGetStrEx(p, "HubName", e->HubName, sizeof(e->HubName), i);
  8666. PackGetStrEx(p, "UserName", e->UserName, sizeof(e->UserName), i);
  8667. PackGetStrEx(p, "Password", e->Password, sizeof(e->Password), i);
  8668. }
  8669. }
  8670. void OutRpcEnumEtherIpId(PACK *p, RPC_ENUM_ETHERIP_ID *t)
  8671. {
  8672. UINT i;
  8673. // Validate arguments
  8674. if (p == NULL || t == NULL)
  8675. {
  8676. return;
  8677. }
  8678. PackAddInt(p, "NumItem", t->NumItem);
  8679. PackSetCurrentJsonGroupName(p, "Settings");
  8680. for (i = 0;i < t->NumItem;i++)
  8681. {
  8682. ETHERIP_ID *e = &t->IdList[i];
  8683. PackAddStrEx(p, "Id", e->Id, i, t->NumItem);
  8684. PackAddStrEx(p, "HubName", e->HubName, i, t->NumItem);
  8685. PackAddStrEx(p, "UserName", e->UserName, i, t->NumItem);
  8686. PackAddStrEx(p, "Password", e->Password, i, t->NumItem);
  8687. }
  8688. PackSetCurrentJsonGroupName(p, NULL);
  8689. }
  8690. void FreeRpcEnumEtherIpId(RPC_ENUM_ETHERIP_ID *t)
  8691. {
  8692. // Validate arguments
  8693. if (t == NULL)
  8694. {
  8695. return;
  8696. }
  8697. Free(t->IdList);
  8698. }
  8699. // IPSEC_SERVICES
  8700. void InIPsecServices(IPSEC_SERVICES *t, PACK *p)
  8701. {
  8702. // Validate arguments
  8703. if (t == NULL || p == NULL)
  8704. {
  8705. return;
  8706. }
  8707. Zero(t, sizeof(IPSEC_SERVICES));
  8708. t->L2TP_Raw = PackGetBool(p, "L2TP_Raw");
  8709. t->L2TP_IPsec = PackGetBool(p, "L2TP_IPsec");
  8710. t->EtherIP_IPsec = PackGetBool(p, "EtherIP_IPsec");
  8711. PackGetStr(p, "IPsec_Secret", t->IPsec_Secret, sizeof(t->IPsec_Secret));
  8712. PackGetStr(p, "L2TP_DefaultHub", t->L2TP_DefaultHub, sizeof(t->L2TP_DefaultHub));
  8713. }
  8714. void OutIPsecServices(PACK *p, IPSEC_SERVICES *t)
  8715. {
  8716. // Validate arguments
  8717. if (t == NULL || p == NULL)
  8718. {
  8719. return;
  8720. }
  8721. PackAddBool(p, "L2TP_Raw", t->L2TP_Raw);
  8722. PackAddBool(p, "L2TP_IPsec", t->L2TP_IPsec);
  8723. PackAddBool(p, "EtherIP_IPsec", t->EtherIP_IPsec);
  8724. PackAddStr(p, "IPsec_Secret", t->IPsec_Secret);
  8725. PackAddStr(p, "L2TP_DefaultHub", t->L2TP_DefaultHub);
  8726. }
  8727. // RPC_WINVER
  8728. void InRpcWinVer(RPC_WINVER *t, PACK *p)
  8729. {
  8730. // Validate arguments
  8731. if (t == NULL || p == NULL)
  8732. {
  8733. return;
  8734. }
  8735. Zero(t, sizeof(RPC_WINVER));
  8736. t->IsWindows = PackGetBool(p, "V_IsWindows");
  8737. t->IsNT = PackGetBool(p, "V_IsNT");
  8738. t->IsServer = PackGetBool(p, "V_IsServer");
  8739. t->IsBeta = PackGetBool(p, "V_IsBeta");
  8740. t->VerMajor = PackGetInt(p, "V_VerMajor");
  8741. t->VerMinor = PackGetInt(p, "V_VerMinor");
  8742. t->Build = PackGetInt(p, "V_Build");
  8743. t->ServicePack = PackGetInt(p, "V_ServicePack");
  8744. PackGetStr(p, "V_Title", t->Title, sizeof(t->Title));
  8745. }
  8746. void OutRpcWinVer(PACK *p, RPC_WINVER *t)
  8747. {
  8748. // Validate arguments
  8749. if (t == NULL || p == NULL)
  8750. {
  8751. return;
  8752. }
  8753. PackAddBool(p, "V_IsWindows", t->IsWindows);
  8754. PackAddBool(p, "V_IsNT", t->IsNT);
  8755. PackAddBool(p, "V_IsServer", t->IsServer);
  8756. PackAddBool(p, "V_IsBeta", t->IsBeta);
  8757. PackAddInt(p, "V_VerMajor", t->VerMajor);
  8758. PackAddInt(p, "V_VerMinor", t->VerMinor);
  8759. PackAddInt(p, "V_Build", t->Build);
  8760. PackAddInt(p, "V_ServicePack", t->ServicePack);
  8761. PackAddStr(p, "V_Title", t->Title);
  8762. }
  8763. // RPC_MSG
  8764. void InRpcMsg(RPC_MSG *t, PACK *p)
  8765. {
  8766. UINT size;
  8767. char *utf8;
  8768. // Validate arguments
  8769. if (t == NULL || p == NULL)
  8770. {
  8771. return;
  8772. }
  8773. Zero(t, sizeof(RPC_MSG));
  8774. PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
  8775. size = PackGetDataSize(p, "Msg");
  8776. utf8 = ZeroMalloc(size + 8);
  8777. PackGetData(p, "Msg", utf8);
  8778. t->Msg = CopyUtfToUni(utf8);
  8779. Free(utf8);
  8780. }
  8781. void OutRpcMsg(PACK *p, RPC_MSG *t)
  8782. {
  8783. UINT size;
  8784. char *utf8;
  8785. // Validate arguments
  8786. if (t == NULL || p == NULL)
  8787. {
  8788. return;
  8789. }
  8790. PackAddStr(p, "HubName", t->HubName);
  8791. utf8 = CopyUniToUtf(t->Msg);
  8792. size = StrLen(utf8);
  8793. PackAddData(p, "Msg", utf8, size);
  8794. Free(utf8);
  8795. }
  8796. void FreeRpcMsg(RPC_MSG *t)
  8797. {
  8798. // Validate arguments
  8799. if (t == NULL)
  8800. {
  8801. return;
  8802. }
  8803. Free(t->Msg);
  8804. }
  8805. // RPC_ENUM_ETH_VLAN
  8806. void InRpcEnumEthVLan(RPC_ENUM_ETH_VLAN *t, PACK *p)
  8807. {
  8808. UINT i;
  8809. // Validate arguments
  8810. if (t == NULL || p == NULL)
  8811. {
  8812. return;
  8813. }
  8814. Zero(t, sizeof(RPC_ENUM_ETH_VLAN));
  8815. t->NumItem = PackGetIndexCount(p, "DeviceName");
  8816. t->Items = ZeroMalloc(sizeof(RPC_ENUM_ETH_VLAN_ITEM) * t->NumItem);
  8817. for (i = 0;i < t->NumItem;i++)
  8818. {
  8819. RPC_ENUM_ETH_VLAN_ITEM *e = &t->Items[i];
  8820. PackGetStrEx(p, "DeviceName", e->DeviceName, sizeof(e->DeviceName), i);
  8821. PackGetStrEx(p, "Guid", e->Guid, sizeof(e->Guid), i);
  8822. PackGetStrEx(p, "DeviceInstanceId", e->DeviceInstanceId, sizeof(e->DeviceInstanceId), i);
  8823. PackGetStrEx(p, "DriverName", e->DriverName, sizeof(e->DriverName), i);
  8824. PackGetStrEx(p, "DriverType", e->DriverType, sizeof(e->DriverType), i);
  8825. e->Support = PackGetBoolEx(p, "Support", i);
  8826. e->Enabled = PackGetBoolEx(p, "Enabled", i);
  8827. }
  8828. }
  8829. void OutRpcEnumEthVLan(PACK *p, RPC_ENUM_ETH_VLAN *t)
  8830. {
  8831. UINT i;
  8832. // Validate arguments
  8833. if (t == NULL || p == NULL)
  8834. {
  8835. return;
  8836. }
  8837. PackSetCurrentJsonGroupName(p, "Devices");
  8838. for (i = 0;i < t->NumItem;i++)
  8839. {
  8840. RPC_ENUM_ETH_VLAN_ITEM *e = &t->Items[i];
  8841. PackAddStrEx(p, "DeviceName", e->DeviceName, i, t->NumItem);
  8842. PackAddStrEx(p, "Guid", e->Guid, i, t->NumItem);
  8843. PackAddStrEx(p, "DeviceInstanceId", e->DeviceInstanceId, i, t->NumItem);
  8844. PackAddStrEx(p, "DriverName", e->DriverName, i, t->NumItem);
  8845. PackAddStrEx(p, "DriverType", e->DriverType, i, t->NumItem);
  8846. PackAddBoolEx(p, "Support", e->Support, i, t->NumItem);
  8847. PackAddBoolEx(p, "Enabled", e->Enabled, i, t->NumItem);
  8848. }
  8849. PackSetCurrentJsonGroupName(p, NULL);
  8850. }
  8851. void FreeRpcEnumEthVLan(RPC_ENUM_ETH_VLAN *t)
  8852. {
  8853. // Validate arguments
  8854. if (t == NULL)
  8855. {
  8856. return;
  8857. }
  8858. Free(t->Items);
  8859. }
  8860. // RPC_ENUM_LOG_FILE
  8861. void InRpcEnumLogFile(RPC_ENUM_LOG_FILE *t, PACK *p)
  8862. {
  8863. UINT i;
  8864. // Validate arguments
  8865. if (t == NULL || p == NULL)
  8866. {
  8867. return;
  8868. }
  8869. Zero(t, sizeof(RPC_ENUM_LOG_FILE));
  8870. t->NumItem = PackGetInt(p, "NumItem");
  8871. t->Items = ZeroMalloc(sizeof(RPC_ENUM_LOG_FILE_ITEM) * t->NumItem);
  8872. for (i = 0;i < t->NumItem;i++)
  8873. {
  8874. RPC_ENUM_LOG_FILE_ITEM *e = &t->Items[i];
  8875. PackGetStrEx(p, "FilePath", e->FilePath, sizeof(e->FilePath), i);
  8876. PackGetStrEx(p, "ServerName", e->ServerName, sizeof(e->ServerName), i);
  8877. e->FileSize = PackGetIntEx(p, "FileSize", i);
  8878. e->UpdatedTime = PackGetInt64Ex(p, "UpdatedTime", i);
  8879. }
  8880. }
  8881. void OutRpcEnumLogFile(PACK *p, RPC_ENUM_LOG_FILE *t)
  8882. {
  8883. UINT i;
  8884. // Validate arguments
  8885. if (t == NULL || p == NULL)
  8886. {
  8887. return;
  8888. }
  8889. PackAddInt(p, "NumItem", t->NumItem);
  8890. PackSetCurrentJsonGroupName(p, "LogFiles");
  8891. for (i = 0;i < t->NumItem;i++)
  8892. {
  8893. RPC_ENUM_LOG_FILE_ITEM *e = &t->Items[i];
  8894. PackAddStrEx(p, "FilePath", e->FilePath, i, t->NumItem);
  8895. PackAddStrEx(p, "ServerName", e->ServerName, i, t->NumItem);
  8896. PackAddIntEx(p, "FileSize", e->FileSize, i, t->NumItem);
  8897. PackAddTime64Ex(p, "UpdatedTime", e->UpdatedTime, i, t->NumItem);
  8898. }
  8899. PackSetCurrentJsonGroupName(p, NULL);
  8900. }
  8901. void FreeRpcEnumLogFile(RPC_ENUM_LOG_FILE *t)
  8902. {
  8903. // Validate arguments
  8904. if (t == NULL)
  8905. {
  8906. return;
  8907. }
  8908. Free(t->Items);
  8909. }
  8910. void AdjoinRpcEnumLogFile(RPC_ENUM_LOG_FILE *t, RPC_ENUM_LOG_FILE *src)
  8911. {
  8912. LIST *o;
  8913. UINT i;
  8914. // Validate arguments
  8915. if (t == NULL || src == NULL)
  8916. {
  8917. return;
  8918. }
  8919. o = NewListFast(CmpLogFile);
  8920. for (i = 0;i < t->NumItem;i++)
  8921. {
  8922. RPC_ENUM_LOG_FILE_ITEM *e = &t->Items[i];
  8923. LOG_FILE *f = ZeroMalloc(sizeof(LOG_FILE));
  8924. f->FileSize = e->FileSize;
  8925. StrCpy(f->Path, sizeof(f->Path), e->FilePath);
  8926. StrCpy(f->ServerName, sizeof(f->ServerName), e->ServerName);
  8927. f->UpdatedTime = e->UpdatedTime;
  8928. Add(o, f);
  8929. }
  8930. for (i = 0;i < src->NumItem;i++)
  8931. {
  8932. RPC_ENUM_LOG_FILE_ITEM *e = &src->Items[i];
  8933. LOG_FILE *f = ZeroMalloc(sizeof(LOG_FILE));
  8934. f->FileSize = e->FileSize;
  8935. StrCpy(f->Path, sizeof(f->Path), e->FilePath);
  8936. StrCpy(f->ServerName, sizeof(f->ServerName), e->ServerName);
  8937. f->UpdatedTime = e->UpdatedTime;
  8938. Add(o, f);
  8939. }
  8940. FreeRpcEnumLogFile(t);
  8941. Sort(o);
  8942. Zero(t, sizeof(RPC_ENUM_LOG_FILE));
  8943. t->NumItem = LIST_NUM(o);
  8944. t->Items = ZeroMalloc(sizeof(RPC_ENUM_LOG_FILE_ITEM) * t->NumItem);
  8945. for (i = 0;i < t->NumItem;i++)
  8946. {
  8947. LOG_FILE *f = LIST_DATA(o, i);
  8948. RPC_ENUM_LOG_FILE_ITEM *e = &t->Items[i];
  8949. StrCpy(e->FilePath, sizeof(e->FilePath), f->Path);
  8950. StrCpy(e->ServerName, sizeof(e->ServerName), f->ServerName);
  8951. e->FileSize = f->FileSize;
  8952. e->UpdatedTime = f->UpdatedTime;
  8953. }
  8954. FreeEnumLogFile(o);
  8955. }
  8956. // RPC_READ_LOG_FILE
  8957. void InRpcReadLogFile(RPC_READ_LOG_FILE *t, PACK *p)
  8958. {
  8959. // Validate arguments
  8960. if (t == NULL || p == NULL)
  8961. {
  8962. return;
  8963. }
  8964. Zero(t, sizeof(RPC_READ_LOG_FILE));
  8965. PackGetStr(p, "FilePath", t->FilePath, sizeof(t->FilePath));
  8966. PackGetStr(p, "ServerName", t->ServerName, sizeof(t->ServerName));
  8967. t->Offset = PackGetInt(p, "Offset");
  8968. t->Buffer = PackGetBuf(p, "Buffer");
  8969. }
  8970. void OutRpcReadLogFile(PACK *p, RPC_READ_LOG_FILE *t)
  8971. {
  8972. // Validate arguments
  8973. if (p == NULL || t == NULL)
  8974. {
  8975. return;
  8976. }
  8977. PackAddStr(p, "FilePath", t->FilePath);
  8978. PackAddStr(p, "ServerName", t->ServerName);
  8979. PackAddInt(p, "Offset", t->Offset);
  8980. if (t->Buffer != NULL)
  8981. {
  8982. PackAddBuf(p, "Buffer", t->Buffer);
  8983. }
  8984. }
  8985. void FreeRpcReadLogFile(RPC_READ_LOG_FILE *t)
  8986. {
  8987. // Validate arguments
  8988. if (t == NULL)
  8989. {
  8990. return;
  8991. }
  8992. if (t->Buffer != NULL)
  8993. {
  8994. FreeBuf(t->Buffer);
  8995. }
  8996. }
  8997. // RPC_AC_LIST
  8998. void InRpcAcList(RPC_AC_LIST *t, PACK *p)
  8999. {
  9000. UINT i;
  9001. LIST *o;
  9002. UINT num;
  9003. // Validate arguments
  9004. if (t == NULL || p == NULL)
  9005. {
  9006. return;
  9007. }
  9008. Zero(t, sizeof(RPC_AC_LIST));
  9009. o = NewAcList();
  9010. PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
  9011. num = PackGetIndexCount(p, "IpAddress");
  9012. for (i = 0;i < num;i++)
  9013. {
  9014. AC *ac = ZeroMalloc(sizeof(AC));
  9015. ac->Id = PackGetIntEx(p, "Id", i);
  9016. ac->Deny = PackGetBoolEx(p, "Deny", i);
  9017. PackGetIpEx(p, "IpAddress", &ac->IpAddress, i);
  9018. ac->Masked = PackGetBoolEx(p, "Masked", i);
  9019. if (ac->Masked)
  9020. {
  9021. PackGetIpEx(p, "SubnetMask", &ac->SubnetMask, i);
  9022. }
  9023. ac->Priority = PackGetIntEx(p, "Priority", i);
  9024. AddAc(o, ac);
  9025. Free(ac);
  9026. }
  9027. t->o = o;
  9028. }
  9029. void OutRpcAcList(PACK *p, RPC_AC_LIST *t)
  9030. {
  9031. UINT i, num;
  9032. LIST *o;
  9033. // Validate arguments
  9034. if (t == NULL || p == NULL)
  9035. {
  9036. return;
  9037. }
  9038. o = t->o;
  9039. num = LIST_NUM(o);
  9040. PackAddInt(p, "NumItem", num);
  9041. PackAddStr(p, "HubName", t->HubName);
  9042. PackSetCurrentJsonGroupName(p, "ACList");
  9043. for (i = 0;i < num;i++)
  9044. {
  9045. AC *ac = LIST_DATA(o, i);
  9046. PackAddIntEx(p, "Id", ac->Id, i, num);
  9047. PackAddBoolEx(p, "Deny", ac->Deny, i, num);
  9048. PackAddIpEx(p, "IpAddress", &ac->IpAddress, i, num);
  9049. PackAddBoolEx(p, "Masked", ac->Masked, i, num);
  9050. PackAddIpEx(p, "SubnetMask", &ac->SubnetMask, i, num);
  9051. PackAddIntEx(p, "Priority", ac->Priority, i, num);
  9052. }
  9053. PackSetCurrentJsonGroupName(p, NULL);
  9054. }
  9055. void FreeRpcAcList(RPC_AC_LIST *t)
  9056. {
  9057. // Validate arguments
  9058. if (t == NULL)
  9059. {
  9060. return;
  9061. }
  9062. FreeAcList(t->o);
  9063. }
  9064. // RPC_INT
  9065. void InRpcInt(RPC_INT *t, PACK *p)
  9066. {
  9067. // Validate arguments
  9068. if (t == NULL || p == NULL)
  9069. {
  9070. return;
  9071. }
  9072. Zero(t, sizeof(RPC_INT));
  9073. t->IntValue = PackGetInt(p, "IntValue");
  9074. }
  9075. void OutRpcInt(PACK *p, RPC_INT *t)
  9076. {
  9077. // Validate arguments
  9078. if (t == NULL || p == NULL)
  9079. {
  9080. return;
  9081. }
  9082. PackAddInt(p, "IntValue", t->IntValue);
  9083. }
  9084. // RPC_ENUM_CRL
  9085. void InRpcEnumCrl(RPC_ENUM_CRL *t, PACK *p)
  9086. {
  9087. UINT i;
  9088. // Validate arguments
  9089. if (t == NULL || p == NULL)
  9090. {
  9091. return;
  9092. }
  9093. Zero(t, sizeof(RPC_ENUM_CRL));
  9094. PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
  9095. t->NumItem = PackGetInt(p, "NumItem");
  9096. t->Items = ZeroMalloc(sizeof(RPC_ENUM_CRL_ITEM) * t->NumItem);
  9097. for (i = 0;i < t->NumItem;i++)
  9098. {
  9099. RPC_ENUM_CRL_ITEM *e = &t->Items[i];
  9100. e->Key = PackGetIntEx(p, "Key", i);
  9101. PackGetUniStrEx(p, "CrlInfo", e->CrlInfo, sizeof(e->CrlInfo), i);
  9102. }
  9103. }
  9104. void OutRpcEnumCrl(PACK *p, RPC_ENUM_CRL *t)
  9105. {
  9106. UINT i;
  9107. // Validate arguments
  9108. if (t == NULL || p == NULL)
  9109. {
  9110. return;
  9111. }
  9112. PackAddStr(p, "HubName", t->HubName);
  9113. PackAddInt(p, "NumItem", t->NumItem);
  9114. PackSetCurrentJsonGroupName(p, "CRLList");
  9115. for (i = 0;i < t->NumItem;i++)
  9116. {
  9117. RPC_ENUM_CRL_ITEM *e = &t->Items[i];
  9118. PackAddIntEx(p, "Key", e->Key, i, t->NumItem);
  9119. PackAddUniStrEx(p, "CrlInfo", e->CrlInfo, i, t->NumItem);
  9120. }
  9121. PackSetCurrentJsonGroupName(p, NULL);
  9122. }
  9123. void FreeRpcEnumCrl(RPC_ENUM_CRL *t)
  9124. {
  9125. // Validate arguments
  9126. if (t == NULL)
  9127. {
  9128. return;
  9129. }
  9130. Free(t->Items);
  9131. }
  9132. // RPC_CRL
  9133. void InRpcCrl(RPC_CRL *t, PACK *p)
  9134. {
  9135. BUF *b;
  9136. NAME *n;
  9137. wchar_t tmp[MAX_SIZE];
  9138. // Validate arguments
  9139. if (t == NULL || p == NULL)
  9140. {
  9141. return;
  9142. }
  9143. Zero(t, sizeof(RPC_CRL));
  9144. PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
  9145. t->Key = PackGetInt(p, "Key");
  9146. b = PackGetBuf(p, "Serial");
  9147. t->Crl = ZeroMalloc(sizeof(CRL));
  9148. if (b != NULL)
  9149. {
  9150. t->Crl->Serial = NewXSerial(b->Buf, b->Size);
  9151. FreeBuf(b);
  9152. }
  9153. t->Crl->Name = ZeroMalloc(sizeof(NAME));
  9154. n = t->Crl->Name;
  9155. if (PackGetUniStr(p, "CommonName", tmp, sizeof(tmp)))
  9156. {
  9157. n->CommonName = CopyUniStr(tmp);
  9158. }
  9159. if (PackGetUniStr(p, "Organization", tmp, sizeof(tmp)))
  9160. {
  9161. n->Organization = CopyUniStr(tmp);
  9162. }
  9163. if (PackGetUniStr(p, "Unit", tmp, sizeof(tmp)))
  9164. {
  9165. n->Unit = CopyUniStr(tmp);
  9166. }
  9167. if (PackGetUniStr(p, "Country", tmp, sizeof(tmp)))
  9168. {
  9169. n->Country = CopyUniStr(tmp);
  9170. }
  9171. if (PackGetUniStr(p, "State", tmp, sizeof(tmp)))
  9172. {
  9173. n->State = CopyUniStr(tmp);
  9174. }
  9175. if (PackGetUniStr(p, "Local", tmp, sizeof(tmp)))
  9176. {
  9177. n->Local = CopyUniStr(tmp);
  9178. }
  9179. if (PackGetDataSize(p, "DigestMD5") == MD5_SIZE)
  9180. {
  9181. PackGetData(p, "DigestMD5", t->Crl->DigestMD5);
  9182. }
  9183. if (PackGetDataSize(p, "DigestSHA1") == SHA1_SIZE)
  9184. {
  9185. PackGetData(p, "DigestSHA1", t->Crl->DigestSHA1);
  9186. }
  9187. }
  9188. void OutRpcCrl(PACK *p, RPC_CRL *t)
  9189. {
  9190. NAME *n;
  9191. // Validate arguments
  9192. if (p == NULL || t == NULL)
  9193. {
  9194. return;
  9195. }
  9196. PackAddStr(p, "HubName", t->HubName);
  9197. PackAddInt(p, "Key", t->Key);
  9198. if (t->Crl == NULL)
  9199. {
  9200. return;
  9201. }
  9202. if (t->Crl->Serial != NULL)
  9203. {
  9204. PackAddData(p, "Serial", t->Crl->Serial->data, t->Crl->Serial->size);
  9205. }
  9206. n = t->Crl->Name;
  9207. if (n->CommonName != NULL)
  9208. {
  9209. PackAddUniStr(p, "CommonName", n->CommonName);
  9210. }
  9211. if (n->Organization != NULL)
  9212. {
  9213. PackAddUniStr(p, "Organization", n->Organization);
  9214. }
  9215. if (n->Unit != NULL)
  9216. {
  9217. PackAddUniStr(p, "Unit", n->Unit);
  9218. }
  9219. if (n->Country != NULL)
  9220. {
  9221. PackAddUniStr(p, "Country", n->Country);
  9222. }
  9223. if (n->State != NULL)
  9224. {
  9225. PackAddUniStr(p, "State", n->State);
  9226. }
  9227. if (n->Local != NULL)
  9228. {
  9229. PackAddUniStr(p, "Local", n->Local);
  9230. }
  9231. if (IsZero(t->Crl->DigestMD5, MD5_SIZE) == false)
  9232. {
  9233. PackAddData(p, "DigestMD5", t->Crl->DigestMD5, MD5_SIZE);
  9234. }
  9235. if (IsZero(t->Crl->DigestSHA1, SHA1_SIZE) == false)
  9236. {
  9237. PackAddData(p, "DigestSHA1", t->Crl->DigestSHA1, SHA1_SIZE);
  9238. }
  9239. }
  9240. void FreeRpcCrl(RPC_CRL *t)
  9241. {
  9242. // Validate arguments
  9243. if (t == NULL)
  9244. {
  9245. return;
  9246. }
  9247. FreeCrl(t->Crl);
  9248. }
  9249. // RPC_ENUM_L3TABLE
  9250. void InRpcEnumL3Table(RPC_ENUM_L3TABLE *t, PACK *p)
  9251. {
  9252. UINT i;
  9253. // Validate arguments
  9254. if (t == NULL || p == NULL)
  9255. {
  9256. return;
  9257. }
  9258. Zero(t, sizeof(RPC_ENUM_L3TABLE));
  9259. t->NumItem = PackGetInt(p, "NumItem");
  9260. PackGetStr(p, "Name", t->Name, sizeof(t->Name));
  9261. t->Items = ZeroMalloc(sizeof(RPC_L3TABLE) * t->NumItem);
  9262. for (i = 0;i < t->NumItem;i++)
  9263. {
  9264. RPC_L3TABLE *e = &t->Items[i];
  9265. e->NetworkAddress = PackGetIp32Ex(p, "NetworkAddress", i);
  9266. e->SubnetMask = PackGetIp32Ex(p, "SubnetMask", i);
  9267. e->GatewayAddress = PackGetIp32Ex(p, "GatewayAddress", i);
  9268. e->Metric = PackGetIntEx(p, "Metric", i);
  9269. }
  9270. }
  9271. void OutRpcEnumL3Table(PACK *p, RPC_ENUM_L3TABLE *t)
  9272. {
  9273. UINT i;
  9274. // Validate arguments
  9275. if (p == NULL || t == NULL)
  9276. {
  9277. return;
  9278. }
  9279. PackAddInt(p, "NumItem", t->NumItem);
  9280. PackAddStr(p, "Name", t->Name);
  9281. PackSetCurrentJsonGroupName(p, "L3Table");
  9282. for (i = 0;i < t->NumItem;i++)
  9283. {
  9284. RPC_L3TABLE *e = &t->Items[i];
  9285. PackAddIp32Ex(p, "NetworkAddress", e->NetworkAddress, i, t->NumItem);
  9286. PackAddIp32Ex(p, "SubnetMask", e->SubnetMask, i, t->NumItem);
  9287. PackAddIp32Ex(p, "GatewayAddress", e->GatewayAddress, i, t->NumItem);
  9288. PackAddIntEx(p, "Metric", e->Metric, i, t->NumItem);
  9289. }
  9290. PackSetCurrentJsonGroupName(p, NULL);
  9291. }
  9292. void FreeRpcEnumL3Table(RPC_ENUM_L3TABLE *t)
  9293. {
  9294. Free(t->Items);
  9295. }
  9296. // RPC_L3TABLE
  9297. void InRpcL3Table(RPC_L3TABLE *t, PACK *p)
  9298. {
  9299. // Validate arguments
  9300. if (t == NULL || p == NULL)
  9301. {
  9302. return;
  9303. }
  9304. Zero(t, sizeof(RPC_L3TABLE));
  9305. PackGetStr(p, "Name", t->Name, sizeof(t->Name));
  9306. t->NetworkAddress = PackGetIp32(p, "NetworkAddress");
  9307. t->SubnetMask = PackGetIp32(p, "SubnetMask");
  9308. t->GatewayAddress = PackGetIp32(p, "GatewayAddress");
  9309. t->Metric = PackGetInt(p, "Metric");
  9310. }
  9311. void OutRpcL3Table(PACK *p, RPC_L3TABLE *t)
  9312. {
  9313. // Validate arguments
  9314. if (p == NULL || t == NULL)
  9315. {
  9316. return;
  9317. }
  9318. PackAddStr(p, "Name", t->Name);
  9319. PackAddIp32(p, "NetworkAddress", t->NetworkAddress);
  9320. PackAddIp32(p, "SubnetMask", t->SubnetMask);
  9321. PackAddIp32(p, "GatewayAddress", t->GatewayAddress);
  9322. PackAddInt(p, "Metric", t->Metric);
  9323. }
  9324. // RPC_ENUM_L3IF
  9325. void InRpcEnumL3If(RPC_ENUM_L3IF *t, PACK *p)
  9326. {
  9327. UINT i;
  9328. // Validate arguments
  9329. if (t == NULL || p == NULL)
  9330. {
  9331. return;
  9332. }
  9333. Zero(t, sizeof(RPC_ENUM_L3IF));
  9334. t->NumItem = PackGetInt(p, "NumItem");
  9335. PackGetStr(p, "Name", t->Name, sizeof(t->Name));
  9336. t->Items = ZeroMalloc(sizeof(RPC_L3IF) * t->NumItem);
  9337. for (i = 0;i < t->NumItem;i++)
  9338. {
  9339. RPC_L3IF *f = &t->Items[i];
  9340. PackGetStrEx(p, "HubName", f->HubName, sizeof(f->HubName), i);
  9341. f->IpAddress = PackGetIp32Ex(p, "IpAddress", i);
  9342. f->SubnetMask = PackGetIp32Ex(p, "SubnetMask", i);
  9343. }
  9344. }
  9345. void OutRpcEnumL3If(PACK *p, RPC_ENUM_L3IF *t)
  9346. {
  9347. UINT i;
  9348. // Validate arguments
  9349. if (p == NULL || t == NULL)
  9350. {
  9351. return;
  9352. }
  9353. PackAddInt(p, "NumItem", t->NumItem);
  9354. PackAddStr(p, "Name", t->Name);
  9355. PackSetCurrentJsonGroupName(p, "L3IFList");
  9356. for (i = 0;i < t->NumItem;i++)
  9357. {
  9358. RPC_L3IF *f = &t->Items[i];
  9359. PackAddStrEx(p, "HubName", f->HubName, i, t->NumItem);
  9360. PackAddIp32Ex(p, "IpAddress", f->IpAddress, i, t->NumItem);
  9361. PackAddIp32Ex(p, "SubnetMask", f->SubnetMask, i, t->NumItem);
  9362. }
  9363. PackSetCurrentJsonGroupName(p, NULL);
  9364. }
  9365. void FreeRpcEnumL3If(RPC_ENUM_L3IF *t)
  9366. {
  9367. // Validate arguments
  9368. if (t == NULL)
  9369. {
  9370. return;
  9371. }
  9372. Free(t->Items);
  9373. }
  9374. // RPC_L3IF
  9375. void InRpcL3If(RPC_L3IF *t, PACK *p)
  9376. {
  9377. // Validate arguments
  9378. if (t == NULL || p == NULL)
  9379. {
  9380. return;
  9381. }
  9382. Zero(t, sizeof(RPC_L3IF));
  9383. PackGetStr(p, "Name", t->Name, sizeof(t->Name));
  9384. PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
  9385. t->IpAddress = PackGetIp32(p, "IpAddress");
  9386. t->SubnetMask = PackGetIp32(p, "SubnetMask");
  9387. }
  9388. void OutRpcL3If(PACK *p, RPC_L3IF *t)
  9389. {
  9390. // Validate arguments
  9391. if (p == NULL || t == NULL)
  9392. {
  9393. return;
  9394. }
  9395. PackAddStr(p, "Name", t->Name);
  9396. PackAddStr(p, "HubName", t->HubName);
  9397. PackAddIp32(p, "IpAddress", t->IpAddress);
  9398. PackAddIp32(p, "SubnetMask", t->SubnetMask);
  9399. }
  9400. // RPC_L3SW
  9401. void InRpcL3Sw(RPC_L3SW *t, PACK *p)
  9402. {
  9403. // Validate arguments
  9404. if (t == NULL || p == NULL)
  9405. {
  9406. return;
  9407. }
  9408. Zero(t, sizeof(RPC_L3SW));
  9409. PackGetStr(p, "Name", t->Name, sizeof(t->Name));
  9410. }
  9411. void OutRpcL3Sw(PACK *p, RPC_L3SW *t)
  9412. {
  9413. // Validate arguments
  9414. if (p == NULL || t == NULL)
  9415. {
  9416. return;
  9417. }
  9418. PackAddStr(p, "Name", t->Name);
  9419. }
  9420. // RPC_ENUM_L3SW
  9421. void InRpcEnumL3Sw(RPC_ENUM_L3SW *t, PACK *p)
  9422. {
  9423. UINT i;
  9424. // Validate arguments
  9425. if (t == NULL || p == NULL)
  9426. {
  9427. return;
  9428. }
  9429. Zero(t, sizeof(RPC_ENUM_L3SW));
  9430. t->NumItem = PackGetInt(p, "NumItem");
  9431. t->Items = ZeroMalloc(sizeof(RPC_ENUM_L3SW_ITEM) * t->NumItem);
  9432. for (i = 0;i < t->NumItem;i++)
  9433. {
  9434. RPC_ENUM_L3SW_ITEM *s = &t->Items[i];
  9435. PackGetStrEx(p, "Name", s->Name, sizeof(s->Name), i);
  9436. s->NumInterfaces = PackGetIntEx(p, "NumInterfaces", i);
  9437. s->NumTables = PackGetIntEx(p, "NumTables", i);
  9438. s->Active = PackGetBoolEx(p, "Active", i);
  9439. s->Online = PackGetBoolEx(p, "Online", i);
  9440. }
  9441. }
  9442. void OutRpcEnumL3Sw(PACK *p, RPC_ENUM_L3SW *t)
  9443. {
  9444. UINT i;
  9445. // Validate arguments
  9446. if (p == NULL || t == NULL)
  9447. {
  9448. return;
  9449. }
  9450. PackAddInt(p, "NumItem", t->NumItem);
  9451. PackSetCurrentJsonGroupName(p, "L3SWList");
  9452. for (i = 0;i < t->NumItem;i++)
  9453. {
  9454. RPC_ENUM_L3SW_ITEM *s = &t->Items[i];
  9455. PackAddStrEx(p, "Name", s->Name, i, t->NumItem);
  9456. PackAddIntEx(p, "NumInterfaces", s->NumInterfaces, i, t->NumItem);
  9457. PackAddIntEx(p, "NumTables", s->NumTables, i, t->NumItem);
  9458. PackAddBoolEx(p, "Active", s->Active, i, t->NumItem);
  9459. PackAddBoolEx(p, "Online", s->Online, i, t->NumItem);
  9460. }
  9461. PackSetCurrentJsonGroupName(p, NULL);
  9462. }
  9463. void FreeRpcEnumL3Sw(RPC_ENUM_L3SW *t)
  9464. {
  9465. // Validate arguments
  9466. if (t == NULL)
  9467. {
  9468. return;
  9469. }
  9470. Free(t->Items);
  9471. }
  9472. // RPC_ENUM_ETH
  9473. void InRpcEnumEth(RPC_ENUM_ETH *t, PACK *p)
  9474. {
  9475. UINT i;
  9476. // Validate arguments
  9477. if (t == NULL || p == NULL)
  9478. {
  9479. return;
  9480. }
  9481. Zero(t, sizeof(RPC_ENUM_ETH));
  9482. t->NumItem = PackGetInt(p, "NumItem");
  9483. t->Items = ZeroMalloc(sizeof(RPC_ENUM_ETH_ITEM) * t->NumItem);
  9484. for (i = 0;i < t->NumItem;i++)
  9485. {
  9486. RPC_ENUM_ETH_ITEM *e = &t->Items[i];
  9487. PackGetStrEx(p, "DeviceName", e->DeviceName, sizeof(e->DeviceName), i);
  9488. PackGetUniStrEx(p, "NetworkConnectionName", e->NetworkConnectionName, sizeof(e->NetworkConnectionName), i);
  9489. }
  9490. }
  9491. void OutRpcEnumEth(PACK *p, RPC_ENUM_ETH *t)
  9492. {
  9493. UINT i;
  9494. // Validate arguments
  9495. if (p == NULL || t == NULL)
  9496. {
  9497. return;
  9498. }
  9499. PackAddInt(p, "NumItem", t->NumItem);
  9500. PackSetCurrentJsonGroupName(p, "EthList");
  9501. for (i = 0;i < t->NumItem;i++)
  9502. {
  9503. RPC_ENUM_ETH_ITEM *e = &t->Items[i];
  9504. PackAddStrEx(p, "DeviceName", e->DeviceName, i, t->NumItem);
  9505. PackAddUniStrEx(p, "NetworkConnectionName", e->NetworkConnectionName, i, t->NumItem);
  9506. }
  9507. PackSetCurrentJsonGroupName(p, NULL);
  9508. }
  9509. void FreeRpcEnumEth(RPC_ENUM_ETH *t)
  9510. {
  9511. // Validate arguments
  9512. if (t == NULL)
  9513. {
  9514. return;
  9515. }
  9516. Free(t->Items);
  9517. }
  9518. // RPC_LOCALBRIDGE
  9519. void InRpcLocalBridge(RPC_LOCALBRIDGE *t, PACK *p)
  9520. {
  9521. // Validate arguments
  9522. if (t == NULL || p == NULL)
  9523. {
  9524. return;
  9525. }
  9526. Zero(t, sizeof(RPC_LOCALBRIDGE));
  9527. PackGetStr(p, "DeviceName", t->DeviceName, sizeof(t->DeviceName));
  9528. PackGetStr(p, "HubNameLB", t->HubName, sizeof(t->HubName));
  9529. t->TapMode = PackGetBool(p, "TapMode");
  9530. }
  9531. void OutRpcLocalBridge(PACK *p, RPC_LOCALBRIDGE *t)
  9532. {
  9533. // Validate arguments
  9534. if (t == NULL || p == NULL)
  9535. {
  9536. return;
  9537. }
  9538. PackAddStr(p, "DeviceName", t->DeviceName);
  9539. PackAddStr(p, "HubNameLB", t->HubName);
  9540. PackAddBool(p, "TapMode", t->TapMode);
  9541. }
  9542. // RPC_ENUM_LOCALBRIDGE
  9543. void InRpcEnumLocalBridge(RPC_ENUM_LOCALBRIDGE *t, PACK *p)
  9544. {
  9545. UINT i;
  9546. // Validate arguments
  9547. if (t == NULL || p == NULL)
  9548. {
  9549. return;
  9550. }
  9551. Zero(t, sizeof(RPC_ENUM_LOCALBRIDGE));
  9552. t->NumItem = PackGetInt(p, "NumItem");
  9553. t->Items = ZeroMalloc(sizeof(RPC_LOCALBRIDGE) * t->NumItem);
  9554. for (i = 0;i < t->NumItem;i++)
  9555. {
  9556. RPC_LOCALBRIDGE *e = &t->Items[i];
  9557. PackGetStrEx(p, "DeviceName", e->DeviceName, sizeof(e->DeviceName), i);
  9558. PackGetStrEx(p, "HubNameLB", e->HubName, sizeof(e->HubName), i);
  9559. e->Online = PackGetBoolEx(p, "Online", i);
  9560. e->Active = PackGetBoolEx(p, "Active", i);
  9561. e->TapMode = PackGetBoolEx(p, "TapMode", i);
  9562. }
  9563. }
  9564. void OutRpcEnumLocalBridge(PACK *p, RPC_ENUM_LOCALBRIDGE *t)
  9565. {
  9566. UINT i;
  9567. // Validate arguments
  9568. if (t == NULL || p == NULL)
  9569. {
  9570. return;
  9571. }
  9572. PackAddInt(p, "NumItem", t->NumItem);
  9573. PackSetCurrentJsonGroupName(p, "LocalBridgeList");
  9574. for (i = 0;i < t->NumItem;i++)
  9575. {
  9576. RPC_LOCALBRIDGE *e = &t->Items[i];
  9577. PackAddStrEx(p, "DeviceName", e->DeviceName, i, t->NumItem);
  9578. PackAddStrEx(p, "HubNameLB", e->HubName, i, t->NumItem);
  9579. PackAddBoolEx(p, "Online", e->Online, i, t->NumItem);
  9580. PackAddBoolEx(p, "Active", e->Active, i, t->NumItem);
  9581. PackAddBoolEx(p, "TapMode", e->TapMode, i, t->NumItem);
  9582. }
  9583. PackSetCurrentJsonGroupName(p, NULL);
  9584. }
  9585. void FreeRpcEnumLocalBridge(RPC_ENUM_LOCALBRIDGE *t)
  9586. {
  9587. // Validate arguments
  9588. if (t == NULL)
  9589. {
  9590. return;
  9591. }
  9592. Free(t->Items);
  9593. }
  9594. // MEMINFO
  9595. void InRpcMemInfo(MEMINFO *t, PACK *p)
  9596. {
  9597. // Validate arguments
  9598. if (t == NULL || p == NULL)
  9599. {
  9600. return;
  9601. }
  9602. Zero(t, sizeof(MEMINFO));
  9603. t->TotalMemory = PackGetInt64(p, "TotalMemory");
  9604. t->UsedMemory = PackGetInt64(p, "UsedMemory");
  9605. t->FreeMemory = PackGetInt64(p, "FreeMemory");
  9606. t->TotalPhys = PackGetInt64(p, "TotalPhys");
  9607. t->UsedPhys = PackGetInt64(p, "UsedPhys");
  9608. t->FreePhys = PackGetInt64(p, "FreePhys");
  9609. }
  9610. void OutRpcMemInfo(PACK *p, MEMINFO *t)
  9611. {
  9612. // Validate arguments
  9613. if (t == NULL || p == NULL)
  9614. {
  9615. return;
  9616. }
  9617. PackAddInt64(p, "TotalMemory", t->TotalMemory);
  9618. PackAddInt64(p, "UsedMemory", t->UsedMemory);
  9619. PackAddInt64(p, "FreeMemory", t->FreeMemory);
  9620. PackAddInt64(p, "TotalPhys", t->TotalPhys);
  9621. PackAddInt64(p, "UsedPhys", t->UsedPhys);
  9622. PackAddInt64(p, "FreePhys", t->FreePhys);
  9623. }
  9624. // OS_INFO
  9625. void InRpcOsInfo(OS_INFO *t, PACK *p)
  9626. {
  9627. char tmp[MAX_SIZE];
  9628. // Validate arguments
  9629. if (t == NULL || p == NULL)
  9630. {
  9631. return;
  9632. }
  9633. Zero(t, sizeof(OS_INFO));
  9634. t->OsType = PackGetInt(p, "OsType");
  9635. t->OsServicePack = PackGetInt(p, "OsServicePack");
  9636. if (PackGetStr(p, "OsSystemName", tmp, sizeof(tmp)))
  9637. {
  9638. t->OsSystemName = CopyStr(tmp);
  9639. }
  9640. if (PackGetStr(p, "OsProductName", tmp, sizeof(tmp)))
  9641. {
  9642. t->OsProductName = CopyStr(tmp);
  9643. }
  9644. if (PackGetStr(p, "OsVendorName", tmp, sizeof(tmp)))
  9645. {
  9646. t->OsVendorName = CopyStr(tmp);
  9647. }
  9648. if (PackGetStr(p, "OsVersion", tmp, sizeof(tmp)))
  9649. {
  9650. t->OsVersion = CopyStr(tmp);
  9651. }
  9652. if (PackGetStr(p, "KernelName", tmp, sizeof(tmp)))
  9653. {
  9654. t->KernelName = CopyStr(tmp);
  9655. }
  9656. if (PackGetStr(p, "KernelVersion", tmp, sizeof(tmp)))
  9657. {
  9658. t->KernelVersion = CopyStr(tmp);
  9659. }
  9660. }
  9661. void OutRpcOsInfo(PACK *p, OS_INFO *t)
  9662. {
  9663. // Validate arguments
  9664. if (t == NULL || p == NULL)
  9665. {
  9666. return;
  9667. }
  9668. PackAddInt(p, "OsType", t->OsType);
  9669. PackAddInt(p, "OsServicePack", t->OsServicePack);
  9670. PackAddStr(p, "OsSystemName", t->OsSystemName);
  9671. PackAddStr(p, "OsProductName", t->OsProductName);
  9672. PackAddStr(p, "OsVendorName", t->OsVendorName);
  9673. PackAddStr(p, "OsVersion", t->OsVersion);
  9674. PackAddStr(p, "KernelName", t->KernelName);
  9675. PackAddStr(p, "KernelVersion", t->KernelVersion);
  9676. }
  9677. void FreeRpcOsInfo(OS_INFO *t)
  9678. {
  9679. // Validate arguments
  9680. if (t == NULL)
  9681. {
  9682. return;
  9683. }
  9684. Free(t->OsSystemName);
  9685. Free(t->OsProductName);
  9686. Free(t->OsVendorName);
  9687. Free(t->OsVersion);
  9688. Free(t->KernelName);
  9689. Free(t->KernelVersion);
  9690. }
  9691. // Read a local log file
  9692. void SiReadLocalLogFile(SERVER *s, char *filepath, UINT offset, RPC_READ_LOG_FILE *t)
  9693. {
  9694. char exe_dir[MAX_PATH], full_path[MAX_PATH];
  9695. IO *o;
  9696. // Validate arguments
  9697. if (s == NULL || t == NULL || filepath == NULL)
  9698. {
  9699. return;
  9700. }
  9701. Zero(t, sizeof(RPC_READ_LOG_FILE));
  9702. GetLogDir(exe_dir, sizeof(exe_dir));
  9703. Format(full_path, sizeof(full_path), "%s/%s", exe_dir, filepath);
  9704. // Read file
  9705. o = FileOpenEx(full_path, false, false);
  9706. if (o != NULL)
  9707. {
  9708. UINT filesize = FileSize(o);
  9709. if (offset < filesize)
  9710. {
  9711. UINT readsize = MIN(filesize - offset, FTP_BLOCK_SIZE);
  9712. void *buf = ZeroMalloc(readsize);
  9713. FileSeek(o, FILE_BEGIN, offset);
  9714. FileRead(o, buf, readsize);
  9715. t->Buffer = NewBuf();
  9716. WriteBuf(t->Buffer, buf, readsize);
  9717. Free(buf);
  9718. }
  9719. FileClose(o);
  9720. }
  9721. }
  9722. // Enumerate local log files
  9723. void SiEnumLocalLogFileList(SERVER *s, char *hubname, RPC_ENUM_LOG_FILE *t)
  9724. {
  9725. LIST *o;
  9726. UINT i;
  9727. // Validate arguments
  9728. if (s == NULL || t == NULL)
  9729. {
  9730. return;
  9731. }
  9732. Zero(t, sizeof(RPC_ENUM_LOG_FILE));
  9733. o = EnumLogFile(hubname);
  9734. t->NumItem = LIST_NUM(o);
  9735. t->Items = ZeroMalloc(sizeof(RPC_ENUM_LOG_FILE_ITEM) * t->NumItem);
  9736. for (i = 0;i < LIST_NUM(o);i++)
  9737. {
  9738. LOG_FILE *f = LIST_DATA(o, i);
  9739. RPC_ENUM_LOG_FILE_ITEM *e = &t->Items[i];
  9740. StrCpy(e->FilePath, sizeof(e->FilePath), f->Path);
  9741. StrCpy(e->ServerName, sizeof(e->ServerName), f->ServerName);
  9742. e->FileSize = f->FileSize;
  9743. e->UpdatedTime = f->UpdatedTime;
  9744. }
  9745. FreeEnumLogFile(o);
  9746. }
  9747. // Enumerate local sessions
  9748. void SiEnumLocalSession(SERVER *s, char *hubname, RPC_ENUM_SESSION *t)
  9749. {
  9750. HUB *h;
  9751. UINT64 now = Tick64();
  9752. UINT64 dormant_interval = 0;
  9753. // Validate arguments
  9754. if (s == NULL || hubname == NULL || t == NULL)
  9755. {
  9756. return;
  9757. }
  9758. LockHubList(s->Cedar);
  9759. h = GetHub(s->Cedar, hubname);
  9760. UnlockHubList(s->Cedar);
  9761. if (h == NULL)
  9762. {
  9763. t->NumSession = 0;
  9764. t->Sessions = ZeroMalloc(0);
  9765. return;
  9766. }
  9767. if (h->Option != NULL)
  9768. {
  9769. dormant_interval = h->Option->DetectDormantSessionInterval * (UINT64)1000;
  9770. }
  9771. LockList(h->SessionList);
  9772. {
  9773. UINT i;
  9774. t->NumSession = LIST_NUM(h->SessionList);
  9775. t->Sessions = ZeroMalloc(sizeof(RPC_ENUM_SESSION_ITEM) * t->NumSession);
  9776. for (i = 0;i < t->NumSession;i++)
  9777. {
  9778. SESSION *s = LIST_DATA(h->SessionList, i);
  9779. RPC_ENUM_SESSION_ITEM *e = &t->Sessions[i];
  9780. Lock(s->lock);
  9781. {
  9782. StrCpy(e->Name, sizeof(e->Name), s->Name);
  9783. StrCpy(e->Username, sizeof(e->Username), s->Username);
  9784. e->Ip = IPToUINT(&s->Connection->ClientIp);
  9785. CopyIP(&e->ClientIP, &s->Connection->ClientIp);
  9786. StrCpy(e->Hostname, sizeof(e->Hostname), s->Connection->ClientHostname);
  9787. e->MaxNumTcp = s->MaxConnection;
  9788. e->CreatedTime = Tick64ToTime64(s->CreatedTime);
  9789. e->LastCommTime = Tick64ToTime64(s->LastCommTime);
  9790. e->LinkMode = s->LinkModeServer;
  9791. e->SecureNATMode = s->SecureNATMode;
  9792. e->BridgeMode = s->BridgeMode;
  9793. e->Layer3Mode = s->L3SwitchMode;
  9794. e->VLanId = s->VLanId;
  9795. LockList(s->Connection->Tcp->TcpSockList);
  9796. {
  9797. e->CurrentNumTcp = s->Connection->Tcp->TcpSockList->num_item;
  9798. }
  9799. UnlockList(s->Connection->Tcp->TcpSockList);
  9800. Lock(s->TrafficLock);
  9801. {
  9802. e->PacketSize = GetTrafficPacketSize(s->Traffic);
  9803. e->PacketNum = GetTrafficPacketNum(s->Traffic);
  9804. }
  9805. Unlock(s->TrafficLock);
  9806. e->Client_BridgeMode = s->IsBridgeMode;
  9807. e->Client_MonitorMode = s->IsMonitorMode;
  9808. Copy(e->UniqueId, s->NodeInfo.UniqueId, 16);
  9809. if (s->NormalClient)
  9810. {
  9811. e->IsDormantEnabled = (dormant_interval == 0 ? false : true);
  9812. if (e->IsDormantEnabled)
  9813. {
  9814. if (s->LastCommTimeForDormant == 0)
  9815. {
  9816. e->LastCommDormant = (UINT64)0x7FFFFFFF;
  9817. }
  9818. else
  9819. {
  9820. e->LastCommDormant = now - s->LastCommTimeForDormant;
  9821. }
  9822. if (s->LastCommTimeForDormant == 0)
  9823. {
  9824. e->IsDormant = true;
  9825. }
  9826. else
  9827. {
  9828. if ((s->LastCommTimeForDormant + dormant_interval) < now)
  9829. {
  9830. e->IsDormant = true;
  9831. }
  9832. }
  9833. }
  9834. }
  9835. }
  9836. Unlock(s->lock);
  9837. GetMachineName(e->RemoteHostname, sizeof(e->RemoteHostname));
  9838. }
  9839. }
  9840. UnlockList(h->SessionList);
  9841. ReleaseHub(h);
  9842. }
  9843. // RPC_ENUM_LICENSE_KEY
  9844. void InRpcEnumLicenseKey(RPC_ENUM_LICENSE_KEY *t, PACK *p)
  9845. {
  9846. UINT i;
  9847. // Validate arguments
  9848. if (t == NULL || p == NULL)
  9849. {
  9850. return;
  9851. }
  9852. Zero(t, sizeof(RPC_ENUM_LICENSE_KEY));
  9853. t->NumItem = PackGetInt(p, "NumItem");
  9854. t->Items = ZeroMalloc(sizeof(RPC_ENUM_LICENSE_KEY_ITEM) * t->NumItem);
  9855. for (i = 0;i < t->NumItem;i++)
  9856. {
  9857. RPC_ENUM_LICENSE_KEY_ITEM *e = &t->Items[i];
  9858. e->Id = PackGetIntEx(p, "Id", i);
  9859. PackGetStrEx(p, "LicenseKey", e->LicenseKey, sizeof(e->LicenseKey), i);
  9860. PackGetStrEx(p, "LicenseId", e->LicenseId, sizeof(e->LicenseId), i);
  9861. PackGetStrEx(p, "LicenseName", e->LicenseName, sizeof(e->LicenseName), i);
  9862. e->Expires = PackGetInt64Ex(p, "Expires", i);
  9863. e->Status = PackGetIntEx(p, "Status", i);
  9864. e->ProductId = PackGetIntEx(p, "ProductId", i);
  9865. e->SystemId = PackGetInt64Ex(p, "SystemId", i);
  9866. e->SerialId = PackGetIntEx(p, "SerialId", i);
  9867. }
  9868. }
  9869. void OutRpcEnumLicenseKey(PACK *p, RPC_ENUM_LICENSE_KEY *t)
  9870. {
  9871. UINT i;
  9872. // Validate arguments
  9873. if (t == NULL || p == NULL)
  9874. {
  9875. return;
  9876. }
  9877. PackAddInt(p, "NumItem", t->NumItem);
  9878. PackSetCurrentJsonGroupName(p, "LicenseKeyList");
  9879. for (i = 0;i < t->NumItem;i++)
  9880. {
  9881. RPC_ENUM_LICENSE_KEY_ITEM *e = &t->Items[i];
  9882. PackAddIntEx(p, "Id", e->Id, i, t->NumItem);
  9883. PackAddStrEx(p, "LicenseKey", e->LicenseKey, i, t->NumItem);
  9884. PackAddStrEx(p, "LicenseId", e->LicenseId, i, t->NumItem);
  9885. PackAddStrEx(p, "LicenseName", e->LicenseName, i, t->NumItem);
  9886. PackAddTime64Ex(p, "Expires", e->Expires, i, t->NumItem);
  9887. PackAddIntEx(p, "Status", e->Status, i, t->NumItem);
  9888. PackAddIntEx(p, "ProductId", e->ProductId, i, t->NumItem);
  9889. PackAddInt64Ex(p, "SystemId", e->SystemId, i, t->NumItem);
  9890. PackAddIntEx(p, "SerialId", e->SerialId, i, t->NumItem);
  9891. }
  9892. PackSetCurrentJsonGroupName(p, NULL);
  9893. }
  9894. void FreeRpcEnumLicenseKey(RPC_ENUM_LICENSE_KEY *t)
  9895. {
  9896. // Validate arguments
  9897. if (t == NULL)
  9898. {
  9899. return;
  9900. }
  9901. Free(t->Items);
  9902. }
  9903. // RPC_LICENSE_STATUS
  9904. void InRpcLicenseStatus(RPC_LICENSE_STATUS *t, PACK *p)
  9905. {
  9906. // Validate arguments
  9907. if (t == NULL || p == NULL)
  9908. {
  9909. return;
  9910. }
  9911. Zero(t, sizeof(RPC_LICENSE_STATUS));
  9912. t->EditionId = PackGetInt(p, "EditionId");
  9913. PackGetStr(p, "EditionStr", t->EditionStr, sizeof(t->EditionStr) );
  9914. t->SystemId = PackGetInt64(p, "SystemId");
  9915. t->SystemExpires = PackGetInt64(p, "SystemExpires");
  9916. t->NumClientConnectLicense = PackGetInt(p, "NumClientConnectLicense");
  9917. t->NumBridgeConnectLicense = PackGetInt(p, "NumBridgeConnectLicense");
  9918. // v3.0
  9919. t->NeedSubscription = PackGetBool(p, "NeedSubscription");
  9920. t->AllowEnterpriseFunction = PackGetBool(p, "AllowEnterpriseFunction");
  9921. t->SubscriptionExpires = PackGetInt64(p, "SubscriptionExpires");
  9922. t->IsSubscriptionExpired = PackGetBool(p, "IsSubscriptionExpired");
  9923. t->NumUserCreationLicense = PackGetInt(p, "NumUserCreationLicense");
  9924. t->ReleaseDate = PackGetInt64(p, "ReleaseDate");
  9925. }
  9926. void OutRpcLicenseStatus(PACK *p, RPC_LICENSE_STATUS *t)
  9927. {
  9928. // Validate arguments
  9929. if (t == NULL || p == NULL)
  9930. {
  9931. return;
  9932. }
  9933. PackAddInt(p, "EditionId", t->EditionId);
  9934. PackAddStr(p, "EditionStr", t->EditionStr);
  9935. PackAddInt64(p, "SystemId", t->SystemId);
  9936. PackAddTime64(p, "SystemExpires", t->SystemExpires);
  9937. PackAddInt(p, "NumClientConnectLicense", t->NumClientConnectLicense);
  9938. PackAddInt(p, "NumBridgeConnectLicense", t->NumBridgeConnectLicense);
  9939. // v3.0
  9940. PackAddBool(p, "NeedSubscription", t->NeedSubscription);
  9941. PackAddBool(p, "AllowEnterpriseFunction", t->AllowEnterpriseFunction);
  9942. PackAddTime64(p, "SubscriptionExpires", t->SubscriptionExpires);
  9943. PackAddBool(p, "IsSubscriptionExpired", t->IsSubscriptionExpired);
  9944. PackAddInt(p, "NumUserCreationLicense", t->NumUserCreationLicense);
  9945. PackAddTime64(p, "ReleaseDate", t->ReleaseDate);
  9946. }
  9947. // RPC_ADMIN_OPTION
  9948. void InRpcAdminOption(RPC_ADMIN_OPTION *t, PACK *p)
  9949. {
  9950. UINT i;
  9951. // Validate arguments
  9952. if (t == NULL || p == NULL)
  9953. {
  9954. return;
  9955. }
  9956. Zero(t, sizeof(RPC_ADMIN_OPTION));
  9957. t->NumItem = PackGetIndexCount(p, "Name");
  9958. t->Items = ZeroMalloc(sizeof(ADMIN_OPTION) * t->NumItem);
  9959. PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
  9960. for (i = 0;i < t->NumItem;i++)
  9961. {
  9962. ADMIN_OPTION *o = &t->Items[i];
  9963. PackGetStrEx(p, "Name", o->Name, sizeof(o->Name), i);
  9964. o->Value = PackGetIntEx(p, "Value", i);
  9965. PackGetUniStrEx(p, "Descrption", o->Descrption, sizeof(o->Descrption), i);
  9966. }
  9967. }
  9968. void OutRpcAdminOption(PACK *p, RPC_ADMIN_OPTION *t)
  9969. {
  9970. UINT i;
  9971. // Validate arguments
  9972. if (t == NULL || p == NULL)
  9973. {
  9974. return;
  9975. }
  9976. PackAddInt(p, "NumItem", t->NumItem);
  9977. PackAddStr(p, "HubName", t->HubName);
  9978. PackSetCurrentJsonGroupName(p, "AdminOptionList");
  9979. for (i = 0;i < t->NumItem;i++)
  9980. {
  9981. ADMIN_OPTION *o = &t->Items[i];
  9982. PackAddStrEx(p, "Name", o->Name, i, t->NumItem);
  9983. PackAddIntEx(p, "Value", o->Value, i, t->NumItem);
  9984. PackAddUniStrEx(p, "Descrption", o->Descrption, i, t->NumItem);
  9985. }
  9986. PackSetCurrentJsonGroupName(p, NULL);
  9987. }
  9988. void FreeRpcAdminOption(RPC_ADMIN_OPTION *t)
  9989. {
  9990. // Validate arguments
  9991. if (t == NULL)
  9992. {
  9993. return;
  9994. }
  9995. Free(t->Items);
  9996. }
  9997. // RPC_CONFIG
  9998. void InRpcConfig(RPC_CONFIG *t, PACK *p)
  9999. {
  10000. UINT size;
  10001. // Validate arguments
  10002. if (t == NULL || p == NULL)
  10003. {
  10004. return;
  10005. }
  10006. Zero(t, sizeof(RPC_CONFIG));
  10007. PackGetStr(p, "FileName", t->FileName, sizeof(t->FileName));
  10008. size = PackGetDataSize(p, "FileData");
  10009. t->FileData = ZeroMalloc(size + 1);
  10010. PackGetData(p, "FileData", t->FileData);
  10011. }
  10012. void OutRpcConfig(PACK *p, RPC_CONFIG *t)
  10013. {
  10014. // Validate arguments
  10015. if (t == NULL || p == NULL)
  10016. {
  10017. return;
  10018. }
  10019. PackAddStr(p, "FileName", t->FileName);
  10020. PackAddData(p, "FileData", t->FileData, StrLen(t->FileData));
  10021. }
  10022. void FreeRpcConfig(RPC_CONFIG *t)
  10023. {
  10024. // Validate arguments
  10025. if (t == NULL)
  10026. {
  10027. return;
  10028. }
  10029. Free(t->FileData);
  10030. }
  10031. // RPC_BRIDGE_SUPPORT
  10032. void InRpcBridgeSupport(RPC_BRIDGE_SUPPORT *t, PACK *p)
  10033. {
  10034. // Validate arguments
  10035. if (t == NULL || p == NULL)
  10036. {
  10037. return;
  10038. }
  10039. Zero(t, sizeof(RPC_BRIDGE_SUPPORT));
  10040. t->IsBridgeSupportedOs = PackGetBool(p, "IsBridgeSupportedOs");
  10041. t->IsWinPcapNeeded = PackGetBool(p, "IsWinPcapNeeded");
  10042. }
  10043. void OutRpcBridgeSupport(PACK *p, RPC_BRIDGE_SUPPORT *t)
  10044. {
  10045. // Validate arguments
  10046. if (p == NULL || t == NULL)
  10047. {
  10048. return;
  10049. }
  10050. PackAddBool(p, "IsBridgeSupportedOs", t->IsBridgeSupportedOs);
  10051. PackAddBool(p, "IsWinPcapNeeded",t->IsWinPcapNeeded);
  10052. }
  10053. // RPC_ADD_ACCESS
  10054. void InRpcAddAccess(RPC_ADD_ACCESS *t, PACK *p)
  10055. {
  10056. // Validate arguments
  10057. if (t == NULL || p == NULL)
  10058. {
  10059. return;
  10060. }
  10061. Zero(t, sizeof(RPC_ADD_ACCESS));
  10062. PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
  10063. InRpcAccess(&t->Access, p);
  10064. }
  10065. void OutRpcAddAccess(PACK *p, RPC_ADD_ACCESS *t)
  10066. {
  10067. // Validate arguments
  10068. if (t == NULL || p == NULL)
  10069. {
  10070. return;
  10071. }
  10072. PackAddStr(p, "HubName", t->HubName);
  10073. OutRpcAccess(p, &t->Access);
  10074. }
  10075. // RPC_DELETE_ACCESS
  10076. void InRpcDeleteAccess(RPC_DELETE_ACCESS *t, PACK *p)
  10077. {
  10078. // Validate arguments
  10079. if (t == NULL || p == NULL)
  10080. {
  10081. return;
  10082. }
  10083. Zero(t, sizeof(RPC_DELETE_ACCESS));
  10084. PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
  10085. t->Id = PackGetInt(p, "Id");
  10086. }
  10087. void OutRpcDeleteAccess(PACK *p, RPC_DELETE_ACCESS *t)
  10088. {
  10089. // Validate arguments
  10090. if (t == NULL || p == NULL)
  10091. {
  10092. return;
  10093. }
  10094. PackAddStr(p, "HubName", t->HubName);
  10095. PackAddInt(p, "Id", t->Id);
  10096. }
  10097. // RPC_SERVER_INFO
  10098. void InRpcServerInfo(RPC_SERVER_INFO *t, PACK *p)
  10099. {
  10100. // Validate arguments
  10101. if (t == NULL || p == NULL)
  10102. {
  10103. return;
  10104. }
  10105. Zero(t, sizeof(RPC_SERVER_INFO));
  10106. PackGetStr(p, "ServerProductName", t->ServerProductName, sizeof(t->ServerProductName));
  10107. PackGetStr(p, "ServerVersionString", t->ServerVersionString, sizeof(t->ServerVersionString));
  10108. PackGetStr(p, "ServerBuildInfoString", t->ServerBuildInfoString, sizeof(t->ServerBuildInfoString));
  10109. t->ServerVerInt = PackGetInt(p, "ServerVerInt");
  10110. t->ServerBuildInt = PackGetInt(p, "ServerBuildInt");
  10111. PackGetStr(p, "ServerHostName", t->ServerHostName, sizeof(t->ServerHostName));
  10112. t->ServerType = PackGetInt(p, "ServerType");
  10113. t->ServerBuildDate = PackGetInt64(p, "ServerBuildDate");
  10114. PackGetStr(p, "ServerFamilyName", t->ServerFamilyName, sizeof(t->ServerFamilyName));
  10115. InRpcOsInfo(&t->OsInfo, p);
  10116. }
  10117. void OutRpcServerInfo(PACK *p, RPC_SERVER_INFO *t)
  10118. {
  10119. // Validate arguments
  10120. if (t == NULL || p == NULL)
  10121. {
  10122. return;
  10123. }
  10124. PackAddStr(p, "ServerProductName", t->ServerProductName);
  10125. PackAddStr(p, "ServerVersionString", t->ServerVersionString);
  10126. PackAddStr(p, "ServerBuildInfoString", t->ServerBuildInfoString);
  10127. PackAddInt(p, "ServerVerInt", t->ServerVerInt);
  10128. PackAddInt(p, "ServerBuildInt", t->ServerBuildInt);
  10129. PackAddStr(p, "ServerHostName", t->ServerHostName);
  10130. PackAddInt(p, "ServerType", t->ServerType);
  10131. PackAddTime64(p, "ServerBuildDate", t->ServerBuildDate);
  10132. PackAddStr(p, "ServerFamilyName", t->ServerFamilyName);
  10133. OutRpcOsInfo(p, &t->OsInfo);
  10134. }
  10135. void FreeRpcServerInfo(RPC_SERVER_INFO *t)
  10136. {
  10137. // Validate arguments
  10138. if (t == NULL)
  10139. {
  10140. return;
  10141. }
  10142. FreeRpcOsInfo(&t->OsInfo);
  10143. }
  10144. // RPC_SERVER_STATUS
  10145. void InRpcServerStatus(RPC_SERVER_STATUS *t, PACK *p)
  10146. {
  10147. // Validate arguments
  10148. if (t == NULL || p == NULL)
  10149. {
  10150. return;
  10151. }
  10152. Zero(t, sizeof(RPC_SERVER_STATUS));
  10153. t->ServerType = PackGetInt(p, "ServerType");
  10154. t->NumTcpConnections = PackGetInt(p, "NumTcpConnections");
  10155. t->NumTcpConnectionsLocal = PackGetInt(p, "NumTcpConnectionsLocal");
  10156. t->NumTcpConnectionsRemote = PackGetInt(p, "NumTcpConnectionsRemote");
  10157. t->NumHubTotal = PackGetInt(p, "NumHubTotal");
  10158. t->NumHubStandalone = PackGetInt(p, "NumHubStandalone");
  10159. t->NumHubStatic = PackGetInt(p, "NumHubStatic");
  10160. t->NumHubDynamic = PackGetInt(p, "NumHubDynamic");
  10161. t->NumSessionsTotal = PackGetInt(p, "NumSessionsTotal");
  10162. t->NumSessionsLocal = PackGetInt(p, "NumSessionsLocal");
  10163. t->NumSessionsRemote = PackGetInt(p, "NumSessionsRemote");
  10164. t->NumMacTables = PackGetInt(p, "NumMacTables");
  10165. t->NumIpTables = PackGetInt(p, "NumIpTables");
  10166. t->NumUsers = PackGetInt(p, "NumUsers");
  10167. t->NumGroups = PackGetInt(p, "NumGroups");
  10168. t->CurrentTime = PackGetInt64(p, "CurrentTime");
  10169. t->CurrentTick = PackGetInt64(p, "CurrentTick");
  10170. t->AssignedBridgeLicenses = PackGetInt(p, "AssignedBridgeLicenses");
  10171. t->AssignedClientLicenses = PackGetInt(p, "AssignedClientLicenses");
  10172. t->AssignedBridgeLicensesTotal = PackGetInt(p, "AssignedBridgeLicensesTotal");
  10173. t->AssignedClientLicensesTotal = PackGetInt(p, "AssignedClientLicensesTotal");
  10174. t->StartTime = PackGetInt64(p, "StartTime");
  10175. InRpcTraffic(&t->Traffic, p);
  10176. InRpcMemInfo(&t->MemInfo, p);
  10177. }
  10178. void OutRpcServerStatus(PACK *p, RPC_SERVER_STATUS *t)
  10179. {
  10180. // Validate arguments
  10181. if (t == NULL || p == NULL)
  10182. {
  10183. return;
  10184. }
  10185. PackAddInt(p, "ServerType", t->ServerType);
  10186. PackAddInt(p, "NumHubTotal", t->NumHubTotal);
  10187. PackAddInt(p, "NumHubStandalone", t->NumHubStandalone);
  10188. PackAddInt(p, "NumHubStatic", t->NumHubStatic);
  10189. PackAddInt(p, "NumHubDynamic", t->NumHubDynamic);
  10190. PackAddInt(p, "NumSessionsTotal", t->NumSessionsTotal);
  10191. PackAddInt(p, "NumSessionsLocal", t->NumSessionsLocal);
  10192. PackAddInt(p, "NumSessionsRemote", t->NumSessionsRemote);
  10193. PackAddInt(p, "NumTcpConnections", t->NumTcpConnections);
  10194. PackAddInt(p, "NumTcpConnectionsLocal", t->NumTcpConnectionsLocal);
  10195. PackAddInt(p, "NumTcpConnectionsRemote", t->NumTcpConnectionsRemote);
  10196. PackAddInt(p, "NumMacTables", t->NumMacTables);
  10197. PackAddInt(p, "NumIpTables", t->NumIpTables);
  10198. PackAddInt(p, "NumUsers", t->NumUsers);
  10199. PackAddInt(p, "NumGroups", t->NumGroups);
  10200. PackAddTime64(p, "CurrentTime", t->CurrentTime);
  10201. PackAddInt64(p, "CurrentTick", t->CurrentTick);
  10202. PackAddInt(p, "AssignedBridgeLicenses", t->AssignedBridgeLicenses);
  10203. PackAddInt(p, "AssignedClientLicenses", t->AssignedClientLicenses);
  10204. PackAddInt(p, "AssignedBridgeLicensesTotal", t->AssignedBridgeLicensesTotal);
  10205. PackAddInt(p, "AssignedClientLicensesTotal", t->AssignedClientLicensesTotal);
  10206. PackAddTime64(p, "StartTime", t->StartTime);
  10207. OutRpcTraffic(p, &t->Traffic);
  10208. OutRpcMemInfo(p, &t->MemInfo);
  10209. }
  10210. // RPC_LISTENER
  10211. void InRpcListener(RPC_LISTENER *t, PACK *p)
  10212. {
  10213. // Validate arguments
  10214. if (t == NULL || p == NULL)
  10215. {
  10216. return;
  10217. }
  10218. Zero(t, sizeof(RPC_LISTENER));
  10219. t->Port = PackGetInt(p, "Port");
  10220. t->Enable = PackGetBool(p, "Enable");
  10221. }
  10222. void OutRpcListener(PACK *p, RPC_LISTENER *t)
  10223. {
  10224. // Validate arguments
  10225. if (t == NULL || p == NULL)
  10226. {
  10227. return;
  10228. }
  10229. PackAddInt(p, "Port", t->Port);
  10230. PackAddBool(p, "Enable", t->Enable);
  10231. }
  10232. // RPC_LISTENER_LIST
  10233. void InRpcListenerList(RPC_LISTENER_LIST *t, PACK *p)
  10234. {
  10235. UINT i;
  10236. // Validate arguments
  10237. if (t == NULL || p == NULL)
  10238. {
  10239. return;
  10240. }
  10241. Zero(t, sizeof(RPC_LISTENER_LIST));
  10242. t->NumPort = PackGetIndexCount(p, "Ports");
  10243. t->Ports = ZeroMalloc(sizeof(UINT) * t->NumPort);
  10244. t->Enables = ZeroMalloc(sizeof(UINT) * t->NumPort);
  10245. t->Errors = ZeroMalloc(sizeof(UINT) * t->NumPort);
  10246. for (i = 0;i < t->NumPort;i++)
  10247. {
  10248. t->Ports[i] = PackGetIntEx(p, "Ports", i);
  10249. t->Enables[i] = PackGetBoolEx(p, "Enables", i);
  10250. t->Errors[i] = PackGetBoolEx(p, "Errors", i);
  10251. }
  10252. }
  10253. void OutRpcListenerList(PACK *p, RPC_LISTENER_LIST *t)
  10254. {
  10255. UINT i;
  10256. // Validate arguments
  10257. if (t == NULL || p == NULL)
  10258. {
  10259. return;
  10260. }
  10261. PackSetCurrentJsonGroupName(p, "ListenerList");
  10262. for (i = 0;i < t->NumPort;i++)
  10263. {
  10264. PackAddIntEx(p, "Ports", t->Ports[i], i, t->NumPort);
  10265. PackAddBoolEx(p, "Enables", t->Enables[i], i, t->NumPort);
  10266. PackAddBoolEx(p, "Errors", t->Errors[i], i, t->NumPort);
  10267. }
  10268. PackSetCurrentJsonGroupName(p, NULL);
  10269. }
  10270. void FreeRpcListenerList(RPC_LISTENER_LIST *t)
  10271. {
  10272. // Validate arguments
  10273. if (t == NULL)
  10274. {
  10275. return;
  10276. }
  10277. Free(t->Ports);
  10278. Free(t->Enables);
  10279. Free(t->Errors);
  10280. }
  10281. // RPC_PORTS
  10282. void InRpcPorts(RPC_PORTS *t, PACK *p)
  10283. {
  10284. UINT i;
  10285. // Validate arguments
  10286. if (t == NULL || p == NULL)
  10287. {
  10288. return;
  10289. }
  10290. t->Num = PackGetIndexCount(p, "Ports");
  10291. t->Ports = ZeroMalloc(sizeof(UINT) * t->Num);
  10292. for (i = 0; i < t->Num; ++i)
  10293. {
  10294. t->Ports[i] = PackGetIntEx(p, "Ports", i);
  10295. }
  10296. }
  10297. void OutRpcPorts(PACK *p, RPC_PORTS *t)
  10298. {
  10299. UINT i;
  10300. // Validate arguments
  10301. if (t == NULL || p == NULL)
  10302. {
  10303. return;
  10304. }
  10305. for (i = 0; i < t->Num; ++i)
  10306. {
  10307. PackAddIntEx(p, "Ports", t->Ports[i], i, t->Num);
  10308. }
  10309. }
  10310. void FreeRpcPorts(RPC_PORTS *t)
  10311. {
  10312. // Validate arguments
  10313. if (t == NULL)
  10314. {
  10315. return;
  10316. }
  10317. Free(t->Ports);
  10318. }
  10319. // RPC_STR
  10320. void InRpcStr(RPC_STR *t, PACK *p)
  10321. {
  10322. UINT size = 65536;
  10323. char *tmp = Malloc(size);
  10324. // Validate arguments
  10325. if (t == NULL || p == NULL)
  10326. {
  10327. return;
  10328. }
  10329. Zero(t, sizeof(RPC_STR));
  10330. if (PackGetStr(p, "String", tmp, size) == false)
  10331. {
  10332. t->String = CopyStr("");
  10333. }
  10334. else
  10335. {
  10336. t->String = CopyStr(tmp);
  10337. }
  10338. Free(tmp);
  10339. }
  10340. void OutRpcStr(PACK *p, RPC_STR *t)
  10341. {
  10342. // Validate arguments
  10343. if (t == NULL || p == NULL)
  10344. {
  10345. return;
  10346. }
  10347. PackAddStr(p, "String", t->String);
  10348. }
  10349. void FreeRpcStr(RPC_STR *t)
  10350. {
  10351. // Validate arguments
  10352. if (t == NULL )
  10353. {
  10354. return;
  10355. }
  10356. Free(t->String);
  10357. }
  10358. // RPC_PROTO_OPTIONS
  10359. void InRpcProtoOptions(RPC_PROTO_OPTIONS *t, PACK *p)
  10360. {
  10361. UINT i, size;
  10362. // Validate arguments
  10363. if (t == NULL || p == NULL)
  10364. {
  10365. return;
  10366. }
  10367. Zero(t, sizeof(RPC_PROTO_OPTIONS));
  10368. size = PackGetStrSize(p, "Protocol");
  10369. if (size > 0)
  10370. {
  10371. t->Protocol = Malloc(size);
  10372. if (PackGetStr(p, "Protocol", t->Protocol, size) == false)
  10373. {
  10374. Zero(t->Protocol, size);
  10375. }
  10376. }
  10377. t->Num = PackGetIndexCount(p, "Name");
  10378. if (t->Num == 0)
  10379. {
  10380. return;
  10381. }
  10382. t->Options = ZeroMalloc(sizeof(PROTO_OPTION) * t->Num);
  10383. for (i = 0; i < t->Num; ++i)
  10384. {
  10385. PROTO_OPTION *option = &t->Options[i];
  10386. size = PackGetStrSizeEx(p, "Name", i);
  10387. if (size > 0)
  10388. {
  10389. option->Name = Malloc(size);
  10390. if (PackGetStrEx(p, "Name", option->Name, size, i) == false)
  10391. {
  10392. Zero(option->Name, size);
  10393. }
  10394. }
  10395. option->Type = PackGetIntEx(p, "Type", i);
  10396. switch (option->Type)
  10397. {
  10398. case PROTO_OPTION_STRING:
  10399. size = PackGetDataSizeEx(p, "Value", i);
  10400. if (size > 0)
  10401. {
  10402. option->String = Malloc(size);
  10403. if (PackGetDataEx2(p, "Value", option->String, size, i) == false)
  10404. {
  10405. Zero(option->String, size);
  10406. }
  10407. }
  10408. break;
  10409. case PROTO_OPTION_BOOL:
  10410. PackGetDataEx2(p, "Value", &option->Bool, sizeof(option->Bool), i);
  10411. break;
  10412. case PROTO_OPTION_UINT32:
  10413. PackGetDataEx2(p, "Value", &option->UInt32, sizeof(option->UInt32), i);
  10414. break;
  10415. default:
  10416. Debug("InRpcProtoOptions(): unhandled type %u!\n", option->Type);
  10417. }
  10418. }
  10419. }
  10420. void OutRpcProtoOptions(PACK *p, RPC_PROTO_OPTIONS *t)
  10421. {
  10422. UINT i;
  10423. // Validate arguments
  10424. if (t == NULL || p == NULL)
  10425. {
  10426. return;
  10427. }
  10428. PackAddStr(p, "Protocol", t->Protocol);
  10429. for (i = 0; i < t->Num; ++i)
  10430. {
  10431. PROTO_OPTION *option = &t->Options[i];
  10432. PackAddStrEx(p, "Name", option->Name, i, t->Num);
  10433. PackAddIntEx(p, "Type", option->Type, i, t->Num);
  10434. switch (option->Type)
  10435. {
  10436. case PROTO_OPTION_STRING:
  10437. PackAddDataEx(p, "Value", option->String, StrLen(option->String) + 1, i, t->Num);
  10438. break;
  10439. case PROTO_OPTION_BOOL:
  10440. PackAddDataEx(p, "Value", &option->Bool, sizeof(option->Bool), i, t->Num);
  10441. break;
  10442. case PROTO_OPTION_UINT32:
  10443. PackAddDataEx(p, "Value", &option->UInt32, sizeof(option->UInt32), i, t->Num);
  10444. break;
  10445. default:
  10446. Debug("OutRpcProtoOptions(): unhandled type %u!\n", option->Type);
  10447. }
  10448. }
  10449. }
  10450. void FreeRpcProtoOptions(RPC_PROTO_OPTIONS *t)
  10451. {
  10452. UINT i;
  10453. // Validate arguments
  10454. if (t == NULL)
  10455. {
  10456. return;
  10457. }
  10458. Free(t->Protocol);
  10459. for (i = 0; i < t->Num; ++i)
  10460. {
  10461. PROTO_OPTION *option = &t->Options[i];
  10462. Free(option->Name);
  10463. if (option->Type == PROTO_OPTION_STRING)
  10464. {
  10465. Free(option->String);
  10466. }
  10467. }
  10468. Free(t->Options);
  10469. }
  10470. // RPC_SET_PASSWORD
  10471. void InRpcSetPassword(RPC_SET_PASSWORD *t, PACK *p)
  10472. {
  10473. // Validate arguments
  10474. if (t == NULL || p == NULL)
  10475. {
  10476. return;
  10477. }
  10478. Zero(t, sizeof(RPC_SET_PASSWORD));
  10479. PackGetData2(p, "HashedPassword", t->HashedPassword, sizeof(t->HashedPassword));
  10480. PackGetStr(p, "PlainTextPassword", t->PlainTextPassword, sizeof(t->PlainTextPassword));
  10481. }
  10482. void OutRpcSetPassword(PACK *p, RPC_SET_PASSWORD *t)
  10483. {
  10484. // Validate arguments
  10485. if (t == NULL || p == NULL)
  10486. {
  10487. return;
  10488. }
  10489. PackAddData(p, "HashedPassword", t->HashedPassword, sizeof(t->HashedPassword));
  10490. PackAddStr(p, "PlainTextPassword", t->PlainTextPassword);
  10491. }
  10492. // RPC_FARM
  10493. void InRpcFarm(RPC_FARM *t, PACK *p)
  10494. {
  10495. UINT i;
  10496. // Validate arguments
  10497. if (t == NULL || p == NULL)
  10498. {
  10499. return;
  10500. }
  10501. Zero(t, sizeof(RPC_FARM));
  10502. t->ServerType = PackGetInt(p, "ServerType");
  10503. t->NumPort = PackGetIndexCount(p, "Ports");
  10504. t->Ports = ZeroMalloc(sizeof(UINT) * t->NumPort);
  10505. for (i = 0;i < t->NumPort;i++)
  10506. {
  10507. t->Ports[i] = PackGetIntEx(p, "Ports", i);
  10508. }
  10509. t->PublicIp = PackGetIp32(p, "PublicIp");
  10510. PackGetStr(p, "ControllerName", t->ControllerName, sizeof(t->ControllerName));
  10511. t->ControllerPort = PackGetInt(p, "ControllerPort");
  10512. PackGetData2(p, "MemberPassword", t->MemberPassword, sizeof(t->MemberPassword));
  10513. PackGetStr(p, "MemberPasswordPlaintext", t->MemberPasswordPlaintext, sizeof(t->MemberPasswordPlaintext));
  10514. t->Weight = PackGetInt(p, "Weight");
  10515. t->ControllerOnly = PackGetBool(p, "ControllerOnly");
  10516. }
  10517. void OutRpcFarm(PACK *p, RPC_FARM *t)
  10518. {
  10519. UINT i;
  10520. // Validate arguments
  10521. if (t == NULL || p == NULL)
  10522. {
  10523. return;
  10524. }
  10525. PackAddInt(p, "ServerType", t->ServerType);
  10526. for (i = 0;i < t->NumPort;i++)
  10527. {
  10528. PackAddIntEx(p, "Ports", t->Ports[i], i, t->NumPort);
  10529. }
  10530. PackAddIp32(p, "PublicIp", t->PublicIp);
  10531. PackAddStr(p, "ControllerName", t->ControllerName);
  10532. PackAddInt(p, "ControllerPort", t->ControllerPort);
  10533. PackAddData(p, "MemberPassword", t->MemberPassword, sizeof(t->MemberPassword));
  10534. PackAddStr(p, "MemberPasswordPlaintext", t->MemberPasswordPlaintext);
  10535. PackAddInt(p, "Weight", t->Weight);
  10536. PackAddBool(p, "ControllerOnly", t->ControllerOnly);
  10537. }
  10538. void FreeRpcFarm(RPC_FARM *t)
  10539. {
  10540. // Validate arguments
  10541. if (t == NULL)
  10542. {
  10543. return;
  10544. }
  10545. Free(t->Ports);
  10546. }
  10547. // RPC_FARM_HUB
  10548. void InRpcFarmHub(RPC_FARM_HUB *t, PACK *p)
  10549. {
  10550. // Validate arguments
  10551. if (t == NULL || p == NULL)
  10552. {
  10553. return;
  10554. }
  10555. Zero(t, sizeof(RPC_FARM_HUB));
  10556. PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
  10557. t->DynamicHub = PackGetBool(p, "DynamicHub");
  10558. }
  10559. void OutRpcFarmHub(PACK *p, RPC_FARM_HUB *t)
  10560. {
  10561. // Validate arguments
  10562. if (t == NULL || p == NULL)
  10563. {
  10564. return;
  10565. }
  10566. PackAddStr(p, "HubName", t->HubName);
  10567. PackAddBool(p, "DynamicHub", t->DynamicHub);
  10568. }
  10569. // RPC_FARM_INFO
  10570. void InRpcFarmInfo(RPC_FARM_INFO *t, PACK *p)
  10571. {
  10572. UINT i;
  10573. // Validate arguments
  10574. if (t == NULL)
  10575. {
  10576. return;
  10577. }
  10578. Zero(t, sizeof(RPC_FARM_INFO));
  10579. t->Id = PackGetInt(p, "Id");
  10580. t->Controller = PackGetBool(p, "Controller");
  10581. t->ConnectedTime = PackGetInt64(p, "ConnectedTime");
  10582. t->Ip = PackGetIp32(p, "Ip");
  10583. PackGetStr(p, "Hostname", t->Hostname, sizeof(t->Hostname));
  10584. t->Point = PackGetInt(p, "Point");
  10585. t->NumPort = PackGetIndexCount(p, "Ports");
  10586. t->Ports = ZeroMalloc(sizeof(UINT) * t->NumPort);
  10587. for (i = 0;i < t->NumPort;i++)
  10588. {
  10589. t->Ports[i] = PackGetIntEx(p, "Ports", i);
  10590. }
  10591. t->ServerCert = PackGetX(p, "ServerCert");
  10592. t->NumFarmHub = PackGetIndexCount(p, "HubName");
  10593. t->FarmHubs = ZeroMalloc(sizeof(RPC_FARM_HUB) * t->NumFarmHub);
  10594. for (i = 0;i < t->NumFarmHub;i++)
  10595. {
  10596. PackGetStrEx(p, "HubName", t->FarmHubs[i].HubName, sizeof(t->FarmHubs[i].HubName), i);
  10597. t->FarmHubs[i].DynamicHub = PackGetBoolEx(p, "DynamicHub", i);
  10598. }
  10599. t->NumSessions = PackGetInt(p, "NumSessions");
  10600. t->NumTcpConnections = PackGetInt(p, "NumTcpConnections");
  10601. t->Weight = PackGetInt(p, "Weight");
  10602. }
  10603. void OutRpcFarmInfo(PACK *p, RPC_FARM_INFO *t)
  10604. {
  10605. UINT i;
  10606. // Validate arguments
  10607. if (t == NULL || p == NULL)
  10608. {
  10609. return;
  10610. }
  10611. PackAddInt(p, "Id", t->Id);
  10612. PackAddBool(p, "Controller", t->Controller);
  10613. PackAddTime64(p, "ConnectedTime", t->ConnectedTime);
  10614. PackAddIp32(p, "Ip", t->Ip);
  10615. PackAddStr(p, "Hostname", t->Hostname);
  10616. PackAddInt(p, "Point", t->Point);
  10617. for (i = 0;i < t->NumPort;i++)
  10618. {
  10619. PackAddIntEx(p, "Ports", t->Ports[i], i, t->NumPort);
  10620. }
  10621. PackAddX(p, "ServerCert", t->ServerCert);
  10622. PackSetCurrentJsonGroupName(p, "HubsList");
  10623. for (i = 0;i < t->NumFarmHub;i++)
  10624. {
  10625. PackAddStrEx(p, "HubName", t->FarmHubs[i].HubName, i, t->NumFarmHub);
  10626. PackAddBoolEx(p, "DynamicHub", t->FarmHubs[i].DynamicHub, i, t->NumFarmHub);
  10627. }
  10628. PackSetCurrentJsonGroupName(p, NULL);
  10629. PackAddInt(p, "NumSessions", t->NumSessions);
  10630. PackAddInt(p, "NumTcpConnections", t->NumTcpConnections);
  10631. PackAddInt(p, "Weight", t->Weight);
  10632. }
  10633. void FreeRpcFarmInfo(RPC_FARM_INFO *t)
  10634. {
  10635. // Validate arguments
  10636. if (t == NULL)
  10637. {
  10638. return;
  10639. }
  10640. Free(t->Ports);
  10641. Free(t->FarmHubs);
  10642. FreeX(t->ServerCert);
  10643. }
  10644. void InRpcEnumFarm(RPC_ENUM_FARM *t, PACK *p)
  10645. {
  10646. UINT i;
  10647. // Validate arguments
  10648. if (t == NULL || p == NULL)
  10649. {
  10650. return;
  10651. }
  10652. Zero(t, sizeof(RPC_ENUM_FARM));
  10653. t->NumFarm = PackGetIndexCount(p, "Id");
  10654. t->Farms = ZeroMalloc(sizeof(RPC_ENUM_FARM_ITEM) * t->NumFarm);
  10655. for (i = 0;i < t->NumFarm;i++)
  10656. {
  10657. RPC_ENUM_FARM_ITEM *e = &t->Farms[i];
  10658. e->Id = PackGetIntEx(p, "Id", i);
  10659. e->Controller = PackGetBoolEx(p, "Controller", i);
  10660. e->ConnectedTime = PackGetInt64Ex(p, "ConnectedTime", i);
  10661. e->Ip = PackGetIp32Ex(p, "Ip", i);
  10662. PackGetStrEx(p, "Hostname", e->Hostname, sizeof(e->Hostname), i);
  10663. e->Point = PackGetIntEx(p, "Point", i);
  10664. e->NumSessions = PackGetIntEx(p, "NumSessions", i);
  10665. e->NumTcpConnections = PackGetIntEx(p, "NumTcpConnections", i);
  10666. e->NumHubs = PackGetIntEx(p, "NumHubs", i);
  10667. e->AssignedClientLicense = PackGetIntEx(p, "AssignedClientLicense", i);
  10668. e->AssignedBridgeLicense = PackGetIntEx(p, "AssignedBridgeLicense", i);
  10669. }
  10670. }
  10671. void OutRpcEnumFarm(PACK *p, RPC_ENUM_FARM *t)
  10672. {
  10673. UINT i;
  10674. // Validate arguments
  10675. if (t == NULL || p == NULL)
  10676. {
  10677. return;
  10678. }
  10679. PackSetCurrentJsonGroupName(p, "FarmMemberList");
  10680. for (i = 0;i < t->NumFarm;i++)
  10681. {
  10682. RPC_ENUM_FARM_ITEM *e = &t->Farms[i];
  10683. PackAddIntEx(p, "Id", e->Id, i, t->NumFarm);
  10684. PackAddBoolEx(p, "Controller", e->Controller, i, t->NumFarm);
  10685. PackAddTime64Ex(p, "ConnectedTime", e->ConnectedTime, i, t->NumFarm);
  10686. PackAddIp32Ex(p, "Ip", e->Ip, i, t->NumFarm);
  10687. PackAddStrEx(p, "Hostname", e->Hostname, i, t->NumFarm);
  10688. PackAddIntEx(p, "Point", e->Point, i, t->NumFarm);
  10689. PackAddIntEx(p, "NumSessions", e->NumSessions, i, t->NumFarm);
  10690. PackAddIntEx(p, "NumTcpConnections", e->NumTcpConnections, i, t->NumFarm);
  10691. PackAddIntEx(p, "NumHubs", e->NumHubs, i, t->NumFarm);
  10692. PackAddIntEx(p, "AssignedClientLicense", e->AssignedClientLicense, i, t->NumFarm);
  10693. PackAddIntEx(p, "AssignedBridgeLicense", e->AssignedBridgeLicense, i, t->NumFarm);
  10694. }
  10695. PackSetCurrentJsonGroupName(p, NULL);
  10696. }
  10697. void FreeRpcEnumFarm(RPC_ENUM_FARM *t)
  10698. {
  10699. // Validate arguments
  10700. if (t == NULL)
  10701. {
  10702. return;
  10703. }
  10704. Free(t->Farms);
  10705. }
  10706. // RPC_FARM_CONNECTION_STATUS
  10707. void InRpcFarmConnectionStatus(RPC_FARM_CONNECTION_STATUS *t, PACK *p)
  10708. {
  10709. Zero(t, sizeof(RPC_FARM_CONNECTION_STATUS));
  10710. // Validate arguments
  10711. if (t == NULL || p == NULL)
  10712. {
  10713. return;
  10714. }
  10715. t->Ip = PackGetIp32(p, "Ip");
  10716. t->Port = PackGetInt(p, "Port");
  10717. t->Online = PackGetBool(p, "Online");
  10718. t->LastError = PackGetInt(p, "LastError");
  10719. t->StartedTime = PackGetInt64(p, "StartedTime");
  10720. t->CurrentConnectedTime = PackGetInt64(p, "CurrentConnectedTime");
  10721. t->FirstConnectedTime = PackGetInt64(p, "FirstConnectedTime");
  10722. t->NumConnected = PackGetInt(p, "NumConnected");
  10723. t->NumTry = PackGetInt(p, "NumTry");
  10724. t->NumFailed = PackGetInt(p, "NumFailed");
  10725. }
  10726. void OutRpcFarmConnectionStatus(PACK *p, RPC_FARM_CONNECTION_STATUS *t)
  10727. {
  10728. // Validate arguments
  10729. if (t == NULL || p == NULL)
  10730. {
  10731. return;
  10732. }
  10733. PackAddIp32(p, "Ip", t->Ip);
  10734. PackAddInt(p, "Port", t->Port);
  10735. PackAddBool(p, "Online", t->Online);
  10736. PackAddInt(p, "LastError", t->LastError);
  10737. PackAddTime64(p, "StartedTime", t->StartedTime);
  10738. PackAddTime64(p, "CurrentConnectedTime", t->CurrentConnectedTime);
  10739. PackAddTime64(p, "FirstConnectedTime", t->FirstConnectedTime);
  10740. PackAddInt(p, "NumConnected", t->NumConnected);
  10741. PackAddInt(p, "NumTry", t->NumTry);
  10742. PackAddInt(p, "NumFailed", t->NumFailed);
  10743. }
  10744. // RPC_HUB_OPTION
  10745. void InRpcHubOption(RPC_HUB_OPTION *t, PACK *p)
  10746. {
  10747. // Validate arguments
  10748. if (t == NULL || p == NULL)
  10749. {
  10750. return;
  10751. }
  10752. Zero(t, sizeof(RPC_HUB_OPTION));
  10753. t->DefaultGateway = PackGetInt(p, "DefaultGateway");
  10754. t->DefaultSubnet = PackGetInt(p, "DefaultSubnet");
  10755. t->MaxSession = PackGetInt(p, "MaxSession");
  10756. t->NoEnum = PackGetBool(p, "NoEnum");
  10757. }
  10758. void OutRpcHubOption(PACK *p, RPC_HUB_OPTION *t)
  10759. {
  10760. // Validate arguments
  10761. if (t == NULL || p == NULL)
  10762. {
  10763. return;
  10764. }
  10765. PackAddInt(p, "DefaultGateway", t->DefaultGateway);
  10766. PackAddInt(p, "DefaultSubnet", t->DefaultSubnet);
  10767. PackAddInt(p, "MaxSession", t->MaxSession);
  10768. PackAddBool(p, "NoEnum", t->NoEnum);
  10769. }
  10770. // RPC_RADIUS
  10771. void InRpcRadius(RPC_RADIUS *t, PACK *p)
  10772. {
  10773. // Validate arguments
  10774. if (t == NULL || p == NULL)
  10775. {
  10776. return;
  10777. }
  10778. Zero(t, sizeof(RPC_RADIUS));
  10779. PackGetStr(p, "RadiusServerName", t->RadiusServerName, sizeof(t->RadiusServerName));
  10780. t->RadiusPort = PackGetInt(p, "RadiusPort");
  10781. PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
  10782. PackGetStr(p, "RadiusSecret", t->RadiusSecret, sizeof(t->RadiusSecret));
  10783. t->RadiusRetryInterval = PackGetInt(p, "RadiusRetryInterval");
  10784. }
  10785. void OutRpcRadius(PACK *p, RPC_RADIUS *t)
  10786. {
  10787. // Validate arguments
  10788. if (t == NULL || p == NULL)
  10789. {
  10790. return;
  10791. }
  10792. PackAddStr(p, "RadiusServerName", t->RadiusServerName);
  10793. PackAddInt(p, "RadiusPort", t->RadiusPort);
  10794. PackAddStr(p, "HubName", t->HubName);
  10795. PackAddStr(p, "RadiusSecret", t->RadiusSecret);
  10796. PackAddInt(p, "RadiusRetryInterval", t->RadiusRetryInterval);
  10797. }
  10798. // RPC_HUB
  10799. void InRpcHub(RPC_HUB *t, PACK *p)
  10800. {
  10801. // Validate arguments
  10802. if (t == NULL || p == NULL)
  10803. {
  10804. return;
  10805. }
  10806. Zero(t, sizeof(RPC_HUB));
  10807. PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
  10808. }
  10809. void OutRpcHub(PACK *p, RPC_HUB *t)
  10810. {
  10811. // Validate arguments
  10812. if (t == NULL || p == NULL)
  10813. {
  10814. return;
  10815. }
  10816. PackAddStr(p, "HubName", t->HubName);
  10817. }
  10818. // RPC_CREATE_HUB
  10819. void InRpcCreateHub(RPC_CREATE_HUB *t, PACK *p)
  10820. {
  10821. // Validate arguments
  10822. if (t == NULL || p == NULL)
  10823. {
  10824. return;
  10825. }
  10826. Zero(t, sizeof(RPC_CREATE_HUB));
  10827. PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
  10828. PackGetData2(p, "HashedPassword", t->HashedPassword, sizeof(t->HashedPassword));
  10829. PackGetData2(p, "SecurePassword", t->SecurePassword, sizeof(t->SecurePassword));
  10830. PackGetStr(p, "AdminPasswordPlainText", t->AdminPasswordPlainText, sizeof(t->AdminPasswordPlainText));
  10831. t->Online = PackGetBool(p, "Online");
  10832. InRpcHubOption(&t->HubOption, p);
  10833. t->HubType = PackGetInt(p, "HubType");
  10834. }
  10835. void OutRpcCreateHub(PACK *p, RPC_CREATE_HUB *t)
  10836. {
  10837. // Validate arguments
  10838. if (t == NULL || p == NULL)
  10839. {
  10840. return;
  10841. }
  10842. PackAddStr(p, "HubName", t->HubName);
  10843. PackAddData(p, "HashedPassword", t->HashedPassword, sizeof(t->HashedPassword));
  10844. PackAddData(p, "SecurePassword", t->SecurePassword, sizeof(t->SecurePassword));
  10845. PackAddBool(p, "Online", t->Online);
  10846. PackAddStr(p, "AdminPasswordPlainText", t->AdminPasswordPlainText);
  10847. OutRpcHubOption(p, &t->HubOption);
  10848. PackAddInt(p, "HubType", t->HubType);
  10849. }
  10850. // RPC_ENUM_HUB
  10851. void InRpcEnumHub(RPC_ENUM_HUB *t, PACK *p)
  10852. {
  10853. UINT i;
  10854. // Validate arguments
  10855. if (t == NULL || p == NULL)
  10856. {
  10857. return;
  10858. }
  10859. Zero(t, sizeof(RPC_ENUM_HUB));
  10860. t->NumHub = PackGetIndexCount(p, "HubName");
  10861. t->Hubs = ZeroMalloc(sizeof(RPC_ENUM_HUB_ITEM) * t->NumHub);
  10862. for (i = 0;i < t->NumHub;i++)
  10863. {
  10864. RPC_ENUM_HUB_ITEM *e = &t->Hubs[i];
  10865. PackGetStrEx(p, "HubName", e->HubName, sizeof(e->HubName), i);
  10866. e->Online = PackGetBoolEx(p, "Online", i);
  10867. e->HubType = PackGetIntEx(p, "HubType", i);
  10868. e->NumSessions = PackGetIntEx(p, "NumSessions", i);
  10869. e->NumUsers = PackGetIntEx(p, "NumUsers", i);
  10870. e->NumGroups = PackGetIntEx(p, "NumGroups", i);
  10871. e->NumMacTables = PackGetIntEx(p, "NumMacTables", i);
  10872. e->NumIpTables = PackGetIntEx(p, "NumIpTables", i);
  10873. e->LastCommTime = PackGetInt64Ex(p, "LastCommTime", i);
  10874. e->CreatedTime = PackGetInt64Ex(p, "CreatedTime", i);
  10875. e->LastLoginTime = PackGetInt64Ex(p, "LastLoginTime", i);
  10876. e->NumLogin = PackGetIntEx(p, "NumLogin", i);
  10877. e->IsTrafficFilled = PackGetBoolEx(p, "IsTrafficFilled", i);
  10878. InRpcTrafficEx(&e->Traffic, p, i);
  10879. }
  10880. }
  10881. void OutRpcEnumHub(PACK *p, RPC_ENUM_HUB *t)
  10882. {
  10883. UINT i;
  10884. // Validate arguments
  10885. if (t == NULL || p == NULL)
  10886. {
  10887. return;
  10888. }
  10889. PackSetCurrentJsonGroupName(p, "HubList");
  10890. for (i = 0;i < t->NumHub;i++)
  10891. {
  10892. RPC_ENUM_HUB_ITEM *e = &t->Hubs[i];
  10893. PackAddStrEx(p, "HubName", e->HubName, i, t->NumHub);
  10894. PackAddBoolEx(p, "Online", e->Online, i, t->NumHub);
  10895. PackAddIntEx(p, "HubType", e->HubType, i, t->NumHub);
  10896. PackAddIntEx(p, "NumSessions", e->NumSessions, i, t->NumHub);
  10897. PackAddIntEx(p, "NumUsers", e->NumUsers, i, t->NumHub);
  10898. PackAddIntEx(p, "NumGroups", e->NumGroups, i, t->NumHub);
  10899. PackAddIntEx(p, "NumMacTables", e->NumMacTables, i, t->NumHub);
  10900. PackAddIntEx(p, "NumIpTables", e->NumIpTables, i, t->NumHub);
  10901. PackAddTime64Ex(p, "LastCommTime", e->LastCommTime, i, t->NumHub);
  10902. PackAddTime64Ex(p, "CreatedTime", e->CreatedTime, i, t->NumHub);
  10903. PackAddTime64Ex(p, "LastLoginTime", e->LastLoginTime, i, t->NumHub);
  10904. PackAddIntEx(p, "NumLogin", e->NumLogin, i, t->NumHub);
  10905. PackAddBoolEx(p, "IsTrafficFilled", e->IsTrafficFilled, i, t->NumHub);
  10906. OutRpcTrafficEx(&e->Traffic, p, i, t->NumHub);
  10907. }
  10908. PackSetCurrentJsonGroupName(p, NULL);
  10909. }
  10910. void FreeRpcEnumHub(RPC_ENUM_HUB *t)
  10911. {
  10912. // Validate arguments
  10913. if (t == NULL)
  10914. {
  10915. return;
  10916. }
  10917. Free(t->Hubs);
  10918. }
  10919. // RPC_DELETE_HUB
  10920. void InRpcDeleteHub(RPC_DELETE_HUB *t, PACK *p)
  10921. {
  10922. // Validate arguments
  10923. if (t == NULL || p == NULL)
  10924. {
  10925. return;
  10926. }
  10927. Zero(t, sizeof(RPC_DELETE_HUB));
  10928. PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
  10929. }
  10930. void OutRpcDeleteHub(PACK *p, RPC_DELETE_HUB *t)
  10931. {
  10932. // Validate arguments
  10933. if (t == NULL || p == NULL)
  10934. {
  10935. return;
  10936. }
  10937. PackAddStr(p, "HubName", t->HubName);
  10938. }
  10939. // RPC_ENUM_CONNECTION
  10940. void InRpcEnumConnection(RPC_ENUM_CONNECTION *t, PACK *p)
  10941. {
  10942. UINT i;
  10943. // Validate arguments
  10944. if (t == NULL || p == NULL)
  10945. {
  10946. return;
  10947. }
  10948. Zero(t, sizeof(RPC_ENUM_CONNECTION));
  10949. t->NumConnection = PackGetIndexCount(p, "Name");
  10950. t->Connections = ZeroMalloc(sizeof(RPC_ENUM_CONNECTION_ITEM) * t->NumConnection);
  10951. for (i = 0;i < t->NumConnection;i++)
  10952. {
  10953. RPC_ENUM_CONNECTION_ITEM *e = &t->Connections[i];
  10954. e->Ip = PackGetIp32Ex(p, "Ip", i);
  10955. e->Port = PackGetIntEx(p, "Port", i);
  10956. PackGetStrEx(p, "Name", e->Name, sizeof(e->Name), i);
  10957. PackGetStrEx(p, "Hostname", e->Hostname, sizeof(e->Hostname), i);
  10958. e->ConnectedTime = PackGetInt64Ex(p, "ConnectedTime", i);
  10959. e->Type = PackGetIntEx(p, "Type", i);
  10960. }
  10961. }
  10962. void OutRpcEnumConnection(PACK *p, RPC_ENUM_CONNECTION *t)
  10963. {
  10964. UINT i;
  10965. // Validate arguments
  10966. if (t == NULL || p == NULL)
  10967. {
  10968. return;
  10969. }
  10970. PackSetCurrentJsonGroupName(p, "ConnectionList");
  10971. for (i = 0;i < t->NumConnection;i++)
  10972. {
  10973. RPC_ENUM_CONNECTION_ITEM *e = &t->Connections[i];
  10974. PackAddIp32Ex(p, "Ip", e->Ip, i, t->NumConnection);
  10975. PackAddIntEx(p, "Port", e->Port, i, t->NumConnection);
  10976. PackAddStrEx(p, "Name", e->Name, i, t->NumConnection);
  10977. PackAddStrEx(p, "Hostname", e->Hostname, i, t->NumConnection);
  10978. PackAddTime64Ex(p, "ConnectedTime", e->ConnectedTime, i, t->NumConnection);
  10979. PackAddIntEx(p, "Type", e->Type, i, t->NumConnection);
  10980. }
  10981. PackSetCurrentJsonGroupName(p, NULL);
  10982. }
  10983. void FreeRpcEnumConnection(RPC_ENUM_CONNECTION *t)
  10984. {
  10985. // Validate arguments
  10986. if (t == NULL)
  10987. {
  10988. return;
  10989. }
  10990. Free(t->Connections);
  10991. }
  10992. // RPC_DISCONNECT_CONNECTION
  10993. void InRpcDisconnectConnection(RPC_DISCONNECT_CONNECTION *t, PACK *p)
  10994. {
  10995. // Validate arguments
  10996. if (t == NULL || p == NULL)
  10997. {
  10998. return;
  10999. }
  11000. Zero(t, sizeof(RPC_DISCONNECT_CONNECTION));
  11001. PackGetStr(p, "Name", t->Name, sizeof(t->Name));
  11002. }
  11003. void OutRpcDisconnectConnection(PACK *p, RPC_DISCONNECT_CONNECTION *t)
  11004. {
  11005. // Validate arguments
  11006. if (t == NULL || p == NULL)
  11007. {
  11008. return;
  11009. }
  11010. PackAddStr(p, "Name", t->Name);
  11011. }
  11012. // RPC_CONNECTION_INFO
  11013. void InRpcConnectionInfo(RPC_CONNECTION_INFO *t, PACK *p)
  11014. {
  11015. // Validate arguments
  11016. if (t == NULL || p == NULL)
  11017. {
  11018. return;
  11019. }
  11020. Zero(t, sizeof(RPC_CONNECTION_INFO));
  11021. PackGetStr(p, "Name", t->Name, sizeof(t->Name));
  11022. t->Ip = PackGetIp32(p, "Ip");
  11023. t->Port = PackGetInt(p, "Port");
  11024. t->ConnectedTime = PackGetInt64(p, "ConnectedTime");
  11025. PackGetStr(p, "Hostname", t->Hostname, sizeof(t->Hostname));
  11026. PackGetStr(p, "ServerStr", t->ServerStr, sizeof(t->ServerStr));
  11027. PackGetStr(p, "ClientStr", t->ClientStr, sizeof(t->ClientStr));
  11028. t->ServerVer = PackGetInt(p, "ServerVer");
  11029. t->ServerBuild = PackGetInt(p, "ServerBuild");
  11030. t->ClientVer = PackGetInt(p, "ClientVer");
  11031. t->ClientBuild = PackGetInt(p, "ClientBuild");
  11032. t->Type = PackGetInt(p, "Type");
  11033. }
  11034. void OutRpcConnectionInfo(PACK *p, RPC_CONNECTION_INFO *t)
  11035. {
  11036. // Validate arguments
  11037. if (t == NULL || p == NULL)
  11038. {
  11039. return;
  11040. }
  11041. PackAddStr(p, "Name", t->Name);
  11042. PackAddIp32(p, "Ip", t->Ip);
  11043. PackAddInt(p, "Port", t->Port);
  11044. PackAddTime64(p, "ConnectedTime", t->ConnectedTime);
  11045. PackAddStr(p, "Hostname", t->Hostname);
  11046. PackAddStr(p, "ServerStr", t->ServerStr);
  11047. PackAddStr(p, "ClientStr", t->ClientStr);
  11048. PackAddInt(p, "ServerVer", t->ServerVer);
  11049. PackAddInt(p, "ServerBuild", t->ServerBuild);
  11050. PackAddInt(p, "ClientVer", t->ClientVer);
  11051. PackAddInt(p, "ClientBuild", t->ClientBuild);
  11052. PackAddInt(p, "Type", t->Type);
  11053. }
  11054. // RPC_SET_HUB_ONLINE
  11055. void InRpcSetHubOnline(RPC_SET_HUB_ONLINE *t, PACK *p)
  11056. {
  11057. // Validate arguments
  11058. if (t == NULL || p == NULL)
  11059. {
  11060. return;
  11061. }
  11062. Zero(t, sizeof(RPC_SET_HUB_ONLINE));
  11063. PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
  11064. t->Online = PackGetBool(p, "Online");
  11065. }
  11066. void OutRpcSetHubOnline(PACK *p, RPC_SET_HUB_ONLINE *t)
  11067. {
  11068. // Validate arguments
  11069. if (t == NULL || p == NULL)
  11070. {
  11071. return;
  11072. }
  11073. PackAddStr(p, "HubName", t->HubName);
  11074. PackAddBool(p, "Online", t->Online);
  11075. }
  11076. // RPC_HUB_STATUS
  11077. void InRpcHubStatus(RPC_HUB_STATUS *t, PACK *p)
  11078. {
  11079. Zero(t, sizeof(RPC_HUB_STATUS));
  11080. // Validate arguments
  11081. if (t == NULL || p == NULL)
  11082. {
  11083. return;
  11084. }
  11085. PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
  11086. t->Online = PackGetBool(p, "Online");
  11087. t->HubType = PackGetInt(p, "HubType");
  11088. t->NumSessions = PackGetInt(p, "NumSessions");
  11089. t->NumSessionsClient = PackGetInt(p, "NumSessionsClient");
  11090. t->NumSessionsBridge = PackGetInt(p, "NumSessionsBridge");
  11091. t->NumAccessLists = PackGetInt(p, "NumAccessLists");
  11092. t->NumUsers = PackGetInt(p, "NumUsers");
  11093. t->NumGroups = PackGetInt(p, "NumGroups");
  11094. t->NumMacTables = PackGetInt(p, "NumMacTables");
  11095. t->NumIpTables = PackGetInt(p, "NumIpTables");
  11096. t->SecureNATEnabled = PackGetBool(p, "SecureNATEnabled");
  11097. InRpcTraffic(&t->Traffic, p);
  11098. t->LastCommTime = PackGetInt64(p, "LastCommTime");
  11099. t->CreatedTime = PackGetInt64(p, "CreatedTime");
  11100. t->LastLoginTime = PackGetInt64(p, "LastLoginTime");
  11101. t->NumLogin = PackGetInt(p, "NumLogin");
  11102. }
  11103. void OutRpcHubStatus(PACK *p, RPC_HUB_STATUS *t)
  11104. {
  11105. // Validate arguments
  11106. if (t == NULL || p == NULL)
  11107. {
  11108. return;
  11109. }
  11110. PackAddStr(p, "HubName", t->HubName);
  11111. PackAddBool(p, "Online", t->Online);
  11112. PackAddInt(p, "HubType", t->HubType);
  11113. PackAddInt(p, "NumSessions", t->NumSessions);
  11114. PackAddInt(p, "NumSessionsClient", t->NumSessionsClient);
  11115. PackAddInt(p, "NumSessionsBridge", t->NumSessionsBridge);
  11116. PackAddInt(p, "NumAccessLists", t->NumAccessLists);
  11117. PackAddInt(p, "NumUsers", t->NumUsers);
  11118. PackAddInt(p, "NumGroups", t->NumGroups);
  11119. PackAddInt(p, "NumMacTables", t->NumMacTables);
  11120. PackAddInt(p, "NumIpTables", t->NumIpTables);
  11121. PackAddBool(p, "SecureNATEnabled", t->SecureNATEnabled);
  11122. OutRpcTraffic(p, &t->Traffic);
  11123. PackAddTime64(p, "LastCommTime", t->LastCommTime);
  11124. PackAddTime64(p, "CreatedTime", t->CreatedTime);
  11125. PackAddTime64(p, "LastLoginTime", t->LastLoginTime);
  11126. PackAddInt(p, "NumLogin", t->NumLogin);
  11127. }
  11128. // RPC_HUB_LOG
  11129. void InRpcHubLog(RPC_HUB_LOG *t, PACK *p)
  11130. {
  11131. UINT i;
  11132. // Validate arguments
  11133. if (t == NULL || p == NULL)
  11134. {
  11135. return;
  11136. }
  11137. Zero(t, sizeof(RPC_HUB_LOG));
  11138. PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
  11139. t->LogSetting.SaveSecurityLog = PackGetBool(p, "SaveSecurityLog");
  11140. t->LogSetting.SecurityLogSwitchType = PackGetInt(p, "SecurityLogSwitchType");
  11141. t->LogSetting.SavePacketLog = PackGetBool(p, "SavePacketLog");
  11142. t->LogSetting.PacketLogSwitchType = PackGetInt(p, "PacketLogSwitchType");
  11143. for (i = 0;i < NUM_PACKET_LOG;i++)
  11144. {
  11145. t->LogSetting.PacketLogConfig[i] = PackGetIntEx(p, "PacketLogConfig", i);
  11146. }
  11147. }
  11148. void OutRpcHubLog(PACK *p, RPC_HUB_LOG *t)
  11149. {
  11150. UINT i;
  11151. // Validate arguments
  11152. if (t == NULL || p == NULL)
  11153. {
  11154. return;
  11155. }
  11156. PackAddStr(p, "HubName", t->HubName);
  11157. PackAddBool(p, "SaveSecurityLog", t->LogSetting.SaveSecurityLog);
  11158. PackAddInt(p, "SecurityLogSwitchType", t->LogSetting.SecurityLogSwitchType);
  11159. PackAddBool(p, "SavePacketLog", t->LogSetting.SavePacketLog);
  11160. PackAddInt(p, "PacketLogSwitchType", t->LogSetting.PacketLogSwitchType);
  11161. for (i = 0;i < NUM_PACKET_LOG;i++)
  11162. {
  11163. PackAddIntEx(p, "PacketLogConfig", t->LogSetting.PacketLogConfig[i], i, NUM_PACKET_LOG);
  11164. }
  11165. }
  11166. // RPC_HUB_ADD_CA
  11167. void InRpcHubAddCa(RPC_HUB_ADD_CA *t, PACK *p)
  11168. {
  11169. // Validate arguments
  11170. if (t == NULL || p == NULL)
  11171. {
  11172. return;
  11173. }
  11174. Zero(t, sizeof(RPC_HUB_ADD_CA));
  11175. PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
  11176. t->Cert = PackGetX(p, "Cert");
  11177. }
  11178. void OutRpcHubAddCa(PACK *p, RPC_HUB_ADD_CA *t)
  11179. {
  11180. // Validate arguments
  11181. if (t == NULL || p == NULL)
  11182. {
  11183. return;
  11184. }
  11185. PackAddStr(p, "HubName", t->HubName);
  11186. PackAddX(p, "Cert", t->Cert);
  11187. }
  11188. void FreeRpcHubAddCa(RPC_HUB_ADD_CA *t)
  11189. {
  11190. // Validate arguments
  11191. if (t == NULL)
  11192. {
  11193. return;
  11194. }
  11195. FreeX(t->Cert);
  11196. }
  11197. // RPC_HUB_ENUM_CA
  11198. void InRpcHubEnumCa(RPC_HUB_ENUM_CA *t, PACK *p)
  11199. {
  11200. UINT i;
  11201. // Validate arguments
  11202. if (t == NULL || p == NULL)
  11203. {
  11204. return;
  11205. }
  11206. Zero(t, sizeof(RPC_HUB_ENUM_CA));
  11207. PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
  11208. t->NumCa = PackGetIndexCount(p, "Key");
  11209. t->Ca = ZeroMalloc(sizeof(RPC_HUB_ENUM_CA_ITEM) * t->NumCa);
  11210. for (i = 0;i < t->NumCa;i++)
  11211. {
  11212. RPC_HUB_ENUM_CA_ITEM *e = &t->Ca[i];
  11213. e->Key = PackGetIntEx(p, "Key", i);
  11214. PackGetUniStrEx(p, "SubjectName", e->SubjectName, sizeof(e->SubjectName), i);
  11215. PackGetUniStrEx(p, "IssuerName", e->IssuerName, sizeof(e->IssuerName), i);
  11216. e->Expires = PackGetInt64Ex(p, "Expires", i);
  11217. }
  11218. }
  11219. void OutRpcHubEnumCa(PACK *p, RPC_HUB_ENUM_CA *t)
  11220. {
  11221. UINT i;
  11222. // Validate arguments
  11223. if (t == NULL || p == NULL)
  11224. {
  11225. return;
  11226. }
  11227. PackAddStr(p, "HubName", t->HubName);
  11228. PackSetCurrentJsonGroupName(p, "CAList");
  11229. for (i = 0;i < t->NumCa;i++)
  11230. {
  11231. RPC_HUB_ENUM_CA_ITEM *e = &t->Ca[i];
  11232. PackAddIntEx(p, "Key", e->Key, i, t->NumCa);
  11233. PackAddUniStrEx(p, "SubjectName", e->SubjectName, i, t->NumCa);
  11234. PackAddUniStrEx(p, "IssuerName", e->IssuerName, i, t->NumCa);
  11235. PackAddTime64Ex(p, "Expires", e->Expires, i, t->NumCa);
  11236. }
  11237. PackSetCurrentJsonGroupName(p, NULL);
  11238. }
  11239. void FreeRpcHubEnumCa(RPC_HUB_ENUM_CA *t)
  11240. {
  11241. // Validate arguments
  11242. if (t == NULL)
  11243. {
  11244. return;
  11245. }
  11246. Free(t->Ca);
  11247. }
  11248. // RPC_HUB_GET_CA
  11249. void InRpcHubGetCa(RPC_HUB_GET_CA *t, PACK *p)
  11250. {
  11251. // Validate arguments
  11252. if (t == NULL || p == NULL)
  11253. {
  11254. return;
  11255. }
  11256. Zero(t, sizeof(RPC_HUB_GET_CA));
  11257. PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
  11258. t->Key = PackGetInt(p, "Key");
  11259. t->Cert = PackGetX(p, "Cert");
  11260. }
  11261. void OutRpcHubGetCa(PACK *p, RPC_HUB_GET_CA *t)
  11262. {
  11263. // Validate arguments
  11264. if (t == NULL || p == NULL)
  11265. {
  11266. return;
  11267. }
  11268. PackAddStr(p, "HubName", t->HubName);
  11269. PackAddInt(p, "Key", t->Key);
  11270. PackAddX(p, "Cert", t->Cert);
  11271. }
  11272. void FreeRpcHubGetCa(RPC_HUB_GET_CA *t)
  11273. {
  11274. // Validate arguments
  11275. if (t == NULL)
  11276. {
  11277. return;
  11278. }
  11279. FreeX(t->Cert);
  11280. }
  11281. // RPC_HUB_DELETE_CA
  11282. void InRpcHubDeleteCa(RPC_HUB_DELETE_CA *t, PACK *p)
  11283. {
  11284. // Validate arguments
  11285. if (t == NULL || p == NULL)
  11286. {
  11287. return;
  11288. }
  11289. Zero(t, sizeof(RPC_HUB_DELETE_CA));
  11290. PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
  11291. t->Key = PackGetInt(p, "Key");
  11292. }
  11293. void OutRpcHubDeleteCa(PACK *p, RPC_HUB_DELETE_CA *t)
  11294. {
  11295. // Validate arguments
  11296. if (t == NULL || p == NULL)
  11297. {
  11298. return;
  11299. }
  11300. PackAddStr(p, "HubName", t->HubName);
  11301. PackAddInt(p, "Key", t->Key);
  11302. }
  11303. // RPC_CREATE_LINK
  11304. void InRpcCreateLink(RPC_CREATE_LINK *t, PACK *p)
  11305. {
  11306. BUF *b;
  11307. // Validate arguments
  11308. if (t == NULL || p == NULL)
  11309. {
  11310. return;
  11311. }
  11312. Zero(t, sizeof(RPC_CREATE_LINK));
  11313. PackGetStr(p, "HubName_Ex", t->HubName, sizeof(t->HubName));
  11314. t->Online = PackGetBool(p, "Online");
  11315. t->ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
  11316. InRpcClientOption(t->ClientOption, p);
  11317. t->ClientAuth = ZeroMalloc(sizeof(CLIENT_AUTH));
  11318. InRpcClientAuth(t->ClientAuth, p);
  11319. InRpcPolicy(&t->Policy, p);
  11320. t->CheckServerCert = PackGetBool(p, "CheckServerCert");
  11321. b = PackGetBuf(p, "ServerCert");
  11322. if (b != NULL)
  11323. {
  11324. t->ServerCert = BufToX(b, false);
  11325. FreeBuf(b);
  11326. }
  11327. }
  11328. void OutRpcCreateLink(PACK *p, RPC_CREATE_LINK *t)
  11329. {
  11330. // Validate arguments
  11331. if (t == NULL || p == NULL)
  11332. {
  11333. return;
  11334. }
  11335. PackAddStr(p, "HubName_Ex",t->HubName);
  11336. PackAddBool(p, "Online", t->Online);
  11337. OutRpcClientOption(p, t->ClientOption);
  11338. OutRpcClientAuth(p, t->ClientAuth);
  11339. OutRpcPolicy(p, &t->Policy);
  11340. PackAddBool(p, "CheckServerCert", t->CheckServerCert);
  11341. if (t->ServerCert != NULL)
  11342. {
  11343. BUF *b;
  11344. b = XToBuf(t->ServerCert, false);
  11345. PackAddBuf(p, "ServerCert", b);
  11346. FreeBuf(b);
  11347. }
  11348. }
  11349. void FreeRpcCreateLink(RPC_CREATE_LINK *t)
  11350. {
  11351. // Validate arguments
  11352. if (t == NULL)
  11353. {
  11354. return;
  11355. }
  11356. if (t->ServerCert != NULL)
  11357. {
  11358. FreeX(t->ServerCert);
  11359. }
  11360. Free(t->ClientOption);
  11361. CiFreeClientAuth(t->ClientAuth);
  11362. }
  11363. // RPC_ENUM_LINK
  11364. void InRpcEnumLink(RPC_ENUM_LINK *t, PACK *p)
  11365. {
  11366. UINT i;
  11367. // Validate arguments
  11368. if (t == NULL || p == NULL)
  11369. {
  11370. return;
  11371. }
  11372. Zero(t, sizeof(RPC_ENUM_LINK));
  11373. PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
  11374. t->NumLink = PackGetIndexCount(p, "AccountName");
  11375. t->Links = ZeroMalloc(sizeof(RPC_ENUM_LINK_ITEM) * t->NumLink);
  11376. for (i = 0;i < t->NumLink;i++)
  11377. {
  11378. RPC_ENUM_LINK_ITEM *e = &t->Links[i];
  11379. PackGetUniStrEx(p, "AccountName", e->AccountName, sizeof(e->AccountName), i);
  11380. PackGetStrEx(p, "Hostname", e->Hostname, sizeof(e->Hostname), i);
  11381. PackGetStrEx(p, "ConnectedHubName", e->HubName, sizeof(e->HubName), i);
  11382. e->Online = PackGetBoolEx(p, "Online", i);
  11383. e->ConnectedTime = PackGetInt64Ex(p, "ConnectedTime", i);
  11384. e->Connected = PackGetBoolEx(p, "Connected", i);
  11385. e->LastError = PackGetIntEx(p, "LastError", i);
  11386. PackGetStrEx(p, "LinkHubName", e->HubName, sizeof(e->HubName), i);
  11387. }
  11388. }
  11389. void OutRpcEnumLink(PACK *p, RPC_ENUM_LINK *t)
  11390. {
  11391. UINT i;
  11392. // Validate arguments
  11393. if (t == NULL || p == NULL)
  11394. {
  11395. return;
  11396. }
  11397. PackAddStr(p, "HubName", t->HubName);
  11398. PackSetCurrentJsonGroupName(p, "LinkList");
  11399. for (i = 0;i < t->NumLink;i++)
  11400. {
  11401. RPC_ENUM_LINK_ITEM *e = &t->Links[i];
  11402. PackAddUniStrEx(p, "AccountName", e->AccountName, i, t->NumLink);
  11403. PackAddStrEx(p, "ConnectedHubName", e->HubName, i, t->NumLink);
  11404. PackAddStrEx(p, "Hostname", e->Hostname, i, t->NumLink);
  11405. PackAddBoolEx(p, "Online", e->Online, i, t->NumLink);
  11406. PackAddTime64Ex(p, "ConnectedTime", e->ConnectedTime, i, t->NumLink);
  11407. PackAddBoolEx(p, "Connected", e->Connected, i, t->NumLink);
  11408. PackAddIntEx(p, "LastError", e->LastError, i, t->NumLink);
  11409. PackAddStrEx(p, "TargetHubName", e->HubName, i, t->NumLink);
  11410. }
  11411. PackSetCurrentJsonGroupName(p, NULL);
  11412. }
  11413. void FreeRpcEnumLink(RPC_ENUM_LINK *t)
  11414. {
  11415. // Validate arguments
  11416. if (t == NULL)
  11417. {
  11418. return;
  11419. }
  11420. Free(t->Links);
  11421. }
  11422. // RPC_LINK_STATUS
  11423. void InRpcLinkStatus(RPC_LINK_STATUS *t, PACK *p)
  11424. {
  11425. // Validate arguments
  11426. if (t == NULL || p == NULL)
  11427. {
  11428. return;
  11429. }
  11430. Zero(t, sizeof(RPC_LINK_STATUS));
  11431. PackGetStr(p, "HubName_Ex", t->HubName, sizeof(t->HubName));
  11432. PackGetUniStr(p, "AccountName", t->AccountName, sizeof(t->AccountName));
  11433. InRpcClientGetConnectionStatus(&t->Status, p);
  11434. }
  11435. void OutRpcLinkStatus(PACK *p, RPC_LINK_STATUS *t)
  11436. {
  11437. // Validate arguments
  11438. if (t == NULL || p == NULL)
  11439. {
  11440. return;
  11441. }
  11442. PackAddStr(p, "HubName_Ex", t->HubName);
  11443. PackAddUniStr(p, "AccountName", t->AccountName);
  11444. OutRpcClientGetConnectionStatus(p, &t->Status);
  11445. }
  11446. void FreeRpcLinkStatus(RPC_LINK_STATUS *t)
  11447. {
  11448. // Validate arguments
  11449. if (t == NULL)
  11450. {
  11451. return;
  11452. }
  11453. CiFreeClientGetConnectionStatus(&t->Status);
  11454. }
  11455. // RPC_LINK
  11456. void InRpcLink(RPC_LINK *t, PACK *p)
  11457. {
  11458. // Validate arguments
  11459. if (t == NULL || p == NULL)
  11460. {
  11461. return;
  11462. }
  11463. Zero(t, sizeof(RPC_LINK));
  11464. PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
  11465. PackGetUniStr(p, "AccountName", t->AccountName, sizeof(t->AccountName));
  11466. }
  11467. void OutRpcLink(PACK *p, RPC_LINK *t)
  11468. {
  11469. // Validate arguments
  11470. if (t == NULL)
  11471. {
  11472. return;
  11473. }
  11474. PackAddStr(p, "HubName", t->HubName);
  11475. PackAddUniStr(p, "AccountName", t->AccountName);
  11476. }
  11477. // RPC_RENAME_LINK
  11478. void InRpcRenameLink(RPC_RENAME_LINK *t, PACK *p)
  11479. {
  11480. // Validate arguments
  11481. if (t == NULL || p == NULL)
  11482. {
  11483. return;
  11484. }
  11485. Zero(t, sizeof(RPC_RENAME_LINK));
  11486. PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
  11487. PackGetUniStr(p, "OldAccountName", t->OldAccountName, sizeof(t->OldAccountName));
  11488. PackGetUniStr(p, "NewAccountName", t->NewAccountName, sizeof(t->NewAccountName));
  11489. }
  11490. void OutRpcRenameLink(PACK *p, RPC_RENAME_LINK *t)
  11491. {
  11492. // Validate arguments
  11493. if (p == NULL || t == NULL)
  11494. {
  11495. return;
  11496. }
  11497. PackAddStr(p, "HubName", t->HubName);
  11498. PackAddUniStr(p, "OldAccountName", t->OldAccountName);
  11499. PackAddUniStr(p, "NewAccountName", t->NewAccountName);
  11500. }
  11501. // ACCESS
  11502. void InRpcAccessEx(ACCESS *a, PACK *p, UINT index)
  11503. {
  11504. // Validate arguments
  11505. if (a == NULL || p == NULL)
  11506. {
  11507. return;
  11508. }
  11509. Zero(a, sizeof(ACCESS));
  11510. a->Id = PackGetIntEx(p, "Id", index);
  11511. PackGetUniStrEx(p, "Note", a->Note, sizeof(a->Note), index);
  11512. a->Active = PackGetBoolEx(p, "Active", index);
  11513. a->Priority = PackGetIntEx(p, "Priority", index);
  11514. a->Discard = PackGetBoolEx(p, "Discard", index);
  11515. a->SrcIpAddress = PackGetIp32Ex(p, "SrcIpAddress", index);
  11516. a->SrcSubnetMask = PackGetIp32Ex(p, "SrcSubnetMask", index);
  11517. a->DestIpAddress = PackGetIp32Ex(p, "DestIpAddress", index);
  11518. a->DestSubnetMask = PackGetIp32Ex(p, "DestSubnetMask", index);
  11519. a->Protocol = PackGetIntEx(p, "Protocol", index);
  11520. a->SrcPortStart = PackGetIntEx(p, "SrcPortStart", index);
  11521. a->SrcPortEnd = PackGetIntEx(p, "SrcPortEnd", index);
  11522. a->DestPortStart = PackGetIntEx(p, "DestPortStart", index);
  11523. a->DestPortEnd = PackGetIntEx(p, "DestPortEnd", index);
  11524. //a->SrcUsernameHash = PackGetIntEx(p, "SrcUsernameHash", index);
  11525. PackGetStrEx(p, "SrcUsername", a->SrcUsername, sizeof(a->SrcUsername), index);
  11526. //a->DestUsernameHash = PackGetIntEx(p, "DestUsernameHash", index);
  11527. PackGetStrEx(p, "DestUsername", a->DestUsername, sizeof(a->DestUsername), index);
  11528. a->CheckSrcMac = PackGetBoolEx(p, "CheckSrcMac", index);
  11529. PackGetDataEx2(p, "SrcMacAddress", a->SrcMacAddress, sizeof(a->SrcMacAddress), index);
  11530. PackGetDataEx2(p, "SrcMacMask", a->SrcMacMask, sizeof(a->SrcMacMask), index);
  11531. a->CheckDstMac = PackGetBoolEx(p, "CheckDstMac", index);
  11532. PackGetDataEx2(p, "DstMacAddress", a->DstMacAddress, sizeof(a->DstMacAddress), index);
  11533. PackGetDataEx2(p, "DstMacMask", a->DstMacMask, sizeof(a->DstMacMask), index);
  11534. a->CheckTcpState = PackGetBoolEx(p, "CheckTcpState", index);
  11535. a->Established = PackGetBoolEx(p, "Established", index);
  11536. a->Delay = PackGetIntEx(p, "Delay", index);
  11537. a->Jitter = PackGetIntEx(p, "Jitter", index);
  11538. a->Loss = PackGetIntEx(p, "Loss", index);
  11539. a->IsIPv6 = PackGetBoolEx(p, "IsIPv6", index);
  11540. a->UniqueId = PackGetIntEx(p, "UniqueId", index);
  11541. PackGetStrEx(p, "RedirectUrl", a->RedirectUrl, sizeof(a->RedirectUrl), index);
  11542. if (a->IsIPv6)
  11543. {
  11544. PackGetIp6AddrEx(p, "SrcIpAddress6", &a->SrcIpAddress6, index);
  11545. PackGetIp6AddrEx(p, "SrcSubnetMask6", &a->SrcSubnetMask6, index);
  11546. PackGetIp6AddrEx(p, "DestIpAddress6", &a->DestIpAddress6, index);
  11547. PackGetIp6AddrEx(p, "DestSubnetMask6", &a->DestSubnetMask6, index);
  11548. }
  11549. }
  11550. void InRpcAccess(ACCESS *a, PACK *p)
  11551. {
  11552. // Validate arguments
  11553. if (a == NULL || p == NULL)
  11554. {
  11555. return;
  11556. }
  11557. InRpcAccessEx(a, p, 0);
  11558. }
  11559. void OutRpcAccessEx(PACK *p, ACCESS *a, UINT index, UINT total)
  11560. {
  11561. // Validate arguments
  11562. if (a == NULL || p == NULL)
  11563. {
  11564. return;
  11565. }
  11566. PackAddIntEx(p, "Id", a->Id, index, total);
  11567. PackAddUniStrEx(p, "Note", a->Note, index, total);
  11568. PackAddBoolEx(p, "Active", a->Active, index, total);
  11569. PackAddIntEx(p, "Priority", a->Priority, index, total);
  11570. PackAddBoolEx(p, "Discard", a->Discard, index, total);
  11571. if (a->IsIPv6)
  11572. {
  11573. PackAddIp32Ex(p, "SrcIpAddress", 0xFDFFFFDF, index, total);
  11574. PackAddIp32Ex(p, "SrcSubnetMask", 0xFFFFFFFF, index, total);
  11575. PackAddIp32Ex(p, "DestIpAddress", 0xFDFFFFDF, index, total);
  11576. PackAddIp32Ex(p, "DestSubnetMask", 0xFFFFFFFF, index, total);
  11577. }
  11578. else
  11579. {
  11580. PackAddIp32Ex(p, "SrcIpAddress", a->SrcIpAddress, index, total);
  11581. PackAddIp32Ex(p, "SrcSubnetMask", a->SrcSubnetMask, index, total);
  11582. PackAddIp32Ex(p, "DestIpAddress", a->DestIpAddress, index, total);
  11583. PackAddIp32Ex(p, "DestSubnetMask", a->DestSubnetMask, index, total);
  11584. }
  11585. PackAddIntEx(p, "Protocol", a->Protocol, index, total);
  11586. PackAddIntEx(p, "SrcPortStart", a->SrcPortStart, index, total);
  11587. PackAddIntEx(p, "SrcPortEnd", a->SrcPortEnd, index, total);
  11588. PackAddIntEx(p, "DestPortStart", a->DestPortStart, index, total);
  11589. PackAddIntEx(p, "DestPortEnd", a->DestPortEnd, index, total);
  11590. //PackAddIntEx(p, "SrcUsernameHash", a->SrcUsernameHash, index, total);
  11591. PackAddStrEx(p, "SrcUsername", a->SrcUsername, index, total);
  11592. //PackAddIntEx(p, "DestUsernameHash", a->DestUsernameHash, index, total);
  11593. PackAddStrEx(p, "DestUsername", a->DestUsername, index, total);
  11594. PackAddBoolEx(p, "CheckSrcMac", a->CheckSrcMac, index, total);
  11595. PackAddDataEx(p, "SrcMacAddress", a->SrcMacAddress, sizeof(a->SrcMacAddress), index, total);
  11596. PackAddDataEx(p, "SrcMacMask", a->SrcMacMask, sizeof(a->SrcMacMask), index, total);
  11597. PackAddBoolEx(p, "CheckDstMac", a->CheckDstMac, index, total);
  11598. PackAddDataEx(p, "DstMacAddress", a->DstMacAddress, sizeof(a->DstMacAddress), index, total);
  11599. PackAddDataEx(p, "DstMacMask", a->DstMacMask, sizeof(a->DstMacMask), index, total);
  11600. PackAddBoolEx(p, "CheckTcpState", a->CheckTcpState, index, total);
  11601. PackAddBoolEx(p, "Established", a->Established, index, total);
  11602. PackAddIntEx(p, "Delay", a->Delay, index, total);
  11603. PackAddIntEx(p, "Jitter", a->Jitter, index, total);
  11604. PackAddIntEx(p, "Loss", a->Loss, index, total);
  11605. PackAddBoolEx(p, "IsIPv6", a->IsIPv6, index, total);
  11606. PackAddIntEx(p, "UniqueId", a->UniqueId, index, total);
  11607. PackAddStrEx(p, "RedirectUrl", a->RedirectUrl, index, total);
  11608. if (a->IsIPv6)
  11609. {
  11610. PackAddIp6AddrEx(p, "SrcIpAddress6", &a->SrcIpAddress6, index, total);
  11611. PackAddIp6AddrEx(p, "SrcSubnetMask6", &a->SrcSubnetMask6, index, total);
  11612. PackAddIp6AddrEx(p, "DestIpAddress6", &a->DestIpAddress6, index, total);
  11613. PackAddIp6AddrEx(p, "DestSubnetMask6", &a->DestSubnetMask6, index, total);
  11614. }
  11615. else
  11616. {
  11617. IPV6_ADDR zero;
  11618. Zero(&zero, sizeof(zero));
  11619. PackAddIp6AddrEx(p, "SrcIpAddress6", &zero, index, total);
  11620. PackAddIp6AddrEx(p, "SrcSubnetMask6", &zero, index, total);
  11621. PackAddIp6AddrEx(p, "DestIpAddress6", &zero, index, total);
  11622. PackAddIp6AddrEx(p, "DestSubnetMask6", &zero, index, total);
  11623. }
  11624. }
  11625. void OutRpcAccess(PACK *p, ACCESS *a)
  11626. {
  11627. // Validate arguments
  11628. if (a == NULL || p == NULL)
  11629. {
  11630. return;
  11631. }
  11632. OutRpcAccessEx(p, a, 0, 1);
  11633. }
  11634. // RPC_ENUM_ACCESS_LIST
  11635. void InRpcEnumAccessList(RPC_ENUM_ACCESS_LIST *a, PACK *p)
  11636. {
  11637. UINT i;
  11638. // Validate arguments
  11639. if (a == NULL || p == NULL)
  11640. {
  11641. return;
  11642. }
  11643. Zero(a, sizeof(RPC_ENUM_ACCESS_LIST));
  11644. PackGetStr(p, "HubName", a->HubName, sizeof(a->HubName));
  11645. a->NumAccess = PackGetIndexCount(p, "Protocol");
  11646. a->Accesses = ZeroMalloc(sizeof(ACCESS) * a->NumAccess);
  11647. for (i = 0;i < a->NumAccess;i++)
  11648. {
  11649. ACCESS *e = &a->Accesses[i];
  11650. InRpcAccessEx(e, p, i);
  11651. }
  11652. }
  11653. void OutRpcEnumAccessList(PACK *p, RPC_ENUM_ACCESS_LIST *a)
  11654. {
  11655. UINT i;
  11656. // Validate arguments
  11657. if (a == NULL || p == NULL)
  11658. {
  11659. return;
  11660. }
  11661. PackAddStr(p, "HubName", a->HubName);
  11662. PackSetCurrentJsonGroupName(p, "AccessList");
  11663. for (i = 0;i < a->NumAccess;i++)
  11664. {
  11665. ACCESS *e = &a->Accesses[i];
  11666. OutRpcAccessEx(p, e, i, a->NumAccess);
  11667. }
  11668. PackSetCurrentJsonGroupName(p, NULL);
  11669. }
  11670. void FreeRpcEnumAccessList(RPC_ENUM_ACCESS_LIST *a)
  11671. {
  11672. // Validate arguments
  11673. if (a == NULL)
  11674. {
  11675. return;
  11676. }
  11677. Free(a->Accesses);
  11678. }
  11679. // AUTHDATA
  11680. void *InRpcAuthData(PACK *p, UINT *authtype, char *username)
  11681. {
  11682. wchar_t tmp[MAX_SIZE];
  11683. AUTHPASSWORD *pw;
  11684. AUTHUSERCERT *usercert;
  11685. AUTHROOTCERT *rootcert;
  11686. AUTHRADIUS *radius;
  11687. AUTHNT *nt;
  11688. BUF *b;
  11689. char plain_pw[MAX_SIZE];
  11690. // Validate arguments
  11691. if (p == NULL)
  11692. {
  11693. return NULL;
  11694. }
  11695. if (authtype == NULL)
  11696. {
  11697. return NULL;
  11698. }
  11699. *authtype = PackGetInt(p, "AuthType");
  11700. switch (*authtype)
  11701. {
  11702. case AUTHTYPE_PASSWORD:
  11703. pw = ZeroMalloc(sizeof(AUTHPASSWORD));
  11704. PackGetData2(p, "HashedKey", pw->HashedKey, sizeof(pw->HashedKey));
  11705. PackGetData2(p, "NtLmSecureHash", pw->NtLmSecureHash, sizeof(pw->NtLmSecureHash));
  11706. if (PackGetStr(p, "Auth_Password", plain_pw, sizeof(plain_pw)))
  11707. {
  11708. if (IsZero(pw->HashedKey, sizeof(pw->HashedKey)))
  11709. {
  11710. HashPassword(pw->HashedKey, username, plain_pw);
  11711. GenerateNtPasswordHash(pw->NtLmSecureHash, plain_pw);
  11712. }
  11713. }
  11714. return pw;
  11715. case AUTHTYPE_USERCERT:
  11716. usercert = ZeroMalloc(sizeof(AUTHUSERCERT));
  11717. usercert->UserX = PackGetX(p, "UserX");
  11718. return usercert;
  11719. case AUTHTYPE_ROOTCERT:
  11720. rootcert = ZeroMalloc(sizeof(AUTHROOTCERT));
  11721. b = PackGetBuf(p, "Serial");
  11722. if (b != NULL)
  11723. {
  11724. rootcert->Serial = NewXSerial(b->Buf, b->Size);
  11725. FreeBuf(b);
  11726. }
  11727. if (PackGetUniStr(p, "CommonName", tmp, sizeof(tmp)))
  11728. {
  11729. rootcert->CommonName = CopyUniStr(tmp);
  11730. }
  11731. return rootcert;
  11732. case AUTHTYPE_RADIUS:
  11733. radius = ZeroMalloc(sizeof(AUTHRADIUS));
  11734. if (PackGetUniStr(p, "RadiusUsername", tmp, sizeof(tmp)))
  11735. {
  11736. radius->RadiusUsername = CopyUniStr(tmp);
  11737. }
  11738. else
  11739. {
  11740. radius->RadiusUsername = CopyUniStr(L"");
  11741. }
  11742. return radius;
  11743. case AUTHTYPE_NT:
  11744. nt = ZeroMalloc(sizeof(AUTHNT));
  11745. if (PackGetUniStr(p, "NtUsername", tmp, sizeof(tmp)))
  11746. {
  11747. nt->NtUsername = CopyUniStr(tmp);
  11748. }
  11749. else
  11750. {
  11751. nt->NtUsername = CopyUniStr(L"");
  11752. }
  11753. return nt;
  11754. }
  11755. return NULL;
  11756. }
  11757. void OutRpcAuthData(PACK *p, void *authdata, UINT authtype)
  11758. {
  11759. AUTHPASSWORD *pw = authdata;
  11760. AUTHUSERCERT *usercert = authdata;
  11761. AUTHROOTCERT *rootcert = authdata;
  11762. AUTHRADIUS *radius = authdata;
  11763. AUTHNT *nt = authdata;
  11764. // Validate arguments
  11765. if (p == NULL)
  11766. {
  11767. return;
  11768. }
  11769. PackAddInt(p, "AuthType", authtype);
  11770. switch (authtype)
  11771. {
  11772. case AUTHTYPE_PASSWORD:
  11773. PackAddData(p, "HashedKey", pw->HashedKey, sizeof(pw->HashedKey));
  11774. PackAddData(p, "NtLmSecureHash", pw->NtLmSecureHash, sizeof(pw->NtLmSecureHash));
  11775. break;
  11776. case AUTHTYPE_USERCERT:
  11777. PackAddX(p, "UserX", usercert->UserX);
  11778. break;
  11779. case AUTHTYPE_ROOTCERT:
  11780. if (rootcert->Serial != NULL)
  11781. {
  11782. PackAddData(p, "Serial", rootcert->Serial->data, rootcert->Serial->size);
  11783. }
  11784. if (rootcert->CommonName != NULL)
  11785. {
  11786. PackAddUniStr(p, "CommonName", rootcert->CommonName);
  11787. }
  11788. break;
  11789. case AUTHTYPE_RADIUS:
  11790. PackAddUniStr(p, "RadiusUsername", radius->RadiusUsername);
  11791. break;
  11792. case AUTHTYPE_NT:
  11793. PackAddUniStr(p, "NtUsername", nt->NtUsername);
  11794. break;
  11795. }
  11796. }
  11797. void FreeRpcAuthData(void *authdata, UINT authtype)
  11798. {
  11799. FreeAuthData(authtype, authdata);
  11800. }
  11801. // RPC_SET_USER
  11802. void InRpcSetUser(RPC_SET_USER *t, PACK *p)
  11803. {
  11804. // Validate arguments
  11805. if (t == NULL || p == NULL)
  11806. {
  11807. return;
  11808. }
  11809. Zero(t, sizeof(RPC_SET_USER));
  11810. PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
  11811. PackGetStr(p, "Name", t->Name, sizeof(t->Name));
  11812. PackGetStr(p, "GroupName", t->GroupName, sizeof(t->GroupName));
  11813. PackGetUniStr(p, "Realname", t->Realname, sizeof(t->Realname));
  11814. PackGetUniStr(p, "Note", t->Note, sizeof(t->Note));
  11815. t->CreatedTime = PackGetInt64(p, "CreatedTime");
  11816. t->UpdatedTime = PackGetInt64(p, "UpdatedTime");
  11817. t->ExpireTime = PackGetInt64(p, "ExpireTime");
  11818. t->AuthData = InRpcAuthData(p, &t->AuthType, t->Name);
  11819. t->NumLogin = PackGetInt(p, "NumLogin");
  11820. InRpcTraffic(&t->Traffic, p);
  11821. if (PackGetBool(p, "UsePolicy"))
  11822. {
  11823. t->Policy = ZeroMalloc(sizeof(POLICY));
  11824. InRpcPolicy(t->Policy, p);
  11825. }
  11826. }
  11827. void OutRpcSetUser(PACK *p, RPC_SET_USER *t)
  11828. {
  11829. // Validate arguments
  11830. if (t == NULL || p == NULL)
  11831. {
  11832. return;
  11833. }
  11834. PackAddStr(p, "HubName", t->HubName);
  11835. PackAddStr(p, "Name", t->Name);
  11836. PackAddStr(p, "GroupName", t->GroupName);
  11837. PackAddUniStr(p, "Realname", t->Realname);
  11838. PackAddUniStr(p, "Note", t->Note);
  11839. PackAddTime64(p, "CreatedTime", t->CreatedTime);
  11840. PackAddTime64(p, "UpdatedTime", t->UpdatedTime);
  11841. PackAddTime64(p, "ExpireTime", t->ExpireTime);
  11842. OutRpcAuthData(p, t->AuthData, t->AuthType);
  11843. PackAddInt(p, "NumLogin", t->NumLogin);
  11844. OutRpcTraffic(p, &t->Traffic);
  11845. if (t->Policy != NULL)
  11846. {
  11847. PackAddBool(p, "UsePolicy", true);
  11848. OutRpcPolicy(p, t->Policy);
  11849. }
  11850. }
  11851. void FreeRpcSetUser(RPC_SET_USER *t)
  11852. {
  11853. // Validate arguments
  11854. if (t == NULL)
  11855. {
  11856. return;
  11857. }
  11858. FreeRpcAuthData(t->AuthData, t->AuthType);
  11859. if (t->Policy)
  11860. {
  11861. Free(t->Policy);
  11862. }
  11863. }
  11864. // RPC_ENUM_USER
  11865. void InRpcEnumUser(RPC_ENUM_USER *t, PACK *p)
  11866. {
  11867. UINT i;
  11868. // Validate arguments
  11869. if (t == NULL || p == NULL)
  11870. {
  11871. return;
  11872. }
  11873. Zero(t, sizeof(RPC_ENUM_USER));
  11874. PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
  11875. t->NumUser = PackGetIndexCount(p, "Name");
  11876. t->Users = ZeroMalloc(sizeof(RPC_ENUM_USER_ITEM) * t->NumUser);
  11877. for (i = 0;i < t->NumUser;i++)
  11878. {
  11879. RPC_ENUM_USER_ITEM *e = &t->Users[i];
  11880. PackGetStrEx(p, "Name", e->Name, sizeof(e->Name), i);
  11881. PackGetStrEx(p, "GroupName", e->GroupName, sizeof(e->GroupName), i);
  11882. PackGetUniStrEx(p, "Realname", e->Realname, sizeof(e->Realname), i);
  11883. PackGetUniStrEx(p, "Note", e->Note, sizeof(e->Note), i);
  11884. e->AuthType = PackGetIntEx(p, "AuthType", i);
  11885. e->LastLoginTime = PackGetInt64Ex(p, "LastLoginTime", i);
  11886. e->NumLogin = PackGetIntEx(p, "NumLogin", i);
  11887. e->DenyAccess = PackGetBoolEx(p, "DenyAccess", i);
  11888. e->IsTrafficFilled = PackGetBoolEx(p, "IsTrafficFilled", i);
  11889. InRpcTrafficEx(&e->Traffic, p, i);
  11890. e->IsExpiresFilled = PackGetBoolEx(p, "IsExpiresFilled", i);
  11891. e->Expires = PackGetInt64Ex(p, "Expires", i);
  11892. }
  11893. }
  11894. void OutRpcEnumUser(PACK *p, RPC_ENUM_USER *t)
  11895. {
  11896. UINT i;
  11897. // Validate arguments
  11898. if (t == NULL || p == NULL)
  11899. {
  11900. return;
  11901. }
  11902. PackAddStr(p, "HubName", t->HubName);
  11903. PackSetCurrentJsonGroupName(p, "UserList");
  11904. for (i = 0;i < t->NumUser;i++)
  11905. {
  11906. RPC_ENUM_USER_ITEM *e = &t->Users[i];
  11907. PackAddStrEx(p, "Name", e->Name, i, t->NumUser);
  11908. PackAddStrEx(p, "GroupName", e->GroupName, i, t->NumUser);
  11909. PackAddUniStrEx(p, "Realname", e->Realname, i, t->NumUser);
  11910. PackAddUniStrEx(p, "Note", e->Note, i, t->NumUser);
  11911. PackAddIntEx(p, "AuthType", e->AuthType, i, t->NumUser);
  11912. PackAddTime64Ex(p, "LastLoginTime", e->LastLoginTime, i, t->NumUser);
  11913. PackAddIntEx(p, "NumLogin", e->NumLogin, i, t->NumUser);
  11914. PackAddBoolEx(p, "DenyAccess", e->DenyAccess, i, t->NumUser);
  11915. PackAddBoolEx(p, "IsTrafficFilled", e->IsTrafficFilled, i, t->NumUser);
  11916. OutRpcTrafficEx(&e->Traffic, p, i, t->NumUser);
  11917. PackAddBoolEx(p, "IsExpiresFilled", e->IsExpiresFilled, i, t->NumUser);
  11918. PackAddTime64Ex(p, "Expires", e->Expires, i, t->NumUser);
  11919. }
  11920. PackSetCurrentJsonGroupName(p, NULL);
  11921. }
  11922. void FreeRpcEnumUser(RPC_ENUM_USER *t)
  11923. {
  11924. // Validate arguments
  11925. if (t == NULL)
  11926. {
  11927. return;
  11928. }
  11929. Free(t->Users);
  11930. }
  11931. // RPC_SET_GROUP
  11932. void InRpcSetGroup(RPC_SET_GROUP *t, PACK *p)
  11933. {
  11934. // Validate arguments
  11935. if (t == NULL || p == NULL)
  11936. {
  11937. return;
  11938. }
  11939. Zero(t, sizeof(RPC_SET_GROUP));
  11940. PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
  11941. PackGetStr(p, "Name", t->Name, sizeof(t->Name));
  11942. PackGetUniStr(p, "Realname", t->Realname, sizeof(t->Realname));
  11943. PackGetUniStr(p, "Note", t->Note, sizeof(t->Note));
  11944. InRpcTraffic(&t->Traffic, p);
  11945. if (PackGetBool(p, "UsePolicy"))
  11946. {
  11947. t->Policy = ZeroMalloc(sizeof(POLICY));
  11948. InRpcPolicy(t->Policy, p);
  11949. }
  11950. }
  11951. void OutRpcSetGroup(PACK *p, RPC_SET_GROUP *t)
  11952. {
  11953. // Validate arguments
  11954. if (t == NULL || p == NULL)
  11955. {
  11956. return;
  11957. }
  11958. PackAddStr(p, "HubName", t->HubName);
  11959. PackAddStr(p, "Name", t->Name);
  11960. PackAddUniStr(p, "Realname", t->Realname);
  11961. PackAddUniStr(p, "Note", t->Note);
  11962. OutRpcTraffic(p, &t->Traffic);
  11963. if (t->Policy != NULL)
  11964. {
  11965. PackAddBool(p, "UsePolicy", true);
  11966. OutRpcPolicy(p, t->Policy);
  11967. }
  11968. }
  11969. void FreeRpcSetGroup(RPC_SET_GROUP *t)
  11970. {
  11971. Free(t->Policy);
  11972. }
  11973. // RPC_ENUM_GROUP
  11974. void InRpcEnumGroup(RPC_ENUM_GROUP *t, PACK *p)
  11975. {
  11976. UINT i;
  11977. // Validate arguments
  11978. if (t == NULL || p == NULL)
  11979. {
  11980. return;
  11981. }
  11982. Zero(t, sizeof(RPC_ENUM_GROUP));
  11983. PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
  11984. t->NumGroup = PackGetIndexCount(p, "Name");
  11985. t->Groups = ZeroMalloc(sizeof(RPC_ENUM_GROUP_ITEM) * t->NumGroup);
  11986. for (i = 0;i < t->NumGroup;i++)
  11987. {
  11988. RPC_ENUM_GROUP_ITEM *e = &t->Groups[i];
  11989. PackGetStrEx(p, "Name", e->Name, sizeof(e->Name), i);
  11990. PackGetUniStrEx(p, "Realname", e->Realname, sizeof(e->Realname), i);
  11991. PackGetUniStrEx(p, "Note", e->Note, sizeof(e->Note), i);
  11992. e->NumUsers = PackGetIntEx(p, "NumUsers", i);
  11993. e->DenyAccess = PackGetBoolEx(p, "DenyAccess", i);
  11994. }
  11995. }
  11996. void OutRpcEnumGroup(PACK *p, RPC_ENUM_GROUP *t)
  11997. {
  11998. UINT i;
  11999. // Validate arguments
  12000. if (t == NULL || p == NULL)
  12001. {
  12002. return;
  12003. }
  12004. PackAddStr(p, "HubName", t->HubName);
  12005. PackSetCurrentJsonGroupName(p, "GroupList");
  12006. for (i = 0;i < t->NumGroup;i++)
  12007. {
  12008. RPC_ENUM_GROUP_ITEM *e = &t->Groups[i];
  12009. PackAddStrEx(p, "Name", e->Name, i, t->NumGroup);
  12010. PackAddUniStrEx(p, "Realname", e->Realname, i, t->NumGroup);
  12011. PackAddUniStrEx(p, "Note", e->Note, i, t->NumGroup);
  12012. PackAddIntEx(p, "NumUsers", e->NumUsers, i, t->NumGroup);
  12013. PackAddBoolEx(p, "DenyAccess", e->DenyAccess, i, t->NumGroup);
  12014. }
  12015. PackSetCurrentJsonGroupName(p, NULL);
  12016. }
  12017. void FreeRpcEnumGroup(RPC_ENUM_GROUP *t)
  12018. {
  12019. // Validate arguments
  12020. if (t == NULL)
  12021. {
  12022. return;
  12023. }
  12024. Free(t->Groups);
  12025. }
  12026. // RPC_DELETE_USER
  12027. void InRpcDeleteUser(RPC_DELETE_USER *t, PACK *p)
  12028. {
  12029. // Validate arguments
  12030. if (t == NULL || p == NULL)
  12031. {
  12032. return;
  12033. }
  12034. Zero(t, sizeof(RPC_DELETE_USER));
  12035. PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
  12036. PackGetStr(p, "Name", t->Name, sizeof(t->Name));
  12037. }
  12038. void OutRpcDeleteUser(PACK *p, RPC_DELETE_USER *t)
  12039. {
  12040. // Validate arguments
  12041. if (t == NULL || p == NULL)
  12042. {
  12043. return;
  12044. }
  12045. PackAddStr(p, "HubName", t->HubName);
  12046. PackAddStr(p, "Name", t->Name);
  12047. }
  12048. // RPC_ENUM_SESSION
  12049. void InRpcEnumSession(RPC_ENUM_SESSION *t, PACK *p)
  12050. {
  12051. UINT i;
  12052. // Validate arguments
  12053. if (t == NULL || p == NULL)
  12054. {
  12055. return;
  12056. }
  12057. Zero(t, sizeof(RPC_ENUM_SESSION));
  12058. PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
  12059. t->NumSession = PackGetIndexCount(p, "Name");
  12060. t->Sessions = ZeroMalloc(sizeof(RPC_ENUM_SESSION_ITEM) * t->NumSession);
  12061. for (i = 0;i < t->NumSession;i++)
  12062. {
  12063. RPC_ENUM_SESSION_ITEM *e = &t->Sessions[i];
  12064. PackGetStrEx(p, "Name", e->Name, sizeof(e->Name), i);
  12065. PackGetStrEx(p, "Username", e->Username, sizeof(e->Username), i);
  12066. e->Ip = PackGetIntEx(p, "Ip", i);
  12067. PackGetIpEx(p, "ClientIP", &e->ClientIP, i);
  12068. PackGetStrEx(p, "Hostname", e->Hostname, sizeof(e->Hostname), i);
  12069. e->MaxNumTcp = PackGetIntEx(p, "MaxNumTcp", i);
  12070. e->CurrentNumTcp = PackGetIntEx(p, "CurrentNumTcp", i);
  12071. e->PacketSize = PackGetInt64Ex(p, "PacketSize", i);
  12072. e->PacketNum = PackGetInt64Ex(p, "PacketNum", i);
  12073. e->RemoteSession = PackGetBoolEx(p, "RemoteSession", i);
  12074. e->LinkMode = PackGetBoolEx(p, "LinkMode", i);
  12075. e->SecureNATMode = PackGetBoolEx(p, "SecureNATMode", i);
  12076. e->BridgeMode = PackGetBoolEx(p, "BridgeMode", i);
  12077. e->Layer3Mode = PackGetBoolEx(p, "Layer3Mode", i);
  12078. e->Client_BridgeMode = PackGetBoolEx(p, "Client_BridgeMode", i);
  12079. e->Client_MonitorMode = PackGetBoolEx(p, "Client_MonitorMode", i);
  12080. PackGetStrEx(p, "RemoteHostname", e->RemoteHostname, sizeof(e->RemoteHostname), i);
  12081. e->VLanId = PackGetIntEx(p, "VLanId", i);
  12082. PackGetDataEx2(p, "UniqueId", e->UniqueId, sizeof(e->UniqueId), i);
  12083. e->IsDormantEnabled = PackGetBoolEx(p, "IsDormantEnabled", i);
  12084. e->IsDormant = PackGetBoolEx(p, "IsDormant", i);
  12085. e->LastCommDormant = PackGetInt64Ex(p, "LastCommDormant", i);
  12086. e->CreatedTime = PackGetInt64Ex(p, "CreatedTime", i);
  12087. e->LastCommTime = PackGetInt64Ex(p, "LastCommTime", i);
  12088. }
  12089. }
  12090. void OutRpcEnumSession(PACK *p, RPC_ENUM_SESSION *t)
  12091. {
  12092. UINT i;
  12093. // Validate arguments
  12094. if (t == NULL || p == NULL)
  12095. {
  12096. return;
  12097. }
  12098. PackAddStr(p, "HubName", t->HubName);
  12099. PackSetCurrentJsonGroupName(p, "SessionList");
  12100. for (i = 0;i < t->NumSession;i++)
  12101. {
  12102. RPC_ENUM_SESSION_ITEM *e = &t->Sessions[i];
  12103. PackAddStrEx(p, "Name", e->Name, i, t->NumSession);
  12104. PackAddStrEx(p, "Username", e->Username, i, t->NumSession);
  12105. PackAddIp32Ex(p, "Ip", e->Ip, i, t->NumSession);
  12106. PackAddIpEx(p, "ClientIP", &e->ClientIP, i, t->NumSession);
  12107. PackAddStrEx(p, "Hostname", e->Hostname, i, t->NumSession);
  12108. PackAddIntEx(p, "MaxNumTcp", e->MaxNumTcp, i, t->NumSession);
  12109. PackAddIntEx(p, "CurrentNumTcp", e->CurrentNumTcp, i, t->NumSession);
  12110. PackAddInt64Ex(p, "PacketSize", e->PacketSize, i, t->NumSession);
  12111. PackAddInt64Ex(p, "PacketNum", e->PacketNum, i, t->NumSession);
  12112. PackAddBoolEx(p, "RemoteSession", e->RemoteSession, i, t->NumSession);
  12113. PackAddStrEx(p, "RemoteHostname", e->RemoteHostname, i, t->NumSession);
  12114. PackAddBoolEx(p, "LinkMode", e->LinkMode, i, t->NumSession);
  12115. PackAddBoolEx(p, "SecureNATMode", e->SecureNATMode, i, t->NumSession);
  12116. PackAddBoolEx(p, "BridgeMode", e->BridgeMode, i, t->NumSession);
  12117. PackAddBoolEx(p, "Layer3Mode", e->Layer3Mode, i, t->NumSession);
  12118. PackAddBoolEx(p, "Client_BridgeMode", e->Client_BridgeMode, i, t->NumSession);
  12119. PackAddBoolEx(p, "Client_MonitorMode", e->Client_MonitorMode, i, t->NumSession);
  12120. PackAddIntEx(p, "VLanId", e->VLanId, i, t->NumSession);
  12121. PackAddDataEx(p, "UniqueId", e->UniqueId, sizeof(e->UniqueId), i, t->NumSession);
  12122. PackAddBoolEx(p, "IsDormantEnabled", e->IsDormantEnabled, i, t->NumSession);
  12123. PackAddBoolEx(p, "IsDormant", e->IsDormant, i, t->NumSession);
  12124. PackAddTime64Ex(p, "LastCommDormant", e->LastCommDormant, i, t->NumSession);
  12125. PackAddTime64Ex(p, "CreatedTime", e->CreatedTime, i, t->NumSession);
  12126. PackAddTime64Ex(p, "LastCommTime", e->LastCommTime, i, t->NumSession);
  12127. }
  12128. PackSetCurrentJsonGroupName(p, NULL);
  12129. }
  12130. void FreeRpcEnumSession(RPC_ENUM_SESSION *t)
  12131. {
  12132. // Validate arguments
  12133. if (t == NULL)
  12134. {
  12135. return;
  12136. }
  12137. Free(t->Sessions);
  12138. }
  12139. // RPC_KEY_PAIR
  12140. void InRpcKeyPair(RPC_KEY_PAIR *t, PACK *p)
  12141. {
  12142. // Validate arguments
  12143. if (t == NULL || p == NULL)
  12144. {
  12145. return;
  12146. }
  12147. t->Cert = PackGetX(p, "Cert");
  12148. t->Key = PackGetK(p, "Key");
  12149. t->Flag1 = PackGetInt(p, "Flag1");
  12150. }
  12151. void OutRpcKeyPair(PACK *p, RPC_KEY_PAIR *t)
  12152. {
  12153. // Validate arguments
  12154. if (p == NULL || t == NULL)
  12155. {
  12156. return;
  12157. }
  12158. PackAddX(p, "Cert", t->Cert);
  12159. PackAddK(p, "Key", t->Key);
  12160. PackAddInt(p, "Flag1", t->Flag1);
  12161. }
  12162. void FreeRpcKeyPair(RPC_KEY_PAIR *t)
  12163. {
  12164. FreeX(t->Cert);
  12165. FreeK(t->Key);
  12166. }
  12167. // RPC_WGK
  12168. void InRpcWgk(RPC_WGK *t, PACK *p)
  12169. {
  12170. UINT i;
  12171. // Validate arguments
  12172. if (t == NULL || p == NULL)
  12173. {
  12174. return;
  12175. }
  12176. Zero(t, sizeof(RPC_WGK));
  12177. t->Num = PackGetIndexCount(p, "Key");
  12178. if (t->Num == 0)
  12179. {
  12180. return;
  12181. }
  12182. t->Wgks = ZeroMalloc(sizeof(WGK) * t->Num);
  12183. for (i = 0; i < t->Num; ++i)
  12184. {
  12185. WGK *wgk = &t->Wgks[i];
  12186. PackGetStrEx(p, "Key", wgk->Key, sizeof(wgk->Key), i);
  12187. PackGetStrEx(p, "Hub", wgk->Hub, sizeof(wgk->Hub), i);
  12188. PackGetStrEx(p, "User", wgk->User, sizeof(wgk->User), i);
  12189. }
  12190. }
  12191. void OutRpcWgk(PACK *p, RPC_WGK *t)
  12192. {
  12193. UINT i;
  12194. // Validate arguments
  12195. if (t == NULL || p == NULL)
  12196. {
  12197. return;
  12198. }
  12199. for (i = 0; i < t->Num; ++i)
  12200. {
  12201. WGK *wgk = &t->Wgks[i];
  12202. PackAddStrEx(p, "Key", wgk->Key, i, t->Num);
  12203. PackAddStrEx(p, "Hub", wgk->Hub, i, t->Num);
  12204. PackAddStrEx(p, "User", wgk->User, i, t->Num);
  12205. }
  12206. }
  12207. void FreeRpcWgk(RPC_WGK *t)
  12208. {
  12209. // Validate arguments
  12210. if (t == NULL)
  12211. {
  12212. return;
  12213. }
  12214. Free(t->Wgks);
  12215. }
  12216. // NODE_INFO
  12217. void InRpcNodeInfo(NODE_INFO *t, PACK *p)
  12218. {
  12219. // Validate arguments
  12220. if (t == NULL || p == NULL)
  12221. {
  12222. return;
  12223. }
  12224. Zero(t, sizeof(NODE_INFO));
  12225. PackGetStr(p, "ClientProductName", t->ClientProductName, sizeof(t->ClientProductName));
  12226. PackGetStr(p, "ServerProductName", t->ServerProductName, sizeof(t->ServerProductName));
  12227. PackGetStr(p, "ClientOsName", t->ClientOsName, sizeof(t->ClientOsName));
  12228. PackGetStr(p, "ClientOsVer", t->ClientOsVer, sizeof(t->ClientOsVer));
  12229. PackGetStr(p, "ClientOsProductId", t->ClientOsProductId, sizeof(t->ClientOsProductId));
  12230. PackGetStr(p, "ClientHostname", t->ClientHostname, sizeof(t->ClientHostname));
  12231. PackGetStr(p, "ServerHostname", t->ServerHostname, sizeof(t->ServerHostname));
  12232. PackGetStr(p, "ProxyHostname", t->ProxyHostname, sizeof(t->ProxyHostname));
  12233. PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
  12234. PackGetData2(p, "UniqueId", t->UniqueId, sizeof(t->UniqueId));
  12235. t->ClientProductVer = PackGetInt(p, "ClientProductVer");
  12236. t->ClientProductBuild = PackGetInt(p, "ClientProductBuild");
  12237. t->ServerProductVer = PackGetInt(p, "ServerProductVer");
  12238. t->ServerProductBuild = PackGetInt(p, "ServerProductBuild");
  12239. t->ClientIpAddress = PackGetIp32(p, "ClientIpAddress");
  12240. PackGetData2(p, "ClientIpAddress6", t->ClientIpAddress6, sizeof(t->ClientIpAddress6));
  12241. t->ClientPort = PackGetInt(p, "ClientPort");
  12242. t->ServerIpAddress = PackGetIp32(p, "ServerIpAddress");
  12243. PackGetData2(p, "ServerIpAddress6", t->ServerIpAddress6, sizeof(t->ServerIpAddress6));
  12244. t->ServerPort = PackGetInt(p, "ServerPort2");
  12245. t->ProxyIpAddress = PackGetIp32(p, "ProxyIpAddress");
  12246. PackGetData2(p, "ProxyIpAddress6", t->ProxyIpAddress6, sizeof(t->ProxyIpAddress6));
  12247. t->ProxyPort = PackGetInt(p, "ProxyPort");
  12248. }
  12249. void OutRpcNodeInfo(PACK *p, NODE_INFO *t)
  12250. {
  12251. // Validate arguments
  12252. if (t == NULL || p == NULL)
  12253. {
  12254. return;
  12255. }
  12256. PackAddStr(p, "ClientProductName", t->ClientProductName);
  12257. PackAddStr(p, "ServerProductName", t->ServerProductName);
  12258. PackAddStr(p, "ClientOsName", t->ClientOsName);
  12259. PackAddStr(p, "ClientOsVer", t->ClientOsVer);
  12260. PackAddStr(p, "ClientOsProductId", t->ClientOsProductId);
  12261. PackAddStr(p, "ClientHostname", t->ClientHostname);
  12262. PackAddStr(p, "ServerHostname", t->ServerHostname);
  12263. PackAddStr(p, "ProxyHostname", t->ProxyHostname);
  12264. PackAddStr(p, "HubName", t->HubName);
  12265. PackAddData(p, "UniqueId", t->UniqueId, sizeof(t->UniqueId));
  12266. PackAddInt(p, "ClientProductVer", t->ClientProductVer);
  12267. PackAddInt(p, "ClientProductBuild", t->ClientProductBuild);
  12268. PackAddInt(p, "ServerProductVer", t->ServerProductVer);
  12269. PackAddInt(p, "ServerProductBuild", t->ServerProductBuild);
  12270. PackAddIp32(p, "ClientIpAddress", t->ClientIpAddress);
  12271. PackAddData(p, "ClientIpAddress6", t->ClientIpAddress6, sizeof(t->ClientIpAddress6));
  12272. PackAddInt(p, "ClientPort", t->ClientPort);
  12273. PackAddIp32(p, "ServerIpAddress", t->ServerIpAddress);
  12274. PackAddData(p, "ServerIpAddress6", t->ServerIpAddress6, sizeof(t->ServerIpAddress6));
  12275. PackAddInt(p, "ServerPort2", t->ServerPort);
  12276. PackAddIp32(p, "ProxyIpAddress", t->ProxyIpAddress);
  12277. PackAddData(p, "ProxyIpAddress6", t->ProxyIpAddress6, sizeof(t->ProxyIpAddress6));
  12278. PackAddInt(p, "ProxyPort", t->ProxyPort);
  12279. }
  12280. // RPC_SESSION_STATUS
  12281. void InRpcSessionStatus(RPC_SESSION_STATUS *t, PACK *p)
  12282. {
  12283. // Validate arguments
  12284. if (t == NULL || p == NULL)
  12285. {
  12286. return;
  12287. }
  12288. Zero(t, sizeof(RPC_SESSION_STATUS));
  12289. PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
  12290. PackGetStr(p, "Name", t->Name, sizeof(t->Name));
  12291. PackGetStr(p, "Username", t->Username, sizeof(t->Username));
  12292. PackGetStr(p, "GroupName", t->GroupName, sizeof(t->GroupName));
  12293. PackGetStr(p, "RealUsername", t->RealUsername, sizeof(t->RealUsername));
  12294. t->ClientIp = PackGetIp32(p, "SessionStatus_ClientIp");
  12295. PackGetData2(p, "SessionStatus_ClientIp6", t->ClientIp6, sizeof(t->ClientIp6));
  12296. PackGetStr(p, "SessionStatus_ClientHostName", t->ClientHostName, sizeof(t->ClientHostName));
  12297. PackGetIp(p, "Client_Ip_Address", &t->ClientIpAddress);
  12298. InRpcClientGetConnectionStatus(&t->Status, p);
  12299. InRpcNodeInfo(&t->NodeInfo, p);
  12300. }
  12301. void OutRpcSessionStatus(PACK *p, RPC_SESSION_STATUS *t)
  12302. {
  12303. // Validate arguments
  12304. if (t == NULL || p == NULL)
  12305. {
  12306. return;
  12307. }
  12308. PackAddStr(p, "HubName", t->HubName);
  12309. PackAddStr(p, "Name", t->Name);
  12310. PackAddStr(p, "Username", t->Username);
  12311. PackAddStr(p, "GroupName", t->GroupName);
  12312. PackAddStr(p, "RealUsername", t->RealUsername);
  12313. PackAddIp32(p, "SessionStatus_ClientIp", t->ClientIp);
  12314. PackAddData(p, "SessionStatus_ClientIp6", t->ClientIp6, sizeof(t->ClientIp6));
  12315. PackAddStr(p, "SessionStatus_ClientHostName", t->ClientHostName);
  12316. PackAddIp(p, "Client_Ip_Address", &t->ClientIpAddress);
  12317. OutRpcClientGetConnectionStatus(p, &t->Status);
  12318. OutRpcNodeInfo(p, &t->NodeInfo);
  12319. }
  12320. void FreeRpcSessionStatus(RPC_SESSION_STATUS *t)
  12321. {
  12322. // Validate arguments
  12323. if (t == NULL)
  12324. {
  12325. return;
  12326. }
  12327. CiFreeClientGetConnectionStatus(&t->Status);
  12328. }
  12329. // RPC_DELETE_SESSION
  12330. void InRpcDeleteSession(RPC_DELETE_SESSION *t, PACK *p)
  12331. {
  12332. // Validate arguments
  12333. if (t == NULL || p == NULL)
  12334. {
  12335. return;
  12336. }
  12337. Zero(t, sizeof(RPC_DELETE_SESSION));
  12338. PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
  12339. PackGetStr(p, "Name", t->Name, sizeof(t->Name));
  12340. }
  12341. void OutRpcDeleteSession(PACK *p, RPC_DELETE_SESSION *t)
  12342. {
  12343. // Validate arguments
  12344. if (t == NULL || p == NULL)
  12345. {
  12346. return;
  12347. }
  12348. PackAddStr(p, "HubName", t->HubName);
  12349. PackAddStr(p, "Name", t->Name);
  12350. }
  12351. // RPC_ENUM_MAC_TABLE
  12352. void InRpcEnumMacTable(RPC_ENUM_MAC_TABLE *t, PACK *p)
  12353. {
  12354. UINT i;
  12355. // Validate arguments
  12356. if (t == NULL || p == NULL)
  12357. {
  12358. return;
  12359. }
  12360. Zero(t, sizeof(RPC_ENUM_MAC_TABLE));
  12361. PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
  12362. t->NumMacTable = PackGetIndexCount(p, "SessionName");
  12363. t->MacTables = ZeroMalloc(sizeof(RPC_ENUM_MAC_TABLE_ITEM) * t->NumMacTable);
  12364. for (i = 0;i < t->NumMacTable;i++)
  12365. {
  12366. RPC_ENUM_MAC_TABLE_ITEM *e = &t->MacTables[i];
  12367. e->Key = PackGetIntEx(p, "Key", i);
  12368. PackGetStrEx(p, "SessionName", e->SessionName, sizeof(e->SessionName), i);
  12369. PackGetDataEx2(p, "MacAddress", e->MacAddress, sizeof(e->MacAddress), i);
  12370. e->VlanId = PackGetIntEx(p, "VlanId", i);
  12371. e->CreatedTime = PackGetInt64Ex(p, "CreatedTime", i);
  12372. e->UpdatedTime = PackGetInt64Ex(p, "UpdatedTime", i);
  12373. e->RemoteItem = PackGetBoolEx(p, "RemoteItem", i);
  12374. PackGetStrEx(p, "RemoteHostname", e->RemoteHostname, sizeof(e->RemoteHostname), i);
  12375. }
  12376. }
  12377. void OutRpcEnumMacTable(PACK *p, RPC_ENUM_MAC_TABLE *t)
  12378. {
  12379. UINT i;
  12380. // Validate arguments
  12381. if (t == NULL || p == NULL)
  12382. {
  12383. return;
  12384. }
  12385. PackAddStr(p, "HubName", t->HubName);
  12386. PackSetCurrentJsonGroupName(p, "MacTable");
  12387. for (i = 0;i < t->NumMacTable;i++)
  12388. {
  12389. RPC_ENUM_MAC_TABLE_ITEM *e = &t->MacTables[i];
  12390. PackAddIntEx(p, "Key", e->Key, i, t->NumMacTable);
  12391. PackAddStrEx(p, "SessionName", e->SessionName, i, t->NumMacTable);
  12392. PackAddDataEx(p, "MacAddress", e->MacAddress, sizeof(e->MacAddress), i, t->NumMacTable);
  12393. PackAddIntEx(p, "VlanId", e->VlanId, i, t->NumMacTable);
  12394. PackAddTime64Ex(p, "CreatedTime", e->CreatedTime, i, t->NumMacTable);
  12395. PackAddTime64Ex(p, "UpdatedTime", e->UpdatedTime, i, t->NumMacTable);
  12396. PackAddBoolEx(p, "RemoteItem", e->RemoteItem, i, t->NumMacTable);
  12397. PackAddStrEx(p, "RemoteHostname", e->RemoteHostname, i, t->NumMacTable);
  12398. }
  12399. PackSetCurrentJsonGroupName(p, NULL);
  12400. }
  12401. void FreeRpcEnumMacTable(RPC_ENUM_MAC_TABLE *t)
  12402. {
  12403. // Validate arguments
  12404. if (t == NULL)
  12405. {
  12406. return;
  12407. }
  12408. Free(t->MacTables);
  12409. }
  12410. // RPC_ENUM_IP_TABLE
  12411. void InRpcEnumIpTable(RPC_ENUM_IP_TABLE *t, PACK *p)
  12412. {
  12413. UINT i;
  12414. // Validate arguments
  12415. if (t == NULL || p == NULL)
  12416. {
  12417. return;
  12418. }
  12419. Zero(t, sizeof(RPC_ENUM_IP_TABLE));
  12420. PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
  12421. t->NumIpTable = PackGetIndexCount(p, "SessionName");
  12422. t->IpTables = ZeroMalloc(sizeof(RPC_ENUM_IP_TABLE_ITEM) * t->NumIpTable);
  12423. for (i = 0;i < t->NumIpTable;i++)
  12424. {
  12425. RPC_ENUM_IP_TABLE_ITEM *e = &t->IpTables[i];
  12426. e->Key = PackGetIntEx(p, "Key", i);
  12427. PackGetStrEx(p, "SessionName", e->SessionName, sizeof(e->SessionName), i);
  12428. e->Ip = PackGetIp32Ex(p, "Ip", i);
  12429. if (PackGetIpEx(p, "IpV6", &e->IpV6, i) == false)
  12430. {
  12431. UINTToIP(&e->IpV6, e->Ip);
  12432. }
  12433. PackGetIp(p, "IpAddress", &e->IpAddress);
  12434. e->DhcpAllocated = PackGetBoolEx(p, "DhcpAllocated", i);
  12435. e->CreatedTime = PackGetInt64Ex(p, "CreatedTime", i);
  12436. e->UpdatedTime = PackGetInt64Ex(p, "UpdatedTime", i);
  12437. e->RemoteItem = PackGetBoolEx(p, "RemoteItem", i);
  12438. PackGetStrEx(p, "RemoteHostname", e->RemoteHostname, sizeof(e->RemoteHostname), i);
  12439. }
  12440. }
  12441. void OutRpcEnumIpTable(PACK *p, RPC_ENUM_IP_TABLE *t)
  12442. {
  12443. UINT i;
  12444. // Validate arguments
  12445. if (t == NULL || p == NULL)
  12446. {
  12447. return;
  12448. }
  12449. PackAddStr(p, "HubName", t->HubName);
  12450. PackSetCurrentJsonGroupName(p, "IpTable");
  12451. for (i = 0;i < t->NumIpTable;i++)
  12452. {
  12453. RPC_ENUM_IP_TABLE_ITEM *e = &t->IpTables[i];
  12454. PackAddIntEx(p, "Key", e->Key, i, t->NumIpTable);
  12455. PackAddStrEx(p, "SessionName", e->SessionName, i, t->NumIpTable);
  12456. PackAddIp32Ex(p, "Ip", e->Ip, i, t->NumIpTable);
  12457. PackAddIpEx(p, "IpV6", &e->IpV6, i, t->NumIpTable);
  12458. PackAddIpEx(p, "IpAddress", &e->IpAddress, i, t->NumIpTable);
  12459. PackAddBoolEx(p, "DhcpAllocated", e->DhcpAllocated, i, t->NumIpTable);
  12460. PackAddTime64Ex(p, "CreatedTime", e->CreatedTime, i, t->NumIpTable);
  12461. PackAddTime64Ex(p, "UpdatedTime", e->UpdatedTime, i, t->NumIpTable);
  12462. PackAddBoolEx(p, "RemoteItem", e->RemoteItem, i, t->NumIpTable);
  12463. PackAddStrEx(p, "RemoteHostname", e->RemoteHostname, i, t->NumIpTable);
  12464. }
  12465. PackSetCurrentJsonGroupName(p, NULL);
  12466. }
  12467. void FreeRpcEnumIpTable(RPC_ENUM_IP_TABLE *t)
  12468. {
  12469. // Validate arguments
  12470. if (t == NULL)
  12471. {
  12472. return;
  12473. }
  12474. Free(t->IpTables);
  12475. }
  12476. // RPC_DELETE_TABLE
  12477. void InRpcDeleteTable(RPC_DELETE_TABLE *t, PACK *p)
  12478. {
  12479. // Validate arguments
  12480. if (t == NULL || p == NULL)
  12481. {
  12482. return;
  12483. }
  12484. Zero(t, sizeof(RPC_DELETE_TABLE));
  12485. PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
  12486. t->Key = PackGetInt(p, "Key");
  12487. }
  12488. void OutRpcDeleteTable(PACK *p, RPC_DELETE_TABLE *t)
  12489. {
  12490. // Validate arguments
  12491. if (t == NULL || p == NULL)
  12492. {
  12493. return;
  12494. }
  12495. PackAddStr(p, "HubName", t->HubName);
  12496. PackAddInt(p, "Key", t->Key);
  12497. }
  12498. // Adjoin RPC_ENUM_IP_TABLE
  12499. void AdjoinRpcEnumIpTable(RPC_ENUM_IP_TABLE *dest, RPC_ENUM_IP_TABLE *src)
  12500. {
  12501. UINT old_num;
  12502. UINT i, n;
  12503. if (dest == NULL || src == NULL)
  12504. {
  12505. return;
  12506. }
  12507. if (src->NumIpTable == 0)
  12508. {
  12509. return;
  12510. }
  12511. old_num = dest->NumIpTable;
  12512. dest->NumIpTable += src->NumIpTable;
  12513. dest->IpTables = ReAlloc(dest->IpTables, sizeof(RPC_ENUM_IP_TABLE_ITEM) * dest->NumIpTable);
  12514. n = 0;
  12515. for (i = old_num;i < dest->NumIpTable;i++)
  12516. {
  12517. Copy(&dest->IpTables[i], &src->IpTables[n++], sizeof(RPC_ENUM_IP_TABLE_ITEM));
  12518. }
  12519. }
  12520. // Adjoin RPC_ENUM_MAC_TABLE
  12521. void AdjoinRpcEnumMacTable(RPC_ENUM_MAC_TABLE *dest, RPC_ENUM_MAC_TABLE *src)
  12522. {
  12523. UINT old_num;
  12524. UINT i, n;
  12525. if (dest == NULL || src == NULL)
  12526. {
  12527. return;
  12528. }
  12529. if (src->NumMacTable == 0)
  12530. {
  12531. return;
  12532. }
  12533. old_num = dest->NumMacTable;
  12534. dest->NumMacTable += src->NumMacTable;
  12535. dest->MacTables = ReAlloc(dest->MacTables, sizeof(RPC_ENUM_MAC_TABLE_ITEM) * dest->NumMacTable);
  12536. n = 0;
  12537. for (i = old_num;i < dest->NumMacTable;i++)
  12538. {
  12539. Copy(&dest->MacTables[i], &src->MacTables[n++], sizeof(RPC_ENUM_MAC_TABLE_ITEM));
  12540. }
  12541. }
  12542. // Adjoin RPC_ENUM_SESSION
  12543. void AdjoinRpcEnumSession(RPC_ENUM_SESSION *dest, RPC_ENUM_SESSION *src)
  12544. {
  12545. UINT old_num;
  12546. UINT i, n;
  12547. if (dest == NULL || src == NULL)
  12548. {
  12549. return;
  12550. }
  12551. if (src->NumSession == 0)
  12552. {
  12553. return;
  12554. }
  12555. old_num = dest->NumSession;
  12556. dest->NumSession += src->NumSession;
  12557. dest->Sessions = ReAlloc(dest->Sessions, sizeof(RPC_ENUM_SESSION_ITEM) * dest->NumSession);
  12558. n = 0;
  12559. for (i = old_num;i < dest->NumSession;i++)
  12560. {
  12561. Copy(&dest->Sessions[i], &src->Sessions[n++], sizeof(RPC_ENUM_SESSION_ITEM));
  12562. }
  12563. }
  12564. // RPC_KEEP
  12565. void InRpcKeep(RPC_KEEP *t, PACK *p)
  12566. {
  12567. // Validate arguments
  12568. if (t == NULL || p == NULL)
  12569. {
  12570. return;
  12571. }
  12572. Zero(t, sizeof(RPC_KEEP));
  12573. t->UseKeepConnect = PackGetBool(p, "UseKeepConnect");
  12574. PackGetStr(p, "KeepConnectHost", t->KeepConnectHost, sizeof(t->KeepConnectHost));
  12575. t->KeepConnectPort = PackGetInt(p, "KeepConnectPort");
  12576. t->KeepConnectProtocol = PackGetInt(p, "KeepConnectProtocol");
  12577. t->KeepConnectInterval = PackGetInt(p, "KeepConnectInterval");
  12578. }
  12579. void OutRpcKeep(PACK *p, RPC_KEEP *t)
  12580. {
  12581. // Validate arguments
  12582. if (t == NULL || p == NULL)
  12583. {
  12584. return;
  12585. }
  12586. PackAddBool(p, "UseKeepConnect", t->UseKeepConnect);
  12587. PackAddStr(p, "KeepConnectHost", t->KeepConnectHost);
  12588. PackAddInt(p, "KeepConnectPort", t->KeepConnectPort);
  12589. PackAddInt(p, "KeepConnectProtocol", t->KeepConnectProtocol);
  12590. PackAddInt(p, "KeepConnectInterval", t->KeepConnectInterval);
  12591. }
  12592. // test RPC function
  12593. UINT StTest(ADMIN *a, RPC_TEST *t)
  12594. {
  12595. Format(t->StrValue, sizeof(t->StrValue), "%u", t->IntValue);
  12596. return ERR_NO_ERROR;
  12597. }
  12598. // RPC_TEST
  12599. void InRpcTest(RPC_TEST *t, PACK *p)
  12600. {
  12601. Zero(t, sizeof(RPC_TEST));
  12602. t->IntValue = PackGetInt(p, "IntValue");
  12603. t->Int64Value = PackGetInt64(p, "Int64Value");
  12604. PackGetStr(p, "StrValue", t->StrValue, sizeof(t->StrValue));
  12605. PackGetUniStr(p, "UniStrValue", t->UniStrValue, sizeof(t->UniStrValue));
  12606. }
  12607. void OutRpcTest(PACK *p, RPC_TEST *t)
  12608. {
  12609. PackAddInt(p, "IntValue", t->IntValue);
  12610. PackAddInt64(p, "Int64Value", t->Int64Value);
  12611. PackAddStr(p, "StrValue", t->StrValue);
  12612. PackAddUniStr(p, "UniStrValue", t->UniStrValue);
  12613. }
  12614. void FreeRpcTest(RPC_TEST *t)
  12615. {
  12616. }
  12617. // Admin RPC call
  12618. PACK *AdminCall(RPC *rpc, char *function_name, PACK *p)
  12619. {
  12620. // Validate arguments
  12621. if (rpc == NULL || function_name == NULL)
  12622. {
  12623. return NULL;
  12624. }
  12625. if (p == NULL)
  12626. {
  12627. p = NewPack();
  12628. }
  12629. // Debug("Admin RPC Call: %s\n", function_name);
  12630. return RpcCall(rpc, function_name, p);
  12631. }
  12632. // Check whether the source IP address is permitted to admin connection
  12633. bool CheckAdminSourceAddress(SOCK *sock, char *hubname)
  12634. {
  12635. BUF *b;
  12636. char *s;
  12637. bool ok = false;
  12638. // Validate arguments
  12639. if (sock == NULL)
  12640. {
  12641. return false;
  12642. }
  12643. b = ReadDump(ADMINIP_TXT);
  12644. if (b == NULL)
  12645. {
  12646. return true;
  12647. }
  12648. while (true)
  12649. {
  12650. UINT i;
  12651. TOKEN_LIST *t;
  12652. IP ip;
  12653. IP mask;
  12654. IP ip1;
  12655. IP ip2;
  12656. s = CfgReadNextLine(b);
  12657. if (s == NULL)
  12658. {
  12659. break;
  12660. }
  12661. Trim(s);
  12662. i = SearchStrEx(s, "//", 0, false);
  12663. if (i != INFINITE)
  12664. {
  12665. s[i] = 0;
  12666. }
  12667. i = SearchStrEx(s, "#", 0, false);
  12668. if (i != INFINITE)
  12669. {
  12670. s[i] = 0;
  12671. }
  12672. Trim(s);
  12673. t = ParseToken(s, " \t");
  12674. if (t != NULL)
  12675. {
  12676. if (t->NumTokens >= 1)
  12677. {
  12678. if (t->NumTokens == 1 || StrCmpi(hubname, t->Token[1]) == 0)
  12679. {
  12680. if (ParseIpAndMask46(t->Token[0], &ip, &mask))
  12681. {
  12682. if (IsIP4(&sock->RemoteIP) && IsIP4(&ip))
  12683. {
  12684. IPAnd4(&ip1, &sock->RemoteIP, &mask);
  12685. IPAnd4(&ip2, &ip, &mask);
  12686. if (CmpIpAddr(&ip1, &ip2) == 0)
  12687. {
  12688. ok = true;
  12689. }
  12690. }
  12691. else if (IsIP6(&sock->RemoteIP) && IsIP6(&ip))
  12692. {
  12693. IPAnd6(&ip1, &sock->RemoteIP, &mask);
  12694. IPAnd6(&ip2, &ip, &mask);
  12695. if (CmpIpAddr(&ip1, &ip2) == 0)
  12696. {
  12697. ok = true;
  12698. }
  12699. }
  12700. }
  12701. else if (StrToIP(&ip, t->Token[0]))
  12702. {
  12703. if (CmpIpAddr(&sock->RemoteIP, &ip) == 0)
  12704. {
  12705. ok = true;
  12706. }
  12707. }
  12708. if (StrCmpi(t->Token[0], "*") == 0)
  12709. {
  12710. ok = true;
  12711. }
  12712. }
  12713. }
  12714. FreeToken(t);
  12715. }
  12716. Free(s);
  12717. }
  12718. FreeBuf(b);
  12719. return ok;
  12720. }
  12721. // Accept admin connection
  12722. UINT AdminAccept(CONNECTION *c, PACK *p)
  12723. {
  12724. ADMIN *a;
  12725. UCHAR secure_password[SHA1_SIZE];
  12726. UCHAR null_password[SHA1_SIZE];
  12727. UCHAR secure_null_password[SHA1_SIZE];
  12728. char hubname[MAX_HUBNAME_LEN + 1];
  12729. CEDAR *cedar;
  12730. SOCK *sock;
  12731. RPC *rpc;
  12732. UINT err;
  12733. SERVER *server = NULL;
  12734. RPC_WINVER ver;
  12735. bool accept_empty_password;
  12736. bool is_empty_password = false;
  12737. // Validate arguments
  12738. if (c == NULL || p == NULL)
  12739. {
  12740. return ERR_INTERNAL_ERROR;
  12741. }
  12742. cedar = c->Cedar;
  12743. sock = c->FirstSock;
  12744. if (cedar != NULL)
  12745. {
  12746. server = cedar->Server;
  12747. }
  12748. accept_empty_password = PackGetBool(p, "accept_empty_password");
  12749. // Get client OS version
  12750. InRpcWinVer(&ver, p);
  12751. // Get hub name
  12752. if (PackGetStr(p, "hubname", hubname, sizeof(hubname)) == false)
  12753. {
  12754. // without hub name
  12755. StrCpy(hubname, sizeof(hubname), "");
  12756. }
  12757. // Check source IP address
  12758. if (CheckAdminSourceAddress(sock, hubname) == false)
  12759. {
  12760. SLog(c->Cedar, "LA_IP_DENIED", c->Name);
  12761. return ERR_IP_ADDRESS_DENIED;
  12762. }
  12763. // Get password information
  12764. if (PackGetDataSize(p, "secure_password") != SHA1_SIZE)
  12765. {
  12766. // Malformed information
  12767. return ERR_PROTOCOL_ERROR;
  12768. }
  12769. PackGetData(p, "secure_password", secure_password);
  12770. if (StrLen(hubname) == 0)
  12771. {
  12772. // Server admin mode
  12773. SLog(c->Cedar, "LA_CONNECTED_1", c->Name);
  12774. }
  12775. else
  12776. {
  12777. // Hub admin mode
  12778. if (server != NULL && server->ServerType == SERVER_TYPE_FARM_MEMBER)
  12779. {
  12780. // Connection with hub admin mode to cluster member is not permitted
  12781. return ERR_NOT_ENOUGH_RIGHT;
  12782. }
  12783. SLog(c->Cedar, "LA_CONNECTED_2", c->Name, hubname);
  12784. }
  12785. // Check password
  12786. err = AdminCheckPassword(cedar, c->Random, secure_password,
  12787. StrLen(hubname) != 0 ? hubname : NULL, accept_empty_password, &is_empty_password);
  12788. if (err != ERR_NO_ERROR)
  12789. {
  12790. // Error occured
  12791. SLog(c->Cedar, "LA_ERROR", c->Name, GetUniErrorStr(err), err);
  12792. return err;
  12793. }
  12794. SLog(c->Cedar, "LA_OK", c->Name);
  12795. HashAdminPassword(null_password, "");
  12796. SecurePassword(secure_null_password, null_password, c->Random);
  12797. if (Cmp(secure_null_password, secure_password, SHA1_SIZE) == 0)
  12798. {
  12799. if (IsLocalHostIP(&sock->RemoteIP) == false)
  12800. {
  12801. // The client tried to use blank password for hub admin mode from remote
  12802. if (StrLen(hubname) != 0)
  12803. {
  12804. return ERR_NULL_PASSWORD_LOCAL_ONLY;
  12805. }
  12806. }
  12807. }
  12808. // Reply success result
  12809. p = NewPack();
  12810. if (accept_empty_password && is_empty_password)
  12811. {
  12812. PackAddBool(p, "empty_password", true);
  12813. }
  12814. HttpServerSend(sock, p);
  12815. FreePack(p);
  12816. // Construct ADMIN object
  12817. a = ZeroMalloc(sizeof(ADMIN));
  12818. a->ServerAdmin = ((StrLen(hubname) == 0) ? true : false);
  12819. a->HubName = (StrLen(hubname) != 0 ? hubname : NULL);
  12820. a->Server = c->Cedar->Server;
  12821. a->ClientBuild = c->ClientBuild;
  12822. Copy(&a->ClientWinVer, &ver, sizeof(RPC_WINVER));
  12823. // Timeout setting
  12824. SetTimeout(sock, INFINITE);
  12825. // RPC Server
  12826. rpc = StartRpcServer(sock, AdminDispatch, a);
  12827. a->Rpc = rpc;
  12828. SLog(c->Cedar, "LA_RPC_START", c->Name, rpc->Name);
  12829. RpcServer(rpc);
  12830. RpcFree(rpc);
  12831. if (a->LogFileList != NULL)
  12832. {
  12833. // Free cached log file list, if it exists
  12834. FreeEnumLogFile(a->LogFileList);
  12835. }
  12836. // Free ADMIN object
  12837. Free(a);
  12838. return ERR_NO_ERROR;
  12839. }
  12840. // Check for admin password
  12841. UINT AdminCheckPassword(CEDAR *c, void *random, void *secure_password, char *hubname,
  12842. bool accept_empty_password, bool *is_password_empty)
  12843. {
  12844. UCHAR check[SHA1_SIZE];
  12845. bool b_dummy;
  12846. // Validate arguments
  12847. if (c == NULL || random == NULL || secure_password == NULL)
  12848. {
  12849. return ERR_INTERNAL_ERROR;
  12850. }
  12851. if (is_password_empty == NULL)
  12852. {
  12853. is_password_empty = &b_dummy;
  12854. }
  12855. *is_password_empty = false;
  12856. if (hubname == NULL || StrLen(hubname) == 0)
  12857. {
  12858. // Server admin mode
  12859. Lock(c->lock);
  12860. {
  12861. if (accept_empty_password && SiIsEmptyPassword(c->Server->HashedPassword))
  12862. {
  12863. // blank password
  12864. *is_password_empty = true;
  12865. }
  12866. SecurePassword(check, c->Server->HashedPassword, random);
  12867. }
  12868. Unlock(c->lock);
  12869. if (Cmp(check, secure_password, SHA1_SIZE) != 0)
  12870. {
  12871. // Password incorrect
  12872. return ERR_ACCESS_DENIED;
  12873. }
  12874. }
  12875. else
  12876. {
  12877. HUB *h;
  12878. #if 0
  12879. if (c->Server->ServerType == SERVER_TYPE_FARM_MEMBER)
  12880. {
  12881. // In cluster member mode, hub admin mode is disabled
  12882. return ERR_FARM_MEMBER_HUB_ADMIN;
  12883. }
  12884. #endif
  12885. // Hub admin mode
  12886. LockHubList(c);
  12887. {
  12888. h = GetHub(c, hubname);
  12889. }
  12890. UnlockHubList(c);
  12891. if (h == NULL)
  12892. {
  12893. // Specified hub is not found
  12894. return ERR_HUB_NOT_FOUND;
  12895. }
  12896. Lock(h->lock);
  12897. {
  12898. if (accept_empty_password && SiIsEmptyPassword(h->HashedPassword))
  12899. {
  12900. // User specified blank password
  12901. *is_password_empty = true;
  12902. }
  12903. SecurePassword(check, h->HashedPassword, random);
  12904. }
  12905. Unlock(h->lock);
  12906. ReleaseHub(h);
  12907. if (Cmp(check, secure_password, SHA1_SIZE) != 0)
  12908. {
  12909. // Incorrect password
  12910. return ERR_ACCESS_DENIED;
  12911. }
  12912. }
  12913. return ERR_NO_ERROR;
  12914. }
  12915. // Hash admin password
  12916. void HashAdminPassword(void *hash, char *password)
  12917. {
  12918. // Validate arguments
  12919. if (hash == NULL || password == NULL)
  12920. {
  12921. return;
  12922. }
  12923. Sha0(hash, password, StrLen(password));
  12924. }
  12925. // Disconnect admin connection
  12926. void AdminDisconnect(RPC *rpc)
  12927. {
  12928. SESSION *s;
  12929. SOCK *sock;
  12930. // Validate arguments
  12931. if (rpc == NULL)
  12932. {
  12933. return;
  12934. }
  12935. s = (SESSION *)rpc->Param;
  12936. sock = rpc->Sock;
  12937. EndRpc(rpc);
  12938. Disconnect(sock);
  12939. ReleaseSession(s);
  12940. }
  12941. // Admin connection main routine
  12942. SESSION *AdminConnectMain(CEDAR *cedar, CLIENT_OPTION *o, char *hubname, void *hashed_password, UINT *err, char *client_name, void *hWnd, bool *empty_password)
  12943. {
  12944. UCHAR secure_password[SHA1_SIZE];
  12945. SESSION *s;
  12946. SOCK *sock;
  12947. PACK *p;
  12948. RPC_WINVER ver;
  12949. // connect
  12950. s = NewRpcSessionEx2(cedar, o, err, client_name, hWnd);
  12951. if (s == NULL)
  12952. {
  12953. return NULL;
  12954. }
  12955. // Get socket
  12956. sock = s->Connection->FirstSock;
  12957. // Generate connect method
  12958. p = NewPack();
  12959. PackAddClientVersion(p, s->Connection);
  12960. PackAddStr(p, "method", "admin");
  12961. PackAddBool(p, "accept_empty_password", true);
  12962. // Windows version on client
  12963. GetWinVer(&ver);
  12964. OutRpcWinVer(p, &ver);
  12965. // Secure Password
  12966. SecurePassword(secure_password, hashed_password, s->Connection->Random);
  12967. PackAddData(p, "secure_password", secure_password, sizeof(secure_password));
  12968. // HUB name
  12969. if (hubname != NULL)
  12970. {
  12971. PackAddStr(p, "hubname", hubname);
  12972. }
  12973. if (HttpClientSend(sock, p) == false)
  12974. {
  12975. // disconnect
  12976. FreePack(p);
  12977. ReleaseSession(s);
  12978. *err = ERR_DISCONNECTED;
  12979. return NULL;
  12980. }
  12981. FreePack(p);
  12982. p = HttpClientRecv(sock);
  12983. if (p == NULL)
  12984. {
  12985. // disconnect
  12986. ReleaseSession(s);
  12987. *err = ERR_DISCONNECTED;
  12988. return NULL;
  12989. }
  12990. if (GetErrorFromPack(p) != 0)
  12991. {
  12992. // error
  12993. ReleaseSession(s);
  12994. *err = GetErrorFromPack(p);
  12995. FreePack(p);
  12996. return NULL;
  12997. }
  12998. if (empty_password != NULL)
  12999. {
  13000. *empty_password = PackGetBool(p, "empty_password");
  13001. }
  13002. FreePack(p);
  13003. return s;
  13004. }
  13005. // Admin connection
  13006. RPC *AdminConnectEx(CEDAR *cedar, CLIENT_OPTION *o, char *hubname, void *hashed_password, UINT *err, char *client_name)
  13007. {
  13008. return AdminConnectEx2(cedar, o, hubname, hashed_password, err, client_name, NULL);
  13009. }
  13010. RPC *AdminConnectEx2(CEDAR *cedar, CLIENT_OPTION *o, char *hubname, void *hashed_password, UINT *err, char *client_name, void *hWnd)
  13011. {
  13012. SESSION *s;
  13013. SOCK *sock;
  13014. RPC *rpc;
  13015. UCHAR hashed_password_2[SHA1_SIZE];
  13016. bool empty_password = false;
  13017. // Validate arguments
  13018. if (cedar == NULL || o == NULL || hashed_password == NULL || err == NULL)
  13019. {
  13020. return NULL;
  13021. }
  13022. if (client_name == NULL)
  13023. {
  13024. client_name = CEDAR_MANAGER_STR;
  13025. }
  13026. Copy(hashed_password_2, hashed_password, SHA1_SIZE);
  13027. s = AdminConnectMain(cedar, o, hubname, hashed_password_2, err, client_name, hWnd, &empty_password);
  13028. if (s == NULL)
  13029. {
  13030. return NULL;
  13031. }
  13032. sock = s->Connection->FirstSock;
  13033. // RPC start
  13034. rpc = StartRpcClient(sock, s);
  13035. rpc->IsVpnServer = true;
  13036. Copy(&rpc->VpnServerClientOption, o, sizeof(CLIENT_OPTION));
  13037. StrCpy(rpc->VpnServerHubName, sizeof(rpc->VpnServerHubName), hubname);
  13038. StrCpy(rpc->VpnServerClientName, sizeof(rpc->VpnServerClientName), client_name);
  13039. if (empty_password == false)
  13040. {
  13041. Copy(rpc->VpnServerHashedPassword, hashed_password_2, SHA1_SIZE);
  13042. }
  13043. else
  13044. {
  13045. HashAdminPassword(rpc->VpnServerHashedPassword, "");
  13046. }
  13047. // timeout setting
  13048. SetTimeout(sock, INFINITE);
  13049. return rpc;
  13050. }
  13051. // Reconnect admin connection
  13052. UINT AdminReconnect(RPC *rpc)
  13053. {
  13054. SESSION *s;
  13055. SOCK *sock;
  13056. CEDAR *cedar;
  13057. UINT err;
  13058. bool empty_password = false;
  13059. // Validate arguments
  13060. if (rpc == NULL || rpc->IsVpnServer == false)
  13061. {
  13062. return ERR_INTERNAL_ERROR;
  13063. }
  13064. s = (SESSION *)rpc->Param;
  13065. cedar = s->Cedar;
  13066. AddRef(cedar->ref);
  13067. sock = rpc->Sock;
  13068. Disconnect(sock);
  13069. ReleaseSock(sock);
  13070. ReleaseSession(s);
  13071. rpc->Param = NULL;
  13072. rpc->Sock = NULL;
  13073. s = AdminConnectMain(cedar, &rpc->VpnServerClientOption,
  13074. rpc->VpnServerHubName,
  13075. rpc->VpnServerHashedPassword,
  13076. &err,
  13077. rpc->VpnServerClientName, NULL, &empty_password);
  13078. ReleaseCedar(cedar);
  13079. if (s == NULL)
  13080. {
  13081. return err;
  13082. }
  13083. if (empty_password)
  13084. {
  13085. HashAdminPassword(rpc->VpnServerHashedPassword, "");
  13086. }
  13087. rpc->Param = s;
  13088. rpc->Sock = s->Connection->FirstSock;
  13089. AddRef(rpc->Sock->ref);
  13090. return ERR_NO_ERROR;
  13091. }
  13092. // Identify blank password
  13093. bool SiIsEmptyPassword(void *hash_password)
  13094. {
  13095. UCHAR hash[SHA1_SIZE];
  13096. // Validate arguments
  13097. if (hash_password == NULL)
  13098. {
  13099. return false;
  13100. }
  13101. Sha0(hash, "", 0);
  13102. if (Cmp(hash_password, hash, SHA1_SIZE) == 0)
  13103. {
  13104. return true;
  13105. }
  13106. return false;
  13107. }