12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265122661226712268122691227012271122721227312274122751227612277122781227912280122811228212283122841228512286122871228812289122901229112292122931229412295122961229712298122991230012301123021230312304123051230612307123081230912310123111231212313123141231512316123171231812319123201232112322123231232412325123261232712328123291233012331123321233312334123351233612337123381233912340123411234212343123441234512346123471234812349123501235112352123531235412355123561235712358123591236012361123621236312364123651236612367123681236912370123711237212373123741237512376123771237812379123801238112382123831238412385123861238712388123891239012391123921239312394123951239612397123981239912400124011240212403124041240512406124071240812409124101241112412124131241412415124161241712418124191242012421124221242312424124251242612427124281242912430124311243212433124341243512436124371243812439124401244112442124431244412445124461244712448124491245012451124521245312454124551245612457124581245912460124611246212463124641246512466124671246812469124701247112472124731247412475124761247712478124791248012481124821248312484124851248612487124881248912490124911249212493124941249512496124971249812499125001250112502125031250412505125061250712508125091251012511125121251312514125151251612517125181251912520125211252212523125241252512526125271252812529125301253112532125331253412535125361253712538125391254012541125421254312544125451254612547125481254912550125511255212553125541255512556125571255812559125601256112562125631256412565125661256712568125691257012571125721257312574125751257612577125781257912580125811258212583125841258512586125871258812589125901259112592125931259412595125961259712598125991260012601126021260312604126051260612607126081260912610126111261212613126141261512616126171261812619126201262112622126231262412625126261262712628126291263012631126321263312634126351263612637126381263912640126411264212643126441264512646126471264812649126501265112652126531265412655126561265712658126591266012661126621266312664126651266612667126681266912670126711267212673126741267512676126771267812679126801268112682126831268412685126861268712688126891269012691126921269312694126951269612697126981269912700127011270212703127041270512706127071270812709127101271112712127131271412715127161271712718127191272012721127221272312724127251272612727127281272912730127311273212733127341273512736127371273812739127401274112742127431274412745127461274712748127491275012751127521275312754127551275612757127581275912760127611276212763127641276512766127671276812769127701277112772127731277412775127761277712778127791278012781127821278312784127851278612787127881278912790127911279212793127941279512796127971279812799128001280112802128031280412805128061280712808128091281012811128121281312814128151281612817128181281912820128211282212823128241282512826128271282812829128301283112832128331283412835128361283712838128391284012841128421284312844128451284612847128481284912850128511285212853128541285512856128571285812859128601286112862128631286412865128661286712868128691287012871128721287312874128751287612877128781287912880128811288212883128841288512886128871288812889128901289112892128931289412895128961289712898128991290012901129021290312904129051290612907129081290912910129111291212913129141291512916129171291812919129201292112922129231292412925129261292712928129291293012931129321293312934129351293612937129381293912940129411294212943129441294512946129471294812949129501295112952129531295412955129561295712958129591296012961129621296312964129651296612967129681296912970129711297212973129741297512976129771297812979129801298112982129831298412985129861298712988129891299012991129921299312994129951299612997129981299913000130011300213003130041300513006130071300813009130101301113012130131301413015130161301713018130191302013021130221302313024130251302613027130281302913030130311303213033130341303513036130371303813039130401304113042130431304413045130461304713048130491305013051130521305313054130551305613057130581305913060130611306213063130641306513066130671306813069130701307113072130731307413075130761307713078130791308013081130821308313084130851308613087130881308913090130911309213093130941309513096130971309813099131001310113102131031310413105131061310713108131091311013111131121311313114131151311613117131181311913120131211312213123131241312513126131271312813129131301313113132131331313413135131361313713138131391314013141131421314313144131451314613147131481314913150131511315213153131541315513156131571315813159131601316113162131631316413165131661316713168131691317013171131721317313174131751317613177131781317913180131811318213183131841318513186131871318813189131901319113192131931319413195131961319713198131991320013201132021320313204132051320613207132081320913210132111321213213132141321513216132171321813219132201322113222132231322413225132261322713228132291323013231132321323313234132351323613237132381323913240132411324213243132441324513246132471324813249132501325113252132531325413255132561325713258132591326013261132621326313264132651326613267132681326913270132711327213273132741327513276132771327813279132801328113282132831328413285132861328713288132891329013291132921329313294132951329613297132981329913300133011330213303133041330513306133071330813309133101331113312133131331413315133161331713318133191332013321133221332313324133251332613327133281332913330133311333213333133341333513336133371333813339133401334113342133431334413345133461334713348133491335013351133521335313354133551335613357133581335913360133611336213363133641336513366133671336813369133701337113372133731337413375133761337713378133791338013381133821338313384133851338613387133881338913390133911339213393133941339513396133971339813399134001340113402134031340413405134061340713408134091341013411134121341313414134151341613417134181341913420134211342213423134241342513426134271342813429134301343113432134331343413435134361343713438134391344013441134421344313444134451344613447134481344913450134511345213453134541345513456134571345813459134601346113462134631346413465134661346713468134691347013471134721347313474134751347613477134781347913480134811348213483134841348513486134871348813489134901349113492134931349413495134961349713498134991350013501135021350313504135051350613507135081350913510135111351213513135141351513516135171351813519135201352113522135231352413525135261352713528135291353013531135321353313534135351353613537135381353913540135411354213543135441354513546135471354813549135501355113552135531355413555135561355713558135591356013561135621356313564135651356613567135681356913570135711357213573135741357513576135771357813579135801358113582135831358413585135861358713588135891359013591135921359313594135951359613597135981359913600136011360213603136041360513606136071360813609136101361113612136131361413615136161361713618136191362013621136221362313624136251362613627136281362913630136311363213633136341363513636136371363813639136401364113642136431364413645136461364713648136491365013651136521365313654136551365613657136581365913660136611366213663136641366513666136671366813669136701367113672136731367413675136761367713678136791368013681136821368313684136851368613687136881368913690136911369213693136941369513696136971369813699137001370113702137031370413705137061370713708137091371013711137121371313714137151371613717137181371913720137211372213723137241372513726137271372813729137301373113732137331373413735137361373713738137391374013741137421374313744137451374613747137481374913750137511375213753137541375513756137571375813759137601376113762137631376413765137661376713768137691377013771137721377313774137751377613777137781377913780137811378213783137841378513786137871378813789137901379113792137931379413795137961379713798137991380013801138021380313804138051380613807138081380913810138111381213813138141381513816138171381813819138201382113822138231382413825138261382713828138291383013831138321383313834138351383613837138381383913840138411384213843138441384513846138471384813849138501385113852138531385413855138561385713858138591386013861138621386313864138651386613867138681386913870138711387213873138741387513876138771387813879138801388113882138831388413885138861388713888138891389013891138921389313894138951389613897138981389913900139011390213903139041390513906139071390813909139101391113912139131391413915139161391713918139191392013921139221392313924139251392613927139281392913930139311393213933139341393513936139371393813939139401394113942139431394413945139461394713948139491395013951139521395313954139551395613957139581395913960139611396213963139641396513966139671396813969139701397113972139731397413975139761397713978139791398013981139821398313984139851398613987139881398913990139911399213993139941399513996139971399813999140001400114002140031400414005140061400714008140091401014011140121401314014140151401614017140181401914020140211402214023140241402514026140271402814029140301403114032140331403414035140361403714038140391404014041140421404314044140451404614047140481404914050140511405214053140541405514056140571405814059140601406114062140631406414065140661406714068140691407014071140721407314074140751407614077140781407914080140811408214083140841408514086140871408814089140901409114092140931409414095140961409714098140991410014101141021410314104141051410614107141081410914110141111411214113141141411514116141171411814119141201412114122141231412414125141261412714128141291413014131141321413314134141351413614137141381413914140141411414214143141441414514146141471414814149141501415114152141531415414155141561415714158141591416014161141621416314164141651416614167141681416914170141711417214173141741417514176141771417814179141801418114182141831418414185141861418714188141891419014191141921419314194141951419614197141981419914200142011420214203142041420514206142071420814209142101421114212142131421414215142161421714218142191422014221142221422314224142251422614227142281422914230142311423214233142341423514236142371423814239142401424114242142431424414245142461424714248142491425014251142521425314254142551425614257142581425914260142611426214263142641426514266142671426814269142701427114272142731427414275142761427714278142791428014281142821428314284142851428614287142881428914290142911429214293142941429514296142971429814299143001430114302143031430414305143061430714308143091431014311143121431314314143151431614317143181431914320143211432214323143241432514326143271432814329143301433114332143331433414335143361433714338143391434014341143421434314344143451434614347143481434914350143511435214353143541435514356143571435814359143601436114362143631436414365143661436714368143691437014371143721437314374143751437614377143781437914380143811438214383143841438514386143871438814389143901439114392143931439414395143961439714398143991440014401144021440314404144051440614407144081440914410144111441214413144141441514416144171441814419144201442114422144231442414425144261442714428144291443014431144321443314434144351443614437144381443914440144411444214443144441444514446144471444814449144501445114452144531445414455144561445714458144591446014461144621446314464144651446614467144681446914470144711447214473144741447514476144771447814479144801448114482144831448414485144861448714488144891449014491144921449314494144951449614497144981449914500145011450214503145041450514506145071450814509145101451114512145131451414515145161451714518145191452014521145221452314524145251452614527145281452914530145311453214533145341453514536145371453814539145401454114542145431454414545145461454714548145491455014551145521455314554145551455614557145581455914560145611456214563145641456514566145671456814569145701457114572145731457414575145761457714578145791458014581145821458314584145851458614587145881458914590145911459214593145941459514596145971459814599146001460114602146031460414605146061460714608146091461014611146121461314614146151461614617146181461914620146211462214623146241462514626146271462814629146301463114632146331463414635146361463714638146391464014641146421464314644146451464614647146481464914650146511465214653146541465514656146571465814659146601466114662146631466414665146661466714668146691467014671146721467314674146751467614677146781467914680146811468214683146841468514686146871468814689146901469114692146931469414695146961469714698146991470014701147021470314704147051470614707147081470914710147111471214713147141471514716147171471814719147201472114722147231472414725147261472714728147291473014731147321473314734147351473614737147381473914740147411474214743147441474514746147471474814749147501475114752147531475414755147561475714758147591476014761147621476314764147651476614767147681476914770147711477214773147741477514776147771477814779147801478114782147831478414785147861478714788147891479014791147921479314794147951479614797147981479914800148011480214803148041480514806148071480814809148101481114812148131481414815148161481714818148191482014821148221482314824148251482614827148281482914830148311483214833148341483514836148371483814839148401484114842148431484414845148461484714848148491485014851148521485314854148551485614857148581485914860148611486214863148641486514866148671486814869148701487114872148731487414875148761487714878148791488014881148821488314884148851488614887148881488914890148911489214893148941489514896148971489814899149001490114902149031490414905149061490714908149091491014911149121491314914149151491614917149181491914920149211492214923149241492514926149271492814929149301493114932149331493414935149361493714938149391494014941149421494314944149451494614947149481494914950149511495214953149541495514956149571495814959149601496114962149631496414965149661496714968149691497014971149721497314974149751497614977149781497914980149811498214983149841498514986149871498814989149901499114992149931499414995149961499714998149991500015001150021500315004150051500615007150081500915010150111501215013150141501515016150171501815019150201502115022150231502415025150261502715028150291503015031150321503315034150351503615037150381503915040150411504215043150441504515046150471504815049150501505115052150531505415055150561505715058150591506015061150621506315064150651506615067150681506915070150711507215073150741507515076150771507815079150801508115082150831508415085150861508715088150891509015091150921509315094150951509615097150981509915100151011510215103151041510515106151071510815109151101511115112151131511415115151161511715118151191512015121151221512315124151251512615127151281512915130151311513215133151341513515136151371513815139151401514115142151431514415145151461514715148151491515015151151521515315154151551515615157151581515915160151611516215163151641516515166151671516815169151701517115172151731517415175151761517715178151791518015181151821518315184151851518615187151881518915190151911519215193151941519515196151971519815199152001520115202152031520415205152061520715208152091521015211152121521315214152151521615217152181521915220152211522215223152241522515226152271522815229152301523115232152331523415235152361523715238152391524015241152421524315244152451524615247152481524915250152511525215253152541525515256152571525815259152601526115262152631526415265152661526715268152691527015271152721527315274152751527615277152781527915280152811528215283152841528515286152871528815289152901529115292152931529415295152961529715298152991530015301153021530315304153051530615307153081530915310153111531215313153141531515316153171531815319153201532115322153231532415325153261532715328153291533015331153321533315334153351533615337153381533915340153411534215343153441534515346153471534815349153501535115352153531535415355153561535715358153591536015361153621536315364153651536615367153681536915370153711537215373153741537515376153771537815379153801538115382153831538415385153861538715388153891539015391153921539315394153951539615397153981539915400154011540215403154041540515406154071540815409154101541115412154131541415415154161541715418154191542015421154221542315424154251542615427154281542915430154311543215433154341543515436154371543815439154401544115442154431544415445154461544715448154491545015451154521545315454154551545615457154581545915460154611546215463154641546515466154671546815469154701547115472154731547415475154761547715478154791548015481154821548315484154851548615487154881548915490154911549215493154941549515496154971549815499155001550115502155031550415505155061550715508155091551015511155121551315514155151551615517155181551915520155211552215523155241552515526155271552815529155301553115532155331553415535155361553715538155391554015541155421554315544155451554615547155481554915550155511555215553155541555515556155571555815559155601556115562155631556415565155661556715568155691557015571155721557315574155751557615577155781557915580155811558215583155841558515586155871558815589155901559115592155931559415595155961559715598155991560015601156021560315604156051560615607156081560915610156111561215613156141561515616156171561815619156201562115622156231562415625156261562715628156291563015631156321563315634156351563615637156381563915640156411564215643156441564515646156471564815649156501565115652156531565415655156561565715658156591566015661156621566315664156651566615667156681566915670156711567215673156741567515676156771567815679156801568115682156831568415685156861568715688156891569015691156921569315694156951569615697156981569915700157011570215703157041570515706157071570815709157101571115712157131571415715157161571715718157191572015721157221572315724157251572615727157281572915730157311573215733157341573515736157371573815739157401574115742157431574415745157461574715748157491575015751157521575315754157551575615757157581575915760157611576215763157641576515766157671576815769157701577115772157731577415775157761577715778157791578015781157821578315784157851578615787157881578915790157911579215793157941579515796157971579815799158001580115802158031580415805158061580715808158091581015811158121581315814158151581615817158181581915820158211582215823158241582515826158271582815829158301583115832158331583415835158361583715838158391584015841158421584315844158451584615847158481584915850158511585215853158541585515856158571585815859158601586115862158631586415865158661586715868158691587015871158721587315874158751587615877158781587915880158811588215883158841588515886158871588815889158901589115892158931589415895158961589715898158991590015901159021590315904159051590615907159081590915910159111591215913159141591515916159171591815919159201592115922159231592415925159261592715928159291593015931159321593315934159351593615937159381593915940159411594215943159441594515946159471594815949159501595115952159531595415955159561595715958159591596015961159621596315964159651596615967159681596915970159711597215973159741597515976159771597815979159801598115982159831598415985159861598715988159891599015991159921599315994159951599615997159981599916000160011600216003160041600516006160071600816009160101601116012160131601416015160161601716018160191602016021160221602316024160251602616027160281602916030160311603216033160341603516036160371603816039160401604116042160431604416045160461604716048160491605016051160521605316054160551605616057160581605916060160611606216063160641606516066160671606816069160701607116072160731607416075160761607716078160791608016081160821608316084160851608616087160881608916090160911609216093160941609516096160971609816099161001610116102161031610416105161061610716108161091611016111161121611316114161151611616117161181611916120161211612216123161241612516126161271612816129161301613116132161331613416135161361613716138161391614016141161421614316144161451614616147161481614916150161511615216153161541615516156161571615816159161601616116162161631616416165161661616716168161691617016171161721617316174161751617616177161781617916180161811618216183161841618516186161871618816189161901619116192161931619416195161961619716198161991620016201162021620316204162051620616207162081620916210162111621216213162141621516216162171621816219162201622116222162231622416225162261622716228162291623016231162321623316234162351623616237162381623916240162411624216243162441624516246162471624816249162501625116252162531625416255162561625716258162591626016261162621626316264162651626616267162681626916270162711627216273162741627516276162771627816279162801628116282162831628416285162861628716288162891629016291162921629316294162951629616297162981629916300163011630216303163041630516306163071630816309163101631116312163131631416315163161631716318163191632016321163221632316324163251632616327163281632916330163311633216333163341633516336163371633816339163401634116342163431634416345163461634716348163491635016351163521635316354163551635616357163581635916360163611636216363163641636516366163671636816369163701637116372163731637416375163761637716378163791638016381163821638316384163851638616387163881638916390163911639216393163941639516396163971639816399164001640116402164031640416405164061640716408164091641016411164121641316414164151641616417164181641916420164211642216423164241642516426164271642816429164301643116432164331643416435164361643716438164391644016441164421644316444164451644616447164481644916450164511645216453164541645516456164571645816459164601646116462164631646416465164661646716468164691647016471164721647316474164751647616477164781647916480164811648216483164841648516486164871648816489164901649116492164931649416495164961649716498164991650016501165021650316504165051650616507165081650916510165111651216513165141651516516165171651816519165201652116522165231652416525165261652716528165291653016531165321653316534165351653616537165381653916540165411654216543165441654516546165471654816549165501655116552165531655416555165561655716558165591656016561165621656316564165651656616567165681656916570165711657216573165741657516576165771657816579165801658116582165831658416585165861658716588165891659016591165921659316594165951659616597165981659916600166011660216603166041660516606166071660816609166101661116612166131661416615166161661716618166191662016621166221662316624166251662616627166281662916630166311663216633166341663516636166371663816639166401664116642166431664416645166461664716648166491665016651166521665316654166551665616657166581665916660166611666216663166641666516666166671666816669166701667116672166731667416675166761667716678166791668016681166821668316684166851668616687166881668916690166911669216693166941669516696166971669816699167001670116702167031670416705167061670716708167091671016711167121671316714167151671616717167181671916720167211672216723167241672516726167271672816729167301673116732167331673416735167361673716738167391674016741167421674316744167451674616747167481674916750167511675216753167541675516756167571675816759167601676116762167631676416765167661676716768167691677016771167721677316774167751677616777167781677916780167811678216783167841678516786167871678816789167901679116792167931679416795167961679716798167991680016801168021680316804168051680616807168081680916810168111681216813168141681516816168171681816819168201682116822168231682416825168261682716828168291683016831168321683316834168351683616837168381683916840168411684216843168441684516846168471684816849168501685116852168531685416855168561685716858168591686016861168621686316864168651686616867168681686916870168711687216873168741687516876168771687816879168801688116882168831688416885168861688716888168891689016891168921689316894168951689616897168981689916900169011690216903169041690516906169071690816909169101691116912169131691416915169161691716918169191692016921169221692316924169251692616927169281692916930169311693216933169341693516936169371693816939169401694116942169431694416945169461694716948169491695016951169521695316954169551695616957169581695916960169611696216963169641696516966169671696816969169701697116972169731697416975169761697716978169791698016981169821698316984169851698616987169881698916990169911699216993169941699516996169971699816999170001700117002170031700417005170061700717008170091701017011170121701317014170151701617017170181701917020170211702217023170241702517026170271702817029170301703117032170331703417035170361703717038170391704017041170421704317044170451704617047170481704917050170511705217053170541705517056170571705817059170601706117062170631706417065170661706717068170691707017071170721707317074170751707617077170781707917080170811708217083170841708517086170871708817089170901709117092170931709417095170961709717098170991710017101171021710317104171051710617107171081710917110171111711217113171141711517116171171711817119171201712117122171231712417125171261712717128171291713017131171321713317134171351713617137171381713917140171411714217143171441714517146171471714817149171501715117152171531715417155171561715717158171591716017161171621716317164171651716617167171681716917170171711717217173171741717517176171771717817179171801718117182171831718417185171861718717188171891719017191171921719317194171951719617197171981719917200172011720217203172041720517206172071720817209172101721117212172131721417215172161721717218172191722017221172221722317224172251722617227172281722917230172311723217233172341723517236172371723817239172401724117242172431724417245172461724717248172491725017251172521725317254172551725617257172581725917260172611726217263172641726517266172671726817269172701727117272172731727417275172761727717278172791728017281172821728317284172851728617287172881728917290172911729217293172941729517296172971729817299173001730117302173031730417305173061730717308173091731017311173121731317314173151731617317173181731917320173211732217323173241732517326173271732817329173301733117332173331733417335173361733717338173391734017341173421734317344173451734617347173481734917350173511735217353173541735517356173571735817359173601736117362173631736417365173661736717368173691737017371173721737317374173751737617377173781737917380173811738217383173841738517386173871738817389173901739117392173931739417395173961739717398173991740017401174021740317404174051740617407174081740917410174111741217413174141741517416174171741817419174201742117422174231742417425174261742717428174291743017431174321743317434174351743617437174381743917440174411744217443174441744517446174471744817449174501745117452174531745417455174561745717458174591746017461174621746317464174651746617467174681746917470174711747217473174741747517476174771747817479174801748117482174831748417485174861748717488174891749017491174921749317494174951749617497174981749917500175011750217503175041750517506175071750817509175101751117512175131751417515175161751717518175191752017521175221752317524175251752617527175281752917530175311753217533175341753517536175371753817539175401754117542175431754417545175461754717548175491755017551175521755317554175551755617557175581755917560175611756217563175641756517566175671756817569175701757117572175731757417575175761757717578175791758017581175821758317584175851758617587175881758917590175911759217593175941759517596175971759817599176001760117602176031760417605176061760717608176091761017611176121761317614176151761617617176181761917620176211762217623176241762517626176271762817629176301763117632176331763417635176361763717638176391764017641176421764317644176451764617647176481764917650176511765217653176541765517656176571765817659176601766117662176631766417665176661766717668176691767017671176721767317674176751767617677176781767917680176811768217683176841768517686176871768817689176901769117692176931769417695176961769717698176991770017701177021770317704177051770617707177081770917710177111771217713177141771517716177171771817719177201772117722177231772417725177261772717728177291773017731177321773317734177351773617737177381773917740177411774217743177441774517746177471774817749177501775117752177531775417755177561775717758177591776017761177621776317764177651776617767177681776917770177711777217773177741777517776177771777817779177801778117782177831778417785177861778717788177891779017791177921779317794177951779617797177981779917800178011780217803178041780517806178071780817809178101781117812178131781417815178161781717818178191782017821178221782317824178251782617827178281782917830178311783217833178341783517836178371783817839178401784117842178431784417845178461784717848178491785017851178521785317854178551785617857178581785917860178611786217863178641786517866178671786817869178701787117872178731787417875178761787717878178791788017881178821788317884178851788617887178881788917890178911789217893178941789517896178971789817899179001790117902179031790417905179061790717908179091791017911179121791317914179151791617917179181791917920179211792217923179241792517926179271792817929179301793117932179331793417935179361793717938179391794017941179421794317944179451794617947179481794917950179511795217953179541795517956179571795817959179601796117962179631796417965179661796717968179691797017971179721797317974179751797617977179781797917980179811798217983179841798517986179871798817989179901799117992179931799417995179961799717998179991800018001180021800318004180051800618007180081800918010180111801218013180141801518016180171801818019180201802118022180231802418025180261802718028180291803018031180321803318034180351803618037180381803918040180411804218043180441804518046180471804818049180501805118052180531805418055180561805718058180591806018061180621806318064180651806618067180681806918070180711807218073180741807518076180771807818079180801808118082180831808418085180861808718088180891809018091180921809318094180951809618097180981809918100181011810218103181041810518106181071810818109181101811118112181131811418115181161811718118181191812018121181221812318124181251812618127181281812918130181311813218133181341813518136181371813818139181401814118142181431814418145181461814718148181491815018151181521815318154181551815618157181581815918160181611816218163181641816518166181671816818169181701817118172181731817418175181761817718178181791818018181181821818318184181851818618187181881818918190181911819218193181941819518196181971819818199182001820118202182031820418205182061820718208182091821018211182121821318214182151821618217182181821918220182211822218223182241822518226182271822818229182301823118232182331823418235182361823718238182391824018241182421824318244182451824618247182481824918250182511825218253182541825518256182571825818259182601826118262182631826418265182661826718268182691827018271182721827318274182751827618277182781827918280182811828218283182841828518286182871828818289182901829118292182931829418295182961829718298182991830018301183021830318304183051830618307183081830918310183111831218313183141831518316183171831818319183201832118322183231832418325183261832718328183291833018331183321833318334183351833618337183381833918340183411834218343183441834518346183471834818349183501835118352183531835418355183561835718358183591836018361183621836318364183651836618367183681836918370183711837218373183741837518376183771837818379183801838118382183831838418385183861838718388183891839018391183921839318394183951839618397183981839918400184011840218403184041840518406184071840818409184101841118412184131841418415184161841718418184191842018421184221842318424184251842618427184281842918430184311843218433184341843518436184371843818439184401844118442184431844418445184461844718448184491845018451184521845318454184551845618457184581845918460184611846218463184641846518466184671846818469184701847118472184731847418475184761847718478184791848018481184821848318484184851848618487184881848918490184911849218493184941849518496184971849818499185001850118502185031850418505185061850718508185091851018511185121851318514185151851618517185181851918520185211852218523185241852518526185271852818529185301853118532185331853418535185361853718538185391854018541185421854318544185451854618547185481854918550185511855218553185541855518556185571855818559185601856118562185631856418565185661856718568185691857018571185721857318574185751857618577185781857918580185811858218583185841858518586185871858818589185901859118592185931859418595185961859718598185991860018601186021860318604186051860618607186081860918610186111861218613186141861518616186171861818619186201862118622186231862418625186261862718628186291863018631186321863318634186351863618637186381863918640186411864218643186441864518646186471864818649186501865118652186531865418655186561865718658186591866018661186621866318664186651866618667186681866918670186711867218673186741867518676186771867818679186801868118682186831868418685186861868718688186891869018691186921869318694186951869618697186981869918700187011870218703187041870518706187071870818709187101871118712187131871418715187161871718718187191872018721187221872318724187251872618727187281872918730187311873218733187341873518736187371873818739187401874118742187431874418745187461874718748187491875018751187521875318754187551875618757187581875918760187611876218763187641876518766187671876818769187701877118772187731877418775187761877718778187791878018781187821878318784187851878618787187881878918790187911879218793187941879518796187971879818799188001880118802188031880418805188061880718808188091881018811188121881318814188151881618817188181881918820188211882218823188241882518826188271882818829188301883118832188331883418835188361883718838188391884018841188421884318844188451884618847188481884918850188511885218853188541885518856188571885818859188601886118862188631886418865188661886718868188691887018871188721887318874188751887618877188781887918880188811888218883188841888518886188871888818889188901889118892188931889418895188961889718898188991890018901189021890318904189051890618907189081890918910189111891218913189141891518916189171891818919189201892118922189231892418925189261892718928189291893018931189321893318934189351893618937189381893918940189411894218943189441894518946189471894818949189501895118952189531895418955189561895718958189591896018961189621896318964189651896618967189681896918970189711897218973189741897518976189771897818979189801898118982189831898418985189861898718988189891899018991189921899318994189951899618997189981899919000190011900219003190041900519006190071900819009190101901119012190131901419015190161901719018190191902019021190221902319024190251902619027190281902919030190311903219033190341903519036190371903819039190401904119042190431904419045190461904719048190491905019051190521905319054190551905619057190581905919060190611906219063190641906519066190671906819069190701907119072190731907419075190761907719078190791908019081190821908319084190851908619087190881908919090190911909219093190941909519096190971909819099191001910119102191031910419105191061910719108191091911019111191121911319114191151911619117191181911919120191211912219123191241912519126191271912819129191301913119132191331913419135191361913719138191391914019141191421914319144191451914619147191481914919150191511915219153191541915519156191571915819159191601916119162191631916419165191661916719168191691917019171191721917319174191751917619177191781917919180191811918219183191841918519186191871918819189191901919119192191931919419195191961919719198191991920019201192021920319204192051920619207192081920919210192111921219213192141921519216192171921819219192201922119222192231922419225192261922719228192291923019231192321923319234192351923619237192381923919240192411924219243192441924519246192471924819249192501925119252192531925419255192561925719258192591926019261192621926319264192651926619267192681926919270192711927219273192741927519276192771927819279192801928119282192831928419285192861928719288192891929019291192921929319294192951929619297192981929919300193011930219303193041930519306193071930819309193101931119312193131931419315193161931719318193191932019321193221932319324193251932619327193281932919330193311933219333193341933519336193371933819339193401934119342193431934419345193461934719348193491935019351193521935319354193551935619357193581935919360193611936219363193641936519366193671936819369193701937119372193731937419375193761937719378193791938019381193821938319384193851938619387193881938919390193911939219393193941939519396193971939819399194001940119402194031940419405194061940719408194091941019411194121941319414194151941619417194181941919420194211942219423194241942519426194271942819429194301943119432194331943419435194361943719438194391944019441194421944319444194451944619447194481944919450194511945219453194541945519456194571945819459194601946119462194631946419465194661946719468194691947019471194721947319474194751947619477194781947919480194811948219483194841948519486194871948819489194901949119492194931949419495194961949719498194991950019501195021950319504195051950619507195081950919510195111951219513195141951519516195171951819519195201952119522195231952419525195261952719528195291953019531195321953319534195351953619537195381953919540195411954219543195441954519546195471954819549195501955119552195531955419555195561955719558195591956019561195621956319564195651956619567195681956919570195711957219573195741957519576195771957819579195801958119582195831958419585195861958719588195891959019591195921959319594195951959619597195981959919600196011960219603196041960519606196071960819609196101961119612196131961419615196161961719618196191962019621196221962319624196251962619627196281962919630196311963219633196341963519636196371963819639196401964119642196431964419645196461964719648196491965019651196521965319654196551965619657196581965919660196611966219663196641966519666196671966819669196701967119672196731967419675196761967719678196791968019681196821968319684196851968619687196881968919690196911969219693196941969519696196971969819699197001970119702197031970419705197061970719708197091971019711197121971319714197151971619717197181971919720197211972219723197241972519726197271972819729197301973119732197331973419735197361973719738197391974019741197421974319744197451974619747197481974919750197511975219753197541975519756197571975819759197601976119762197631976419765197661976719768197691977019771197721977319774197751977619777197781977919780197811978219783197841978519786197871978819789197901979119792197931979419795197961979719798197991980019801198021980319804198051980619807198081980919810198111981219813198141981519816198171981819819198201982119822198231982419825198261982719828198291983019831198321983319834198351983619837198381983919840198411984219843198441984519846198471984819849198501985119852198531985419855198561985719858198591986019861198621986319864198651986619867198681986919870198711987219873198741987519876198771987819879198801988119882198831988419885198861988719888198891989019891198921989319894198951989619897198981989919900199011990219903199041990519906199071990819909199101991119912199131991419915199161991719918199191992019921199221992319924199251992619927199281992919930199311993219933199341993519936199371993819939199401994119942199431994419945199461994719948199491995019951199521995319954199551995619957199581995919960199611996219963199641996519966199671996819969199701997119972199731997419975199761997719978199791998019981199821998319984199851998619987199881998919990199911999219993199941999519996199971999819999200002000120002200032000420005200062000720008200092001020011200122001320014200152001620017200182001920020200212002220023200242002520026200272002820029200302003120032200332003420035200362003720038200392004020041200422004320044200452004620047200482004920050200512005220053200542005520056200572005820059200602006120062200632006420065200662006720068200692007020071200722007320074200752007620077200782007920080200812008220083200842008520086200872008820089200902009120092200932009420095200962009720098200992010020101201022010320104201052010620107201082010920110201112011220113201142011520116201172011820119201202012120122201232012420125201262012720128201292013020131201322013320134201352013620137201382013920140201412014220143201442014520146201472014820149201502015120152201532015420155201562015720158201592016020161201622016320164201652016620167201682016920170201712017220173201742017520176201772017820179201802018120182201832018420185201862018720188201892019020191201922019320194201952019620197201982019920200202012020220203202042020520206202072020820209202102021120212202132021420215202162021720218202192022020221202222022320224202252022620227202282022920230202312023220233202342023520236202372023820239202402024120242202432024420245202462024720248202492025020251202522025320254202552025620257202582025920260202612026220263202642026520266202672026820269202702027120272202732027420275202762027720278202792028020281202822028320284202852028620287202882028920290202912029220293202942029520296202972029820299203002030120302203032030420305203062030720308203092031020311203122031320314203152031620317203182031920320203212032220323203242032520326203272032820329203302033120332203332033420335203362033720338203392034020341203422034320344203452034620347203482034920350203512035220353203542035520356203572035820359203602036120362203632036420365203662036720368203692037020371203722037320374203752037620377203782037920380203812038220383203842038520386203872038820389203902039120392203932039420395203962039720398203992040020401204022040320404204052040620407204082040920410204112041220413204142041520416204172041820419204202042120422204232042420425204262042720428204292043020431204322043320434204352043620437204382043920440204412044220443204442044520446204472044820449204502045120452204532045420455204562045720458204592046020461204622046320464204652046620467204682046920470204712047220473204742047520476204772047820479204802048120482204832048420485204862048720488204892049020491204922049320494204952049620497204982049920500205012050220503205042050520506205072050820509205102051120512205132051420515205162051720518205192052020521205222052320524205252052620527205282052920530205312053220533205342053520536205372053820539205402054120542205432054420545205462054720548205492055020551205522055320554205552055620557205582055920560205612056220563205642056520566205672056820569205702057120572205732057420575205762057720578205792058020581205822058320584205852058620587205882058920590205912059220593205942059520596205972059820599206002060120602206032060420605206062060720608206092061020611206122061320614206152061620617206182061920620206212062220623206242062520626206272062820629206302063120632206332063420635206362063720638206392064020641206422064320644206452064620647206482064920650206512065220653206542065520656206572065820659206602066120662206632066420665206662066720668206692067020671206722067320674206752067620677206782067920680206812068220683206842068520686206872068820689206902069120692206932069420695206962069720698206992070020701207022070320704207052070620707207082070920710207112071220713207142071520716207172071820719207202072120722207232072420725207262072720728207292073020731207322073320734207352073620737207382073920740207412074220743207442074520746207472074820749207502075120752207532075420755207562075720758207592076020761207622076320764207652076620767207682076920770207712077220773207742077520776207772077820779207802078120782207832078420785207862078720788207892079020791207922079320794207952079620797207982079920800208012080220803208042080520806208072080820809208102081120812208132081420815208162081720818208192082020821208222082320824208252082620827208282082920830208312083220833208342083520836208372083820839208402084120842208432084420845208462084720848208492085020851208522085320854208552085620857208582085920860208612086220863208642086520866208672086820869208702087120872208732087420875208762087720878208792088020881208822088320884208852088620887208882088920890208912089220893208942089520896208972089820899209002090120902209032090420905209062090720908209092091020911209122091320914209152091620917209182091920920209212092220923209242092520926209272092820929209302093120932209332093420935209362093720938209392094020941209422094320944209452094620947209482094920950209512095220953209542095520956209572095820959209602096120962209632096420965209662096720968209692097020971209722097320974209752097620977209782097920980209812098220983209842098520986209872098820989209902099120992209932099420995209962099720998209992100021001210022100321004210052100621007210082100921010210112101221013210142101521016210172101821019210202102121022210232102421025210262102721028210292103021031210322103321034210352103621037210382103921040210412104221043210442104521046210472104821049210502105121052210532105421055210562105721058210592106021061210622106321064210652106621067210682106921070210712107221073210742107521076210772107821079210802108121082210832108421085210862108721088210892109021091210922109321094210952109621097210982109921100211012110221103211042110521106211072110821109211102111121112211132111421115211162111721118211192112021121211222112321124211252112621127211282112921130211312113221133211342113521136211372113821139211402114121142211432114421145211462114721148211492115021151211522115321154211552115621157211582115921160211612116221163211642116521166211672116821169211702117121172211732117421175211762117721178211792118021181211822118321184211852118621187211882118921190211912119221193211942119521196211972119821199212002120121202212032120421205212062120721208212092121021211212122121321214212152121621217212182121921220212212122221223212242122521226212272122821229212302123121232212332123421235212362123721238212392124021241212422124321244212452124621247212482124921250212512125221253212542125521256212572125821259212602126121262212632126421265212662126721268212692127021271212722127321274212752127621277212782127921280212812128221283212842128521286212872128821289212902129121292212932129421295212962129721298212992130021301213022130321304213052130621307213082130921310213112131221313213142131521316213172131821319213202132121322213232132421325213262132721328213292133021331213322133321334213352133621337213382133921340213412134221343213442134521346213472134821349213502135121352213532135421355213562135721358213592136021361213622136321364213652136621367213682136921370213712137221373213742137521376213772137821379213802138121382213832138421385213862138721388213892139021391213922139321394213952139621397213982139921400214012140221403214042140521406214072140821409214102141121412214132141421415214162141721418214192142021421214222142321424214252142621427214282142921430214312143221433214342143521436214372143821439214402144121442214432144421445214462144721448214492145021451214522145321454214552145621457214582145921460214612146221463214642146521466214672146821469214702147121472214732147421475214762147721478214792148021481214822148321484214852148621487214882148921490214912149221493214942149521496214972149821499215002150121502215032150421505215062150721508215092151021511215122151321514215152151621517215182151921520215212152221523215242152521526215272152821529215302153121532215332153421535215362153721538215392154021541215422154321544215452154621547215482154921550215512155221553215542155521556215572155821559215602156121562215632156421565215662156721568215692157021571215722157321574215752157621577215782157921580215812158221583215842158521586215872158821589215902159121592215932159421595215962159721598215992160021601216022160321604216052160621607216082160921610216112161221613216142161521616216172161821619216202162121622216232162421625216262162721628216292163021631216322163321634216352163621637216382163921640216412164221643216442164521646216472164821649216502165121652216532165421655216562165721658216592166021661216622166321664216652166621667216682166921670216712167221673216742167521676216772167821679216802168121682216832168421685216862168721688216892169021691216922169321694216952169621697216982169921700217012170221703217042170521706217072170821709217102171121712217132171421715217162171721718217192172021721217222172321724217252172621727217282172921730217312173221733217342173521736217372173821739217402174121742217432174421745217462174721748217492175021751217522175321754217552175621757217582175921760217612176221763217642176521766217672176821769217702177121772217732177421775217762177721778217792178021781217822178321784217852178621787217882178921790217912179221793217942179521796217972179821799218002180121802218032180421805218062180721808218092181021811218122181321814218152181621817218182181921820218212182221823218242182521826218272182821829218302183121832218332183421835218362183721838218392184021841218422184321844218452184621847218482184921850218512185221853218542185521856218572185821859218602186121862218632186421865218662186721868218692187021871218722187321874218752187621877218782187921880218812188221883218842188521886218872188821889218902189121892218932189421895218962189721898218992190021901219022190321904219052190621907219082190921910219112191221913219142191521916219172191821919219202192121922219232192421925219262192721928219292193021931219322193321934219352193621937219382193921940219412194221943219442194521946219472194821949219502195121952219532195421955219562195721958219592196021961219622196321964219652196621967219682196921970219712197221973219742197521976219772197821979219802198121982219832198421985219862198721988219892199021991219922199321994219952199621997219982199922000220012200222003220042200522006220072200822009220102201122012220132201422015220162201722018220192202022021220222202322024220252202622027220282202922030220312203222033220342203522036220372203822039220402204122042220432204422045220462204722048220492205022051220522205322054220552205622057220582205922060220612206222063220642206522066220672206822069220702207122072220732207422075220762207722078220792208022081220822208322084220852208622087220882208922090220912209222093220942209522096220972209822099221002210122102221032210422105221062210722108221092211022111221122211322114221152211622117221182211922120221212212222123221242212522126221272212822129221302213122132221332213422135221362213722138221392214022141221422214322144221452214622147221482214922150221512215222153221542215522156221572215822159221602216122162221632216422165221662216722168221692217022171221722217322174221752217622177221782217922180221812218222183221842218522186221872218822189221902219122192221932219422195221962219722198221992220022201222022220322204222052220622207222082220922210222112221222213222142221522216222172221822219222202222122222222232222422225222262222722228222292223022231222322223322234222352223622237222382223922240222412224222243222442224522246222472224822249222502225122252222532225422255222562225722258222592226022261222622226322264222652226622267222682226922270222712227222273222742227522276222772227822279222802228122282222832228422285222862228722288222892229022291222922229322294222952229622297222982229922300223012230222303223042230522306223072230822309223102231122312223132231422315223162231722318223192232022321223222232322324223252232622327223282232922330223312233222333223342233522336223372233822339223402234122342223432234422345223462234722348223492235022351223522235322354223552235622357223582235922360223612236222363223642236522366223672236822369223702237122372223732237422375223762237722378223792238022381223822238322384223852238622387223882238922390223912239222393223942239522396223972239822399224002240122402224032240422405224062240722408224092241022411224122241322414224152241622417224182241922420224212242222423224242242522426224272242822429224302243122432224332243422435224362243722438224392244022441224422244322444224452244622447224482244922450224512245222453224542245522456224572245822459224602246122462224632246422465224662246722468224692247022471224722247322474224752247622477224782247922480224812248222483224842248522486224872248822489224902249122492224932249422495224962249722498224992250022501225022250322504225052250622507225082250922510225112251222513225142251522516225172251822519225202252122522225232252422525225262252722528225292253022531225322253322534225352253622537225382253922540225412254222543225442254522546225472254822549225502255122552225532255422555225562255722558225592256022561225622256322564225652256622567225682256922570225712257222573225742257522576225772257822579225802258122582225832258422585225862258722588225892259022591225922259322594225952259622597225982259922600226012260222603226042260522606226072260822609226102261122612226132261422615226162261722618226192262022621226222262322624226252262622627226282262922630226312263222633226342263522636226372263822639226402264122642226432264422645226462264722648226492265022651226522265322654226552265622657226582265922660226612266222663226642266522666226672266822669226702267122672226732267422675226762267722678226792268022681226822268322684226852268622687226882268922690226912269222693226942269522696226972269822699227002270122702227032270422705227062270722708227092271022711227122271322714227152271622717227182271922720227212272222723227242272522726227272272822729227302273122732227332273422735227362273722738227392274022741227422274322744227452274622747227482274922750227512275222753227542275522756227572275822759227602276122762227632276422765227662276722768227692277022771227722277322774227752277622777227782277922780227812278222783227842278522786227872278822789227902279122792227932279422795227962279722798227992280022801228022280322804228052280622807228082280922810228112281222813228142281522816228172281822819228202282122822228232282422825228262282722828228292283022831228322283322834228352283622837228382283922840228412284222843228442284522846228472284822849228502285122852228532285422855228562285722858228592286022861228622286322864228652286622867228682286922870228712287222873228742287522876228772287822879228802288122882228832288422885228862288722888228892289022891228922289322894228952289622897228982289922900229012290222903229042290522906229072290822909229102291122912229132291422915229162291722918229192292022921229222292322924229252292622927229282292922930229312293222933229342293522936229372293822939229402294122942229432294422945229462294722948229492295022951229522295322954229552295622957229582295922960229612296222963229642296522966229672296822969229702297122972229732297422975229762297722978229792298022981229822298322984229852298622987229882298922990229912299222993229942299522996229972299822999230002300123002230032300423005230062300723008230092301023011230122301323014230152301623017230182301923020230212302223023230242302523026230272302823029230302303123032230332303423035230362303723038230392304023041230422304323044230452304623047230482304923050230512305223053230542305523056230572305823059230602306123062230632306423065230662306723068230692307023071230722307323074230752307623077230782307923080230812308223083230842308523086230872308823089230902309123092230932309423095230962309723098230992310023101231022310323104231052310623107231082310923110231112311223113231142311523116231172311823119231202312123122231232312423125231262312723128231292313023131231322313323134231352313623137231382313923140231412314223143231442314523146231472314823149231502315123152231532315423155231562315723158231592316023161231622316323164231652316623167231682316923170231712317223173231742317523176231772317823179231802318123182231832318423185231862318723188231892319023191231922319323194231952319623197231982319923200232012320223203232042320523206232072320823209232102321123212232132321423215232162321723218232192322023221232222322323224232252322623227232282322923230232312323223233232342323523236232372323823239232402324123242232432324423245232462324723248232492325023251232522325323254232552325623257232582325923260232612326223263232642326523266232672326823269232702327123272232732327423275232762327723278232792328023281232822328323284232852328623287232882328923290232912329223293232942329523296232972329823299233002330123302233032330423305233062330723308233092331023311233122331323314233152331623317233182331923320233212332223323233242332523326233272332823329233302333123332233332333423335233362333723338233392334023341233422334323344233452334623347233482334923350233512335223353233542335523356233572335823359233602336123362233632336423365233662336723368233692337023371233722337323374233752337623377233782337923380233812338223383233842338523386233872338823389233902339123392233932339423395233962339723398233992340023401234022340323404234052340623407234082340923410234112341223413234142341523416234172341823419234202342123422234232342423425234262342723428234292343023431234322343323434234352343623437234382343923440234412344223443234442344523446234472344823449234502345123452234532345423455234562345723458234592346023461234622346323464234652346623467234682346923470234712347223473234742347523476234772347823479234802348123482234832348423485234862348723488234892349023491234922349323494234952349623497234982349923500235012350223503235042350523506235072350823509235102351123512235132351423515235162351723518235192352023521235222352323524235252352623527235282352923530235312353223533235342353523536235372353823539235402354123542235432354423545235462354723548235492355023551235522355323554235552355623557235582355923560235612356223563235642356523566235672356823569235702357123572235732357423575235762357723578235792358023581235822358323584235852358623587235882358923590235912359223593235942359523596235972359823599236002360123602236032360423605236062360723608236092361023611236122361323614236152361623617236182361923620236212362223623236242362523626236272362823629236302363123632236332363423635236362363723638236392364023641236422364323644236452364623647236482364923650236512365223653236542365523656236572365823659236602366123662236632366423665236662366723668236692367023671236722367323674236752367623677236782367923680236812368223683236842368523686236872368823689236902369123692236932369423695236962369723698236992370023701237022370323704237052370623707237082370923710237112371223713237142371523716237172371823719237202372123722237232372423725237262372723728237292373023731237322373323734237352373623737237382373923740237412374223743237442374523746237472374823749237502375123752237532375423755237562375723758237592376023761237622376323764237652376623767237682376923770237712377223773237742377523776237772377823779237802378123782237832378423785237862378723788237892379023791237922379323794237952379623797237982379923800238012380223803238042380523806238072380823809238102381123812238132381423815238162381723818238192382023821238222382323824238252382623827238282382923830238312383223833238342383523836238372383823839238402384123842238432384423845238462384723848238492385023851238522385323854238552385623857238582385923860238612386223863238642386523866238672386823869238702387123872238732387423875238762387723878238792388023881238822388323884238852388623887238882388923890238912389223893238942389523896238972389823899239002390123902239032390423905239062390723908239092391023911239122391323914239152391623917239182391923920239212392223923239242392523926239272392823929239302393123932239332393423935239362393723938239392394023941239422394323944239452394623947239482394923950239512395223953239542395523956239572395823959239602396123962239632396423965239662396723968239692397023971239722397323974239752397623977239782397923980239812398223983239842398523986239872398823989239902399123992 |
- // SoftEther VPN Source Code - Stable Edition Repository
- // Cedar Communication Module
- //
- // SoftEther VPN Server, Client and Bridge are free software under the Apache License, Version 2.0.
- //
- // Copyright (c) Daiyuu Nobori.
- // Copyright (c) SoftEther VPN Project, University of Tsukuba, Japan.
- // Copyright (c) SoftEther Corporation.
- // Copyright (c) all contributors on SoftEther VPN project in GitHub.
- //
- // All Rights Reserved.
- //
- // http://www.softether.org/
- //
- // This stable branch is officially managed by Daiyuu Nobori, the owner of SoftEther VPN Project.
- // Pull requests should be sent to the Developer Edition Master Repository on https://github.com/SoftEtherVPN/SoftEtherVPN
- //
- // License: The Apache License, Version 2.0
- // https://www.apache.org/licenses/LICENSE-2.0
- //
- // DISCLAIMER
- // ==========
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- // SOFTWARE.
- //
- // THIS SOFTWARE IS DEVELOPED IN JAPAN, AND DISTRIBUTED FROM JAPAN, UNDER
- // JAPANESE LAWS. YOU MUST AGREE IN ADVANCE TO USE, COPY, MODIFY, MERGE, PUBLISH,
- // DISTRIBUTE, SUBLICENSE, AND/OR SELL COPIES OF THIS SOFTWARE, THAT ANY
- // JURIDICAL DISPUTES WHICH ARE CONCERNED TO THIS SOFTWARE OR ITS CONTENTS,
- // AGAINST US (SOFTETHER PROJECT, SOFTETHER CORPORATION, DAIYUU NOBORI OR OTHER
- // SUPPLIERS), OR ANY JURIDICAL DISPUTES AGAINST US WHICH ARE CAUSED BY ANY KIND
- // OF USING, COPYING, MODIFYING, MERGING, PUBLISHING, DISTRIBUTING, SUBLICENSING,
- // AND/OR SELLING COPIES OF THIS SOFTWARE SHALL BE REGARDED AS BE CONSTRUED AND
- // CONTROLLED BY JAPANESE LAWS, AND YOU MUST FURTHER CONSENT TO EXCLUSIVE
- // JURISDICTION AND VENUE IN THE COURTS SITTING IN TOKYO, JAPAN. YOU MUST WAIVE
- // ALL DEFENSES OF LACK OF PERSONAL JURISDICTION AND FORUM NON CONVENIENS.
- // PROCESS MAY BE SERVED ON EITHER PARTY IN THE MANNER AUTHORIZED BY APPLICABLE
- // LAW OR COURT RULE.
- //
- // USE ONLY IN JAPAN. DO NOT USE THIS SOFTWARE IN ANOTHER COUNTRY UNLESS YOU HAVE
- // A CONFIRMATION THAT THIS SOFTWARE DOES NOT VIOLATE ANY CRIMINAL LAWS OR CIVIL
- // RIGHTS IN THAT PARTICULAR COUNTRY. USING THIS SOFTWARE IN OTHER COUNTRIES IS
- // COMPLETELY AT YOUR OWN RISK. THE SOFTETHER VPN PROJECT HAS DEVELOPED AND
- // DISTRIBUTED THIS SOFTWARE TO COMPLY ONLY WITH THE JAPANESE LAWS AND EXISTING
- // CIVIL RIGHTS INCLUDING PATENTS WHICH ARE SUBJECTS APPLY IN JAPAN. OTHER
- // COUNTRIES' LAWS OR CIVIL RIGHTS ARE NONE OF OUR CONCERNS NOR RESPONSIBILITIES.
- // WE HAVE NEVER INVESTIGATED ANY CRIMINAL REGULATIONS, CIVIL LAWS OR
- // INTELLECTUAL PROPERTY RIGHTS INCLUDING PATENTS IN ANY OF OTHER 200+ COUNTRIES
- // AND TERRITORIES. BY NATURE, THERE ARE 200+ REGIONS IN THE WORLD, WITH
- // DIFFERENT LAWS. IT IS IMPOSSIBLE TO VERIFY EVERY COUNTRIES' LAWS, REGULATIONS
- // AND CIVIL RIGHTS TO MAKE THE SOFTWARE COMPLY WITH ALL COUNTRIES' LAWS BY THE
- // PROJECT. EVEN IF YOU WILL BE SUED BY A PRIVATE ENTITY OR BE DAMAGED BY A
- // PUBLIC SERVANT IN YOUR COUNTRY, THE DEVELOPERS OF THIS SOFTWARE WILL NEVER BE
- // LIABLE TO RECOVER OR COMPENSATE SUCH DAMAGES, CRIMINAL OR CIVIL
- // RESPONSIBILITIES. NOTE THAT THIS LINE IS NOT LICENSE RESTRICTION BUT JUST A
- // STATEMENT FOR WARNING AND DISCLAIMER.
- //
- // READ AND UNDERSTAND THE 'WARNING.TXT' FILE BEFORE USING THIS SOFTWARE.
- // SOME SOFTWARE PROGRAMS FROM THIRD PARTIES ARE INCLUDED ON THIS SOFTWARE WITH
- // LICENSE CONDITIONS WHICH ARE DESCRIBED ON THE 'THIRD_PARTY.TXT' FILE.
- //
- //
- // SOURCE CODE CONTRIBUTION
- // ------------------------
- //
- // Your contribution to SoftEther VPN Project is much appreciated.
- // Please send patches to us through GitHub.
- // Read the SoftEther VPN Patch Acceptance Policy in advance:
- // http://www.softether.org/5-download/src/9.patch
- //
- //
- // DEAR SECURITY EXPERTS
- // ---------------------
- //
- // If you find a bug or a security vulnerability please kindly inform us
- // about the problem immediately so that we can fix the security problem
- // to protect a lot of users around the world as soon as possible.
- //
- // Our e-mail address for security reports is:
- // softether-vpn-security [at] softether.org
- //
- // Please note that the above e-mail address is not a technical support
- // inquiry address. If you need technical assistance, please visit
- // http://www.softether.org/ and ask your question on the users forum.
- //
- // Thank you for your cooperation.
- //
- //
- // NO MEMORY OR RESOURCE LEAKS
- // ---------------------------
- //
- // The memory-leaks and resource-leaks verification under the stress
- // test has been passed before release this source code.
- // Command.c
- // vpncmd Command Line Management Utility
- #include "CedarPch.h"
- // System checker definition
- typedef bool (CHECKER_PROC_DEF)();
- typedef struct CHECKER_PROC
- {
- char *Title;
- CHECKER_PROC_DEF *Proc;
- } CHECKER_PROC;
- static CHECKER_PROC checker_procs[] =
- {
- {"CHECK_PROC_KERNEL", CheckKernel},
- {"CHECK_PROC_MEMORY", CheckMemory},
- {"CHECK_PROC_STRINGS", CheckStrings},
- {"CHECK_PROC_FILESYSTEM", CheckFileSystem},
- {"CHECK_PROC_THREAD", CheckThread},
- {"CHECK_PROC_NETWORK", CheckNetwork},
- };
- typedef struct CHECK_NETWORK_1
- {
- SOCK *ListenSocket;
- } CHECK_NETWORK_1;
- typedef struct CHECK_NETWORK_2
- {
- SOCK *s;
- X *x;
- K *k;
- } CHECK_NETWORK_2;
- // Convert the TT_RESULT to RPC
- void OutRpcTtResult(PACK *p, TT_RESULT *t)
- {
- if (p == NULL || t == NULL)
- {
- return;
- }
- PackAddBool(p, "Raw", t->Raw);
- PackAddBool(p, "Double", t->Double);
- PackAddInt64(p, "NumBytesUpload", t->NumBytesUpload);
- PackAddInt64(p, "NumBytesDownload", t->NumBytesDownload);
- PackAddInt64(p, "NumBytesTotal", t->NumBytesTotal);
- PackAddInt64(p, "Span", t->Span);
- PackAddInt64(p, "BpsUpload", t->BpsUpload);
- PackAddInt64(p, "BpsDownload", t->BpsDownload);
- PackAddInt64(p, "BpsTotal", t->BpsTotal);
- }
- // Convert an RPC to a TT_RESULT
- void InRpcTtResult(PACK *p, TT_RESULT *t)
- {
- if (p == NULL || t == NULL)
- {
- return;
- }
- Zero(t, sizeof(TT_RESULT));
- t->Raw = PackGetBool(p, "Raw");
- t->Double = PackGetBool(p, "Double");
- t->NumBytesUpload = PackGetInt64(p, "NumBytesUpload");
- t->NumBytesDownload = PackGetInt64(p, "NumBytesDownload");
- t->NumBytesTotal = PackGetInt64(p, "NumBytesTotal");
- t->Span = PackGetInt64(p, "Span");
- t->BpsUpload = PackGetInt64(p, "BpsUpload");
- t->BpsDownload = PackGetInt64(p, "BpsDownload");
- t->BpsTotal = PackGetInt64(p, "BpsTotal");
- }
- // Accept thread
- void CheckNetworkAcceptThread(THREAD *thread, void *param)
- {
- CHECK_NETWORK_2 *c = (CHECK_NETWORK_2 *)param;
- SOCK *s = c->s;
- UINT i = 0;
- if (StartSSL(s, c->x, c->k))
- {
- while (true)
- {
- i++;
- if (Send(s, &i, sizeof(UINT), true) == 0)
- {
- break;
- }
- }
- }
- Disconnect(s);
- ReleaseSock(s);
- }
- // Listen thread
- void CheckNetworkListenThread(THREAD *thread, void *param)
- {
- CHECK_NETWORK_1 *c = (CHECK_NETWORK_1 *)param;
- SOCK *s;
- UINT i;
- K *pub, *pri;
- X *x;
- LIST *o = NewList(NULL);
- NAME *name = NewName(L"Test", L"Test", L"Test", L"JP", L"Ibaraki", L"Tsukuba");
- RsaGen(&pri, &pub, 1024);
- x = NewRootX(pub, pri, name, 1000, NULL);
- FreeName(name);
- for (i = 1025;;i++)
- {
- s = Listen(i);
- if (s != NULL)
- {
- break;
- }
- }
- c->ListenSocket = s;
- AddRef(s->ref);
- NoticeThreadInit(thread);
- while (true)
- {
- SOCK *new_sock = Accept(s);
- if (new_sock == NULL)
- {
- break;
- }
- else
- {
- CHECK_NETWORK_2 c;
- THREAD *t;
- Zero(&c, sizeof(c));
- c.s = new_sock;
- c.k = pri;
- c.x = x;
- t = NewThread(CheckNetworkAcceptThread, &c);
- Insert(o, t);
- }
- }
- for (i = 0;i < LIST_NUM(o);i++)
- {
- THREAD *t = LIST_DATA(o, i);
- WaitThread(t, INFINITE);
- ReleaseThread(t);
- }
- FreeK(pri);
- FreeK(pub);
- FreeX(x);
- ReleaseSock(s);
- ReleaseList(o);
- }
- // Network function check
- bool CheckNetwork()
- {
- CHECK_NETWORK_1 c;
- THREAD *t;
- SOCK *listen_socket;
- UINT port;
- UINT i, num;
- bool ok = true;
- SOCK **socks;
- SOCK_EVENT *se = NewSockEvent();
- Zero(&c, sizeof(c));
- t = NewThread(CheckNetworkListenThread, &c);
- WaitThreadInit(t);
- listen_socket = c.ListenSocket;
- port = listen_socket->LocalPort;
- num = 8;
- socks = ZeroMalloc(sizeof(SOCK *) * num);
- for (i = 0;i < num;i++)
- {
- socks[i] = Connect("localhost", port);
- if (socks[i] == NULL)
- {
- Print("Connect Failed. (%u)\n", i);
- ok = false;
- num = i;
- break;
- }
- if (StartSSL(socks[i], NULL, NULL) == false)
- {
- ReleaseSock(socks[i]);
- Print("Connect Failed. (%u)\n", i);
- ok = false;
- num = i;
- break;
- }
- JoinSockToSockEvent(socks[i], se);
- }
- if (ok)
- {
- while (true)
- {
- UINT i;
- bool end = false;
- bool all_blocked = true;
- for (i = 0;i < num;i++)
- {
- UINT n;
- UINT ret;
- n = 0;
- ret = Recv(socks[i], &n, sizeof(UINT), true);
- if (ret == 0)
- {
- Print("Recv Failed (Disconnected).\n", ret);
- end = true;
- ok = false;
- }
- if (ret != SOCK_LATER)
- {
- all_blocked = false;
- }
- if (n >= 128)
- {
- end = true;
- }
- }
- if (end)
- {
- break;
- }
- if (all_blocked)
- {
- WaitSockEvent(se, INFINITE);
- }
- }
- }
- for (i = 0;i < num;i++)
- {
- Disconnect(socks[i]);
- ReleaseSock(socks[i]);
- }
- Free(socks);
- Disconnect(listen_socket);
- WaitThread(t, INFINITE);
- ReleaseThread(t);
- ReleaseSock(listen_socket);
- ReleaseSockEvent(se);
- return ok;
- }
- typedef struct CHECK_THREAD_1
- {
- UINT num;
- LOCK *lock;
- THREAD *wait_thread;
- } CHECK_THREAD_1;
- static UINT check_thread_global_1 = 0;
- #define CHECK_THREAD_INCREMENT_COUNT 32
- // Test thread 1
- void CheckThread1(THREAD *thread, void *param)
- {
- CHECK_THREAD_1 *ct1 = (CHECK_THREAD_1 *)param;
- UINT i;
- UINT num = CHECK_THREAD_INCREMENT_COUNT;
- WaitThread(ct1->wait_thread, INFINITE);
- for (i = 0;i < num;i++)
- {
- Lock(ct1->lock);
- check_thread_global_1 = ct1->num;
- InputToNull((void *)check_thread_global_1);
- check_thread_global_1 = check_thread_global_1 + 1 + RetZero();
- ct1->num = check_thread_global_1;
- Unlock(ct1->lock);
- }
- }
- // Test thread 2
- void CheckThread2(THREAD *thread, void *param)
- {
- EVENT *e = (EVENT *)param;
- Wait(e, INFINITE);
- }
- typedef struct CHECK_THREAD_3
- {
- UINT num, a;
- } CHECK_THREAD_3;
- // Test thread 3
- void CheckThread3(THREAD *thread, void *param)
- {
- CHECK_THREAD_3 *c = (CHECK_THREAD_3 *)param;
- THREAD *t;
- if (c->num == 0)
- {
- return;
- }
- c->num--;
- c->a++;
- t = NewThread(CheckThread3, c);
- WaitThread(t, INFINITE);
- ReleaseThread(t);
- }
- // Thread check
- bool CheckThread()
- {
- bool ok = true;
- CHECK_THREAD_1 ct1;
- UINT num = 32;
- UINT i;
- THREAD **threads;
- EVENT *e;
- THREAD *t2;
- THREAD *t;
- CHECK_THREAD_3 c;
- e = NewEvent();
- Zero(&ct1, sizeof(ct1));
- ct1.lock = NewLock();
- t2 = NewThread(CheckThread2, e);
- ct1.wait_thread = t2;
- threads = ZeroMalloc(sizeof(THREAD *) * num);
- for (i = 0;i < num;i++)
- {
- threads[i] = NewThread(CheckThread1, &ct1);
- if (threads[i] == NULL)
- {
- Print("Thread %u Create Failed.\n", i);
- ok = false;
- }
- }
- Set(e);
- for (i = 0;i < num;i++)
- {
- WaitThread(threads[i], INFINITE);
- ReleaseThread(threads[i]);
- }
- Free(threads);
- if (ct1.num != (num * CHECK_THREAD_INCREMENT_COUNT))
- {
- Print("Threading: %u != %u\n", ct1.num, num * CHECK_THREAD_INCREMENT_COUNT);
- ok = false;
- }
- DeleteLock(ct1.lock);
- WaitThread(t2, INFINITE);
- ReleaseThread(t2);
- ReleaseEvent(e);
- num = 32;
- Zero(&c, sizeof(c));
- c.num = num;
- t = NewThread(CheckThread3, &c);
- WaitThread(t, INFINITE);
- ReleaseThread(t);
- if (c.a != num)
- {
- Print("Threading: %u != %u\n", c.a, num);
- ok = false;
- }
- return ok;
- }
- // File system check
- bool CheckFileSystem()
- {
- bool ok = true;
- char exe[MAX_PATH];
- char exe_dir[MAX_PATH];
- DIRLIST *dirs;
- UINT i;
- GetExeName(exe, sizeof(exe));
- GetExeDir(exe_dir, sizeof(exe_dir));
- ok = false;
- dirs = EnumDir(exe_dir);
- for (i = 0;i < dirs->NumFiles;i++)
- {
- if (EndWith(exe, dirs->File[i]->FileName))
- {
- ok = true;
- break;
- }
- }
- FreeDir(dirs);
- if (ok == false)
- {
- Print("EnumDir Failed.\n");
- return false;
- }
- else
- {
- UINT size = 1234567;
- UCHAR *buf;
- IO *io;
- #ifndef OS_WIN32
- wchar_t *filename = L"/tmp/vpn_checker_tmp";
- #else // OS_WIN32
- wchar_t filename[MAX_PATH];
- CombinePathW(filename, sizeof(filename), MsGetMyTempDirW(), L"vpn_checker_tmp");
- #endif // OS_WIN32
- buf = Malloc(size);
- for (i = 0;i < size;i++)
- {
- buf[i] = i % 256;
- }
- io = FileCreateW(filename);
- if (io == NULL)
- {
- Print("FileCreate Failed.\n");
- Free(buf);
- return false;
- }
- else
- {
- FileWrite(io, buf, size);
- Free(buf);
- FileClose(io);
- io = FileOpenW(filename, false);
- if (FileSize(io) != 1234567)
- {
- Print("FileSize Failed.\n");
- FileClose(io);
- return false;
- }
- else
- {
- BUF *b;
- FileClose(io);
- b = ReadDumpW(filename);
- for (i = 0;i < b->Size;i++)
- {
- UCHAR c = ((UCHAR *)b->Buf)[i];
- if (c != (i % 256))
- {
- Print("FileToBuf Failed.\n");
- FreeBuf(b);
- return false;
- }
- }
- FreeBuf(b);
- }
- }
- FileDeleteW(filename);
- }
- return ok;
- }
- // String check
- bool CheckStrings()
- {
- wchar_t *numstr = _UU("CHECK_TEST_123456789");
- char tmp[MAX_SIZE];
- wchar_t tmp2[MAX_SIZE];
- UINT i;
- UINT sum, sum2;
- UNI_TOKEN_LIST *t;
- UniStrCpy(tmp2, sizeof(tmp2), L"");
- sum2 = 0;
- for (i = 0;i < 64;i++)
- {
- sum2 += i;
- UniFormat(tmp2, sizeof(tmp2), L"%s,%u", tmp2, i);
- }
- t = UniParseToken(tmp2, L",");
- sum = 0;
- for (i = 0;i < t->NumTokens;i++)
- {
- wchar_t *s = t->Token[i];
- UINT n = UniToInt(s);
- sum += n;
- }
- UniFreeToken(t);
- if (sum != sum2)
- {
- Print("UniParseToken Failed.\n");
- return false;
- }
- if (UniToInt(numstr) != 123456789)
- {
- Print("UniToInt Failed.\n");
- return false;
- }
- UniToStr(tmp, sizeof(tmp), numstr);
- if (ToInt(tmp) != 123456789)
- {
- Print("UniToStr Failed.\n");
- return false;
- }
- return true;
- }
- // Memory check
- bool CheckMemory()
- {
- UINT i, num, size, j;
- void **pp;
- bool ok = true;
- UINT old_size;
- num = 2000;
- size = 1000;
- pp = ZeroMalloc(sizeof(void *) * num);
- for (i = 0;i < num;i++)
- {
- pp[i] = ZeroMalloc(size);
- InputToNull(pp[i]);
- for (j = 0;j < size;j++)
- {
- ((UCHAR *)pp[i])[j] = j % 256;
- }
- }
- old_size = size;
- size = size * 3;
- for (i = 0;i < num;i++)
- {
- pp[i] = ReAlloc(pp[i], size);
- for (j = old_size;j < size;j++)
- {
- InputToNull((void *)(UINT)(((UCHAR *)pp[i])[j] = j % 256));
- }
- }
- for (i = 0;i < num;i++)
- {
- for (j = 0;j < size;j++)
- {
- if (((UCHAR *)pp[i])[j] != (j % 256))
- {
- ok = false;
- }
- }
- Free(pp[i]);
- }
- Free(pp);
- // OpenSSL Check
- if (RsaCheckEx() == false)
- {
- // Abort
- Print("RsaCheck(): OpenSSL Library Init Failed. (too old?)\nPlease install the latest version of OpenSSL.\n\n");
- ok = false;
- }
- return ok;
- }
- // Function that do not do anything
- void InputToNull(void *p)
- {
- if (RetZero() == 1)
- {
- UCHAR *c = (UCHAR *)p;
- c[0] = 0x32;
- }
- }
- // Function that returns 0
- UINT RetZero()
- {
- if (g_debug == 0x123455)
- {
- return 1;
- }
- else
- {
- return 0;
- }
- }
- // Kernel check
- bool CheckKernel()
- {
- UINT num = 10, i;
- UINT64 s = Tick64();
- UINT64 t = Tick64();
- for (i = 0;i < num;i++)
- {
- UINT64 q = Tick64();
- if (t > q)
- {
- Print("Tick64 #1 Failed.\n");
- return false;
- }
- t = q;
- SleepThread(100);
- }
- t = (Tick64() - s);
- if (t <= 500 || t >= 2000)
- {
- Print("Tick64 #2 Failed.\n");
- return false;
- }
- else if (false)
- {
- UINT64 tick1 = Tick64();
- UINT64 time1;
- UINT64 tick2, time2;
- SleepThread(1000);
- tick2 = Tick64();
- time2 = LocalTime64();
- time1 = SystemToLocal64(TickToTime(tick1));
- if (time2 > time1)
- {
- s = time2 - time1;
- }
- else
- {
- s = time1 - time2;
- }
- if (s <= 500 || s >= 2000)
- {
- Print("TickToTime Failed.\n");
- return false;
- }
- }
- #ifdef OS_UNIX
- {
- // Test of child process
- UINT pid;
- char exe[MAX_SIZE];
- GetExeName(exe, sizeof(exe));
- pid = fork();
- if (pid == -1)
- {
- Print("fork Failed.\n");
- return false;
- }
- if (pid == 0)
- {
- char *param = UNIX_ARG_EXIT;
- char **args;
- args = ZeroMalloc(sizeof(char *) * 3);
- args[0] = exe;
- args[1] = param;
- args[2] = NULL;
- setsid();
- // Close the standard I/O
- UnixCloseIO();
- // Stop unwanted signals
- signal(SIGHUP, SIG_IGN);
- execvp(exe, args);
- AbortExit();
- }
- else
- {
- int status = 0, ret;
- // Wait for the termination of the child process
- ret = waitpid(pid, &status, 0);
- if (WIFEXITED(status) == 0)
- {
- // Aborted
- Print("waitpid Failed: 0x%x\n", ret);
- return false;
- }
- }
- }
- #endif // OS_UNIX
- return true;
- }
- // System checker
- bool SystemCheck()
- {
- UINT i;
- bool ng = false;
- UniPrint(_UU("CHECK_TITLE"));
- UniPrint(_UU("CHECK_NOTE"));
- for (i = 0;i < sizeof(checker_procs) / sizeof(checker_procs[0]);i++)
- {
- wchar_t *title;
- bool ret = false;
- CHECKER_PROC *p = &checker_procs[i];
- title = _UU(p->Title);
- UniPrint(_UU("CHECK_EXEC_TAG"), title);
- ret = p->Proc();
- if (ret == false)
- {
- ng = true;
- }
- UniPrint(L" %s\n", ret ? _UU("CHECK_PASS") : _UU("CHECK_FAIL"));
- }
- UniPrint(L"\n");
- if (ng == false)
- {
- UniPrint(L"%s\n\n", _UU("CHECK_RESULT_1"));
- }
- else
- {
- UniPrint(L"%s\n\n", _UU("CHECK_RESULT_2"));
- }
- return true;
- }
- // Behavior checker
- UINT PtCheck(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- UINT ret = ERR_NO_ERROR;
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- if (SystemCheck() == false)
- {
- ret = ERR_INTERNAL_ERROR;
- }
- FreeParamValueList(o);
- return ret;
- }
- // VPN Tools main function
- void PtMain(PT *pt)
- {
- char prompt[MAX_SIZE];
- wchar_t tmp[MAX_SIZE];
- // Validate arguments
- if (pt == NULL)
- {
- return;
- }
- // Display a message that start-up is complete
- UniFormat(tmp, sizeof(tmp), _UU("CMD_VPNCMD_TOOLS_CONNECTED"));
- pt->Console->Write(pt->Console, tmp);
- pt->Console->Write(pt->Console, L"");
- while (true)
- {
- // Definition of command
- CMD cmd[] =
- {
- {"About", PsAbout},
- {"MakeCert", PtMakeCert},
- {"MakeCert2048", PtMakeCert2048},
- {"TrafficClient", PtTrafficClient},
- {"TrafficServer", PtTrafficServer},
- {"Check", PtCheck},
- };
- // Generate a prompt
- StrCpy(prompt, sizeof(prompt), "VPN Tools>");
- if (DispatchNextCmdEx(pt->Console, pt->CmdLine, prompt, cmd, sizeof(cmd) / sizeof(cmd[0]), pt) == false)
- {
- break;
- }
- pt->LastError = pt->Console->RetCode;
- if (pt->LastError == ERR_NO_ERROR && pt->Console->ConsoleType != CONSOLE_CSV)
- {
- pt->Console->Write(pt->Console, _UU("CMD_MSG_OK"));
- pt->Console->Write(pt->Console, L"");
- }
- if (pt->CmdLine != NULL)
- {
- break;
- }
- }
- }
- // Create a VPN Tools context
- PT *NewPt(CONSOLE *c, wchar_t *cmdline)
- {
- PT *pt;
- // Validate arguments
- if (c == NULL)
- {
- return NULL;
- }
- if (UniIsEmptyStr(cmdline))
- {
- cmdline = NULL;
- }
- pt = ZeroMalloc(sizeof(PT));
- pt->Console = c;
- pt->CmdLine = CopyUniStr(cmdline);
- return pt;
- }
- // Release the VPN Tools context
- void FreePt(PT *pt)
- {
- // Validate arguments
- if (pt == NULL)
- {
- return;
- }
- Free(pt->CmdLine);
- Free(pt);
- }
- // Start VPN Tools
- UINT PtConnect(CONSOLE *c, wchar_t *cmdline)
- {
- PT *pt;
- UINT ret = 0;
- // Validate arguments
- if (c == NULL)
- {
- return ERR_INTERNAL_ERROR;
- }
- pt = NewPt(c, cmdline);
- PtMain(pt);
- ret = pt->LastError;
- FreePt(pt);
- return ret;
- }
- // Initialize the execution path information of vpncmd command
- void VpnCmdInitBootPath()
- {
- #ifdef OS_WIN32
- char exe_path[MAX_PATH];
- char tmp[MAX_PATH];
- GetExeName(exe_path, sizeof(exe_path));
- if (SearchStrEx(exe_path, "ham.exe", 0, false) != INFINITE || SearchStrEx(exe_path, "ham_x64.exe", 0, false) != INFINITE || SearchStrEx(exe_path, "ham_ia64.exe", 0, false) != INFINITE)
- {
- return;
- }
- if (MsIsAdmin())
- {
- UINT current_ver;
- // Get the version of vpncmd that is currently installed
- current_ver = MsRegReadInt(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_VER);
- if ((CEDAR_BUILD >= current_ver) ||
- MsRegIsValue(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_PATH) == false)
- {
- char *src_filename;
- bool b = false;
- // Copy the vpncmdsys.exe to system32
- if (MsIsNt())
- {
- Format(tmp, sizeof(tmp), "%s\\vpncmd.exe", MsGetSystem32Dir());
- }
- else
- {
- Format(tmp, sizeof(tmp), "%s\\vpncmd.exe", MsGetWindowsDir());
- }
- src_filename = VPNCMD_BOOTSTRAP_FILENAME;
- if (IsX64())
- {
- src_filename = VPNCMD_BOOTSTRAP_FILENAME_X64;
- }
- if (IsIA64())
- {
- src_filename = VPNCMD_BOOTSTRAP_FILENAME_IA64;
- }
- b = true;
- if (MsIs64BitWindows() == false || Is64())
- {
- if (IsFile(tmp) == false || (CEDAR_BUILD > current_ver) || MsRegIsValue(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_PATH) == false)
- {
- b = FileCopy(src_filename, tmp);
- }
- }
- else
- {
- void *wow;
- wow = MsDisableWow64FileSystemRedirection();
- if (true)
- {
- if (IsFile(tmp) == false || (CEDAR_BUILD > current_ver) || MsRegIsValue(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_PATH) == false)
- {
- b = FileCopy(src_filename, tmp);
- }
- }
- MsRestoreWow64FileSystemRedirection(wow);
- if (true)
- {
- if (IsFile(tmp) == false || (CEDAR_BUILD > current_ver) || MsRegIsValue(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_PATH) == false)
- {
- b = FileCopy(src_filename, tmp);
- }
- }
- }
- // Because the currently running prompt is newer version, overwrite the registry
- if (MsIs64BitWindows() == false)
- {
- MsRegWriteStr(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_PATH, exe_path);
- MsRegWriteInt(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_VER, CEDAR_BUILD);
- }
- else
- {
- MsRegWriteStrEx2(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_PATH, exe_path, true, false);
- MsRegWriteIntEx2(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_VER, CEDAR_BUILD, true, false);
- MsRegWriteStrEx2(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_PATH, exe_path, false, true);
- MsRegWriteIntEx2(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_VER, CEDAR_BUILD, false, true);
- }
- }
- }
- #endif // OS_WIN32
- }
- // Show the string
- void TtPrint(void *param, TT_PRINT_PROC *print_proc, wchar_t *str)
- {
- // Validate arguments
- if (print_proc == NULL || str == NULL)
- {
- return;
- }
- print_proc(param, str);
- }
- // Generate new random data
- void TtGenerateRandomData(UCHAR **buf, UINT *size)
- {
- UCHAR *tmp;
- UINT sz;
- UINT i;
- // Validate arguments
- if (buf == NULL || size == NULL)
- {
- return;
- }
- sz = TRAFFIC_BUF_SIZE;
- tmp = Malloc(sz);
- for (i = 0;i < sz;i++)
- {
- tmp[i] = rand() % 256;
- if (tmp[i] == '!')
- {
- tmp[i] = '_';
- }
- }
- *buf = tmp;
- *size = sz;
- }
- // Communication throughput measurement server worker thread
- void TtsWorkerThread(THREAD *thread, void *param)
- {
- TTS *tts;
- TTS_WORKER *w;
- UINT buf_size;
- UCHAR *send_buf_data, *recv_buf_data;
- bool all_sockets_blocked = false;
- UINT64 tmp64;
- LIST *o;
- UINT i;
- wchar_t tmp[MAX_SIZE];
- bool dont_block_next_time = false;
- char *ver_str = TRAFFIC_VER_STR;
- // Validate arguments
- if (thread == NULL || param == NULL)
- {
- return;
- }
- // Allocate the data area
- TtGenerateRandomData(&send_buf_data, &buf_size);
- TtGenerateRandomData(&recv_buf_data, &buf_size);
- w = (TTS_WORKER *)param;
- tts = (TTS *)w->Tts;
- // Preparation of socket events
- w->SockEvent = NewSockEvent();
- AddRef(w->SockEvent->ref);
- // Preparing the Server socket list
- w->TtsSockList = NewList(NULL);
- // Notify completion of preparation to parent thread
- NoticeThreadInit(thread);
- o = NewList(NULL);
- while (tts->Halt == false)
- {
- UINT64 now = Tick64();
- // Wait for all sockets
- if (dont_block_next_time == false)
- {
- WaitSockEvent(w->SockEvent, 50);
- }
- dont_block_next_time = false;
- // Process for sockets that are currently registered
- LockList(w->TtsSockList);
- {
- UINT i;
- all_sockets_blocked = false;
- // Continue to send and receive data
- // until all sockets become block state
- while (all_sockets_blocked == false)
- {
- all_sockets_blocked = true;
- for (i = 0;i < LIST_NUM(w->TtsSockList);i++)
- {
- UINT ret = SOCK_LATER;
- UCHAR *send_data = NULL, *recv_data = NULL;
- UINT send_size = 0, recv_size = 0;
- TTS_SOCK *ts = LIST_DATA(w->TtsSockList, i);
- bool blocked_for_this_socket = false;
- if (ts->SockJoined == false)
- {
- JoinSockToSockEvent(ts->Sock, w->SockEvent);
- ts->SockJoined = true;
- }
- switch (ts->State)
- {
- case 0:
- // Return the version string
- ret = Send(ts->Sock, ver_str, TRAFFIC_VER_STR_SIZE, false);
- if (ret != 0 && ret != SOCK_LATER)
- {
- ts->State = 5;
- ts->LastCommTime = now;
- }
- break;
- case 5:
- // Receive the direction from the client
- ret = Recv(ts->Sock, recv_buf_data, buf_size, false);
- if (ret != 0 && ret != SOCK_LATER)
- {
- UCHAR c;
- ts->LastCommTime = now;
- // Direction of the data is in the first byte that is received
- c = recv_buf_data[0];
- if (c == 0)
- {
- // In the case of 0, Client -> Server
- ts->State = 1;
- }
- else
- {
- // Otherwise Server -> Client
- ts->State = 2;
- }
- if (ret >= (sizeof(UINT64) + sizeof(UINT64) + 1))
- {
- // Session ID
- ts->SessionId = READ_UINT64(recv_buf_data + 1);
- // Span
- ts->Span = READ_UINT64(recv_buf_data + sizeof(UINT64) + 1);
- ts->GiveupSpan = ts->Span * 3ULL + 180000ULL;
- }
- }
- break;
- case 1:
- // Client -> Server
- ret = Recv(ts->Sock, recv_buf_data, buf_size, false);
- if (ret != 0 && ret != SOCK_LATER)
- {
- // Checking the first byte of received
- UCHAR c = recv_buf_data[0];
- ts->LastCommTime = now;
- if (ts->FirstRecvTick == 0)
- {
- // Record the time at which the data has been received for the first
- ts->FirstRecvTick = now;
- }
- else
- {
- // Check whether the span didn't finish yet
- if (ts->FirstRecvTick <= now)
- {
- if (ts->Span != 0)
- {
- UINT64 giveup_tick = ts->FirstRecvTick + ts->Span;
- if (now > giveup_tick)
- {
- // Span has expired
- c = '!';
- }
- }
- }
- }
- if (c == '!')
- {
- // Notice the size information from the server to the client
- ts->State = 3;
- Debug("!");
- }
- }
- break;
- case 2:
- // Server -> Client
- if (ts->NoMoreSendData == false)
- {
- ret = Send(ts->Sock, send_buf_data, buf_size, false);
- if (ret != 0 && ret != SOCK_LATER)
- {
- ts->LastCommTime = now;
- }
- }
- else
- {
- ret = Recv(ts->Sock, recv_buf_data, buf_size, false);
- if (ret != 0 && ret != SOCK_LATER)
- {
- ts->LastCommTime = now;
- }
- }
- if (ts->FirstSendTick == 0)
- {
- ts->FirstSendTick = now;
- }
- else
- {
- if (ts->FirstSendTick <= now)
- {
- if (ts->Span != 0)
- {
- UINT64 giveup_tick = ts->FirstSendTick + ts->Span * 3ULL + 180000ULL;
- if (now > giveup_tick)
- {
- ret = 0;
- }
- }
- }
- }
- break;
- case 3:
- // Notice the size information from the server to the client
- tmp64 = Endian64(ts->NumBytes);
- Recv(ts->Sock, recv_buf_data, buf_size, false);
- if (ts->LastWaitTick == 0 || ts->LastWaitTick <= Tick64())
- {
- ret = Send(ts->Sock, &tmp64, sizeof(tmp64), false);
- if (ret != 0 && ret != SOCK_LATER)
- {
- ts->LastCommTime = now;
- }
- if (ret != SOCK_LATER)
- {
- UINT j;
- ts->LastWaitTick = Tick64() + 100;
- if (ts->SessionId != 0)
- {
- // Not to send more data to the socket of the
- // transmission direction in the same session ID
- for (j = 0;j < LIST_NUM(w->TtsSockList);j++)
- {
- TTS_SOCK *ts2 = LIST_DATA(w->TtsSockList, j);
- if (ts2->SessionId == ts->SessionId &&
- ts2 != ts)
- {
- ts2->NoMoreSendData = true;
- }
- }
- }
- }
- }
- break;
- }
- if (now > (ts->LastCommTime + ts->GiveupSpan))
- {
- // Timeout: disconnect orphan sessions
- ret = 0;
- }
- if (ret == 0)
- {
- // Mark as deleting the socket because it is disconnected
- Insert(o, ts);
- }
- else if (ret == SOCK_LATER)
- {
- // Delay has occurred
- blocked_for_this_socket = true;
- dont_block_next_time = false;
- }
- else
- {
- if (ts->State == 1)
- {
- ts->NumBytes += (UINT64)ret;
- }
- }
- if (blocked_for_this_socket == false)
- {
- all_sockets_blocked = false;
- }
- }
- if (LIST_NUM(o) != 0)
- {
- UINT i;
- // One or more sockets is disconnected
- for (i = 0;i < LIST_NUM(o);i++)
- {
- TTS_SOCK *ts = LIST_DATA(o, i);
- UniFormat(tmp, sizeof(tmp), _UU("TTS_DISCONNECTED"), ts->Id, ts->Sock->RemoteHostname);
- TtPrint(tts->Param, tts->Print, tmp);
- Disconnect(ts->Sock);
- ReleaseSock(ts->Sock);
- Delete(w->TtsSockList, ts);
- Free(ts);
- }
- DeleteAll(o);
- }
- if (w->NewSocketArrived || tts->Halt)
- {
- w->NewSocketArrived = false;
- all_sockets_blocked = true;
- dont_block_next_time = true;
- }
- }
- }
- UnlockList(w->TtsSockList);
- }
- LockList(w->TtsSockList);
- {
- // Release the sockets of all remaining
- for (i = 0;i < LIST_NUM(w->TtsSockList);i++)
- {
- TTS_SOCK *ts = LIST_DATA(w->TtsSockList, i);
- UniFormat(tmp, sizeof(tmp), _UU("TTS_DISCONNECT"), ts->Id, ts->Sock->RemoteHostname);
- TtPrint(tts->Param, tts->Print, tmp);
- Disconnect(ts->Sock);
- ReleaseSock(ts->Sock);
- Free(ts);
- }
- }
- UnlockList(w->TtsSockList);
- // Cleanup
- ReleaseList(o);
- ReleaseList(w->TtsSockList);
- ReleaseSockEvent(w->SockEvent);
- Free(send_buf_data);
- Free(recv_buf_data);
- }
- // Accept thread for IPv6
- void TtsIPv6AcceptThread(THREAD *thread, void *param)
- {
- TTS *tts = (TTS *)param;
- // Validate arguments
- if (tts == NULL || param == NULL)
- {
- return;
- }
- TtsAcceptProc(tts, tts->ListenSocketV6);
- }
- // Accept procedure
- void TtsAcceptProc(TTS *tts, SOCK *listen_socket)
- {
- wchar_t tmp[MAX_SIZE];
- UINT seed = 0;
- // Validate arguments
- if (tts == NULL || listen_socket == NULL)
- {
- return;
- }
- while (tts->Halt == false)
- {
- SOCK *s;
- // Accept
- s = Accept(listen_socket);
- if (s == NULL)
- {
- if (tts->Halt == false)
- {
- SleepThread(10);
- }
- continue;
- }
- else
- {
- UINT num, i;
- TTS_WORKER *w;
- // Connected from the client
- AcceptInitEx(s, true);
- // Choose a worker thread
- num = LIST_NUM(tts->WorkerList);
- i = seed % num;
- seed++;
- w = LIST_DATA(tts->WorkerList, i);
- w->NewSocketArrived = true;
- LockList(w->TtsSockList);
- {
- TTS_SOCK *ts = ZeroMalloc(sizeof(TTS_SOCK));
- ts->Id = (++tts->IdSeed);
- ts->Sock = s;
- ts->GiveupSpan = (UINT64)(10 * 60 * 1000);
- ts->LastCommTime = Tick64();
- UniFormat(tmp, sizeof(tmp), _UU("TTS_ACCEPTED"), ts->Id,
- s->RemoteHostname, s->RemotePort);
- TtPrint(tts->Param, tts->Print, tmp);
- Insert(w->TtsSockList, ts);
- w->NewSocketArrived = true;
- }
- UnlockList(w->TtsSockList);
- SetSockEvent(w->SockEvent);
- }
- }
- }
- // Communication throughput measurement server wait thread
- void TtsListenThread(THREAD *thread, void *param)
- {
- TTS *tts;
- wchar_t tmp[MAX_SIZE];
- // Validate arguments
- if (thread == NULL || param == NULL)
- {
- return;
- }
- tts = (TTS *)param;
- tts->ListenSocket = NULL;
- tts->ListenSocket = ListenEx(tts->Port, false);
- tts->ListenSocketV6 = ListenEx6(tts->Port, false);
- if (tts->ListenSocket == NULL && tts->ListenSocketV6 == NULL)
- {
- // Failed to Listen
- UniFormat(tmp, sizeof(tmp), _UU("TT_LISTEN_FAILED"), tts->Port);
- TtPrint(tts->Param, tts->Print, tmp);
- // Notify completion of preparation to parent thread
- NoticeThreadInit(thread);
- tts->ErrorCode = ERR_INTERNAL_ERROR;
- }
- else
- {
- UINT i, num_worker_threads;
- UniFormat(tmp, sizeof(tmp), _UU("TTS_LISTEN_STARTED"), tts->Port);
- TtPrint(tts->Param, tts->Print, tmp);
- if (tts->ListenSocketV6 != NULL)
- {
- UniFormat(tmp, sizeof(tmp), _UU("TTS_LISTEN_STARTED_V6"), tts->Port);
- TtPrint(tts->Param, tts->Print, tmp);
- }
- else
- {
- UniFormat(tmp, sizeof(tmp), _UU("TTS_LISTEN_FAILED_V6"), tts->Port);
- TtPrint(tts->Param, tts->Print, tmp);
- }
- if (tts->ListenSocket != NULL)
- {
- AddRef(tts->ListenSocket->ref);
- }
- if (tts->ListenSocketV6 != NULL)
- {
- AddRef(tts->ListenSocketV6->ref);
- }
- num_worker_threads = GetNumberOfCpu();
- // Start the worker threads
- for (i = 0;i < num_worker_threads;i++)
- {
- TTS_WORKER *w = ZeroMalloc(sizeof(TTS_WORKER));
- w->Tts = tts;
- w->WorkThread = NewThread(TtsWorkerThread, w);
- WaitThreadInit(w->WorkThread);
- Add(tts->WorkerList, w);
- }
- // Notify completion of preparation to parent thread
- NoticeThreadInit(thread);
- // Prepare for IPv6 Accept thread
- tts->IPv6AcceptThread = NULL;
- if (tts->ListenSocketV6 != NULL)
- {
- tts->IPv6AcceptThread = NewThread(TtsIPv6AcceptThread, tts);
- }
- TtsAcceptProc(tts, tts->ListenSocket);
- if (tts->IPv6AcceptThread != NULL)
- {
- WaitThread(tts->IPv6AcceptThread, INFINITE);
- ReleaseThread(tts->IPv6AcceptThread);
- }
- TtPrint(tts->Param, tts->Print, _UU("TTS_LISTEN_STOP"));
- ReleaseSock(tts->ListenSocket);
- ReleaseSock(tts->ListenSocketV6);
- for (i = 0;i < LIST_NUM(tts->WorkerList);i++)
- {
- TTS_WORKER *w = LIST_DATA(tts->WorkerList, i);
- SetSockEvent(w->SockEvent);
- // Wait for stopping the worker thread
- WaitThread(w->WorkThread, INFINITE);
- ReleaseThread(w->WorkThread);
- ReleaseSockEvent(w->SockEvent);
- Free(w);
- }
- }
- }
- // String of the direction in which data flows
- wchar_t *GetTtcTypeStr(UINT type)
- {
- switch (type)
- {
- case TRAFFIC_TYPE_DOWNLOAD:
- return _UU("TTC_TYPE_DOWNLOAD");
- case TRAFFIC_TYPE_UPLOAD:
- return _UU("TTC_TYPE_UPLOAD");
- default:
- return _UU("TTC_TYPE_FULL");
- }
- }
- // Show a Summary
- void TtcPrintSummary(TTC *ttc)
- {
- wchar_t tmp[MAX_SIZE];
- wchar_t tmp2[MAX_SIZE];
- wchar_t *tag = L"%-35s %s";
- // Validate arguments
- if (ttc == NULL)
- {
- return;
- }
- TtPrint(ttc->Param, ttc->Print, L"");
- TtPrint(ttc->Param, ttc->Print, _UU("TTC_SUMMARY_BAR"));
- TtPrint(ttc->Param, ttc->Print, _UU("TTC_SUMMARY_TITLE"));
- TtPrint(ttc->Param, ttc->Print, L"");
- // Destination host name
- StrToUni(tmp2, sizeof(tmp2), ttc->Host);
- UniFormat(tmp, sizeof(tmp), tag, _UU("TTC_SUMMARY_HOST"), tmp2);
- TtPrint(ttc->Param, ttc->Print, tmp);
- // Destination TCP port number
- UniToStru(tmp2, ttc->Port);
- UniFormat(tmp, sizeof(tmp), tag, _UU("TTC_SUMMARY_PORT"), tmp2);
- TtPrint(ttc->Param, ttc->Print, tmp);
- // Number of TCP connections to establish
- UniToStru(tmp2, ttc->NumTcp);
- UniFormat(tmp, sizeof(tmp), tag, _UU("TTC_SUMMARY_NUMTCP"), tmp2);
- TtPrint(ttc->Param, ttc->Print, tmp);
- // Data transmission direction
- UniFormat(tmp, sizeof(tmp), tag, _UU("TTC_SUMMARY_TYPE"), GetTtcTypeStr(ttc->Type));
- TtPrint(ttc->Param, ttc->Print, tmp);
- // Data transmission span
- UniFormat(tmp2, sizeof(tmp2), _UU("TTC_SPAN_STR"), (double)(ttc->Span) / 1000.0);
- UniFormat(tmp, sizeof(tmp), tag, _UU("TTC_SUMMARY_SPAN"), tmp2);
- TtPrint(ttc->Param, ttc->Print, tmp);
- // Correct the data for Ethernet frame
- UniFormat(tmp, sizeof(tmp), tag, _UU("TTC_SUMMARY_ETHER"), ttc->Raw ? _UU("SEC_NO") : _UU("SEC_YES"));
- TtPrint(ttc->Param, ttc->Print, tmp);
- // Measure the total amount of input and output throughput of relay equipment
- UniFormat(tmp, sizeof(tmp), tag, _UU("TTC_SUMMARY_DOUBLE"), ttc->Double ? _UU("SEC_YES") : _UU("SEC_NO"));
- TtPrint(ttc->Param, ttc->Print, tmp);
- TtPrint(ttc->Param, ttc->Print, _UU("TTC_SUMMARY_BAR"));
- TtPrint(ttc->Param, ttc->Print, L"");
- }
- // Stop the communication throughput measurement client
- void StopTtc(TTC *ttc)
- {
- // Validate arguments
- if (ttc == NULL)
- {
- return;
- }
- TtPrint(ttc->Param, ttc->Print, _UU("TTC_STOPPING"));
- ttc->Halt = true;
- }
- // Generate a result
- void TtcGenerateResult(TTC *ttc)
- {
- TT_RESULT *res;
- UINT i;
- // Validate arguments
- if (ttc == NULL)
- {
- return;
- }
- res = &ttc->Result;
- Zero(res, sizeof(TT_RESULT));
- res->Raw = ttc->Raw;
- res->Double = ttc->Double;
- res->Span = ttc->RealSpan;
- for (i = 0;i < LIST_NUM(ttc->ItcSockList);i++)
- {
- TTC_SOCK *ts = LIST_DATA(ttc->ItcSockList, i);
- if (ts->Download == false)
- {
- // Upload
- res->NumBytesUpload += ts->NumBytes;
- }
- else
- {
- // Download
- res->NumBytesDownload += ts->NumBytes;
- }
- }
- if (res->Raw == false)
- {
- // Correct to match the Ethernet
- res->NumBytesDownload = (UINT64)((double)res->NumBytesDownload * 1514.0 / 1460.0);
- res->NumBytesUpload = (UINT64)((double)res->NumBytesUpload * 1514.0 / 1460.0);
- }
- res->NumBytesTotal = res->NumBytesDownload + res->NumBytesUpload;
- // Measure the throughput
- if (res->Span != 0)
- {
- res->BpsUpload = (UINT64)((double)res->NumBytesUpload * 8.0 / ((double)res->Span / 1000.0));
- res->BpsDownload = (UINT64)((double)res->NumBytesDownload * 8.0 / ((double)res->Span / 1000.0));
- }
- if (res->Double)
- {
- res->BpsUpload *= 2ULL;
- res->BpsDownload *= 2ULL;
- }
- res->BpsTotal = res->BpsUpload + res->BpsDownload;
- }
- // Client worker thread
- void TtcWorkerThread(THREAD *thread, void *param)
- {
- TTC_WORKER *w;
- TTC *ttc;
- bool dont_block_next_time = false;
- bool halting = false;
- UINT64 halt_timeout = 0;
- bool all_sockets_blocked;
- wchar_t tmp[MAX_SIZE];
- UCHAR *send_buf_data, *recv_buf_data;
- UINT buf_size;
- UINT64 tmp64;
- if (thread == NULL || param == NULL)
- {
- return;
- }
- w = (TTC_WORKER *)param;
- ttc = w->Ttc;
- // Allocate the data area
- TtGenerateRandomData(&send_buf_data, &buf_size);
- TtGenerateRandomData(&recv_buf_data, &buf_size);
- NoticeThreadInit(thread);
- // Wait for start
- Wait(w->StartEvent, INFINITE);
- // Main loop
- while (true)
- {
- UINT i;
- if (dont_block_next_time == false)
- {
- WaitSockEvent(w->SockEvent, 50);
- }
- dont_block_next_time = false;
- if (ttc->AbnormalTerminated)
- {
- // Abnormal termination occured
- break;
- }
- if (ttc->Halt || ttc->end_tick <= Tick64() || (ttc->Cancel != NULL && (*ttc->Cancel)))
- {
- // End measurement
- if (halting == false)
- {
- if (ttc->Halt || (ttc->Cancel != NULL && (*ttc->Cancel)))
- {
- if ((ttc->flag1++) == 0)
- {
- // User cancel
- TtPrint(ttc->Param, ttc->Print, _UU("TTC_COMM_USER_CANCEL"));
- }
- }
- else
- {
- // Time elapsed
- if ((ttc->flag2++) == 0)
- {
- UniFormat(tmp, sizeof(tmp), _UU("TTC_COMM_END"),
- (double)ttc->Span / 1000.0);
- TtPrint(ttc->Param, ttc->Print, tmp);
- }
- }
- if (ttc->RealSpan == 0)
- {
- ttc->RealSpan = Tick64() - ttc->start_tick;
- }
- halting = true;
- // Wait for reporting data from the server
- halt_timeout = Tick64() + 60000ULL;
- }
- }
- if (halt_timeout != 0)
- {
- bool ok = true;
- // Wait that all TCP connections to finish processing
- for (i = 0;i < LIST_NUM(w->SockList);i++)
- {
- TTC_SOCK *ts = LIST_DATA(w->SockList, i);
- if (ts->Download == false)
- {
- if (ts->ServerUploadReportReceived == false)
- {
- ok = false;
- }
- }
- }
- if (ok)
- {
- // Measurement completed
- w->Ok = true;
- break;
- }
- else
- {
- if (halt_timeout <= Tick64())
- {
- // An error occured
- ttc->AbnormalTerminated = true;
- ttc->ErrorCode = ERR_PROTOCOL_ERROR;
- break;
- }
- }
- }
- all_sockets_blocked = false;
- // Continue to send and receive data
- // until all sockets become block state
- while (all_sockets_blocked == false)
- {
- all_sockets_blocked = true;
- for (i = 0;i < LIST_NUM(w->SockList);i++)
- {
- UINT ret = SOCK_LATER;
- TTC_SOCK *ts = LIST_DATA(w->SockList, i);
- bool blocked_for_this_socket = false;
- UCHAR c = 0;
- UCHAR c_and_session_id[1 + sizeof(UINT64) + sizeof(UINT64)];
- if (halt_timeout != 0)
- {
- if (ts->State != 3 && ts->State != 4)
- {
- if (ts->Download == false)
- {
- if (ts->State != 0)
- {
- ts->State = 3;
- }
- else
- {
- ts->ServerUploadReportReceived = true;
- ts->State = 4;
- }
- }
- else
- {
- ts->State = 4;
- }
- }
- }
- switch (ts->State)
- {
- case 0:
- // Initial state: Specify the direction of
- // the data flow between client-server
- if (ts->Download)
- {
- c = 1;
- }
- else
- {
- c = 0;
- }
- c_and_session_id[0] = c;
- WRITE_UINT64(c_and_session_id + 1, ttc->session_id);
- WRITE_UINT64(c_and_session_id + sizeof(UINT64) + 1, ttc->Span);
- ret = Send(ts->Sock, c_and_session_id, 1 + sizeof(UINT64) + sizeof(UINT64), false);
- if (ret != 0 && ret != SOCK_LATER)
- {
- if (ts->Download)
- {
- ts->State = 1;
- }
- else
- {
- ts->State = 2;
- }
- }
- break;
- case 1:
- // Server -> Client (download)
- ret = Recv(ts->Sock, recv_buf_data, buf_size, false);
- break;
- case 2:
- // Client -> Server (upload)
- ret = Send(ts->Sock, send_buf_data, buf_size, false);
- break;
- case 3:
- // Transmission completion client -> server (upload)
- // Request the data size
- if (ts->NextSendRequestReportTick == 0 ||
- (Tick64() >= ts->NextSendRequestReportTick))
- {
- UCHAR suprise[MAX_SIZE];
- UINT i;
- ts->NextSendRequestReportTick = Tick64() + 200ULL;
- for (i = 0;i < sizeof(suprise);i++)
- {
- suprise[i] = '!';
- }
- ret = Send(ts->Sock, suprise, sizeof(suprise), false);
- }
- ret = Recv(ts->Sock, &tmp64, sizeof(tmp64), false);
- if (ret != 0 && ret != SOCK_LATER && ret == sizeof(tmp64))
- {
- ts->NumBytes = Endian64(tmp64);
- ts->ServerUploadReportReceived = true;
- ts->State = 4;
- }
- break;
- case 4:
- // Do Nothing
- if (Recv(ts->Sock, recv_buf_data, buf_size, false) == SOCK_LATER)
- {
- ret = SOCK_LATER;
- }
- break;
- }
- if (ret == 0)
- {
- // The socket is disconnected
- ttc->AbnormalTerminated = true;
- ttc->ErrorCode = ERR_PROTOCOL_ERROR;
- blocked_for_this_socket = true;
- dont_block_next_time = false;
- if (ts->HideErrMsg == false)
- {
- UniFormat(tmp, sizeof(tmp), _UU("TTC_COMM_DISCONNECTED"), ts->Id);
- TtPrint(ttc->Param, ttc->Print, tmp);
- ts->HideErrMsg = true;
- }
- }
- else if (ret == SOCK_LATER)
- {
- // Delay has occurred
- blocked_for_this_socket = true;
- dont_block_next_time = false;
- }
- else
- {
- if (ts->Download)
- {
- ts->NumBytes += (UINT64)ret;
- }
- }
- if (blocked_for_this_socket == false)
- {
- all_sockets_blocked = false;
- }
- }
- if (ttc->Halt || (ttc->Cancel != NULL && (*ttc->Cancel)))
- {
- all_sockets_blocked = true;
- dont_block_next_time = true;
- }
- if (ttc->end_tick <= Tick64())
- {
- all_sockets_blocked = true;
- dont_block_next_time = true;
- }
- }
- }
- Free(send_buf_data);
- Free(recv_buf_data);
- }
- // Client thread
- void TtcThread(THREAD *thread, void *param)
- {
- TTC *ttc;
- UINT i;
- wchar_t tmp[MAX_SIZE];
- bool ok = false;
- IP ip_ret;
- // Validate arguments
- if (thread == NULL || param == NULL)
- {
- return;
- }
- ttc = (TTC *)param;
- // Ready
- NoticeThreadInit(thread);
- TtcPrintSummary(ttc);
- UniFormat(tmp, sizeof(tmp), _UU("TTC_CONNECT_START"),
- ttc->Host, ttc->Port, ttc->NumTcp);
- TtPrint(ttc->Param, ttc->Print, tmp);
- // Establish all connections to the client
- ttc->ItcSockList = NewList(NULL);
- ok = true;
- Zero(&ip_ret, sizeof(ip_ret));
- for (i = 0;i < ttc->NumTcp;i++)
- {
- SOCK *s;
- TTC_SOCK *ts = ZeroMalloc(sizeof(TTC_SOCK));
- char target_host[MAX_SIZE];
- ts->Id = i + 1;
- if (ttc->Type == TRAFFIC_TYPE_DOWNLOAD)
- {
- ts->Download = true;
- }
- else if (ttc->Type == TRAFFIC_TYPE_UPLOAD)
- {
- ts->Download = false;
- }
- else
- {
- ts->Download = ((i % 2) == 0) ? true : false;
- }
- StrCpy(target_host, sizeof(target_host), ttc->Host);
- if (IsZeroIp(&ip_ret) == false)
- {
- IPToStr(target_host, sizeof(target_host), &ip_ret);
- }
- s = ConnectEx4(target_host, ttc->Port, 0, ttc->Cancel, NULL, NULL, false, false, true, &ip_ret);
- if (s == NULL)
- {
- UniFormat(tmp, sizeof(tmp), _UU("TTC_CONNECT_FAILED"), i + 1);
- TtPrint(ttc->Param, ttc->Print, tmp);
- ok = false;
- Free(ts);
- break;
- }
- else
- {
- char buffer[TRAFFIC_VER_STR_SIZE];
- SetTimeout(s, 5000);
- Zero(buffer, sizeof(buffer));
- if (Recv(s, buffer, sizeof(buffer), false) != sizeof(buffer) || Cmp(buffer, TRAFFIC_VER_STR, TRAFFIC_VER_STR_SIZE) != 0)
- {
- TtPrint(ttc->Param, ttc->Print, _UU("TTC_CONNECT_NOT_SERVER"));
- ok = false;
- ReleaseSock(s);
- Free(ts);
- break;
- }
- UniFormat(tmp, sizeof(tmp), _UU("TTC_CONNECT_OK"), i + 1);
- TtPrint(ttc->Param, ttc->Print, tmp);
- UniFormat(tmp, sizeof(tmp), _UU("TTC_CONNECT_OK_2"), GetTtcTypeStr(ts->Download ? TRAFFIC_TYPE_DOWNLOAD : TRAFFIC_TYPE_UPLOAD));
- TtPrint(ttc->Param, ttc->Print, tmp);
- ts->Sock = s;
- SetTimeout(s, TIMEOUT_INFINITE);
- }
- Insert(ttc->ItcSockList, ts);
- }
- Set(ttc->InitedEvent);
- if (ttc->StartEvent != NULL)
- {
- Wait(ttc->StartEvent, INFINITE);
- SleepThread(500);
- }
- if (ok)
- {
- UINT64 start_tick, end_tick;
- UINT64 halt_timeout = 0;
- wchar_t tmp1[MAX_SIZE], tmp2[MAX_SIZE];
- UINT check_clock_seed = 0;
- bool halting = false;
- UINT64 session_id = Rand64();
- UINT i, num_cpu;
- bool all_ok = false;
- ttc->session_id = session_id;
- num_cpu = GetNumberOfCpu();
- ttc->WorkerThreadList = NewList(NULL);
- for (i = 0;i < num_cpu;i++)
- {
- TTC_WORKER *w = ZeroMalloc(sizeof(TTC_WORKER));
- w->Ttc = ttc;
- w->SockList = NewList(NULL);
- w->StartEvent = NewEvent();
- w->SockEvent = NewSockEvent();
- w->WorkerThread = NewThread(TtcWorkerThread, w);
- WaitThreadInit(w->WorkerThread);
- Add(ttc->WorkerThreadList, w);
- }
- // Assign each of sockets to each of worker threads
- for (i = 0;i < LIST_NUM(ttc->ItcSockList);i++)
- {
- TTC_SOCK *ts = LIST_DATA(ttc->ItcSockList, i);
- UINT num = LIST_NUM(ttc->WorkerThreadList);
- UINT j = i % num;
- TTC_WORKER *w = LIST_DATA(ttc->WorkerThreadList, j);
- Add(w->SockList, ts);
- JoinSockToSockEvent(ts->Sock, w->SockEvent);
- }
- // Record the current time
- start_tick = Tick64();
- end_tick = start_tick + ttc->Span;
- ttc->start_tick = start_tick;
- ttc->end_tick = end_tick;
- // Set the start event for all worker threads
- for (i = 0;i < LIST_NUM(ttc->WorkerThreadList);i++)
- {
- TTC_WORKER *w = LIST_DATA(ttc->WorkerThreadList, i);
- Set(w->StartEvent);
- }
- // Show start message
- GetDateTimeStrEx64(tmp1, sizeof(tmp1), SystemToLocal64(TickToTime(start_tick)), NULL);
- GetDateTimeStrEx64(tmp2, sizeof(tmp2), SystemToLocal64(TickToTime(end_tick)), NULL);
- UniFormat(tmp, sizeof(tmp), _UU("TTC_COMM_START"), tmp1, tmp2);
- TtPrint(ttc->Param, ttc->Print, tmp);
- // Wait for all worker threads finish
- all_ok = true;
- for (i = 0;i < LIST_NUM(ttc->WorkerThreadList);i++)
- {
- TTC_WORKER *w = LIST_DATA(ttc->WorkerThreadList, i);
- WaitThread(w->WorkerThread, INFINITE);
- if (w->Ok == false)
- {
- all_ok = false;
- }
- }
- if (all_ok)
- {
- // Measurement completed
- // Show the result
- TtcGenerateResult(ttc);
- }
- // Release worker threads
- for (i = 0;i < LIST_NUM(ttc->WorkerThreadList);i++)
- {
- TTC_WORKER *w = LIST_DATA(ttc->WorkerThreadList, i);
- ReleaseThread(w->WorkerThread);
- ReleaseEvent(w->StartEvent);
- ReleaseList(w->SockList);
- ReleaseSockEvent(w->SockEvent);
- Free(w);
- }
- ReleaseList(ttc->WorkerThreadList);
- ttc->WorkerThreadList = NULL;
- }
- else
- {
- // Abort
- TtPrint(ttc->Param, ttc->Print, _UU("TTC_ERROR_ABORTED"));
- ttc->ErrorCode = ERR_CONNECT_FAILED;
- }
- // Cleanup
- for (i = 0;i < LIST_NUM(ttc->ItcSockList);i++)
- {
- TTC_SOCK *ts = LIST_DATA(ttc->ItcSockList, i);
- Disconnect(ts->Sock);
- ReleaseSock(ts->Sock);
- Free(ts);
- }
- ReleaseList(ttc->ItcSockList);
- }
- // Start the communication throughput measurement client
- TTC *NewTtc(char *host, UINT port, UINT numtcp, UINT type, UINT64 span, bool dbl, bool raw, TT_PRINT_PROC *print_proc, void *param)
- {
- return NewTtcEx(host, port, numtcp, type, span, dbl, raw, print_proc, param, NULL, NULL);
- }
- TTC *NewTtcEx(char *host, UINT port, UINT numtcp, UINT type, UINT64 span, bool dbl, bool raw, TT_PRINT_PROC *print_proc, void *param, EVENT *start_event, bool *cancel)
- {
- TTC *ttc;
- ttc = ZeroMalloc(sizeof(TTC));
- ttc->InitedEvent = NewEvent();
- ttc->Port = port;
- StrCpy(ttc->Host, sizeof(ttc->Host), host);
- ttc->NumTcp = numtcp;
- ttc->Type = type;
- ttc->Span = span;
- ttc->Double = dbl;
- ttc->Raw = raw;
- ttc->StartEvent = start_event;
- ttc->Cancel = cancel;
- if (ttc->Type == TRAFFIC_TYPE_FULL && ttc->NumTcp < 2)
- {
- ttc->NumTcp = 2;
- }
- ttc->Print = print_proc;
- ttc->Param = param;
- ttc->ErrorCode = ERR_NO_ERROR;
- TtPrint(ttc->Param, ttc->Print, _UU("TTC_INIT"));
- ttc->Thread = NewThread(TtcThread, ttc);
- WaitThreadInit(ttc->Thread);
- return ttc;
- }
- // Wait for stopping the communication throughput measurement client
- UINT FreeTtc(TTC *ttc, TT_RESULT *result)
- {
- UINT ret;
- // Validate arguments
- if (ttc == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- WaitThread(ttc->Thread, INFINITE);
- ReleaseThread(ttc->Thread);
- TtPrint(ttc->Param, ttc->Print, _UU("TTC_FREE"));
- ret = ttc->ErrorCode;
- if (ret == ERR_NO_ERROR)
- {
- if (result != NULL)
- {
- Copy(result, &ttc->Result, sizeof(TT_RESULT));
- }
- }
- ReleaseEvent(ttc->InitedEvent);
- Free(ttc);
- return ret;
- }
- // Start the communication throughput measurement server
- TTS *NewTts(UINT port, void *param, TT_PRINT_PROC *print_proc)
- {
- TTS *tts;
- THREAD *t;
- tts = ZeroMalloc(sizeof(TTS));
- tts->Port = port;
- tts->Param = param;
- tts->Print = print_proc;
- TtPrint(param, print_proc, _UU("TTS_INIT"));
- tts->WorkerList = NewList(NULL);
- // Creating a thread
- t = NewThread(TtsListenThread, tts);
- WaitThreadInit(t);
- tts->Thread = t;
- return tts;
- }
- // Wait for stopping the communication throughput measurement server
- UINT FreeTts(TTS *tts)
- {
- UINT ret;
- // Validate arguments
- if (tts == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- TtPrint(tts->Param, tts->Print, _UU("TTS_STOP_INIT"));
- tts->Halt = true;
- Disconnect(tts->ListenSocket);
- ReleaseSock(tts->ListenSocket);
- Disconnect(tts->ListenSocketV6);
- ReleaseSock(tts->ListenSocketV6);
- // Wait for the termination of the thread
- WaitThread(tts->Thread, INFINITE);
- ReleaseThread(tts->Thread);
- TtPrint(tts->Param, tts->Print, _UU("TTS_STOP_FINISHED"));
- ret = tts->ErrorCode;
- ReleaseList(tts->WorkerList);
- Free(tts);
- return ret;
- }
- // Show the measurement tools prompt
- void PtTrafficPrintProc(void *param, wchar_t *str)
- {
- CONSOLE *c;
- // Validate arguments
- if (param == NULL || str == NULL)
- {
- return;
- }
- c = (CONSOLE *)param;
- if (c->ConsoleType == CONSOLE_LOCAL)
- {
- Lock(c->OutputLock);
- {
- wchar_t tmp[MAX_SIZE];
- // Display only if the local console
- // (Can not be displayed because threads aren't synchronized otherwise?)
- UniStrCpy(tmp, sizeof(tmp), str);
- if (UniEndWith(str, L"\n") == false)
- {
- UniStrCat(tmp, sizeof(tmp), L"\n");
- }
- UniPrint(L"%s", tmp);
- }
- Unlock(c->OutputLock);
- }
- }
- // Display the communication throughput results
- void TtcPrintResult(CONSOLE *c, TT_RESULT *res)
- {
- CT *ct;
- wchar_t tmp[MAX_SIZE];
- wchar_t tmp1[MAX_SIZE];
- wchar_t tmp2[MAX_SIZE];
- char str[MAX_SIZE];
- // Validate arguments
- if (c == NULL || res == NULL)
- {
- return;
- }
- c->Write(c, _UU("TTC_RES_TITLE"));
- ct = CtNew();
- CtInsertColumn(ct, _UU("TTC_RES_COLUMN_1"), false);
- CtInsertColumn(ct, _UU("TTC_RES_COLUMN_2"), true);
- CtInsertColumn(ct, _UU("TTC_RES_COLUMN_3"), true);
- // Time that was used to measure
- GetSpanStrMilli(str, sizeof(str), res->Span);
- StrToUni(tmp, sizeof(tmp), str);
- CtInsert(ct, _UU("TTC_RES_SPAN"), tmp, L"");
- // Correct the data for Ethernet frame
- CtInsert(ct, _UU("TTC_RES_ETHER"), res->Raw ? _UU("SEC_NO") : _UU("SEC_YES"), L"");
- // Amount of communication data of download direction
- ToStr3(str, sizeof(str), res->NumBytesDownload);
- UniFormat(tmp1, sizeof(tmp1), L"%S Bytes", str);
- ToStrByte1000(str, sizeof(str), res->NumBytesDownload);
- StrToUni(tmp2, sizeof(tmp2), str);
- CtInsert(ct, _UU("TTC_RES_BYTES_DOWNLOAD"), tmp1, tmp2);
- // Amount of communication data of upload direction
- ToStr3(str, sizeof(str), res->NumBytesUpload);
- UniFormat(tmp1, sizeof(tmp1), L"%S Bytes", str);
- ToStrByte1000(str, sizeof(str), res->NumBytesUpload);
- StrToUni(tmp2, sizeof(tmp2), str);
- CtInsert(ct, _UU("TTC_RES_BYTES_UPLOAD"), tmp1, tmp2);
- // Total amount of communication data
- ToStr3(str, sizeof(str), res->NumBytesTotal);
- UniFormat(tmp1, sizeof(tmp1), L"%S Bytes", str);
- ToStrByte1000(str, sizeof(str), res->NumBytesTotal);
- StrToUni(tmp2, sizeof(tmp2), str);
- CtInsert(ct, _UU("TTC_RES_BYTES_TOTAL"), tmp1, tmp2);
- // Calculate the total throughput of input and output of the relay equipment
- CtInsert(ct, _UU("TTC_RES_DOUBLE"), (res->Double == false) ? _UU("SEC_NO") : _UU("SEC_YES"), L"");
- // Average throughput of download direction
- ToStr3(str, sizeof(str), res->BpsDownload);
- UniFormat(tmp1, sizeof(tmp1), L"%S bps", str);
- ToStrByte1000(str, sizeof(str), res->BpsDownload);
- ReplaceStr(str, sizeof(str), str, "Bytes", "bps");
- StrToUni(tmp2, sizeof(tmp2), str);
- CtInsert(ct, _UU("TTC_RES_BPS_DOWNLOAD"), tmp1, tmp2);
- // Average throughput of upload direction
- ToStr3(str, sizeof(str), res->BpsUpload);
- UniFormat(tmp1, sizeof(tmp1), L"%S bps", str);
- ToStrByte1000(str, sizeof(str), res->BpsUpload);
- ReplaceStr(str, sizeof(str), str, "Bytes", "bps");
- StrToUni(tmp2, sizeof(tmp2), str);
- CtInsert(ct, _UU("TTC_RES_BPS_UPLOAD"), tmp1, tmp2);
- // Total average throughput
- ToStr3(str, sizeof(str), res->BpsTotal);
- UniFormat(tmp1, sizeof(tmp1), L"%S bps", str);
- ToStrByte1000(str, sizeof(str), res->BpsTotal);
- ReplaceStr(str, sizeof(str), str, "Bytes", "bps");
- StrToUni(tmp2, sizeof(tmp2), str);
- CtInsert(ct, _UU("TTC_RES_BPS_TOTAL"), tmp1, tmp2);
- CtFree(ct, c);
- }
- // Execute the communication throughput measurement tool server
- UINT PtTrafficServer(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- UINT ret = ERR_NO_ERROR;
- UINT port;
- bool nohup;
- TTS *tts;
- PARAM args[] =
- {
- {"[port]", NULL, NULL, NULL, NULL},
- {"NOHUP", NULL, NULL, NULL, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- port = GetParamInt(o, "[port]");
- if (port == 0)
- {
- port = TRAFFIC_DEFAULT_PORT;
- }
- nohup = GetParamYes(o, "nohup");
- tts = NewTts(port, c, PtTrafficPrintProc);
- if (nohup)
- {
- while (true)
- {
- SleepThread(10000);
- }
- }
- c->Write(c, _UU("TTS_ENTER_TO_EXIT"));
- Free(c->ReadLine(c, L"", true));
- ret = tts->ErrorCode;
- FreeTts(tts);
- if (ret != ERR_NO_ERROR)
- {
- CmdPrintError(c, ret);
- }
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Execute the communication throughput measurement tool client
- UINT PtTrafficClient(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- TTC *ttc;
- LIST *o;
- UINT ret = ERR_NO_ERROR;
- char *host = NULL;
- UINT port;
- UINT num, type;
- bool dbl = false, raw = false;
- UINT64 span;
- // Parameter list that can be specified
- CMD_EVAL_MIN_MAX minmax =
- {
- "CMD_TrafficClient_EVAL_NUMTCP",
- 0, TRAFFIC_NUMTCP_MAX,
- };
- PARAM args[] =
- {
- {"[host:port]", CmdPrompt, _UU("CMD_TrafficClient_PROMPT_HOST"), CmdEvalNotEmpty, NULL},
- {"NUMTCP", NULL, NULL, CmdEvalMinMax, &minmax},
- {"TYPE", NULL, NULL, NULL, NULL},
- {"SPAN", NULL, NULL, NULL, NULL},
- {"DOUBLE", NULL, NULL, NULL, NULL},
- {"RAW", NULL, NULL, NULL, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- if (ParseHostPort(GetParamStr(o, "[host:port]"), &host, &port, TRAFFIC_DEFAULT_PORT) == false)
- {
- c->Write(c, _UU("CMD_TrafficClient_ERROR_HOSTPORT"));
- ret = ERR_INVALID_PARAMETER;
- }
- else
- {
- char *s;
- UINT i;
- Trim(host);
- num = GetParamInt(o, "NUMTCP");
- if (num == 0)
- {
- num = TRAFFIC_NUMTCP_DEFAULT;
- }
- s = GetParamStr(o, "TYPE");
- if (StartWith("download", s))
- {
- type = TRAFFIC_TYPE_DOWNLOAD;
- }
- else if (StartWith("upload", s))
- {
- type = TRAFFIC_TYPE_UPLOAD;
- }
- else
- {
- type = TRAFFIC_TYPE_FULL;
- }
- i = GetParamInt(o, "SPAN");
- if (i == 0)
- {
- i = TRAFFIC_SPAN_DEFAULT;
- }
- span = (UINT64)i * 1000ULL;
- dbl = GetParamYes(o, "DOUBLE");
- raw = GetParamYes(o, "RAW");
- if (type == TRAFFIC_TYPE_FULL)
- {
- if ((num % 2) != 0)
- {
- ret = ERR_INVALID_PARAMETER;
- c->Write(c, _UU("CMD_TrafficClient_ERROR_NUMTCP"));
- }
- }
- if (ret == ERR_NO_ERROR)
- {
- TT_RESULT result;
- ttc = NewTtc(host, port, num, type, span, dbl, raw, PtTrafficPrintProc, c);
- if (c->ConsoleType == CONSOLE_LOCAL)
- {
- if (c->Param != NULL && (((LOCAL_CONSOLE_PARAM *)c->Param)->InBuf == NULL))
- {
- // c->Write(c, _UU("TTC_ENTER_TO_EXIT"));
- // GetLine(NULL, 0);
- // StopTtc(ttc);
- }
- }
- Zero(&result, sizeof(result));
- ret = FreeTtc(ttc, &result);
- if (ret == ERR_NO_ERROR)
- {
- TtcPrintResult(c, &result);
- }
- }
- }
- if (ret != ERR_NO_ERROR)
- {
- CmdPrintError(c, ret);
- }
- // Release of the parameter list
- FreeParamValueList(o);
- Free(host);
- return ret;
- }
- // Certificate easy creation tool (1024 bit)
- UINT PtMakeCert(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- UINT ret = ERR_NO_ERROR;
- X *x = NULL;
- K *pub = NULL;
- K *pri = NULL;
- NAME *n;
- X_SERIAL *x_serial = NULL;
- BUF *buf;
- UINT days;
- X *root_x = NULL;
- K *root_k = NULL;
- // Parameter list that can be specified
- CMD_EVAL_MIN_MAX minmax =
- {
- "CMD_MakeCert_EVAL_EXPIRES",
- 0,
- 10950,
- };
- PARAM args[] =
- {
- {"CN", CmdPrompt, _UU("CMD_MakeCert_PROMPT_CN"), NULL, NULL},
- {"O", CmdPrompt, _UU("CMD_MakeCert_PROMPT_O"), NULL, NULL},
- {"OU", CmdPrompt, _UU("CMD_MakeCert_PROMPT_OU"), NULL, NULL},
- {"C", CmdPrompt, _UU("CMD_MakeCert_PROMPT_C"), NULL, NULL},
- {"ST", CmdPrompt, _UU("CMD_MakeCert_PROMPT_ST"), NULL, NULL},
- {"L", CmdPrompt, _UU("CMD_MakeCert_PROMPT_L"), NULL, NULL},
- {"SERIAL", CmdPrompt, _UU("CMD_MakeCert_PROMPT_SERIAL"), NULL, NULL},
- {"EXPIRES", CmdPrompt, _UU("CMD_MakeCert_PROMPT_EXPIRES"), CmdEvalMinMax, &minmax},
- {"SIGNCERT", NULL, NULL, CmdEvalIsFile, NULL},
- {"SIGNKEY", NULL, NULL, CmdEvalIsFile, NULL},
- {"SAVECERT", CmdPrompt, _UU("CMD_MakeCert_PROMPT_SAVECERT"), CmdEvalNotEmpty, NULL},
- {"SAVEKEY", CmdPrompt, _UU("CMD_MakeCert_PROMPT_SAVEKEY"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- if (IsEmptyStr(GetParamStr(o, "SIGNCERT")) == false && IsEmptyStr(GetParamStr(o, "SIGNKEY")) == false)
- {
- root_x = FileToXW(GetParamUniStr(o, "SIGNCERT"));
- root_k = FileToKW(GetParamUniStr(o, "SIGNKEY"), true, NULL);
- if (root_x == NULL || root_k == NULL || CheckXandK(root_x, root_k) == false)
- {
- ret = ERR_INTERNAL_ERROR;
- c->Write(c, _UU("CMD_MakeCert_ERROR_SIGNKEY"));
- }
- }
- if (ret == ERR_NO_ERROR)
- {
- buf = StrToBin(GetParamStr(o, "SERIAL"));
- if (buf != NULL && buf->Size >= 1)
- {
- x_serial = NewXSerial(buf->Buf, buf->Size);
- }
- FreeBuf(buf);
- n = NewName(GetParamUniStr(o, "CN"), GetParamUniStr(o, "O"), GetParamUniStr(o, "OU"),
- GetParamUniStr(o, "C"), GetParamUniStr(o, "ST"), GetParamUniStr(o, "L"));
- days = GetParamInt(o, "EXPIRES");
- if (days == 0)
- {
- days = 3650;
- }
- RsaGen(&pri, &pub, 1024);
- if (root_x == NULL)
- {
- x = NewRootX(pub, pri, n, days, x_serial);
- }
- else
- {
- x = NewX(pub, root_k, root_x, n, days, x_serial);
- }
- FreeXSerial(x_serial);
- FreeName(n);
- if (x == NULL)
- {
- ret = ERR_INTERNAL_ERROR;
- c->Write(c, _UU("CMD_MakeCert_ERROR_GEN_FAILED"));
- }
- else
- {
- if (XToFileW(x, GetParamUniStr(o, "SAVECERT"), true) == false)
- {
- c->Write(c, _UU("CMD_SAVECERT_FAILED"));
- }
- else if (KToFileW(pri, GetParamUniStr(o, "SAVEKEY"), true, NULL) == false)
- {
- c->Write(c, _UU("CMD_SAVEKEY_FAILED"));
- }
- }
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- // Release of the parameter list
- FreeParamValueList(o);
- FreeX(root_x);
- FreeK(root_k);
- FreeX(x);
- FreeK(pri);
- FreeK(pub);
- return ret;
- }
- // Certificate easy creation tool (2048 bit)
- UINT PtMakeCert2048(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- UINT ret = ERR_NO_ERROR;
- X *x = NULL;
- K *pub = NULL;
- K *pri = NULL;
- NAME *n;
- X_SERIAL *x_serial = NULL;
- BUF *buf;
- UINT days;
- X *root_x = NULL;
- K *root_k = NULL;
- // Parameter list that can be specified
- CMD_EVAL_MIN_MAX minmax =
- {
- "CMD_MakeCert_EVAL_EXPIRES",
- 0,
- 10950,
- };
- PARAM args[] =
- {
- {"CN", CmdPrompt, _UU("CMD_MakeCert_PROMPT_CN"), NULL, NULL},
- {"O", CmdPrompt, _UU("CMD_MakeCert_PROMPT_O"), NULL, NULL},
- {"OU", CmdPrompt, _UU("CMD_MakeCert_PROMPT_OU"), NULL, NULL},
- {"C", CmdPrompt, _UU("CMD_MakeCert_PROMPT_C"), NULL, NULL},
- {"ST", CmdPrompt, _UU("CMD_MakeCert_PROMPT_ST"), NULL, NULL},
- {"L", CmdPrompt, _UU("CMD_MakeCert_PROMPT_L"), NULL, NULL},
- {"SERIAL", CmdPrompt, _UU("CMD_MakeCert_PROMPT_SERIAL"), NULL, NULL},
- {"EXPIRES", CmdPrompt, _UU("CMD_MakeCert_PROMPT_EXPIRES"), CmdEvalMinMax, &minmax},
- {"SIGNCERT", NULL, NULL, CmdEvalIsFile, NULL},
- {"SIGNKEY", NULL, NULL, CmdEvalIsFile, NULL},
- {"SAVECERT", CmdPrompt, _UU("CMD_MakeCert_PROMPT_SAVECERT"), CmdEvalNotEmpty, NULL},
- {"SAVEKEY", CmdPrompt, _UU("CMD_MakeCert_PROMPT_SAVEKEY"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- if (IsEmptyStr(GetParamStr(o, "SIGNCERT")) == false && IsEmptyStr(GetParamStr(o, "SIGNKEY")) == false)
- {
- root_x = FileToXW(GetParamUniStr(o, "SIGNCERT"));
- root_k = FileToKW(GetParamUniStr(o, "SIGNKEY"), true, NULL);
- if (root_x == NULL || root_k == NULL || CheckXandK(root_x, root_k) == false)
- {
- ret = ERR_INTERNAL_ERROR;
- c->Write(c, _UU("CMD_MakeCert_ERROR_SIGNKEY"));
- }
- }
- if (ret == ERR_NO_ERROR)
- {
- buf = StrToBin(GetParamStr(o, "SERIAL"));
- if (buf != NULL && buf->Size >= 1)
- {
- x_serial = NewXSerial(buf->Buf, buf->Size);
- }
- FreeBuf(buf);
- n = NewName(GetParamUniStr(o, "CN"), GetParamUniStr(o, "O"), GetParamUniStr(o, "OU"),
- GetParamUniStr(o, "C"), GetParamUniStr(o, "ST"), GetParamUniStr(o, "L"));
- days = GetParamInt(o, "EXPIRES");
- if (days == 0)
- {
- days = 3650;
- }
- RsaGen(&pri, &pub, 2048);
- if (root_x == NULL)
- {
- x = NewRootX(pub, pri, n, days, x_serial);
- }
- else
- {
- x = NewX(pub, root_k, root_x, n, days, x_serial);
- }
- FreeXSerial(x_serial);
- FreeName(n);
- if (x == NULL)
- {
- ret = ERR_INTERNAL_ERROR;
- c->Write(c, _UU("CMD_MakeCert_ERROR_GEN_FAILED"));
- }
- else
- {
- if (XToFileW(x, GetParamUniStr(o, "SAVECERT"), true) == false)
- {
- c->Write(c, _UU("CMD_SAVECERT_FAILED"));
- }
- else if (KToFileW(pri, GetParamUniStr(o, "SAVEKEY"), true, NULL) == false)
- {
- c->Write(c, _UU("CMD_SAVEKEY_FAILED"));
- }
- }
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- // Release of the parameter list
- FreeParamValueList(o);
- FreeX(root_x);
- FreeK(root_k);
- FreeX(x);
- FreeK(pri);
- FreeK(pub);
- return ret;
- }
- // Client management tool main
- void PcMain(PC *pc)
- {
- char prompt[MAX_SIZE];
- wchar_t tmp[MAX_SIZE];
- // Validate arguments
- if (pc == NULL)
- {
- return;
- }
- // Display a message that the connection has been made
- UniFormat(tmp, sizeof(tmp), _UU("CMD_VPNCMD_CLIENT_CONNECTED"),
- pc->ServerName);
- pc->Console->Write(pc->Console, tmp);
- pc->Console->Write(pc->Console, L"");
- while (true)
- {
- // Definition of command
- CMD cmd[] =
- {
- {"About", PsAbout},
- {"Check", PtCheck},
- {"VersionGet", PcVersionGet},
- {"PasswordSet", PcPasswordSet},
- {"PasswordGet", PcPasswordGet},
- {"CertList", PcCertList},
- {"CertAdd", PcCertAdd},
- {"CertDelete", PcCertDelete},
- {"CertGet", PcCertGet},
- {"SecureList", PcSecureList},
- {"SecureSelect", PcSecureSelect},
- {"SecureGet", PcSecureGet},
- {"NicCreate", PcNicCreate},
- {"NicDelete", PcNicDelete},
- {"NicUpgrade", PcNicUpgrade},
- {"NicGetSetting", PcNicGetSetting},
- {"NicSetSetting", PcNicSetSetting},
- {"NicEnable", PcNicEnable},
- {"NicDisable", PcNicDisable},
- {"NicList", PcNicList},
- {"AccountList", PcAccountList},
- {"AccountCreate", PcAccountCreate},
- {"AccountSet", PcAccountSet},
- {"AccountGet", PcAccountGet},
- {"AccountDelete", PcAccountDelete},
- {"AccountUsernameSet", PcAccountUsernameSet},
- {"AccountAnonymousSet", PcAccountAnonymousSet},
- {"AccountPasswordSet", PcAccountPasswordSet},
- {"AccountCertSet", PcAccountCertSet},
- {"AccountCertGet", PcAccountCertGet},
- {"AccountEncryptDisable", PcAccountEncryptDisable},
- {"AccountEncryptEnable", PcAccountEncryptEnable},
- {"AccountCompressEnable", PcAccountCompressEnable},
- {"AccountCompressDisable", PcAccountCompressDisable},
- {"AccountProxyNone", PcAccountProxyNone},
- {"AccountProxyHttp", PcAccountProxyHttp},
- {"AccountProxySocks", PcAccountProxySocks},
- {"AccountServerCertEnable", PcAccountServerCertEnable},
- {"AccountServerCertDisable", PcAccountServerCertDisable},
- {"AccountServerCertSet", PcAccountServerCertSet},
- {"AccountServerCertDelete", PcAccountServerCertDelete},
- {"AccountServerCertGet", PcAccountServerCertGet},
- {"AccountDetailSet", PcAccountDetailSet},
- {"AccountRename", PcAccountRename},
- {"AccountConnect", PcAccountConnect},
- {"AccountDisconnect", PcAccountDisconnect},
- {"AccountStatusGet", PcAccountStatusGet},
- {"AccountNicSet", PcAccountNicSet},
- {"AccountStatusShow", PcAccountStatusShow},
- {"AccountStatusHide", PcAccountStatusHide},
- {"AccountSecureCertSet", PcAccountSecureCertSet},
- {"AccountRetrySet", PcAccountRetrySet},
- {"AccountStartupSet", PcAccountStartupSet},
- {"AccountStartupRemove", PcAccountStartupRemove},
- {"AccountExport", PcAccountExport},
- {"AccountImport", PcAccountImport},
- {"RemoteEnable", PcRemoteEnable},
- {"RemoteDisable", PcRemoteDisable},
- {"KeepEnable", PcKeepEnable},
- {"KeepDisable", PcKeepDisable},
- {"KeepSet", PcKeepSet},
- {"KeepGet", PcKeepGet},
- {"MakeCert", PtMakeCert},
- {"MakeCert2048", PtMakeCert2048},
- {"TrafficClient", PtTrafficClient},
- {"TrafficServer", PtTrafficServer},
- };
- // Generate a prompt
- StrCpy(prompt, sizeof(prompt), "VPN Client>");
- if (DispatchNextCmdEx(pc->Console, pc->CmdLine, prompt, cmd, sizeof(cmd) / sizeof(cmd[0]), pc) == false)
- {
- break;
- }
- pc->LastError = pc->Console->RetCode;
- if (pc->LastError == ERR_NO_ERROR && pc->Console->ConsoleType != CONSOLE_CSV)
- {
- pc->Console->Write(pc->Console, _UU("CMD_MSG_OK"));
- pc->Console->Write(pc->Console, L"");
- }
- if (pc->CmdLine != NULL)
- {
- break;
- }
- }
- }
- // Retrieve the version information of VPN Client service
- UINT PcVersionGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_VERSION t;
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- ret = CcGetClientVersion(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- wchar_t tmp[MAX_SIZE];
- CT *ct;
- // Success
- ct = CtNewStandard();
- StrToUni(tmp, sizeof(tmp), t.ClientProductName);
- CtInsert(ct, _UU("CMD_VersionGet_1"), tmp);
- StrToUni(tmp, sizeof(tmp), t.ClientVersionString);
- CtInsert(ct, _UU("CMD_VersionGet_2"), tmp);
- StrToUni(tmp, sizeof(tmp), t.ClientBuildInfoString);
- CtInsert(ct, _UU("CMD_VersionGet_3"), tmp);
- UniToStru(tmp, t.ProcessId);
- CtInsert(ct, _UU("CMD_VersionGet_4"), tmp);
- StrToUni(tmp, sizeof(tmp), OsTypeToStr(t.OsType));
- CtInsert(ct, _UU("CMD_VersionGet_5"), tmp);
- CtFree(ct, c);
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- // Release the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Set a password to connect to the VPN Client Service
- UINT PcPasswordSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_PASSWORD t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[password]", CmdPromptChoosePassword, NULL, NULL, NULL},
- {"REMOTEONLY", NULL, NULL, NULL, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- StrCpy(t.Password, sizeof(t.Password), GetParamStr(o, "[password]"));
- t.PasswordRemoteOnly = GetParamYes(o, "REMOTEONLY");
- ret = CcSetPassword(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- // Success
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Get the settings of the password to connect to the VPN Client service
- UINT PcPasswordGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_PASSWORD_SETTING t;
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- ret = CcGetPasswordSetting(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- // Success
- CT *ct = CtNewStandard();
- CtInsert(ct, _UU("CMD_PasswordGet_1"),
- t.IsPasswordPresented ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
- CtInsert(ct, _UU("CMD_PasswordGet_2"),
- t.PasswordRemoteOnly ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
- CtFree(ct, c);
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- // Release the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Get the list of certificates of the trusted certification authority
- UINT PcCertList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_ENUM_CA t;
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- ret = CcEnumCa(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- // Success
- UINT i;
- CT *ct = CtNewStandard();
- for (i = 0;i < t.NumItem;i++)
- {
- wchar_t tmp[MAX_SIZE];
- wchar_t tmp2[64];
- RPC_CLIENT_ENUM_CA_ITEM *e = t.Items[i];
- GetDateStrEx64(tmp, sizeof(tmp), SystemToLocal64(e->Expires), NULL);
- UniToStru(tmp2, e->Key);
- CtInsert(ct, _UU("CMD_CAList_COLUMN_ID"), tmp2);
- CtInsert(ct, _UU("CM_CERT_COLUMN_1"), e->SubjectName);
- CtInsert(ct, _UU("CM_CERT_COLUMN_2"), e->IssuerName);
- CtInsert(ct, _UU("CM_CERT_COLUMN_3"), tmp);
- if (i != (t.NumItem - 1))
- {
- CtInsert(ct, L"---", L"---");
- }
- }
- CtFree(ct, c);
- CiFreeClientEnumCa(&t);
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Add a certificate of the trusted certification authority
- UINT PcCertAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CERT t;
- X *x;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[path]", CmdPrompt, _UU("CMD_CAAdd_PROMPT_PATH"), CmdEvalIsFile, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- x = FileToXW(GetParamUniStr(o, "[path]"));
- if (x == NULL)
- {
- FreeParamValueList(o);
- c->Write(c, _UU("CMD_MSG_LOAD_CERT_FAILED"));
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- t.x = x;
- ret = CcAddCa(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- // Success
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- FreeX(x);
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Delete the certificate of the trusted certification authority
- UINT PcCertDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_DELETE_CA t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[id]", CmdPrompt, _UU("CMD_CADelete_PROMPT_ID"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- t.Key = GetParamInt(o, "[id]");
- ret = CcDeleteCa(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- // Success
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Get the certificate of the trusted certification authority
- UINT PcCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_GET_CA t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[id]", CmdPrompt, _UU("CMD_CAGet_PROMPT_ID"), CmdEvalNotEmpty, NULL},
- {"SAVECERT", CmdPrompt, _UU("CMD_CAGet_PROMPT_SAVECERT"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- t.Key = GetParamInt(o, "[id]");
- ret = CcGetCa(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- // Success
- if (XToFileW(t.x, GetParamUniStr(o, "SAVECERT"), true))
- {
- // Success
- }
- else
- {
- // Failure
- ret = ERR_INTERNAL_ERROR;
- c->Write(c, _UU("CMD_MSG_SAVE_CERT_FAILED"));
- }
- CiFreeGetCa(&t);
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Get the list of the type of smart card that can be used
- UINT PcSecureList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_ENUM_SECURE t;
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- ret = CcEnumSecure(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- CT *ct;
- UINT i;
- wchar_t tmp1[MAX_SIZE];
- wchar_t tmp2[MAX_SIZE];
- wchar_t tmp4[MAX_SIZE];
- wchar_t *tmp3;
- // Success
- ct = CtNew();
- CtInsertColumn(ct, _UU("SEC_COLUMN1"), false);
- CtInsertColumn(ct, _UU("SEC_COLUMN2"), false);
- CtInsertColumn(ct, _UU("SEC_COLUMN3"), false);
- CtInsertColumn(ct, _UU("SEC_COLUMN4"), false);
- for (i = 0;i < t.NumItem;i++)
- {
- RPC_CLIENT_ENUM_SECURE_ITEM *e = t.Items[i];
- // ID
- UniToStru(tmp1, e->DeviceId);
- // Device name
- StrToUni(tmp2, sizeof(tmp2), e->DeviceName);
- // Type
- tmp3 = (e->Type == SECURE_IC_CARD) ? _UU("SEC_SMART_CARD") : _UU("SEC_USB_TOKEN");
- // Manufacturer
- StrToUni(tmp4, sizeof(tmp4), e->Manufacturer);
- CtInsert(ct, tmp1, tmp2, tmp3, tmp4);
- }
- CtFreeEx(ct, c, true);
- CiFreeClientEnumSecure(&t);
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Select the type of smart card to be used
- UINT PcSecureSelect(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_USE_SECURE t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[id]", CmdPrompt, _UU("CMD_SecureSelect_PROMPT_ID"), NULL, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- t.DeviceId = GetParamInt(o, "[id]");
- ret = CcUseSecure(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- // Success
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Get the type ID of smart card to be used
- UINT PcSecureGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_USE_SECURE t;
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- ret = CcGetUseSecure(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- // Success
- wchar_t tmp[MAX_SIZE];
- if (t.DeviceId != 0)
- {
- UniFormat(tmp, sizeof(tmp), _UU("CMD_SecureGet_Print"), t.DeviceId);
- }
- else
- {
- UniStrCpy(tmp, sizeof(tmp), _UU("CMD_SecureGet_NoPrint"));
- }
- c->Write(c, tmp);
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Create a new virtual LAN card
- UINT PcNicCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_CREATE_VLAN t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_NicCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "[name]"));
- ret = CcCreateVLan(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- // Success
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Delete the virtual LAN card
- UINT PcNicDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_CREATE_VLAN t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_NicCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "[name]"));
- ret = CcDeleteVLan(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- // Success
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Upgrading the device driver of the virtual LAN card
- UINT PcNicUpgrade(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_CREATE_VLAN t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_NicCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "[name]"));
- ret = CcUpgradeVLan(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- // Success
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Get the settings of the virtual LAN card
- UINT PcNicGetSetting(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_GET_VLAN t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_NicCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "[name]"));
- ret = CcGetVLan(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- // Success
- CT *ct = CtNewStandard();
- wchar_t tmp[MAX_SIZE];
- StrToUni(tmp, sizeof(tmp), t.DeviceName);
- CtInsert(ct, _UU("CMD_NicGetSetting_1"), tmp);
- CtInsert(ct, _UU("CMD_NicGetSetting_2"), t.Enabled ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
- StrToUni(tmp, sizeof(tmp), t.MacAddress);
- CtInsert(ct, _UU("CMD_NicGetSetting_3"), tmp);
- StrToUni(tmp, sizeof(tmp), t.Version);
- CtInsert(ct, _UU("CMD_NicGetSetting_4"), tmp);
- StrToUni(tmp, sizeof(tmp), t.FileName);
- CtInsert(ct, _UU("CMD_NicGetSetting_5"), tmp);
- StrToUni(tmp, sizeof(tmp), t.Guid);
- CtInsert(ct, _UU("CMD_NicGetSetting_6"), tmp);
- CtFree(ct, c);
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Change the settings for the virtual LAN card
- UINT PcNicSetSetting(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_SET_VLAN t;
- UCHAR mac_address[6];
- BUF *b;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_NicCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
- {"MAC", CmdPrompt, _UU("CMD_NicSetSetting_PROMPT_MAC"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // Inspect the MAC address
- Zero(mac_address, sizeof(mac_address));
- b = StrToBin(GetParamStr(o, "MAC"));
- if (b != NULL && b->Size == 6)
- {
- Copy(mac_address, b->Buf, 6);
- }
- FreeBuf(b);
- if (IsZero(mac_address, 6))
- {
- // MAC address is invalid
- FreeParamValueList(o);
- CmdPrintError(c, ERR_INVALID_PARAMETER);
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "[name]"));
- NormalizeMacAddress(t.MacAddress, sizeof(t.MacAddress), GetParamStr(o, "MAC"));
- ret = CcSetVLan(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- // Success
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Enable the virtual LAN card
- UINT PcNicEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_CREATE_VLAN t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_NicCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "[name]"));
- ret = CcEnableVLan(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- // Success
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Disable the virtual LAN card
- UINT PcNicDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_CREATE_VLAN t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_NicCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "[name]"));
- ret = CcDisableVLan(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- // Success
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Get the Virtual LAN card list
- UINT PcNicList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_ENUM_VLAN t;
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- ret = CcEnumVLan(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- CT *ct;
- UINT i;
- // Success
- ct = CtNew();
- CtInsertColumn(ct, _UU("CM_VLAN_COLUMN_1"), false);
- CtInsertColumn(ct, _UU("CM_VLAN_COLUMN_2"), false);
- CtInsertColumn(ct, _UU("CM_VLAN_COLUMN_3"), false);
- CtInsertColumn(ct, _UU("CM_VLAN_COLUMN_4"), false);
- for (i = 0;i < t.NumItem;i++)
- {
- wchar_t name[MAX_SIZE];
- wchar_t mac[MAX_SIZE];
- wchar_t ver[MAX_SIZE];
- wchar_t *status;
- RPC_CLIENT_ENUM_VLAN_ITEM *v = t.Items[i];
- // Device name
- StrToUni(name, sizeof(name), v->DeviceName);
- // State
- status = v->Enabled ? _UU("CM_VLAN_ENABLED") : _UU("CM_VLAN_DISABLED");
- // MAC address
- StrToUni(mac, sizeof(mac), v->MacAddress);
- // Version
- StrToUni(ver, sizeof(ver), v->Version);
- CtInsert(ct,
- name, status, mac, ver);
- }
- CtFreeEx(ct, c, true);
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- CiFreeClientEnumVLan(&t);
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Get the protocol name string from ID
- wchar_t *GetProtocolName(UINT n)
- {
- switch (n)
- {
- case PROXY_DIRECT:
- return _UU("PROTO_DIRECT_TCP");
- case PROXY_HTTP:
- return _UU("PROTO_HTTP_PROXY");
- case PROXY_SOCKS:
- return _UU("PROTO_SOCKS_PROXY");
- }
- return _UU("PROTO_UNKNOWN");
- }
- // Get the connection settings list
- UINT PcAccountList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_ENUM_ACCOUNT t;
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- ret = CcEnumAccount(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- UINT i;
- CT *ct;
- // Success
- ct = CtNew();
- CtInsertColumn(ct, _UU("CM_ACCOUNT_COLUMN_1"), false);
- CtInsertColumn(ct, _UU("CM_ACCOUNT_COLUMN_2"), false);
- CtInsertColumn(ct, _UU("CM_ACCOUNT_COLUMN_3"), false);
- CtInsertColumn(ct, _UU("CM_ACCOUNT_COLUMN_3_2"), false);
- CtInsertColumn(ct, _UU("CM_ACCOUNT_COLUMN_4"), false);
- for (i = 0;i < t.NumItem;i++)
- {
- RPC_CLIENT_ENUM_ACCOUNT_ITEM *e = t.Items[i];
- wchar_t tmp[MAX_SIZE];
- wchar_t tmp2[MAX_SIZE];
- wchar_t tmp4[MAX_SIZE];
- IP ip;
- char ip_str[MAX_SIZE];
- // Special treatment for IPv6 addresses
- if (StrToIP6(&ip, e->ServerName) && StartWith(e->ServerName, "[") == false)
- {
- Format(ip_str, sizeof(ip_str),
- "[%s]", e->ServerName);
- }
- else
- {
- StrCpy(ip_str, sizeof(ip_str), e->ServerName);
- }
- if (e->Port == 0)
- {
- // Port number unknown
- UniFormat(tmp2, sizeof(tmp2), L"%S (%s)", ip_str, GetProtocolName(e->ProxyType));
- }
- else
- {
- // Port number are also shown
- UniFormat(tmp2, sizeof(tmp2), L"%S:%u (%s)", ip_str, e->Port, GetProtocolName(e->ProxyType));
- }
- // Virtual HUB name
- StrToUni(tmp4, sizeof(tmp4), e->HubName);
- // Add
- StrToUni(tmp, sizeof(tmp), e->DeviceName);
- CtInsert(ct,
- e->AccountName,
- e->Active == false ? _UU("CM_ACCOUNT_OFFLINE") :
- (e->Connected ? _UU("CM_ACCOUNT_ONLINE") : _UU("CM_ACCOUNT_CONNECTING")),
- tmp2, tmp4,
- tmp);
- }
- CtFreeEx(ct, c, true);
- }
- CiFreeClientEnumAccount(&t);
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Create new connection settings
- UINT PcAccountCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_CREATE_ACCOUNT t;
- UINT port = 443;
- char *host = NULL;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- {"SERVER", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Server"), CmdEvalHostAndPort, NULL},
- {"HUB", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Hub"), CmdEvalSafe, NULL},
- {"USERNAME", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Username"), CmdEvalNotEmpty, NULL},
- {"NICNAME", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Nicname"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 443);
- // RPC call
- Zero(&t, sizeof(t));
- t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
- UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
- t.ClientOption->Port = port;
- StrCpy(t.ClientOption->Hostname, sizeof(t.ClientOption->Hostname), host);
- StrCpy(t.ClientOption->HubName, sizeof(t.ClientOption->HubName), GetParamStr(o, "HUB"));
- t.ClientOption->NumRetry = INFINITE;
- t.ClientOption->RetryInterval = 15;
- t.ClientOption->MaxConnection = 1;
- t.ClientOption->UseEncrypt = true;
- t.ClientOption->AdditionalConnectionInterval = 1;
- StrCpy(t.ClientOption->DeviceName, sizeof(t.ClientOption->DeviceName), GetParamStr(o, "NICNAME"));
- t.ClientAuth = ZeroMalloc(sizeof(CLIENT_AUTH));
- t.ClientAuth->AuthType = CLIENT_AUTHTYPE_ANONYMOUS;
- StrCpy(t.ClientAuth->Username, sizeof(t.ClientAuth->Username), GetParamStr(o, "USERNAME"));
- Free(host);
- ret = CcCreateAccount(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- // Success
- }
- CiFreeClientCreateAccount(&t);
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Set the destination of the connection settings
- UINT PcAccountSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_GET_ACCOUNT t;
- char *host = NULL;
- UINT port = 443;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- {"SERVER", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Server"), CmdEvalHostAndPort, NULL},
- {"HUB", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Hub"), CmdEvalSafe, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 443);
- Zero(&t, sizeof(t));
- UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
- ret = CcGetAccount(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- RPC_CLIENT_CREATE_ACCOUNT c;
- // Success
- t.ClientOption->Port = port;
- StrCpy(t.ClientOption->Hostname, sizeof(t.ClientOption->Hostname), host);
- StrCpy(t.ClientOption->HubName, sizeof(t.ClientOption->HubName), GetParamStr(o, "HUB"));
- Zero(&c, sizeof(c));
- c.ClientAuth = t.ClientAuth;
- c.ClientOption = t.ClientOption;
- c.CheckServerCert = t.CheckServerCert;
- c.ServerCert = t.ServerCert;
- c.StartupAccount = t.StartupAccount;
- ret = CcSetAccount(pc->RemoteClient, &c);
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- CiFreeClientGetAccount(&t);
- // Release of the parameter list
- FreeParamValueList(o);
- Free(host);
- return ret;
- }
- // Get the configuration of the connection settings
- UINT PcAccountGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_GET_ACCOUNT t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
- ret = CcGetAccount(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- // Show the contents of the connection settings
- wchar_t tmp[MAX_SIZE];
- CT *ct = CtNewStandard();
- // Connection settings name
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_NAME"), t.ClientOption->AccountName);
- // Host name of the destination VPN Server
- StrToUni(tmp, sizeof(tmp), t.ClientOption->Hostname);
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_HOSTNAME"), tmp);
- // The port number to connect to VPN Server
- UniToStru(tmp, t.ClientOption->Port);
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PORT"), tmp);
- // Virtual HUB name of the destination VPN Server
- StrToUni(tmp, sizeof(tmp), t.ClientOption->HubName);
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_HUBNAME"), tmp);
- // Type of proxy server to go through
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_TYPE"), GetProxyTypeStr(t.ClientOption->ProxyType));
- if (t.ClientOption->ProxyType != PROXY_DIRECT)
- {
- // Host name of the proxy server
- StrToUni(tmp, sizeof(tmp), t.ClientOption->ProxyName);
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_HOSTNAME"), tmp);
- // Port number of the proxy server
- UniToStru(tmp, t.ClientOption->ProxyPort);
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_PORT"), tmp);
- // User name of the proxy server
- StrToUni(tmp, sizeof(tmp), t.ClientOption->ProxyUsername);
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_USERNAME"), tmp);
- }
- // Verify the server certificate
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_SERVER_CERT_USE"),
- t.CheckServerCert ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
- // Registered specific certificate
- if (t.ServerCert != NULL)
- {
- GetAllNameFromX(tmp, sizeof(tmp), t.ServerCert);
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_SERVER_CERT_NAME"), tmp);
- }
- // Device name to be used for the connection
- StrToUni(tmp, sizeof(tmp), t.ClientOption->DeviceName);
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_DEVICE_NAME"), tmp);
- // Authentication type
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_AUTH_TYPE"), GetClientAuthTypeStr(t.ClientAuth->AuthType));
- // User name
- StrToUni(tmp, sizeof(tmp), t.ClientAuth->Username);
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_AUTH_USERNAME"), tmp);
- if (t.ClientAuth->AuthType == CLIENT_AUTHTYPE_CERT)
- {
- if (t.ClientAuth->ClientX != NULL)
- {
- // Client certificate name
- GetAllNameFromX(tmp, sizeof(tmp), t.ClientAuth->ClientX);
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_AUTH_CERT_NAME"), tmp);
- }
- }
- // Number of TCP connections to be used for VPN communication
- UniToStru(tmp, t.ClientOption->MaxConnection);
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_NUMTCP"), tmp);
- // Establishment interval of each TCP connection
- UniToStru(tmp, t.ClientOption->AdditionalConnectionInterval);
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_TCP_INTERVAL"), tmp);
- // Life span of each TCP connection
- if (t.ClientOption->ConnectionDisconnectSpan != 0)
- {
- UniToStru(tmp, t.ClientOption->ConnectionDisconnectSpan);
- }
- else
- {
- UniStrCpy(tmp, sizeof(tmp), _UU("CMD_MSG_INFINITE"));
- }
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_TCP_TTL"), tmp);
- // Use of half-duplex mode
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_TCP_HALF"),
- t.ClientOption->HalfConnection ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
- // Encryption by SSL
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_ENCRYPT"),
- t.ClientOption->UseEncrypt ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
- // Data compression
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_COMPRESS"),
- t.ClientOption->UseCompress ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
- // Connect in bridge / router mode
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_BRIDGE_ROUTER"),
- t.ClientOption->RequireBridgeRoutingMode ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
- // Connect in monitoring mode
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_MONITOR"),
- t.ClientOption->RequireMonitorMode ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
- // Not to rewrite the routing table
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_NO_TRACKING"),
- t.ClientOption->NoRoutingTracking ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
- // Disable the QoS control
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_QOS_DISABLE"),
- t.ClientOption->DisableQoS ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
- CtFree(ct, c);
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- CiFreeClientGetAccount(&t);
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Delete the connection settings
- UINT PcAccountDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_DELETE_ACCOUNT t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
- ret = CcDeleteAccount(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- // Success
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Set the user name used to connect with connection settings
- UINT PcAccountUsernameSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_GET_ACCOUNT t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- {"USERNAME", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Username"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
- ret = CcGetAccount(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- RPC_CLIENT_CREATE_ACCOUNT z;
- // Change the settings
- StrCpy(t.ClientAuth->Username, sizeof(t.ClientAuth->Username), GetParamStr(o, "USERNAME"));
- if (t.ClientAuth->AuthType == CLIENT_AUTHTYPE_PASSWORD)
- {
- c->Write(c, _UU("CMD_AccountUsername_Notice"));
- }
- Zero(&z, sizeof(z));
- z.CheckServerCert = t.CheckServerCert;
- z.ClientAuth = t.ClientAuth;
- z.ClientOption = t.ClientOption;
- z.ServerCert = t.ServerCert;
- z.StartupAccount = t.StartupAccount;
- ret = CcSetAccount(pc->RemoteClient, &z);
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- CiFreeClientGetAccount(&t);
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Set the type of user authentication of connection settings to anonymous authentication
- UINT PcAccountAnonymousSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_GET_ACCOUNT t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
- ret = CcGetAccount(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- RPC_CLIENT_CREATE_ACCOUNT z;
- // Change the settings
- t.ClientAuth->AuthType = CLIENT_AUTHTYPE_ANONYMOUS;
- Zero(&z, sizeof(z));
- z.CheckServerCert = t.CheckServerCert;
- z.ClientAuth = t.ClientAuth;
- z.ClientOption = t.ClientOption;
- z.ServerCert = t.ServerCert;
- z.StartupAccount = t.StartupAccount;
- ret = CcSetAccount(pc->RemoteClient, &z);
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- CiFreeClientGetAccount(&t);
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Set the type of user authentication of connection settings to the password authentication
- UINT PcAccountPasswordSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_GET_ACCOUNT t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- {"PASSWORD", CmdPromptChoosePassword, NULL, NULL, NULL},
- {"TYPE", CmdPrompt, _UU("CMD_CascadePasswordSet_Prompt_Type"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
- ret = CcGetAccount(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- char *typestr = GetParamStr(o, "TYPE");
- RPC_CLIENT_CREATE_ACCOUNT z;
- // Change the settings
- if (StartWith("standard", typestr))
- {
- t.ClientAuth->AuthType = CLIENT_AUTHTYPE_PASSWORD;
- HashPassword(t.ClientAuth->HashedPassword, t.ClientAuth->Username,
- GetParamStr(o, "PASSWORD"));
- }
- else if (StartWith("radius", typestr) || StartWith("ntdomain", typestr))
- {
- t.ClientAuth->AuthType = CLIENT_AUTHTYPE_PLAIN_PASSWORD;
- StrCpy(t.ClientAuth->PlainPassword, sizeof(t.ClientAuth->PlainPassword),
- GetParamStr(o, "PASSWORD"));
- }
- else
- {
- // Error has occured
- c->Write(c, _UU("CMD_CascadePasswordSet_Type_Invalid"));
- ret = ERR_INVALID_PARAMETER;
- }
- if (ret == ERR_NO_ERROR)
- {
- Zero(&z, sizeof(z));
- z.CheckServerCert = t.CheckServerCert;
- z.ClientAuth = t.ClientAuth;
- z.ClientOption = t.ClientOption;
- z.ServerCert = t.ServerCert;
- z.StartupAccount = t.StartupAccount;
- ret = CcSetAccount(pc->RemoteClient, &z);
- }
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- CiFreeClientGetAccount(&t);
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Set the type of user authentication of connection settings to the client certificate authentication
- UINT PcAccountCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_GET_ACCOUNT t;
- X *x;
- K *k;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- {"LOADCERT", CmdPrompt, _UU("CMD_LOADCERTPATH"), CmdEvalIsFile, NULL},
- {"LOADKEY", CmdPrompt, _UU("CMD_LOADKEYPATH"), CmdEvalIsFile, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- if (CmdLoadCertAndKey(c, &x, &k, GetParamUniStr(o, "LOADCERT"), GetParamUniStr(o, "LOADKEY")) == false)
- {
- return ERR_INTERNAL_ERROR;
- }
- // RPC call
- Zero(&t, sizeof(t));
- UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
- ret = CcGetAccount(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- RPC_CLIENT_CREATE_ACCOUNT z;
- t.ClientAuth->AuthType = CLIENT_AUTHTYPE_CERT;
- if (t.ClientAuth->ClientX != NULL)
- {
- FreeX(t.ClientAuth->ClientX);
- }
- if (t.ClientAuth->ClientK != NULL)
- {
- FreeK(t.ClientAuth->ClientK);
- }
- t.ClientAuth->ClientX = CloneX(x);
- t.ClientAuth->ClientK = CloneK(k);
- Zero(&z, sizeof(z));
- z.CheckServerCert = t.CheckServerCert;
- z.ClientAuth = t.ClientAuth;
- z.ClientOption = t.ClientOption;
- z.ServerCert = t.ServerCert;
- z.StartupAccount = t.StartupAccount;
- ret = CcSetAccount(pc->RemoteClient, &z);
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- FreeX(x);
- FreeK(k);
- CiFreeClientGetAccount(&t);
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Get the client certificate to be used for the connection settings
- UINT PcAccountCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_GET_ACCOUNT t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- {"SAVECERT", CmdPrompt, _UU("CMD_SAVECERTPATH"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
- ret = CcGetAccount(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- if (t.ClientAuth->AuthType != CLIENT_AUTHTYPE_CERT)
- {
- c->Write(c, _UU("CMD_CascadeCertSet_Not_Auth_Cert"));
- ret = ERR_INTERNAL_ERROR;
- }
- else if (t.ClientAuth->ClientX == NULL)
- {
- c->Write(c, _UU("CMD_CascadeCertSet_Cert_Not_Exists"));
- ret = ERR_INTERNAL_ERROR;
- }
- else
- {
- XToFileW(t.ClientAuth->ClientX, GetParamUniStr(o, "SAVECERT"), true);
- }
- }
- CiFreeClientGetAccount(&t);
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Disable communication encryption with the connection settings
- UINT PcAccountEncryptDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_GET_ACCOUNT t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
- ret = CcGetAccount(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- RPC_CLIENT_CREATE_ACCOUNT z;
- // Change the settings
- t.ClientOption->UseEncrypt = false;
- Zero(&z, sizeof(z));
- z.CheckServerCert = t.CheckServerCert;
- z.ClientAuth = t.ClientAuth;
- z.ClientOption = t.ClientOption;
- z.ServerCert = t.ServerCert;
- z.StartupAccount = t.StartupAccount;
- ret = CcSetAccount(pc->RemoteClient, &z);
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- CiFreeClientGetAccount(&t);
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Enable communication encryption with the connection settings
- UINT PcAccountEncryptEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_GET_ACCOUNT t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
- ret = CcGetAccount(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- RPC_CLIENT_CREATE_ACCOUNT z;
- // Change the settings
- t.ClientOption->UseEncrypt = true;
- Zero(&z, sizeof(z));
- z.CheckServerCert = t.CheckServerCert;
- z.ClientAuth = t.ClientAuth;
- z.ClientOption = t.ClientOption;
- z.ServerCert = t.ServerCert;
- z.StartupAccount = t.StartupAccount;
- ret = CcSetAccount(pc->RemoteClient, &z);
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- CiFreeClientGetAccount(&t);
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Enable communication data compression with the connection settings
- UINT PcAccountCompressEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_GET_ACCOUNT t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
- ret = CcGetAccount(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- RPC_CLIENT_CREATE_ACCOUNT z;
- // Change the settings
- t.ClientOption->UseCompress = true;
- Zero(&z, sizeof(z));
- z.CheckServerCert = t.CheckServerCert;
- z.ClientAuth = t.ClientAuth;
- z.ClientOption = t.ClientOption;
- z.ServerCert = t.ServerCert;
- z.StartupAccount = t.StartupAccount;
- ret = CcSetAccount(pc->RemoteClient, &z);
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- CiFreeClientGetAccount(&t);
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Disable communication data compression with the connection settings
- UINT PcAccountCompressDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_GET_ACCOUNT t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
- ret = CcGetAccount(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- RPC_CLIENT_CREATE_ACCOUNT z;
- // Change the settings
- t.ClientOption->UseCompress = false;
- Zero(&z, sizeof(z));
- z.CheckServerCert = t.CheckServerCert;
- z.ClientAuth = t.ClientAuth;
- z.ClientOption = t.ClientOption;
- z.ServerCert = t.ServerCert;
- z.StartupAccount = t.StartupAccount;
- ret = CcSetAccount(pc->RemoteClient, &z);
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- CiFreeClientGetAccount(&t);
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Set the connection method of the connection settings to the direct TCP/IP connection
- UINT PcAccountProxyNone(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_GET_ACCOUNT t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
- ret = CcGetAccount(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- RPC_CLIENT_CREATE_ACCOUNT z;
- // Change the settings
- t.ClientOption->ProxyType = PROXY_DIRECT;
- Zero(&z, sizeof(z));
- z.CheckServerCert = t.CheckServerCert;
- z.ClientAuth = t.ClientAuth;
- z.ClientOption = t.ClientOption;
- z.ServerCert = t.ServerCert;
- z.StartupAccount = t.StartupAccount;
- ret = CcSetAccount(pc->RemoteClient, &z);
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- CiFreeClientGetAccount(&t);
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Set the connection method of the connection settings to the HTTP proxy server connection
- UINT PcAccountProxyHttp(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_GET_ACCOUNT t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- {"SERVER", CmdPrompt, _UU("CMD_AccountProxyHttp_Prompt_Server"), CmdEvalHostAndPort, NULL},
- {"USERNAME", NULL, NULL, NULL, NULL},
- {"PASSWORD", NULL, NULL, NULL, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
- ret = CcGetAccount(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- RPC_CLIENT_CREATE_ACCOUNT z;
- char *host;
- UINT port;
- // Data change
- if (ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 8080))
- {
- t.ClientOption->ProxyType = PROXY_HTTP;
- StrCpy(t.ClientOption->ProxyName, sizeof(t.ClientOption->ProxyName), host);
- t.ClientOption->ProxyPort = port;
- StrCpy(t.ClientOption->ProxyUsername, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "USERNAME"));
- StrCpy(t.ClientOption->ProxyPassword, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "PASSWORD"));
- Free(host);
- }
- Zero(&z, sizeof(z));
- z.CheckServerCert = t.CheckServerCert;
- z.ClientAuth = t.ClientAuth;
- z.ClientOption = t.ClientOption;
- z.ServerCert = t.ServerCert;
- z.StartupAccount = t.StartupAccount;
- ret = CcSetAccount(pc->RemoteClient, &z);
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- CiFreeClientGetAccount(&t);
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Set the connection method of the connection settings to the SOCKS proxy server connection
- UINT PcAccountProxySocks(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_GET_ACCOUNT t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- {"SERVER", CmdPrompt, _UU("CMD_AccountProxyHttp_Prompt_Server"), CmdEvalHostAndPort, NULL},
- {"USERNAME", NULL, NULL, NULL, NULL},
- {"PASSWORD", NULL, NULL, NULL, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
- ret = CcGetAccount(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- RPC_CLIENT_CREATE_ACCOUNT z;
- char *host;
- UINT port;
- // Data change
- if (ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 8080))
- {
- t.ClientOption->ProxyType = PROXY_SOCKS;
- StrCpy(t.ClientOption->ProxyName, sizeof(t.ClientOption->ProxyName), host);
- t.ClientOption->ProxyPort = port;
- StrCpy(t.ClientOption->ProxyUsername, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "USERNAME"));
- StrCpy(t.ClientOption->ProxyPassword, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "PASSWORD"));
- Free(host);
- }
- Zero(&z, sizeof(z));
- z.CheckServerCert = t.CheckServerCert;
- z.ClientAuth = t.ClientAuth;
- z.ClientOption = t.ClientOption;
- z.ServerCert = t.ServerCert;
- z.StartupAccount = t.StartupAccount;
- ret = CcSetAccount(pc->RemoteClient, &z);
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- CiFreeClientGetAccount(&t);
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Enable validation option for server certificate of connection settings
- UINT PcAccountServerCertEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_GET_ACCOUNT t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
- ret = CcGetAccount(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- RPC_CLIENT_CREATE_ACCOUNT z;
- // Change the settings
- t.CheckServerCert = true;
- Zero(&z, sizeof(z));
- z.CheckServerCert = t.CheckServerCert;
- z.ClientAuth = t.ClientAuth;
- z.ClientOption = t.ClientOption;
- z.ServerCert = t.ServerCert;
- z.StartupAccount = t.StartupAccount;
- ret = CcSetAccount(pc->RemoteClient, &z);
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- CiFreeClientGetAccount(&t);
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Disable validation option of the server certificate of connection settings
- UINT PcAccountServerCertDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_GET_ACCOUNT t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
- ret = CcGetAccount(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- RPC_CLIENT_CREATE_ACCOUNT z;
- // Change the settings
- t.CheckServerCert = false;
- Zero(&z, sizeof(z));
- z.CheckServerCert = t.CheckServerCert;
- z.ClientAuth = t.ClientAuth;
- z.ClientOption = t.ClientOption;
- z.ServerCert = t.ServerCert;
- z.StartupAccount = t.StartupAccount;
- ret = CcSetAccount(pc->RemoteClient, &z);
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- CiFreeClientGetAccount(&t);
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Set the server-specific certificate of connection settings
- UINT PcAccountServerCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_GET_ACCOUNT t;
- X *x;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- {"LOADCERT", CmdPrompt, _UU("CMD_LOADCERTPATH"), CmdEvalIsFile, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- x = FileToXW(GetParamUniStr(o, "LOADCERT"));
- if (x == NULL)
- {
- FreeParamValueList(o);
- c->Write(c, _UU("CMD_LOADCERT_FAILED"));
- return ERR_INTERNAL_ERROR;
- }
- // RPC call
- Zero(&t, sizeof(t));
- UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
- ret = CcGetAccount(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- RPC_CLIENT_CREATE_ACCOUNT z;
- // Change the settings
- if (t.ServerCert != NULL)
- {
- FreeX(t.ServerCert);
- }
- t.ServerCert = CloneX(x);
- Zero(&z, sizeof(z));
- z.CheckServerCert = t.CheckServerCert;
- z.ClientAuth = t.ClientAuth;
- z.ClientOption = t.ClientOption;
- z.ServerCert = t.ServerCert;
- z.StartupAccount = t.StartupAccount;
- ret = CcSetAccount(pc->RemoteClient, &z);
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- CiFreeClientGetAccount(&t);
- // Release of the parameter list
- FreeParamValueList(o);
- FreeX(x);
- return ret;
- }
- // Delete a server-specific certificate of connection settings
- UINT PcAccountServerCertDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_GET_ACCOUNT t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
- ret = CcGetAccount(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- RPC_CLIENT_CREATE_ACCOUNT z;
- // Change the settings
- if (t.ServerCert != NULL)
- {
- FreeX(t.ServerCert);
- }
- t.ServerCert = NULL;
- Zero(&z, sizeof(z));
- z.CheckServerCert = t.CheckServerCert;
- z.ClientAuth = t.ClientAuth;
- z.ClientOption = t.ClientOption;
- z.ServerCert = t.ServerCert;
- z.StartupAccount = t.StartupAccount;
- ret = CcSetAccount(pc->RemoteClient, &z);
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- CiFreeClientGetAccount(&t);
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Get a server-specific certificate of connection settings
- UINT PcAccountServerCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_GET_ACCOUNT t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- {"SAVECERT", CmdPrompt, _UU("CMD_SAVECERTPATH"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
- ret = CcGetAccount(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- RPC_CLIENT_CREATE_ACCOUNT z;
- // Change the settings
- if (t.ServerCert != NULL)
- {
- FreeX(t.ServerCert);
- }
- t.ServerCert = NULL;
- Zero(&z, sizeof(z));
- z.CheckServerCert = t.CheckServerCert;
- z.ClientAuth = t.ClientAuth;
- z.ClientOption = t.ClientOption;
- z.ServerCert = t.ServerCert;
- z.StartupAccount = t.StartupAccount;
- ret = CcSetAccount(pc->RemoteClient, &z);
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- CiFreeClientGetAccount(&t);
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Set the advanced settings of connection settings
- UINT PcAccountDetailSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_GET_ACCOUNT t;
- CMD_EVAL_MIN_MAX mm_maxtcp =
- {
- "CMD_CascadeDetailSet_Eval_MaxTcp", 1, 32
- };
- CMD_EVAL_MIN_MAX mm_interval =
- {
- "CMD_CascadeDetailSet_Eval_Interval", 1, 4294967295UL
- };
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- {"MAXTCP", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_MaxTcp"), CmdEvalMinMax, &mm_maxtcp},
- {"INTERVAL", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_Interval"), CmdEvalMinMax, &mm_interval},
- {"TTL", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_TTL"), NULL, NULL},
- {"HALF", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_HALF"), NULL, NULL},
- {"BRIDGE", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_BRIDGE"), NULL, NULL},
- {"MONITOR", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_MONITOR"), NULL, NULL},
- {"NOTRACK", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_NOTRACK"), NULL, NULL},
- {"NOQOS", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_NOQOS"), NULL, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
- ret = CcGetAccount(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- RPC_CLIENT_CREATE_ACCOUNT z;
- // Data change
- t.ClientOption->MaxConnection = GetParamInt(o, "MAXTCP");
- t.ClientOption->AdditionalConnectionInterval = GetParamInt(o, "INTERVAL");
- t.ClientOption->ConnectionDisconnectSpan = GetParamInt(o, "TTL");
- t.ClientOption->HalfConnection = GetParamYes(o, "HALF");
- t.ClientOption->RequireBridgeRoutingMode = GetParamYes(o, "BRIDGE");
- t.ClientOption->RequireMonitorMode = GetParamYes(o, "MONITOR");
- t.ClientOption->NoRoutingTracking = GetParamYes(o, "NOTRACK");
- t.ClientOption->DisableQoS = GetParamYes(o, "NOQOS");
- Zero(&z, sizeof(z));
- z.CheckServerCert = t.CheckServerCert;
- z.ClientAuth = t.ClientAuth;
- z.ClientOption = t.ClientOption;
- z.ServerCert = t.ServerCert;
- z.StartupAccount = t.StartupAccount;
- ret = CcSetAccount(pc->RemoteClient, &z);
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- CiFreeClientGetAccount(&t);
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Change the name of the connection settings
- UINT PcAccountRename(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_RENAME_ACCOUNT t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_AccountRename_PROMPT_OLD"), CmdEvalNotEmpty, NULL},
- {"NEW", CmdPrompt, _UU("CMD_AccountRename_PROMPT_NEW"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- UniStrCpy(t.NewName, sizeof(t.NewName), GetParamUniStr(o, "NEW"));
- UniStrCpy(t.OldName, sizeof(t.OldName), GetParamUniStr(o, "[name]"));
- ret = CcRenameAccount(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- // Success
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Start to connect to the VPN Server using the connection settings
- UINT PcAccountConnect(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_CONNECT t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
- ret = CcConnect(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- // Success
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Disconnect the connection settings of connected
- UINT PcAccountDisconnect(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_CONNECT t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
- ret = CcDisconnect(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- // Success
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Get the current state of the connection settings
- UINT PcAccountStatusGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_GET_CONNECTION_STATUS t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
- ret = CcGetAccountStatus(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- if (t.Active == false)
- {
- // Has been disconnected
- ret = ERR_ACCOUNT_INACTIVE;
- }
- else
- {
- CT *ct = CtNewStandard();
- CmdPrintStatusToListView(ct, &t);
- CtFree(ct, c);
- }
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- CiFreeClientGetConnectionStatus(&t);
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Set a virtual LAN card to be used in the connection settings
- UINT PcAccountNicSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_GET_ACCOUNT t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- {"NICNAME", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Nicname"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- Zero(&t, sizeof(t));
- UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
- ret = CcGetAccount(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- RPC_CLIENT_CREATE_ACCOUNT c;
- // Success
- StrCpy(t.ClientOption->DeviceName, sizeof(t.ClientOption->DeviceName),
- GetParamStr(o, "NICNAME"));
- Zero(&c, sizeof(c));
- c.ClientAuth = t.ClientAuth;
- c.ClientOption = t.ClientOption;
- c.CheckServerCert = t.CheckServerCert;
- c.ServerCert = t.ServerCert;
- c.StartupAccount = t.StartupAccount;
- ret = CcSetAccount(pc->RemoteClient, &c);
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- CiFreeClientGetAccount(&t);
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Set to display error screens and connection status while connecting to the VPN Server
- UINT PcAccountStatusShow(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_GET_ACCOUNT t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
- ret = CcGetAccount(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- RPC_CLIENT_CREATE_ACCOUNT z;
- // Change the settings
- t.ClientOption->HideStatusWindow = false;
- Zero(&z, sizeof(z));
- z.CheckServerCert = t.CheckServerCert;
- z.ClientAuth = t.ClientAuth;
- z.ClientOption = t.ClientOption;
- z.ServerCert = t.ServerCert;
- z.StartupAccount = t.StartupAccount;
- ret = CcSetAccount(pc->RemoteClient, &z);
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- CiFreeClientGetAccount(&t);
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Configure not to display error screens and connection status while connecting to the VPN Server
- UINT PcAccountStatusHide(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_GET_ACCOUNT t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
- ret = CcGetAccount(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- RPC_CLIENT_CREATE_ACCOUNT z;
- // Change the settings
- t.ClientOption->HideStatusWindow = true;
- Zero(&z, sizeof(z));
- z.CheckServerCert = t.CheckServerCert;
- z.ClientAuth = t.ClientAuth;
- z.ClientOption = t.ClientOption;
- z.ServerCert = t.ServerCert;
- z.StartupAccount = t.StartupAccount;
- ret = CcSetAccount(pc->RemoteClient, &z);
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- CiFreeClientGetAccount(&t);
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Set the type of user authentication of connection settings to the smart card authentication
- UINT PcAccountSecureCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_GET_ACCOUNT t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- {"CERTNAME", CmdPrompt, _UU("CMD_AccountSecureCertSet_PROMPT_CERTNAME"), CmdEvalNotEmpty, NULL},
- {"KEYNAME", CmdPrompt, _UU("CMD_AccountSecureCertSet_PROMPT_KEYNAME"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
- ret = CcGetAccount(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- RPC_CLIENT_CREATE_ACCOUNT z;
- // Change the settings
- t.ClientAuth->AuthType = CLIENT_AUTHTYPE_SECURE;
- StrCpy(t.ClientAuth->SecurePublicCertName, sizeof(t.ClientAuth->SecurePublicCertName),
- GetParamStr(o, "CERTNAME"));
- StrCpy(t.ClientAuth->SecurePrivateKeyName, sizeof(t.ClientAuth->SecurePrivateKeyName),
- GetParamStr(o, "KEYNAME"));
- Zero(&z, sizeof(z));
- z.CheckServerCert = t.CheckServerCert;
- z.ClientAuth = t.ClientAuth;
- z.ClientOption = t.ClientOption;
- z.ServerCert = t.ServerCert;
- z.StartupAccount = t.StartupAccount;
- ret = CcSetAccount(pc->RemoteClient, &z);
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- CiFreeClientGetAccount(&t);
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Set the retry interval and number of retries when disconnect or connection failure of connection settings
- UINT PcAccountRetrySet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_GET_ACCOUNT t;
- // Parameter list that can be specified
- CMD_EVAL_MIN_MAX minmax =
- {
- "CMD_AccountRetrySet_EVAL_INTERVAL",
- 5,
- 4294967295UL,
- };
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- {"NUM", CmdPrompt, _UU("CMD_AccountRetrySet_PROMPT_NUM"), CmdEvalNotEmpty, NULL},
- {"INTERVAL", CmdPrompt, _UU("CMD_AccountRetrySet_PROMPY_INTERVAL"), CmdEvalMinMax, &minmax},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
- ret = CcGetAccount(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- RPC_CLIENT_CREATE_ACCOUNT z;
- // Change the settings
- UINT num = GetParamInt(o, "NUM");
- UINT interval = GetParamInt(o, "INTERVAL");
- t.ClientOption->NumRetry = (num == 999) ? INFINITE : num;
- t.ClientOption->RetryInterval = interval;
- Zero(&z, sizeof(z));
- z.CheckServerCert = t.CheckServerCert;
- z.ClientAuth = t.ClientAuth;
- z.ClientOption = t.ClientOption;
- z.ServerCert = t.ServerCert;
- z.StartupAccount = t.StartupAccount;
- ret = CcSetAccount(pc->RemoteClient, &z);
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- CiFreeClientGetAccount(&t);
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Set to start-up connection the connection settings
- UINT PcAccountStartupSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_GET_ACCOUNT t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
- ret = CcGetAccount(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- RPC_CLIENT_CREATE_ACCOUNT z;
- // Change the settings
- t.StartupAccount = true;
- Zero(&z, sizeof(z));
- z.CheckServerCert = t.CheckServerCert;
- z.ClientAuth = t.ClientAuth;
- z.ClientOption = t.ClientOption;
- z.ServerCert = t.ServerCert;
- z.StartupAccount = t.StartupAccount;
- ret = CcSetAccount(pc->RemoteClient, &z);
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- CiFreeClientGetAccount(&t);
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Unset the start-up connection of the connection settings
- UINT PcAccountStartupRemove(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_GET_ACCOUNT t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
- ret = CcGetAccount(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- RPC_CLIENT_CREATE_ACCOUNT z;
- // Change the settings
- t.StartupAccount = false;
- Zero(&z, sizeof(z));
- z.CheckServerCert = t.CheckServerCert;
- z.ClientAuth = t.ClientAuth;
- z.ClientOption = t.ClientOption;
- z.ServerCert = t.ServerCert;
- z.StartupAccount = t.StartupAccount;
- ret = CcSetAccount(pc->RemoteClient, &z);
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- CiFreeClientGetAccount(&t);
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Export the connection settings
- UINT PcAccountExport(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- RPC_CLIENT_GET_ACCOUNT t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- {"SAVEPATH", CmdPrompt, _UU("CMD_AccountExport_PROMPT_SAVEPATH"), CmdEvalNotEmpty, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
- ret = CcGetAccount(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- RPC_CLIENT_CREATE_ACCOUNT z;
- BUF *b;
- BUF *b2;
- char tmp[MAX_SIZE];
- UCHAR *buf;
- UINT buf_size;
- UCHAR bom[] = {0xef, 0xbb, 0xbf, };
- Zero(&z, sizeof(z));
- z.CheckServerCert = t.CheckServerCert;
- z.ClientAuth = t.ClientAuth;
- z.ClientOption = t.ClientOption;
- z.ServerCert = t.ServerCert;
- z.StartupAccount = t.StartupAccount;
- b = CiAccountToCfg(&z);
- StrCpy(tmp, sizeof(tmp), GetParamStr(o, "SAVEPATH"));
- b2 = NewBuf();
- WriteBuf(b2, bom, sizeof(bom));
- // Add the header part
- buf_size = CalcUniToUtf8(_UU("CM_ACCOUNT_FILE_BANNER"));
- buf = ZeroMalloc(buf_size + 32);
- UniToUtf8(buf, buf_size, _UU("CM_ACCOUNT_FILE_BANNER"));
- WriteBuf(b2, buf, StrLen((char *)buf));
- WriteBuf(b2, b->Buf, b->Size);
- SeekBuf(b2, 0, 0);
- FreeBuf(b);
- if (DumpBuf(b2, tmp) == false)
- {
- c->Write(c, _UU("CMD_SAVEFILE_FAILED"));
- ret = ERR_INTERNAL_ERROR;
- }
- FreeBuf(b2);
- Free(buf);
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- CiFreeClientGetAccount(&t);
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Check whether the specified account name exists
- bool CmdIsAccountName(REMOTE_CLIENT *r, wchar_t *name)
- {
- UINT i;
- RPC_CLIENT_ENUM_ACCOUNT t;
- wchar_t tmp[MAX_SIZE];
- bool b = false;
- // Validate arguments
- if (r == NULL || name == NULL)
- {
- return false;
- }
- if (CcEnumAccount(r, &t) != ERR_NO_ERROR)
- {
- return false;
- }
- UniStrCpy(tmp, sizeof(tmp), name);
- UniTrim(tmp);
- for (i = 0;i < t.NumItem;i++)
- {
- if (UniStrCmpi(t.Items[i]->AccountName, tmp) == 0)
- {
- b = true;
- break;
- }
- }
- CiFreeClientEnumAccount(&t);
- return b;
- }
- // Generate an import name
- void CmdGenerateImportName(REMOTE_CLIENT *r, wchar_t *name, UINT size, wchar_t *old_name)
- {
- UINT i;
- // Validate arguments
- if (r == NULL || name == NULL || old_name == NULL)
- {
- return;
- }
- for (i = 1;;i++)
- {
- wchar_t tmp[MAX_SIZE];
- if (i == 1)
- {
- UniFormat(tmp, sizeof(tmp), _UU("CM_IMPORT_NAME_1"), old_name);
- }
- else
- {
- UniFormat(tmp, sizeof(tmp), _UU("CM_IMPORT_NAME_2"), old_name, i);
- }
- if (CmdIsAccountName(r, tmp) == false)
- {
- UniStrCpy(name, size, tmp);
- return;
- }
- }
- }
- // Import a connection setting
- UINT PcAccountImport(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- BUF *b;
- wchar_t name[MAX_SIZE];
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[path]", CmdPrompt, _UU("CMD_AccountImport_PROMPT_PATH"), CmdEvalIsFile, NULL},
- };
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // Read the file
- b = ReadDumpW(GetParamUniStr(o, "[path]"));
- if (b == NULL)
- {
- // Read failure
- c->Write(c, _UU("CMD_LOADFILE_FAILED"));
- ret = ERR_INTERNAL_ERROR;
- }
- else
- {
- RPC_CLIENT_CREATE_ACCOUNT *t;
- t = CiCfgToAccount(b);
- if (t == NULL)
- {
- // Failed to parse
- c->Write(c, _UU("CMD_AccountImport_FAILED_PARSE"));
- ret = ERR_INTERNAL_ERROR;
- }
- else
- {
- CmdGenerateImportName(pc->RemoteClient, name, sizeof(name), t->ClientOption->AccountName);
- UniStrCpy(t->ClientOption->AccountName, sizeof(t->ClientOption->AccountName), name);
- ret = CcCreateAccount(pc->RemoteClient, t);
- if (ret == ERR_NO_ERROR)
- {
- wchar_t tmp[MAX_SIZE];
- UniFormat(tmp, sizeof(tmp), _UU("CMD_AccountImport_OK"), name);
- c->Write(c, tmp);
- }
- CiFreeClientCreateAccount(t);
- Free(t);
- }
- FreeBuf(b);
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Allow remote management of the VPN Client Service
- UINT PcRemoteEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- CLIENT_CONFIG t;
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- ret = CcGetClientConfig(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- t.AllowRemoteConfig = true;
- ret = CcSetClientConfig(pc->RemoteClient, &t);
- }
- if (ret == ERR_NO_ERROR)
- {
- // Success
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Prohibit remote management of the VPN Client Service
- UINT PcRemoteDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- CLIENT_CONFIG t;
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- ret = CcGetClientConfig(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- t.AllowRemoteConfig = false;
- ret = CcSetClientConfig(pc->RemoteClient, &t);
- }
- if (ret == ERR_NO_ERROR)
- {
- // Success
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Enable the maintenance function of the Internet connection
- UINT PcKeepEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- CLIENT_CONFIG t;
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- ret = CcGetClientConfig(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- // Change the settings
- t.UseKeepConnect = true;
- ret = CcSetClientConfig(pc->RemoteClient, &t);
- }
- if (ret == ERR_NO_ERROR)
- {
- // Success
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Disable the maintenance function of the Internet connection
- UINT PcKeepDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- CLIENT_CONFIG t;
- // Get the parameter list
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- ret = CcGetClientConfig(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- // Change the settings
- t.UseKeepConnect = false;
- ret = CcSetClientConfig(pc->RemoteClient, &t);
- }
- if (ret == ERR_NO_ERROR)
- {
- // Success
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Set the maintenance function of the Internet connection
- UINT PcKeepSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- CLIENT_CONFIG t;
- char *host;
- UINT port;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"HOST", CmdPrompt, _UU("CMD_KeepSet_PROMPT_HOST"), CmdEvalHostAndPort, NULL},
- {"PROTOCOL", CmdPrompt, _UU("CMD_KeepSet_PROMPT_PROTOCOL"), CmdEvalTcpOrUdp, NULL},
- {"INTERVAL", CmdPrompt, _UU("CMD_KeepSet_PROMPT_INTERVAL"), NULL, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- ret = CcGetClientConfig(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- if (ParseHostPort(GetParamStr(o, "HOST"), &host, &port, 0))
- {
- StrCpy(t.KeepConnectHost, sizeof(t.KeepConnectHost), host);
- t.KeepConnectPort = port;
- t.KeepConnectInterval = GetParamInt(o, "INTERVAL");
- t.KeepConnectProtocol = (StrCmpi(GetParamStr(o, "PROTOCOL"), "tcp") == 0) ? 0 : 1;
- Free(host);
- ret = CcSetClientConfig(pc->RemoteClient, &t);
- }
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Get the maintenance function of the Internet connection
- UINT PcKeepGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PC *pc = (PC *)param;
- UINT ret = ERR_NO_ERROR;
- CLIENT_CONFIG t;
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- Zero(&t, sizeof(t));
- ret = CcGetClientConfig(pc->RemoteClient, &t);
- if (ret == ERR_NO_ERROR)
- {
- wchar_t tmp[MAX_SIZE];
- CT *ct = CtNewStandard();
- StrToUni(tmp, sizeof(tmp), t.KeepConnectHost);
- CtInsert(ct, _UU("CMD_KeepGet_COLUMN_1"), tmp);
- UniToStru(tmp, t.KeepConnectPort);
- CtInsert(ct, _UU("CMD_KeepGet_COLUMN_2"), tmp);
- UniToStru(tmp, t.KeepConnectInterval);
- CtInsert(ct, _UU("CMD_KeepGet_COLUMN_3"), tmp);
- CtInsert(ct, _UU("CMD_KeepGet_COLUMN_4"),
- t.KeepConnectProtocol == 0 ? L"TCP/IP" : L"UDP/IP");
- CtInsert(ct, _UU("CMD_KeepGet_COLUMN_5"),
- t.UseKeepConnect ? _UU("SM_ACCESS_ENABLE") : _UU("SM_ACCESS_DISABLE"));
- CtFree(ct, c);
- }
- if (ret != ERR_NO_ERROR)
- {
- // Error has occurred
- CmdPrintError(c, ret);
- }
- // Release of the parameter list
- FreeParamValueList(o);
- return ret;
- }
- // Creat a new client management tool context
- PC *NewPc(CONSOLE *c, REMOTE_CLIENT *remote_client, char *servername, wchar_t *cmdline)
- {
- PC *pc;
- // Validate arguments
- if (c == NULL || remote_client == NULL || servername == NULL)
- {
- return NULL;
- }
- if (UniIsEmptyStr(cmdline))
- {
- cmdline = NULL;
- }
- pc = ZeroMalloc(sizeof(PC));
- pc->ConsoleForServer = false;
- pc->ServerName = CopyStr(servername);
- pc->Console = c;
- pc->LastError = 0;
- pc->RemoteClient = remote_client;
- pc->CmdLine = CopyUniStr(cmdline);
- return pc;
- }
- // Release the client management tools context
- void FreePc(PC *pc)
- {
- // Validate arguments
- if (pc == NULL)
- {
- return;
- }
- Free(pc->ServerName);
- Free(pc->CmdLine);
- Free(pc);
- }
- // Client management tool
- UINT PcConnect(CONSOLE *c, char *target, wchar_t *cmdline, char *password)
- {
- CEDAR *cedar;
- REMOTE_CLIENT *client;
- bool bad_pass;
- bool no_remote;
- char pass[MAX_SIZE];
- UINT ret = 0;
- // Validate arguments
- if (c == NULL || target == NULL)
- {
- return ERR_INTERNAL_ERROR;
- }
- StrCpy(pass, sizeof(pass), password);
- cedar = NewCedar(NULL, NULL);
- RETRY:
- client = CcConnectRpc(target, pass, &bad_pass, &no_remote, 0);
- if (client == NULL)
- {
- if (no_remote)
- {
- // Remote connection refusal
- c->Write(c, _UU("CMD_VPNCMD_CLIENT_NO_REMODE"));
- ReleaseCedar(cedar);
- return ERR_INTERNAL_ERROR;
- }
- else if (bad_pass)
- {
- char *tmp;
- // Password is different
- c->Write(c, _UU("CMD_VPNCMD_PASSWORD_1"));
- tmp = c->ReadPassword(c, _UU("CMD_VPNCMD_PASSWORD_2"));
- c->Write(c, L"");
- if (tmp == NULL)
- {
- // Cancel
- ReleaseCedar(cedar);
- return ERR_ACCESS_DENIED;
- }
- else
- {
- StrCpy(pass, sizeof(pass), tmp);
- Free(tmp);
- }
- goto RETRY;
- }
- else
- {
- // Connection failure
- CmdPrintError(c, ERR_CONNECT_FAILED);
- ReleaseCedar(cedar);
- return ERR_CONNECT_FAILED;
- }
- }
- else
- {
- // Connection complete
- PC *pc = NewPc(c, client, target, cmdline);
- PcMain(pc);
- ret = pc->LastError;
- FreePc(pc);
- }
- CcDisconnectRpc(client);
- ReleaseCedar(cedar);
- return ret;
- }
- // Server Administration Tool Processor Main
- void PsMain(PS *ps)
- {
- char prompt[MAX_SIZE];
- wchar_t tmp[MAX_SIZE];
- // Validate arguments
- if (ps == NULL)
- {
- return;
- }
- // If it's not in CSV mode, to display a message that the connection has been made
- if(ps->Console->ConsoleType != CONSOLE_CSV)
- {
- UniFormat(tmp, sizeof(tmp), _UU("CMD_VPNCMD_SERVER_CONNECTED"),
- ps->ServerName, ps->ServerPort);
- ps->Console->Write(ps->Console, tmp);
- ps->Console->Write(ps->Console, L"");
- if (ps->HubName == NULL)
- {
- // Server management mode
- ps->Console->Write(ps->Console, _UU("CMD_VPNCMD_SERVER_CONNECTED_1"));
- }
- else
- {
- // Virtual HUB management mode
- UniFormat(tmp, sizeof(tmp), _UU("CMD_VPNCMD_SERVER_CONNECTED_2"),
- ps->HubName);
- ps->Console->Write(ps->Console, tmp);
- }
- ps->Console->Write(ps->Console, L"");
- }
- // Get the Caps
- ps->CapsList = ScGetCapsEx(ps->Rpc);
- if (ps->AdminHub != NULL)
- {
- RPC_HUB_STATUS t;
- UINT ret;
- wchar_t tmp[MAX_SIZE];
- // Choose the Virtual HUB that is specified in the ADMINHUB
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->AdminHub);
- ret = ScGetHubStatus(ps->Rpc, &t);
- if (ret == ERR_NO_ERROR)
- {
- // Success
- UniFormat(tmp, sizeof(tmp), _UU("CMD_Hub_Selected"), t.HubName);
- if (ps->HubName != NULL)
- {
- Free(ps->HubName);
- }
- ps->HubName = CopyStr(t.HubName);
- if( ps->Console->ConsoleType != CONSOLE_CSV)
- {
- ps->Console->Write(ps->Console, tmp);
- }
- }
- else
- {
- // Failure
- UniFormat(tmp, sizeof(tmp), _UU("CMD_Hub_Select_Failed"), ps->AdminHub);
- ps->Console->Write(ps->Console, tmp);
- CmdPrintError(ps->Console, ret);
- }
- }
- if (ps->HubName == NULL)
- {
- RPC_KEY_PAIR t;
- Zero(&t, sizeof(t));
- if (ScGetServerCert(ps->Rpc, &t) == ERR_NO_ERROR)
- {
- if (t.Cert != NULL && t.Cert->has_basic_constraints == false)
- {
- if (t.Cert->root_cert)
- {
- ps->Console->Write(ps->Console, L"");
- ps->Console->Write(ps->Console, _UU("SM_CERT_MESSAGE_CLI"));
- ps->Console->Write(ps->Console, L"");
- }
- }
- FreeRpcKeyPair(&t);
- }
- }
- while (true)
- {
- // Definition of command
- CMD cmd[] =
- {
- {"About", PsAbout},
- {"Check", PtCheck},
- {"Crash", PsCrash},
- {"Flush", PsFlush},
- {"Debug", PsDebug},
- {"ServerInfoGet", PsServerInfoGet},
- {"ServerStatusGet", PsServerStatusGet},
- {"ListenerCreate", PsListenerCreate},
- {"ListenerDelete", PsListenerDelete},
- {"ListenerList", PsListenerList},
- {"ListenerEnable", PsListenerEnable},
- {"ListenerDisable", PsListenerDisable},
- {"ServerPasswordSet", PsServerPasswordSet},
- {"ClusterSettingGet", PsClusterSettingGet},
- {"ClusterSettingStandalone", PsClusterSettingStandalone},
- {"ClusterSettingController", PsClusterSettingController},
- {"ClusterSettingMember", PsClusterSettingMember},
- {"ClusterMemberList", PsClusterMemberList},
- {"ClusterMemberInfoGet", PsClusterMemberInfoGet},
- {"ClusterMemberCertGet", PsClusterMemberCertGet},
- {"ClusterConnectionStatusGet", PsClusterConnectionStatusGet},
- {"ServerCertGet", PsServerCertGet},
- {"ServerKeyGet", PsServerKeyGet},
- {"ServerCertSet", PsServerCertSet},
- {"ServerCipherGet", PsServerCipherGet},
- {"ServerCipherSet", PsServerCipherSet},
- {"KeepEnable", PsKeepEnable},
- {"KeepDisable", PsKeepDisable},
- {"KeepSet", PsKeepSet},
- {"KeepGet", PsKeepGet},
- {"SyslogGet", PsSyslogGet},
- {"SyslogDisable", PsSyslogDisable},
- {"SyslogEnable", PsSyslogEnable},
- {"ConnectionList", PsConnectionList},
- {"ConnectionGet", PsConnectionGet},
- {"ConnectionDisconnect", PsConnectionDisconnect},
- {"BridgeDeviceList", PsBridgeDeviceList},
- {"BridgeList", PsBridgeList},
- {"BridgeCreate", PsBridgeCreate},
- {"BridgeDelete", PsBridgeDelete},
- {"Caps", PsCaps},
- {"Reboot", PsReboot},
- {"ConfigGet", PsConfigGet},
- {"ConfigSet", PsConfigSet},
- {"RouterList", PsRouterList},
- {"RouterAdd", PsRouterAdd},
- {"RouterDelete", PsRouterDelete},
- {"RouterStart", PsRouterStart},
- {"RouterStop", PsRouterStop},
- {"RouterIfList", PsRouterIfList},
- {"RouterIfAdd", PsRouterIfAdd},
- {"RouterIfDel", PsRouterIfDel},
- {"RouterTableList", PsRouterTableList},
- {"RouterTableAdd", PsRouterTableAdd},
- {"RouterTableDel", PsRouterTableDel},
- {"LogFileList", PsLogFileList},
- {"LogFileGet", PsLogFileGet},
- {"HubCreate", PsHubCreate},
- {"HubCreateDynamic", PsHubCreateDynamic},
- {"HubCreateStatic", PsHubCreateStatic},
- {"HubDelete", PsHubDelete},
- {"HubSetStatic", PsHubSetStatic},
- {"HubSetDynamic", PsHubSetDynamic},
- {"HubList", PsHubList},
- {"Hub", PsHub},
- {"Online", PsOnline},
- {"Offline", PsOffline},
- {"SetMaxSession", PsSetMaxSession},
- {"SetHubPassword", PsSetHubPassword},
- {"SetEnumAllow", PsSetEnumAllow},
- {"SetEnumDeny", PsSetEnumDeny},
- {"OptionsGet", PsOptionsGet},
- {"RadiusServerSet", PsRadiusServerSet},
- {"RadiusServerDelete", PsRadiusServerDelete},
- {"RadiusServerGet", PsRadiusServerGet},
- {"StatusGet", PsStatusGet},
- {"LogGet", PsLogGet},
- {"LogEnable", PsLogEnable},
- {"LogDisable", PsLogDisable},
- {"LogSwitchSet", PsLogSwitchSet},
- {"LogPacketSaveType", PsLogPacketSaveType},
- {"CAList", PsCAList},
- {"CAAdd", PsCAAdd},
- {"CADelete", PsCADelete},
- {"CAGet", PsCAGet},
- {"CascadeList", PsCascadeList},
- {"CascadeCreate", PsCascadeCreate},
- {"CascadeSet", PsCascadeSet},
- {"CascadeGet", PsCascadeGet},
- {"CascadeDelete", PsCascadeDelete},
- {"CascadeUsernameSet", PsCascadeUsernameSet},
- {"CascadeAnonymousSet", PsCascadeAnonymousSet},
- {"CascadePasswordSet", PsCascadePasswordSet},
- {"CascadeCertSet", PsCascadeCertSet},
- {"CascadeCertGet", PsCascadeCertGet},
- {"CascadeEncryptEnable", PsCascadeEncryptEnable},
- {"CascadeEncryptDisable", PsCascadeEncryptDisable},
- {"CascadeCompressEnable", PsCascadeCompressEnable},
- {"CascadeCompressDisable", PsCascadeCompressDisable},
- {"CascadeProxyNone", PsCascadeProxyNone},
- {"CascadeProxyHttp", PsCascadeProxyHttp},
- {"CascadeProxySocks", PsCascadeProxySocks},
- {"CascadeServerCertEnable", PsCascadeServerCertEnable},
- {"CascadeServerCertDisable", PsCascadeServerCertDisable},
- {"CascadeServerCertSet", PsCascadeServerCertSet},
- {"CascadeServerCertDelete", PsCascadeServerCertDelete},
- {"CascadeServerCertGet", PsCascadeServerCertGet},
- {"CascadeDetailSet", PsCascadeDetailSet},
- {"CascadePolicySet", PsCascadePolicySet},
- {"PolicyList", PsPolicyList},
- {"CascadeStatusGet", PsCascadeStatusGet},
- {"CascadeRename", PsCascadeRename},
- {"CascadeOnline", PsCascadeOnline},
- {"CascadeOffline", PsCascadeOffline},
- {"AccessAdd", PsAccessAdd},
- {"AccessAddEx", PsAccessAddEx},
- {"AccessAdd6", PsAccessAdd6},
- {"AccessAddEx6", PsAccessAddEx6},
- {"AccessList", PsAccessList},
- {"AccessDelete", PsAccessDelete},
- {"AccessEnable", PsAccessEnable},
- {"AccessDisable", PsAccessDisable},
- {"UserList", PsUserList},
- {"UserCreate", PsUserCreate},
- {"UserSet", PsUserSet},
- {"UserDelete", PsUserDelete},
- {"UserGet", PsUserGet},
- {"UserAnonymousSet", PsUserAnonymousSet},
- {"UserPasswordSet", PsUserPasswordSet},
- {"UserCertSet", PsUserCertSet},
- {"UserCertGet", PsUserCertGet},
- {"UserSignedSet", PsUserSignedSet},
- {"UserRadiusSet", PsUserRadiusSet},
- {"UserNTLMSet", PsUserNTLMSet},
- {"UserPolicyRemove", PsUserPolicyRemove},
- {"UserPolicySet", PsUserPolicySet},
- {"UserExpiresSet", PsUserExpiresSet},
- {"GroupList", PsGroupList},
- {"GroupCreate", PsGroupCreate},
- {"GroupSet", PsGroupSet},
- {"GroupDelete", PsGroupDelete},
- {"GroupGet", PsGroupGet},
- {"GroupJoin", PsGroupJoin},
- {"GroupUnjoin", PsGroupUnjoin},
- {"GroupPolicyRemove", PsGroupPolicyRemove},
- {"GroupPolicySet", PsGroupPolicySet},
- {"SessionList", PsSessionList},
- {"SessionGet", PsSessionGet},
- {"SessionDisconnect", PsSessionDisconnect},
- {"MacTable", PsMacTable},
- {"MacDelete", PsMacDelete},
- {"IpTable", PsIpTable},
- {"IpDelete", PsIpDelete},
- {"SecureNatEnable", PsSecureNatEnable},
- {"SecureNatDisable", PsSecureNatDisable},
- {"SecureNatStatusGet", PsSecureNatStatusGet},
- {"SecureNatHostGet", PsSecureNatHostGet},
- {"SecureNatHostSet", PsSecureNatHostSet},
- {"NatGet", PsNatGet},
- {"NatEnable", PsNatEnable},
- {"NatDisable", PsNatDisable},
- {"NatSet", PsNatSet},
- {"NatTable", PsNatTable},
- {"DhcpGet", PsDhcpGet},
- {"DhcpEnable", PsDhcpEnable},
- {"DhcpDisable", PsDhcpDisable},
- {"DhcpSet", PsDhcpSet},
- {"DhcpTable", PsDhcpTable},
- {"AdminOptionList", PsAdminOptionList},
- {"AdminOptionSet", PsAdminOptionSet},
- {"ExtOptionList", PsExtOptionList},
- {"ExtOptionSet", PsExtOptionSet},
- {"CrlList", PsCrlList},
- {"CrlAdd", PsCrlAdd},
- {"CrlDel", PsCrlDel},
- {"CrlGet", PsCrlGet},
- {"AcList", PsAcList},
- {"AcAdd", PsAcAdd},
- {"AcAdd6", PsAcAdd6},
- {"AcDel", PsAcDel},
- {"MakeCert", PtMakeCert},
- {"MakeCert2048", PtMakeCert2048},
- {"TrafficClient", PtTrafficClient},
- {"TrafficServer", PtTrafficServer},
- {"LicenseAdd", PsLicenseAdd},
- {"LicenseDel", PsLicenseDel},
- {"LicenseList", PsLicenseList},
- {"LicenseStatus", PsLicenseStatus},
- {"IPsecEnable", PsIPsecEnable},
- {"IPsecGet", PsIPsecGet},
- {"EtherIpClientAdd", PsEtherIpClientAdd},
- {"EtherIpClientDelete", PsEtherIpClientDelete},
- {"EtherIpClientList", PsEtherIpClientList},
- {"OpenVpnEnable", PsOpenVpnEnable},
- {"OpenVpnGet", PsOpenVpnGet},
- {"OpenVpnMakeConfig", PsOpenVpnMakeConfig},
- {"SstpEnable", PsSstpEnable},
- {"SstpGet", PsSstpGet},
- {"ServerCertRegenerate", PsServerCertRegenerate},
- {"VpnOverIcmpDnsEnable", PsVpnOverIcmpDnsEnable},
- {"VpnOverIcmpDnsGet", PsVpnOverIcmpDnsGet},
- {"DynamicDnsGetStatus", PsDynamicDnsGetStatus},
- {"DynamicDnsSetHostname", PsDynamicDnsSetHostname},
- {"VpnAzureGetStatus", PsVpnAzureGetStatus},
- {"VpnAzureSetEnable", PsVpnAzureSetEnable},
- };
- // Generate a prompt
- if (ps->HubName == NULL)
- {
- Format(prompt, sizeof(prompt), "VPN Server>");
- }
- else
- {
- Format(prompt, sizeof(prompt), "VPN Server/%s>", ps->HubName);
- }
- if (DispatchNextCmdEx(ps->Console, ps->CmdLine, prompt, cmd, sizeof(cmd) / sizeof(cmd[0]), ps) == false)
- {
- break;
- }
- ps->LastError = ps->Console->RetCode;
- if (ps->LastError == ERR_NO_ERROR && ps->Console->ConsoleType != CONSOLE_CSV)
- {
- ps->Console->Write(ps->Console, _UU("CMD_MSG_OK"));
- ps->Console->Write(ps->Console, L"");
- }
- if (ps->CmdLine != NULL)
- {
- break;
- }
- }
- // Release the Caps
- FreeCapsList(ps->CapsList);
- ps->CapsList = NULL;
- }
- // A template for a new command function
- UINT PsXxx(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret;
- RPC_LISTENER t;
- PARAM args[] =
- {
- {"[port]", CmdPromptPort, _UU("CMD_ListenerCreate_PortPrompt"), CmdEvalPort, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- t.Enable = true;
- t.Port = ToInt(GetParamStr(o, "[port]"));
- ret = ScCreateListener(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Set to the stand-alone mode
- UINT PsClusterSettingStandalone(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_FARM t;
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- t.ServerType = SERVER_TYPE_STANDALONE;
- // RPC call
- ret = ScSetFarmSetting(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Set to the cluster controller mode
- UINT PsClusterSettingController(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_FARM t;
- UINT weight;
- PARAM args[] =
- {
- {"WEIGHT", NULL, NULL, NULL, NULL},
- {"ONLY", NULL, NULL, NULL, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- weight = GetParamInt(o, "WEIGHT");
- if (weight == 0)
- {
- weight = FARM_DEFAULT_WEIGHT;
- }
- Zero(&t, sizeof(t));
- t.ServerType = SERVER_TYPE_FARM_CONTROLLER;
- t.Weight = weight;
- t.ControllerOnly = GetParamYes(o, "ONLY");
- // RPC call
- ret = ScSetFarmSetting(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Evaluate the IP address
- bool CmdEvalIp(CONSOLE *c, wchar_t *str, void *param)
- {
- // Validate arguments
- if (c == NULL || str == NULL)
- {
- return false;
- }
- if (UniIsEmptyStr(str))
- {
- return true;
- }
- if (UniStrToIP32(str) == 0 && UniStrCmpi(str, L"0.0.0.0") != 0)
- {
- wchar_t *msg = (param == NULL) ? _UU("CMD_IP_EVAL_FAILED") : (wchar_t *)param;
- c->Write(c, msg);
- return false;
- }
- return true;
- }
- // Convert a string to port list
- LIST *StrToPortList(char *str)
- {
- LIST *o;
- TOKEN_LIST *t;
- UINT i;
- if (str == NULL)
- {
- return NULL;
- }
- // Convert to token
- t = ParseToken(str, ", ");
- if (t == NULL)
- {
- return NULL;
- }
- if (t->NumTokens == 0)
- {
- FreeToken(t);
- return NULL;
- }
- o = NewListFast(NULL);
- for (i = 0;i < t->NumTokens;i++)
- {
- char *s = t->Token[i];
- UINT n;
- if (IsNum(s) == false)
- {
- ReleaseList(o);
- FreeToken(t);
- return NULL;
- }
- n = ToInt(s);
- if (n == 0 || n >= 65536)
- {
- ReleaseList(o);
- FreeToken(t);
- return NULL;
- }
- if (IsInList(o, (void *)n))
- {
- ReleaseList(o);
- FreeToken(t);
- return NULL;
- }
- Add(o, (void *)n);
- }
- FreeToken(t);
- if (LIST_NUM(o) > MAX_PUBLIC_PORT_NUM)
- {
- ReleaseList(o);
- return NULL;
- }
- return o;
- }
- // Set to the cluster member mode
- UINT PsClusterSettingMember(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_FARM t;
- char *host_and_port;
- char *host;
- UINT port;
- UINT weight;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[server:port]", CmdPrompt, _UU("CMD_ClusterSettingMember_Prompt_HOST_1"), CmdEvalHostAndPort, NULL},
- {"IP", PsClusterSettingMemberPromptIp, NULL, CmdEvalIp, NULL},
- {"PORTS", PsClusterSettingMemberPromptPorts, NULL, CmdEvalPortList, NULL},
- {"PASSWORD", CmdPromptChoosePassword, NULL, NULL, NULL},
- {"WEIGHT", NULL, NULL, NULL, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- weight = GetParamInt(o, "WEIGHT");
- if (weight == 0)
- {
- weight = FARM_DEFAULT_WEIGHT;
- }
- Zero(&t, sizeof(t));
- host_and_port = GetParamStr(o, "[server:port]");
- if (ParseHostPort(host_and_port, &host, &port, 0))
- {
- char *pw;
- char *ports_str;
- LIST *ports;
- UINT i;
- StrCpy(t.ControllerName, sizeof(t.ControllerName), host);
- t.ControllerPort = port;
- Free(host);
- pw = GetParamStr(o, "PASSWORD");
- Hash(t.MemberPassword, pw, StrLen(pw), true);
- t.PublicIp = StrToIP32(GetParamStr(o, "IP"));
- t.ServerType = SERVER_TYPE_FARM_MEMBER;
- ports_str = GetParamStr(o, "PORTS");
- ports = StrToPortList(ports_str);
- t.NumPort = LIST_NUM(ports);
- t.Ports = ZeroMalloc(sizeof(UINT) * t.NumPort);
- for (i = 0;i < t.NumPort;i++)
- {
- t.Ports[i] = (UINT)LIST_DATA(ports, i);
- }
- t.Weight = weight;
- ReleaseList(ports);
- // RPC call
- ret = ScSetFarmSetting(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcFarm(&t);
- }
- FreeParamValueList(o);
- return 0;
- }
- // Evaluate the port list
- bool CmdEvalPortList(CONSOLE *c, wchar_t *str, void *param)
- {
- char *s;
- bool ret = false;
- LIST *o;
- // Validate arguments
- if (c == NULL || str == NULL)
- {
- return false;
- }
- s = CopyUniToStr(str);
- o = StrToPortList(s);
- if (o != NULL)
- {
- ret = true;
- }
- ReleaseList(o);
- Free(s);
- if (ret == false)
- {
- c->Write(c, _UU("CMD_PORTLIST_EVAL_FAILED"));
- }
- return ret;
- }
- // Check the string of the form of the host name and port number
- bool CmdEvalHostAndPort(CONSOLE *c, wchar_t *str, void *param)
- {
- char *tmp;
- bool ret = false;
- // Validate arguments
- if (c == NULL || str == NULL)
- {
- return false;
- }
- tmp = CopyUniToStr(str);
- ret = ParseHostPort(tmp, NULL, NULL, (UINT)param);
- if (ret == false)
- {
- c->Write(c, param == NULL ? _UU("CMD_HOSTPORT_EVAL_FAILED") : (wchar_t *)param);
- }
- Free(tmp);
- return ret;
- }
- // Input the public port number
- wchar_t *PsClusterSettingMemberPromptPorts(CONSOLE *c, void *param)
- {
- wchar_t *ret;
- // Validate arguments
- if (c == NULL)
- {
- return NULL;
- }
- c->Write(c, _UU("CMD_ClusterSettingMember_Prompt_PORT_1"));
- c->Write(c, L"");
- ret = c->ReadLine(c, _UU("CMD_ClusterSettingMember_Prompt_PORT_2"), true);
- return ret;
- }
- // Input the public IP address
- wchar_t *PsClusterSettingMemberPromptIp(CONSOLE *c, void *param)
- {
- wchar_t *ret;
- // Validate arguments
- if (c == NULL)
- {
- return NULL;
- }
- c->Write(c, _UU("CMD_ClusterSettingMember_Prompt_IP_1"));
- c->Write(c, L"");
- ret = c->ReadLine(c, _UU("CMD_ClusterSettingMember_Prompt_IP_2"), true);
- return ret;
- }
- // Show the cluster members list
- UINT PsClusterMemberList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_ENUM_FARM t;
- CT *ct;
- UINT i;
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // RPC call
- ret = ScEnumFarmMember(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- ct = CtNew();
- CtInsertColumn(ct, _UU("CMD_ID"), true);
- CtInsertColumn(ct, _UU("SM_FM_COLUMN_1"), false);
- CtInsertColumn(ct, _UU("SM_FM_COLUMN_2"), false);
- CtInsertColumn(ct, _UU("SM_FM_COLUMN_3"), false);
- CtInsertColumn(ct, _UU("SM_FM_COLUMN_4"), true);
- CtInsertColumn(ct, _UU("SM_FM_COLUMN_5"), true);
- CtInsertColumn(ct, _UU("SM_FM_COLUMN_6"), true);
- CtInsertColumn(ct, _UU("SM_FM_COLUMN_7"), true);
- CtInsertColumn(ct, _UU("SM_FM_COLUMN_8"), true);
- CtInsertColumn(ct, _UU("SM_FM_COLUMN_9"), true);
- for (i = 0;i < t.NumFarm;i++)
- {
- RPC_ENUM_FARM_ITEM *e = &t.Farms[i];
- wchar_t tmp0[64];
- wchar_t tmp1[MAX_SIZE];
- wchar_t tmp2[MAX_SIZE];
- wchar_t tmp3[64];
- wchar_t tmp4[64];
- wchar_t tmp5[64];
- wchar_t tmp6[64];
- wchar_t tmp7[64];
- wchar_t tmp8[64];
- GetDateTimeStrEx64(tmp1, sizeof(tmp1), SystemToLocal64(e->ConnectedTime), NULL);
- StrToUni(tmp2, sizeof(tmp2), e->Hostname);
- UniToStru(tmp3, e->Point);
- UniToStru(tmp4, e->NumSessions);
- UniToStru(tmp5, e->NumTcpConnections);
- UniToStru(tmp6, e->NumHubs);
- UniToStru(tmp7, e->AssignedClientLicense);
- UniToStru(tmp8, e->AssignedBridgeLicense);
- UniToStru(tmp0, e->Id);
- CtInsert(ct, tmp0,
- e->Controller ? _UU("SM_FM_CONTROLLER") : _UU("SM_FM_MEMBER"),
- tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8);
- }
- CtFree(ct, c);
- FreeRpcEnumFarm(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Get information of cluster members
- UINT PsClusterMemberInfoGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_FARM_INFO t;
- CT *ct;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[id]", CmdPrompt, _UU("CMD_ClusterMemberInfoGet_PROMPT_ID"), NULL, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- t.Id = UniToInt(GetParamUniStr(o, "[id]"));
- // RPC call
- ret = ScGetFarmInfo(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- ct = CtNewStandard();
- {
- wchar_t tmp[MAX_SIZE];
- char str[MAX_SIZE];
- UINT i;
- CtInsert(ct, _UU("SM_FMINFO_TYPE"),
- t.Controller ? _UU("SM_FARM_CONTROLLER") : _UU("SM_FARM_MEMBER"));
- GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.ConnectedTime), NULL);
- CtInsert(ct, _UU("SM_FMINFO_CONNECT_TIME"), tmp);
- IPToStr32(str, sizeof(str), t.Ip);
- StrToUni(tmp, sizeof(tmp), str);
- CtInsert(ct, _UU("SM_FMINFO_IP"), tmp);
- StrToUni(tmp, sizeof(tmp), t.Hostname);
- CtInsert(ct, _UU("SM_FMINFO_HOSTNAME"), tmp);
- UniToStru(tmp, t.Point);
- CtInsert(ct, _UU("SM_FMINFO_POINT"), tmp);
- UniToStru(tmp, t.Weight);
- CtInsert(ct, _UU("SM_FMINFO_WEIGHT"), tmp);
- UniToStru(tmp, t.NumPort);
- CtInsert(ct, _UU("SM_FMINFO_NUM_PORT"), tmp);
- for (i = 0;i < t.NumPort;i++)
- {
- wchar_t tmp2[MAX_SIZE];
- UniFormat(tmp, sizeof(tmp), _UU("SM_FMINFO_PORT"), i + 1);
- UniToStru(tmp2, t.Ports[i]);
- CtInsert(ct, tmp, tmp2);
- }
- UniToStru(tmp, t.NumFarmHub);
- CtInsert(ct, _UU("SM_FMINFO_NUM_HUB"), tmp);
- for (i = 0;i < t.NumFarmHub;i++)
- {
- wchar_t tmp2[MAX_SIZE];
- UniFormat(tmp, sizeof(tmp), _UU("SM_FMINFO_HUB"), i + 1);
- UniFormat(tmp2, sizeof(tmp2),
- t.FarmHubs[i].DynamicHub ? _UU("SM_FMINFO_HUB_TAG_2") : _UU("SM_FMINFO_HUB_TAG_1"),
- t.FarmHubs[i].HubName);
- CtInsert(ct, tmp, tmp2);
- }
- UniToStru(tmp, t.NumSessions);
- CtInsert(ct, _UU("SM_FMINFO_NUM_SESSION"), tmp);
- UniToStru(tmp, t.NumTcpConnections);
- CtInsert(ct, _UU("SM_FMINFO_NUN_CONNECTION"), tmp);
- }
- CtFree(ct, c);
- FreeRpcFarmInfo(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Get certificates of cluster members
- UINT PsClusterMemberCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_FARM_INFO t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[id]", CmdPrompt, _UU("CMD_ClusterMemberCertGet_PROMPT_ID"), NULL, NULL},
- {"SAVECERT", CmdPrompt, _UU("CMD_SAVECERTPATH"), CmdEvalNotEmpty, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- t.Id = UniToInt(GetParamUniStr(o, "[id]"));
- // RPC call
- ret = ScGetFarmInfo(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- X *x = t.ServerCert;
- wchar_t *filename = GetParamUniStr(o, "SAVECERT");
- if (XToFileW(x, filename, true) == false)
- {
- c->Write(c, _UU("CMD_SAVECERT_FAILED"));
- ret = ERR_INTERNAL_ERROR;
- }
- }
- FreeRpcFarmInfo(&t);
- FreeParamValueList(o);
- return ret;
- }
- // Get the status of the connection to the cluster controller
- UINT PsClusterConnectionStatusGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_FARM_CONNECTION_STATUS t;
- wchar_t tmp[MAX_SIZE];
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // RPC call
- ret = ScGetFarmConnectionStatus(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- CT *ct = CtNewStandard();
- char str[MAX_SIZE];
- if (t.Online == false)
- {
- CtInsert(ct, _UU("SM_FC_IP"), _UU("SM_FC_NOT_CONNECTED"));
- CtInsert(ct, _UU("SM_FC_PORT"), _UU("SM_FC_NOT_CONNECTED"));
- }
- else
- {
- IPToStr32(str, sizeof(str), t.Ip);
- StrToUni(tmp, sizeof(tmp), str);
- CtInsert(ct, _UU("SM_FC_IP"), tmp);
- UniToStru(tmp, t.Port);
- CtInsert(ct, _UU("SM_FC_PORT"), tmp);
- }
- CtInsert(ct,
- _UU("SM_FC_STATUS"),
- t.Online ? _UU("SM_FC_ONLINE") : _UU("SM_FC_OFFLINE"));
- if (t.Online == false)
- {
- UniFormat(tmp, sizeof(tmp), _UU("SM_FC_ERROR_TAG"), _E(t.LastError), t.LastError);
- CtInsert(ct,
- _UU("SM_FC_LAST_ERROR"), tmp);
- }
- GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.StartedTime), NULL);
- CtInsert(ct, _UU("SM_FC_START_TIME"), tmp);
- GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.FirstConnectedTime), NULL);
- CtInsert(ct, _UU("SM_FC_FIRST_TIME"), tmp);
- //if (t.Online == false)
- {
- GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.CurrentConnectedTime), NULL);
- CtInsert(ct, _UU("SM_FC_CURRENT_TIME"), tmp);
- }
- UniToStru(tmp, t.NumTry);
- CtInsert(ct, _UU("SM_FC_NUM_TRY"), tmp);
- UniToStru(tmp, t.NumConnected);
- CtInsert(ct, _UU("SM_FC_NUM_CONNECTED"), tmp);
- UniToStru(tmp, t.NumFailed);
- CtInsert(ct, _UU("SM_FC_NUM_FAILED"), tmp);
- CtFree(ct, c);
- }
- FreeParamValueList(o);
- return 0;
- }
- // Get the SSL certificate of the VPN Server
- UINT PsServerCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_KEY_PAIR t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[cert]", CmdPrompt, _UU("CMD_SAVECERTPATH"), CmdEvalNotEmpty, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // RPC call
- ret = ScGetServerCert(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- if (XToFileW(t.Cert, GetParamUniStr(o, "[cert]"), true) == false)
- {
- c->Write(c, _UU("CMD_SAVECERT_FAILED"));
- }
- FreeRpcKeyPair(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Get the private key of the SSL certificate of the VPN Server
- UINT PsServerKeyGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_KEY_PAIR t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[key]", CmdPrompt, _UU("CMD_SAVEKEYPATH"), CmdEvalNotEmpty, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // RPC call
- ret = ScGetServerCert(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- if (t.Key != NULL)
- {
- if (KToFileW(t.Key, GetParamUniStr(o, "[key]"), true, NULL) == false)
- {
- c->Write(c, _UU("CMD_SAVEKEY_FAILED"));
- }
- }
- else
- {
- ret = ERR_NOT_ENOUGH_RIGHT;
- CmdPrintError(c, ret);
- }
- FreeRpcKeyPair(&t);
- FreeParamValueList(o);
- return ret;
- }
- // Read the certificate and the private key
- bool CmdLoadCertAndKey(CONSOLE *c, X **xx, K **kk, wchar_t *cert_filename, wchar_t *key_filename)
- {
- X *x;
- K *k;
- // Validate arguments
- if (c == NULL || cert_filename == NULL || key_filename == NULL || xx == NULL || kk == NULL)
- {
- return false;
- }
- x = FileToXW(cert_filename);
- if (x == NULL)
- {
- c->Write(c, _UU("CMD_LOADCERT_FAILED"));
- return false;
- }
- k = CmdLoadKey(c, key_filename);
- if (k == NULL)
- {
- c->Write(c, _UU("CMD_LOADKEY_FAILED"));
- FreeX(x);
- return false;
- }
- if (CheckXandK(x, k) == false)
- {
- c->Write(c, _UU("CMD_KEYPAIR_FAILED"));
- FreeX(x);
- FreeK(k);
- return false;
- }
- *xx = x;
- *kk = k;
- return true;
- }
- // Read the secret key
- K *CmdLoadKey(CONSOLE *c, wchar_t *filename)
- {
- BUF *b;
- // Validate arguments
- if (c == NULL || filename == NULL)
- {
- return NULL;
- }
- b = ReadDumpW(filename);
- if (b == NULL)
- {
- c->Write(c, _UU("CMD_LOADCERT_FAILED"));
- return NULL;
- }
- else
- {
- K *key;
- if (IsEncryptedK(b, true) == false)
- {
- key = BufToK(b, true, IsBase64(b), NULL);
- }
- else
- {
- c->Write(c, _UU("CMD_LOADKEY_ENCRYPTED_1"));
- while (true)
- {
- char *pass = c->ReadPassword(c, _UU("CMD_LOADKEY_ENCRYPTED_2"));
- if (pass == NULL)
- {
- FreeBuf(b);
- return NULL;
- }
- key = BufToK(b, true, IsBase64(b), pass);
- Free(pass);
- if (key != NULL)
- {
- break;
- }
- c->Write(c, _UU("CMD_LOADKEY_ENCRYPTED_3"));
- }
- }
- FreeBuf(b);
- return key;
- }
- }
- // Set the SSL certificate and the private key of the VPN Server
- UINT PsServerCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_KEY_PAIR t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"LOADCERT", CmdPrompt, _UU("CMD_LOADCERTPATH"), CmdEvalIsFile, NULL},
- {"LOADKEY", CmdPrompt, _UU("CMD_LOADKEYPATH"), CmdEvalIsFile, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- if (CmdLoadCertAndKey(c, &t.Cert, &t.Key,
- GetParamUniStr(o, "LOADCERT"),
- GetParamUniStr(o, "LOADKEY")))
- {
- // RPC call
- ret = ScSetServerCert(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- if (t.Flag1 == 0)
- {
- // Show the warning message
- c->Write(c, L"");
- c->Write(c, _UU("SM_CERT_NEED_ROOT"));
- c->Write(c, L"");
- }
- FreeRpcKeyPair(&t);
- }
- else
- {
- ret = ERR_INTERNAL_ERROR;
- }
- FreeParamValueList(o);
- return ret;
- }
- // Get the encryption algorithm used for the VPN communication
- UINT PsServerCipherGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_STR t;
- TOKEN_LIST *ciphers;
- UINT i;
- wchar_t tmp[4096];
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // RPC call
- ret = ScGetServerCipher(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- ciphers = GetCipherList();
- c->Write(c, _UU("CMD_ServerCipherGet_SERVER"));
- UniFormat(tmp, sizeof(tmp), L" %S", t.String);
- c->Write(c, tmp);
- c->Write(c, L"");
- c->Write(c, _UU("CMD_ServerCipherGet_CIPHERS"));
- for (i = 0;i < ciphers->NumTokens;i++)
- {
- UniFormat(tmp, sizeof(tmp), L" %S", ciphers->Token[i]);
- c->Write(c, tmp);
- }
- FreeRpcStr(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Set the encryption algorithm used for the VPN communication
- UINT PsServerCipherSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_STR t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_ServerCipherSet_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- t.String = CopyStr(GetParamStr(o, "[name]"));
- // RPC call
- ret = ScSetServerCipher(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcStr(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Enabling the maintenance function of the Internet connection
- UINT PsKeepEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_KEEP t;
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // RPC call
- ret = ScGetKeep(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- t.UseKeepConnect = true;
- ret = ScSetKeep(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Disabling the maintenance function of the Internet connection
- UINT PsKeepDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_KEEP t;
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // RPC call
- ret = ScGetKeep(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- t.UseKeepConnect = false;
- ret = ScSetKeep(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Evaluate the UDP or the TCP
- bool CmdEvalTcpOrUdp(CONSOLE *c, wchar_t *str, void *param)
- {
- // Validate arguments
- if (c == NULL || str == NULL)
- {
- return false;
- }
- if (UniStrCmpi(str, L"tcp") == 0 || UniStrCmpi(str, L"udp") == 0)
- {
- return true;
- }
- c->Write(c, _UU("CMD_KeepSet_EVAL_TCP_UDP"));
- return false;
- }
- // Enable the syslog configuration
- UINT PsSyslogEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- SYSLOG_SETTING t;
- CMD_EVAL_MIN_MAX minmax = {"CMD_SyslogEnable_MINMAX", 1, 3};
- char *host;
- UINT port;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[1|2|3]", CmdPrompt, _UU("CMD_SyslogEnable_Prompt_123"), CmdEvalMinMax, &minmax},
- {"HOST", CmdPrompt, _UU("CMD_SyslogEnable_Prompt_HOST"), CmdEvalHostAndPort, (void *)SYSLOG_PORT},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- if (ParseHostPort(GetParamStr(o, "HOST"), &host, &port, SYSLOG_PORT))
- {
- StrCpy(t.Hostname, sizeof(t.Hostname), host);
- t.Port = port;
- t.SaveType = GetParamInt(o, "[1|2|3]");
- Free(host);
- // RPC call
- ret = ScSetSysLog(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- }
- FreeParamValueList(o);
- return 0;
- }
- // Disable the syslog configuration
- UINT PsSyslogDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- SYSLOG_SETTING t;
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // RPC call
- ret = ScGetSysLog(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- t.SaveType = SYSLOG_NONE;
- // RPC call
- ret = ScSetSysLog(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Get the syslog configuration
- UINT PsSyslogGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- SYSLOG_SETTING t;
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // RPC call
- ret = ScGetSysLog(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- wchar_t tmp[MAX_SIZE];
- CT *ct = CtNewStandard();
- CtInsert(ct, _UU("CMD_SyslogGet_COLUMN_1"), GetSyslogSettingName(t.SaveType));
- if (t.SaveType != SYSLOG_NONE)
- {
- StrToUni(tmp, sizeof(tmp), t.Hostname);
- CtInsert(ct, _UU("CMD_SyslogGet_COLUMN_2"), tmp);
- UniToStru(tmp, t.Port);
- CtInsert(ct, _UU("CMD_SyslogGet_COLUMN_3"), tmp);
- }
- CtFree(ct, c);
- }
- FreeParamValueList(o);
- return 0;
- }
- // Get the syslog configuration name
- wchar_t *GetSyslogSettingName(UINT n)
- {
- char tmp[MAX_PATH];
- Format(tmp, sizeof(tmp), "SM_SYSLOG_%u", n);
- return _UU(tmp);
- }
- // Setting of maintenance function of the Internet connection
- UINT PsKeepSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_KEEP t;
- char *host;
- UINT port;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"HOST", CmdPrompt, _UU("CMD_KeepSet_PROMPT_HOST"), CmdEvalHostAndPort, NULL},
- {"PROTOCOL", CmdPrompt, _UU("CMD_KeepSet_PROMPT_PROTOCOL"), CmdEvalTcpOrUdp, NULL},
- {"INTERVAL", CmdPrompt, _UU("CMD_KeepSet_PROMPT_INTERVAL"), NULL, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // RPC call
- ret = ScGetKeep(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- if (ParseHostPort(GetParamStr(o, "HOST"), &host, &port, 0))
- {
- StrCpy(t.KeepConnectHost, sizeof(t.KeepConnectHost), host);
- t.KeepConnectPort = port;
- t.KeepConnectInterval = GetParamInt(o, "INTERVAL");
- t.KeepConnectProtocol = (StrCmpi(GetParamStr(o, "PROTOCOL"), "tcp") == 0) ? 0 : 1;
- Free(host);
- // RPC call
- ret = ScSetKeep(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- }
- FreeParamValueList(o);
- return 0;
- }
- // Get the maintenance function of the Internet connection
- UINT PsKeepGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_KEEP t;
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // RPC call
- ret = ScGetKeep(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- wchar_t tmp[MAX_SIZE];
- CT *ct = CtNewStandard();
- StrToUni(tmp, sizeof(tmp), t.KeepConnectHost);
- CtInsert(ct, _UU("CMD_KeepGet_COLUMN_1"), tmp);
- UniToStru(tmp, t.KeepConnectPort);
- CtInsert(ct, _UU("CMD_KeepGet_COLUMN_2"), tmp);
- UniToStru(tmp, t.KeepConnectInterval);
- CtInsert(ct, _UU("CMD_KeepGet_COLUMN_3"), tmp);
- CtInsert(ct, _UU("CMD_KeepGet_COLUMN_4"),
- t.KeepConnectProtocol == 0 ? L"TCP/IP" : L"UDP/IP");
- CtInsert(ct, _UU("CMD_KeepGet_COLUMN_5"),
- t.UseKeepConnect ? _UU("SM_ACCESS_ENABLE") : _UU("SM_ACCESS_DISABLE"));
- CtFree(ct, c);
- }
- FreeParamValueList(o);
- return 0;
- }
- // Get the connection type string
- wchar_t *GetConnectionTypeStr(UINT type)
- {
- char tmp[MAX_SIZE];
- Format(tmp, sizeof(tmp), "SM_CONNECTION_TYPE_%u", type);
- return _UU(tmp);
- }
- // Get the list of TCP connections connected to VPN Server
- UINT PsConnectionList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_ENUM_CONNECTION t;
- UINT i;
- CT *ct;
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // RPC call
- ret = ScEnumConnection(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- ct = CtNew();
- CtInsertColumn(ct, _UU("SM_CONN_COLUMN_1"), false);
- CtInsertColumn(ct, _UU("SM_CONN_COLUMN_2"), false);
- CtInsertColumn(ct, _UU("SM_CONN_COLUMN_3"), false);
- CtInsertColumn(ct, _UU("SM_CONN_COLUMN_4"), false);
- for (i = 0;i < t.NumConnection;i++)
- {
- wchar_t tmp[MAX_SIZE];
- wchar_t name[MAX_SIZE];
- wchar_t datetime[MAX_SIZE];
- RPC_ENUM_CONNECTION_ITEM *e = &t.Connections[i];
- StrToUni(name, sizeof(name), e->Name);
- UniFormat(tmp, sizeof(tmp), _UU("SM_HOSTNAME_AND_PORT"), e->Hostname, e->Port);
- GetDateTimeStrEx64(datetime, sizeof(datetime), SystemToLocal64(e->ConnectedTime), NULL);
- CtInsert(ct, name, tmp, datetime,
- GetConnectionTypeStr(e->Type));
- }
- CtFree(ct, c);
- FreeRpcEnumConnetion(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Get the TCP connection information currently connected to the VPN Server
- UINT PsConnectionGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CONNECTION_INFO t;
- CT *ct;
- wchar_t tmp[MAX_SIZE];
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_ConnectionGet_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
- // RPC call
- ret = ScGetConnectionInfo(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- ct = CtNewStandard();
- StrToUni(tmp, sizeof(tmp), t.Name);
- CtInsert(ct, _UU("SM_CONNINFO_NAME"), tmp);
- CtInsert(ct, _UU("SM_CONNINFO_TYPE"), GetConnectionTypeStr(t.Type));
- StrToUni(tmp, sizeof(tmp), t.Hostname);
- CtInsert(ct, _UU("SM_CONNINFO_HOSTNAME"), tmp);
- UniToStru(tmp, t.Port);
- CtInsert(ct, _UU("SM_CONNINFO_PORT"), tmp);
- GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.ConnectedTime), NULL);
- CtInsert(ct, _UU("SM_CONNINFO_TIME"), tmp);
- StrToUni(tmp, sizeof(tmp), t.ServerStr);
- CtInsert(ct, _UU("SM_CONNINFO_SERVER_STR"), tmp);
- UniFormat(tmp, sizeof(tmp), L"%u.%02u", t.ServerVer / 100, t.ServerVer % 100);
- CtInsert(ct, _UU("SM_CONNINFO_SERVER_VER"), tmp);
- UniToStru(tmp, t.ServerBuild);
- CtInsert(ct, _UU("SM_CONNINFO_SERVER_BUILD"), tmp);
- if (StrLen(t.ClientStr) != 0)
- {
- StrToUni(tmp, sizeof(tmp), t.ClientStr);
- CtInsert(ct, _UU("SM_CONNINFO_CLIENT_STR"), tmp);
- UniFormat(tmp, sizeof(tmp), L"%u.%02u", t.ClientVer / 100, t.ClientVer % 100);
- CtInsert(ct, _UU("SM_CONNINFO_CLIENT_VER"), tmp);
- UniToStru(tmp, t.ClientBuild);
- CtInsert(ct, _UU("SM_CONNINFO_CLIENT_BUILD"), tmp);
- }
- CtFree(ct, c);
- }
- FreeParamValueList(o);
- return 0;
- }
- // Disconnect the TCP connection connected to the VPN Server
- UINT PsConnectionDisconnect(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_DISCONNECT_CONNECTION t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_ConnectionDisconnect_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
- // RPC call
- ret = ScDisconnectConnection(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Get the LAN card list that can be used for local bridge
- UINT PsBridgeDeviceList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_ENUM_ETH t;
- UINT i;
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // RPC call
- ret = ScEnumEthernet(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- for (i = 0;i < t.NumItem;i++)
- {
- RPC_ENUM_ETH_ITEM *item = &t.Items[i];
- wchar_t tmp[MAX_SIZE * 2];
- StrToUni(tmp, sizeof(tmp), item->DeviceName);
- c->Write(c, tmp);
- }
- FreeRpcEnumEth(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Get the list of local bridge connection
- UINT PsBridgeList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_ENUM_LOCALBRIDGE t;
- UINT i;
- CT *ct;
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // RPC call
- ret = ScEnumLocalBridge(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- ct = CtNew();
- CtInsertColumn(ct, _UU("SM_BRIDGE_COLUMN_1"), false);
- CtInsertColumn(ct, _UU("SM_BRIDGE_COLUMN_2"), false);
- CtInsertColumn(ct, _UU("SM_BRIDGE_COLUMN_3"), false);
- CtInsertColumn(ct, _UU("SM_BRIDGE_COLUMN_4"), false);
- for (i = 0;i < t.NumItem;i++)
- {
- RPC_LOCALBRIDGE *e = &t.Items[i];
- wchar_t name[MAX_SIZE];
- wchar_t nic[MAX_SIZE];
- wchar_t hub[MAX_SIZE];
- wchar_t *status = _UU("SM_BRIDGE_OFFLINE");
- UniToStru(name, i + 1);
- StrToUni(nic, sizeof(nic), e->DeviceName);
- StrToUni(hub, sizeof(hub), e->HubName);
- if (e->Online)
- {
- status = e->Active ? _UU("SM_BRIDGE_ONLINE") : _UU("SM_BRIDGE_ERROR");
- }
- CtInsert(ct, name, hub, nic, status);
- }
- CtFree(ct, c);
- FreeRpcEnumLocalBridge(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Create a local bridge connection
- UINT PsBridgeCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_LOCALBRIDGE t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[hubname]", CmdPrompt, _UU("CMD_BridgeCreate_PROMPT_HUBNAME"), CmdEvalNotEmpty, NULL},
- {"DEVICE", CmdPrompt, _UU("CMD_BridgeCreate_PROMPT_DEVICE"), CmdEvalNotEmpty, NULL},
- {"TAP", NULL, NULL, NULL, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- t.Active = true;
- StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "DEVICE"));
- StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[hubname]"));
- t.Online = true;
- t.TapMode = GetParamYes(o, "TAP");
- // RPC call
- ret = ScAddLocalBridge(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- c->Write(c, _UU("SM_BRIDGE_INTEL"));
- c->Write(c, L"");
- if (GetCapsBool(ps->CapsList, "b_is_in_vm"))
- {
- // Message in the case of operating in a VM
- c->Write(c, _UU("D_SM_VMBRIDGE@CAPTION"));
- c->Write(c, _UU("D_SM_VMBRIDGE@S_1"));
- c->Write(c, _UU("D_SM_VMBRIDGE@S_2"));
- c->Write(c, L"");
- }
- }
- FreeParamValueList(o);
- return 0;
- }
- // Delete the local bridge connection
- UINT PsBridgeDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_LOCALBRIDGE t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[hubname]", CmdPrompt, _UU("CMD_BridgeDelete_PROMPT_HUBNAME"), CmdEvalNotEmpty, NULL},
- {"DEVICE", CmdPrompt, _UU("CMD_BridgeDelete_PROMPT_DEVICE"), CmdEvalNotEmpty, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "DEVICE"));
- StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[hubname]"));
- // RPC call
- ret = ScDeleteLocalBridge(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Get the list of features and capabilities of the server
- UINT PsCaps(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- CAPSLIST *t;
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // RPC call
- t = ScGetCapsEx(ps->Rpc);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- UINT i;
- CT *ct;
- ct = CtNewStandard();
- for (i = 0;i < LIST_NUM(t->CapsList);i++)
- {
- CAPS *c = LIST_DATA(t->CapsList, i);
- wchar_t title[MAX_SIZE];
- char name[256];
- Format(name, sizeof(name), "CT_%s", c->Name);
- UniStrCpy(title, sizeof(title), _UU(name));
- if (UniIsEmptyStr(title))
- {
- UniFormat(title, sizeof(title), L"%S", (StrLen(c->Name) >= 2) ? c->Name + 2 : c->Name);
- }
- if (StartWith(c->Name, "b_"))
- {
- bool icon_pass = c->Value == 0 ? false : true;
- if (StrCmpi(c->Name, "b_must_install_pcap") == 0)
- {
- // Reverse only item of WinPcap
- icon_pass = !icon_pass;
- }
- CtInsert(ct, title, c->Value == 0 ? _UU("CAPS_NO") : _UU("CAPS_YES"));
- }
- else
- {
- wchar_t str[64];
- UniToStru(str, c->Value);
- CtInsert(ct, title, str);
- }
- }
- CtFree(ct, c);
- }
- FreeCapsList(t);
- FreeParamValueList(o);
- return 0;
- }
- // Restart the VPN Server service
- UINT PsReboot(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_TEST t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"RESETCONFIG", NULL, NULL, NULL, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- t.IntValue = GetParamYes(o, "RESETCONFIG") ? 1 : 0;
- // RPC call
- ret = ScRebootServer(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcTest(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Get the current configuration of the VPN Server
- UINT PsConfigGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CONFIG t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[path]", NULL, NULL, NULL, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // RPC call
- ret = ScGetConfig(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- wchar_t *filename = GetParamUniStr(o, "[path]");
- if (IsEmptyUniStr(filename))
- {
- // Display on the screen
- wchar_t tmp[MAX_SIZE];
- UINT buf_size;
- wchar_t *buf;
- UNI_TOKEN_LIST *lines;
- UniFormat(tmp, sizeof(tmp), _UU("CMD_ConfigGet_FILENAME"), t.FileName,
- StrLen(t.FileData));
- c->Write(c, tmp);
- c->Write(c, L"");
- buf_size = CalcUtf8ToUni((BYTE *)t.FileData, StrLen(t.FileData));
- buf = ZeroMalloc(buf_size + 32);
- Utf8ToUni(buf, buf_size, (BYTE *)t.FileData, StrLen(t.FileData));
- lines = UniGetLines(buf);
- if (lines != NULL)
- {
- UINT i;
- for (i = 0;i < lines->NumTokens;i++)
- {
- c->Write(c, lines->Token[i]);
- }
- UniFreeToken(lines);
- }
- c->Write(c, L"");
- Free(buf);
- }
- else
- {
- // Save to the file
- IO *io = FileCreateW(filename);
- if (io == NULL)
- {
- c->Write(c, _UU("CMD_ConfigGet_FILE_SAVE_FAILED"));
- ret = ERR_INTERNAL_ERROR;
- }
- else
- {
- FileWrite(io, t.FileData, StrLen(t.FileData));
- FileClose(io);
- }
- }
- }
- FreeRpcConfig(&t);
- FreeParamValueList(o);
- return ret;
- }
- // Write the configuration to the VPN Server
- UINT PsConfigSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CONFIG t;
- wchar_t *filename;
- BUF *buf;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[path]", CmdPrompt, _UU("CMD_ConfigSet_PROMPT_PATH"), CmdEvalIsFile, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- filename = GetParamUniStr(o, "[path]");
- buf = ReadDumpW(filename);
- if (buf == NULL)
- {
- c->Write(c, _UU("CMD_ConfigSet_FILE_LOAD_FAILED"));
- }
- else
- {
- Zero(&t, sizeof(t));
- t.FileData = ZeroMalloc(buf->Size + 1);
- Copy(t.FileData, buf->Buf, buf->Size);
- FreeBuf(buf);
- // RPC call
- ret = ScSetConfig(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcConfig(&t);
- }
- FreeParamValueList(o);
- return 0;
- }
- // Get the Virtual Layer 3 switch list
- UINT PsRouterList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_ENUM_L3SW t;
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // RPC call
- ret = ScEnumL3Switch(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- CT *ct = CtNew();
- UINT i;
- CtInsertColumn(ct, _UU("SM_L3_SW_COLUMN1"), false);
- CtInsertColumn(ct, _UU("SM_L3_SW_COLUMN2"), false);
- CtInsertColumn(ct, _UU("SM_L3_SW_COLUMN3"), true);
- CtInsertColumn(ct, _UU("SM_L3_SW_COLUMN4"), true);
- for (i = 0;i < t.NumItem;i++)
- {
- RPC_ENUM_L3SW_ITEM *e = &t.Items[i];
- wchar_t tmp1[MAX_SIZE], *tmp2, tmp3[64], tmp4[64];
- StrToUni(tmp1, sizeof(tmp1), e->Name);
- if (e->Active == false)
- {
- tmp2 = _UU("SM_L3_SW_ST_F_F");
- }
- else if (e->Online == false)
- {
- tmp2 = _UU("SM_L3_SW_ST_T_F");
- }
- else
- {
- tmp2 = _UU("SM_L3_SW_ST_T_T");
- }
- UniToStru(tmp3, e->NumInterfaces);
- UniToStru(tmp4, e->NumTables);
- CtInsert(ct,
- tmp1, tmp2, tmp3, tmp4);
- }
- CtFree(ct, c);
- }
- FreeRpcEnumL3Sw(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Define a new virtual layer 3 switch
- UINT PsRouterAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_L3SW t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_RouterAdd_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
- // RPC call
- ret = ScAddL3Switch(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Delete the Virtual Layer 3 Switch
- UINT PsRouterDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_L3SW t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_RouterDelete_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
- // RPC call
- ret = ScDelL3Switch(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Start the Virtual Layer 3 Switch
- UINT PsRouterStart(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_L3SW t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_RouterStart_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
- // RPC call
- ret = ScStartL3Switch(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Stop the Virtual Layer 3 Switch
- UINT PsRouterStop(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_L3SW t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_RouterStop_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
- // RPC call
- ret = ScStopL3Switch(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Get the interface list registered on Virtual Layer 3 Switch
- UINT PsRouterIfList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_ENUM_L3IF t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_RouterIfList_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
- // RPC call
- ret = ScEnumL3If(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- UINT i;
- wchar_t tmp1[MAX_SIZE];
- wchar_t tmp2[MAX_SIZE];
- wchar_t tmp3[MAX_SIZE];
- CT *ct = CtNew();
- CtInsertColumn(ct, _UU("SM_L3_SW_IF_COLUMN1"), false);
- CtInsertColumn(ct, _UU("SM_L3_SW_IF_COLUMN2"), false);
- CtInsertColumn(ct, _UU("SM_L3_SW_IF_COLUMN3"), false);
- for (i = 0;i < t.NumItem;i++)
- {
- RPC_L3IF *e = &t.Items[i];
- IPToUniStr32(tmp1, sizeof(tmp1), e->IpAddress);
- IPToUniStr32(tmp2, sizeof(tmp2), e->SubnetMask);
- StrToUni(tmp3, sizeof(tmp3), e->HubName);
- CtInsert(ct, tmp1, tmp2, tmp3);
- }
- CtFree(ct, c);
- }
- FreeRpcEnumL3If(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Evaluate the IP address and mask
- bool CmdEvalIpAndMask4(CONSOLE *c, wchar_t *str, void *param)
- {
- char tmp[MAX_SIZE];
- UINT ip, mask;
- // Validate arguments
- if (c == NULL || str == NULL)
- {
- return false;
- }
- UniToStr(tmp, sizeof(tmp), str);
- if (ParseIpAndMask4(tmp, &ip, &mask) == false)
- {
- c->Write(c, _UU("CMD_PARSE_IP_MASK_ERROR_1"));
- return false;
- }
- return true;
- }
- bool CmdEvalIpAndMask6(CONSOLE *c, wchar_t *str, void *param)
- {
- char tmp[MAX_SIZE];
- IP ip, mask;
- // Validate arguments
- if (c == NULL || str == NULL)
- {
- return false;
- }
- UniToStr(tmp, sizeof(tmp), str);
- if (ParseIpAndMask6(tmp, &ip, &mask) == false)
- {
- c->Write(c, _UU("CMD_PARSE_IP_MASK_ERROR_1_6"));
- return false;
- }
- return true;
- }
- bool CmdEvalIpAndMask46(CONSOLE *c, wchar_t *str, void *param)
- {
- char tmp[MAX_SIZE];
- TOKEN_LIST *t;
- bool ret = false;
- Zero(tmp, sizeof(tmp));
- UniToStr(tmp, sizeof(tmp), str);
- t = ParseToken(tmp, "/");
- if (t == NULL)
- {
- return false;
- }
- if (t->NumTokens >= 1)
- {
- Trim(t->Token[0]);
- if (IsIpStr4(t->Token[0]))
- {
- ret = CmdEvalIpAndMask4(c, str, param);
- }
- else
- {
- ret = CmdEvalIpAndMask6(c, str, param);
- }
- }
- FreeToken(t);
- return ret;
- }
- // Evaluate the network address and the subnet mask
- bool CmdEvalNetworkAndSubnetMask4(CONSOLE *c, wchar_t *str, void *param)
- {
- char tmp[MAX_SIZE];
- UINT ip, mask;
- // Validate arguments
- if (c == NULL || str == NULL)
- {
- return false;
- }
- UniToStr(tmp, sizeof(tmp), str);
- if (ParseIpAndSubnetMask4(tmp, &ip, &mask) == false)
- {
- c->Write(c, _UU("CMD_PARSE_IP_SUBNET_ERROR_1"));
- return false;
- }
- if (IsNetworkAddress32(ip, mask) == false)
- {
- c->Write(c, _UU("CMD_PARSE_IP_SUBNET_ERROR_2"));
- return false;
- }
- return true;
- }
- bool CmdEvalNetworkAndSubnetMask6(CONSOLE *c, wchar_t *str, void *param)
- {
- char tmp[MAX_SIZE];
- IP ip, mask;
- // Validate arguments
- if (c == NULL || str == NULL)
- {
- return false;
- }
- UniToStr(tmp, sizeof(tmp), str);
- if (ParseIpAndSubnetMask6(tmp, &ip, &mask) == false)
- {
- c->Write(c, _UU("CMD_PARSE_IP_SUBNET_ERROR_1_6"));
- return false;
- }
- if (IsNetworkPrefixAddress6(&ip, &mask) == false)
- {
- c->Write(c, _UU("CMD_PARSE_IP_SUBNET_ERROR_3"));
- return false;
- }
- return true;
- }
- bool CmdEvalNetworkAndSubnetMask46(CONSOLE *c, wchar_t *str, void *param)
- {
- char tmp[MAX_SIZE];
- TOKEN_LIST *t;
- bool ret = false;
- Zero(tmp, sizeof(tmp));
- UniToStr(tmp, sizeof(tmp), str);
- t = ParseToken(tmp, "/");
- if (t == NULL)
- {
- return false;
- }
- if (t->NumTokens >= 1)
- {
- Trim(t->Token[0]);
- if (IsIpStr4(t->Token[0]))
- {
- ret = CmdEvalNetworkAndSubnetMask4(c, str, param);
- }
- else
- {
- ret = CmdEvalNetworkAndSubnetMask6(c, str, param);
- }
- }
- FreeToken(t);
- return ret;
- }
- // Evaluate the IP address and subnet mask
- bool CmdEvalHostAndSubnetMask4(CONSOLE *c, wchar_t *str, void *param)
- {
- char tmp[MAX_SIZE];
- // Validate arguments
- if (c == NULL || str == NULL)
- {
- return false;
- }
- UniToStr(tmp, sizeof(tmp), str);
- if (ParseIpAndSubnetMask4(tmp, NULL, NULL) == false)
- {
- c->Write(c, _UU("CMD_PARSE_IP_SUBNET_ERROR_1"));
- return false;
- }
- return true;
- }
- // Add a virtual interface to the virtual layer 3 switch
- UINT PsRouterIfAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_L3IF t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_RouterIfAdd_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
- {"HUB", CmdPrompt, _UU("CMD_RouterIfAdd_PROMPT_HUB"), CmdEvalNotEmpty, NULL},
- {"IP", CmdPrompt, _UU("CMD_RouterIfAdd_PROMPT_IP"), CmdEvalHostAndSubnetMask4, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
- ParseIpAndSubnetMask4(GetParamStr(o, "IP"), &t.IpAddress, &t.SubnetMask);
- StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "HUB"));
- // RPC call
- ret = ScAddL3If(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Delete the virtual interface of the virtual layer 3 switch
- UINT PsRouterIfDel(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_L3IF t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_RouterIfAdd_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
- {"HUB", CmdPrompt, _UU("CMD_RouterIfAdd_PROMPT_HUB"), CmdEvalNotEmpty, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
- StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "HUB"));
- // RPC call
- ret = ScDelL3If(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Get the routing table of the Virtual Layer 3 Switch
- UINT PsRouterTableList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_ENUM_L3TABLE t;
- CT *ct;
- wchar_t tmp1[MAX_SIZE];
- wchar_t tmp2[MAX_SIZE];
- wchar_t tmp3[MAX_SIZE];
- wchar_t tmp4[MAX_SIZE];
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_RouterTableList_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
- // RPC call
- ret = ScEnumL3Table(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- UINT i;
- ct = CtNew();
- CtInsertColumn(ct, _UU("SM_L3_SW_TABLE_COLUMN1"), false);
- CtInsertColumn(ct, _UU("SM_L3_SW_TABLE_COLUMN2"), false);
- CtInsertColumn(ct, _UU("SM_L3_SW_TABLE_COLUMN3"), false);
- CtInsertColumn(ct, _UU("SM_L3_SW_TABLE_COLUMN4"), true);
- for (i = 0;i < t.NumItem;i++)
- {
- RPC_L3TABLE *e = &t.Items[i];
- IPToUniStr32(tmp1, sizeof(tmp1), e->NetworkAddress);
- IPToUniStr32(tmp2, sizeof(tmp2), e->SubnetMask);
- IPToUniStr32(tmp3, sizeof(tmp3), e->GatewayAddress);
- UniToStru(tmp4, e->Metric);
- CtInsert(ct, tmp1, tmp2, tmp3, tmp4);
- }
- CtFree(ct, c);
- }
- FreeRpcEnumL3Table(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Add a routing table entry to the Virtual Layer 3 Switch
- UINT PsRouterTableAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_L3TABLE t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
- {"NETWORK", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_NETWORK"), CmdEvalNetworkAndSubnetMask4, NULL},
- {"GATEWAY", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_GATEWAY"), CmdEvalIp, NULL},
- {"METRIC", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_METRIC"), CmdEvalInt1, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
- ParseIpAndSubnetMask4(GetParamStr(o, "NETWORK"), &t.NetworkAddress, &t.SubnetMask);
- t.Metric = GetParamInt(o, "METRIC");
- t.GatewayAddress = StrToIP32(GetParamStr(o, "GATEWAY"));
- // RPC call
- ret = ScAddL3Table(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Delete the routing table entry of the Virtual Layer 3 Switch
- UINT PsRouterTableDel(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_L3TABLE t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
- {"NETWORK", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_NETWORK"), CmdEvalNetworkAndSubnetMask4, NULL},
- {"GATEWAY", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_GATEWAY"), CmdEvalIp, NULL},
- {"METRIC", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_METRIC"), CmdEvalInt1, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
- ParseIpAndSubnetMask4(GetParamStr(o, "NETWORK"), &t.NetworkAddress, &t.SubnetMask);
- t.Metric = GetParamInt(o, "METRIC");
- t.GatewayAddress = StrToIP32(GetParamStr(o, "GATEWAY"));
- // RPC call
- ret = ScDelL3Table(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Get the log files list
- UINT PsLogFileList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_ENUM_LOG_FILE t;
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- c->Write(c, _UU("CMD_LogFileList_START"));
- c->Write(c, L"");
- // RPC call
- ret = ScEnumLogFile(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- UINT i;
- wchar_t tmp[MAX_SIZE];
- CT *ct;
- UniFormat(tmp, sizeof(tmp), _UU("CMD_LogFileList_NUM_LOGS"), t.NumItem);
- c->Write(c, tmp);
- ct = CtNew();
- CtInsertColumn(ct, _UU("SM_LOG_FILE_COLUMN_1"), false);
- CtInsertColumn(ct, _UU("SM_LOG_FILE_COLUMN_2"), true);
- CtInsertColumn(ct, _UU("SM_LOG_FILE_COLUMN_3"), false);
- CtInsertColumn(ct, _UU("SM_LOG_FILE_COLUMN_4"), false);
- for (i = 0;i < t.NumItem;i++)
- {
- RPC_ENUM_LOG_FILE_ITEM *e = &t.Items[i];
- wchar_t tmp1[MAX_PATH], tmp2[128], tmp3[128], tmp4[MAX_HOST_NAME_LEN + 1];
- char tmp[MAX_SIZE];
- StrToUni(tmp1, sizeof(tmp1), e->FilePath);
- ToStrByte(tmp, sizeof(tmp), e->FileSize);
- StrToUni(tmp2, sizeof(tmp2), tmp);
- GetDateTimeStr64Uni(tmp3, sizeof(tmp3), SystemToLocal64(e->UpdatedTime));
- StrToUni(tmp4, sizeof(tmp4), e->ServerName);
- CtInsert(ct, tmp1, tmp2, tmp3, tmp4);
- }
- CtFreeEx(ct, c, true);
- }
- FreeRpcEnumLogFile(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Download a log file
- UINT PsLogFileGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- BUF *buf;
- char *filename = NULL;
- char *server_name;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_LogFileGet_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
- {"SERVER", NULL, NULL, NULL, NULL},
- {"SAVEPATH", NULL, NULL, NULL, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- filename = GetParamStr(o, "SAVE");
- if (IsEmptyStr(filename))
- {
- filename = GetParamStr(o, "SAVEPATH");
- }
- c->Write(c, _UU("CMD_LogFileGet_START"));
- server_name = GetParamStr(o, "SERVER");
- buf = DownloadFileFromServer(ps->Rpc, server_name,
- GetParamStr(o, "[name]"), 0, NULL, NULL);
- if (buf == NULL)
- {
- c->Write(c, _UU("CMD_LogFileGet_FAILED"));
- ret = ERR_INTERNAL_ERROR;
- }
- else
- {
- if (IsEmptyStr(filename) == false)
- {
- // Save to the file
- if (DumpBuf(buf, filename) == false)
- {
- ret = ERR_INTERNAL_ERROR;
- c->Write(c, _UU("CMD_LogFileGet_SAVE_FAILED"));
- }
- }
- else
- {
- // Display on the screen
- wchar_t tmp[MAX_SIZE];
- UINT buf_size;
- wchar_t *uni_buf;
- UniFormat(tmp, sizeof(tmp), _UU("CMD_LogFileGet_FILESIZE"),
- buf->Size);
- c->Write(c, tmp);
- c->Write(c, L"");
- buf_size = CalcUtf8ToUni((BYTE *)buf->Buf, buf->Size);
- uni_buf = ZeroMalloc(buf_size + 32);
- Utf8ToUni(uni_buf, buf_size, (BYTE *)buf->Buf, buf->Size);
- c->Write(c, uni_buf);
- c->Write(c, L"");
- Free(uni_buf);
- }
- FreeBuf(buf);
- }
- FreeParamValueList(o);
- return ret;
- }
- // Create a New Virtual HUB
- UINT PsHubCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CREATE_HUB t;
- char *pass = "";
- UINT hub_type = HUB_TYPE_STANDALONE;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_HubCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
- {"PASSWORD", CmdPromptChoosePassword, NULL, NULL, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- else
- {
- RPC_SERVER_INFO t;
- Zero(&t, sizeof(t));
- if (ScGetServerInfo(ps->Rpc, &t) == ERR_NO_ERROR)
- {
- if (t.ServerType == SERVER_TYPE_FARM_CONTROLLER)
- {
- hub_type = HUB_TYPE_FARM_DYNAMIC;
- }
- FreeRpcServerInfo(&t);
- }
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));
- t.HubType = hub_type;
- if (IsEmptyStr(GetParamStr(o, "PASSWORD")) == false)
- {
- pass = GetParamStr(o, "PASSWORD");
- }
- Hash(t.HashedPassword, pass, StrLen(pass), true);
- HashPassword(t.SecurePassword, ADMINISTRATOR_USERNAME, pass);
- t.Online = true;
- // RPC call
- ret = ScCreateHub(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Create a New Virtual HUB (dynamic mode)
- UINT PsHubCreateDynamic(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CREATE_HUB t;
- char *pass = "";
- UINT hub_type = HUB_TYPE_FARM_DYNAMIC;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_HubCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
- {"PASSWORD", CmdPromptChoosePassword, NULL, NULL, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));
- t.HubType = hub_type;
- if (IsEmptyStr(GetParamStr(o, "PASSWORD")) == false)
- {
- pass = GetParamStr(o, "PASSWORD");
- }
- Hash(t.HashedPassword, pass, StrLen(pass), true);
- HashPassword(t.SecurePassword, ADMINISTRATOR_USERNAME, pass);
- t.Online = true;
- // RPC call
- ret = ScCreateHub(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Create a New Virtual HUB (static mode)
- UINT PsHubCreateStatic(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CREATE_HUB t;
- char *pass = "";
- UINT hub_type = HUB_TYPE_FARM_STATIC;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_HubCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
- {"PASSWORD", CmdPromptChoosePassword, NULL, NULL, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));
- t.HubType = hub_type;
- if (IsEmptyStr(GetParamStr(o, "PASSWORD")) == false)
- {
- pass = GetParamStr(o, "PASSWORD");
- }
- Hash(t.HashedPassword, pass, StrLen(pass), true);
- HashPassword(t.SecurePassword, ADMINISTRATOR_USERNAME, pass);
- t.Online = true;
- // RPC call
- ret = ScCreateHub(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Delete a Virtual HUB
- UINT PsHubDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_DELETE_HUB t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_HubDelete_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));
- // RPC call
- ret = ScDeleteHub(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Set the Virtual HUB to static
- UINT PsHubSetStatic(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CREATE_HUB t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_HubChange_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));
- // Retrieve the current setting first
- ret = ScGetHub(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- // Change the settings
- StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));
- t.HubType = HUB_TYPE_FARM_STATIC;
- // Write
- ret = ScSetHub(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Change the type of Virtual HUB to dynamic Virtual HUB
- UINT PsHubSetDynamic(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CREATE_HUB t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_HubChange_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));
- // Retrieve the current setting first
- ret = ScGetHub(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- // Change the settings
- StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));
- t.HubType = HUB_TYPE_FARM_DYNAMIC;
- // Write
- ret = ScSetHub(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Get the list of Virtual HUB
- UINT PsHubList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_ENUM_HUB t;
- UINT i;
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // RPC call
- ret = ScEnumHub(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- CT *ct = CtNew();
- CtInsertColumn(ct, _UU("SM_HUB_COLUMN_1"), false);
- CtInsertColumn(ct, _UU("SM_HUB_COLUMN_2"), false);
- CtInsertColumn(ct, _UU("SM_HUB_COLUMN_3"), false);
- CtInsertColumn(ct, _UU("SM_HUB_COLUMN_4"), false);
- CtInsertColumn(ct, _UU("SM_HUB_COLUMN_5"), false);
- CtInsertColumn(ct, _UU("SM_HUB_COLUMN_6"), false);
- CtInsertColumn(ct, _UU("SM_HUB_COLUMN_7"), false);
- CtInsertColumn(ct, _UU("SM_HUB_COLUMN_8"), false);
- CtInsertColumn(ct, _UU("SM_HUB_COLUMN_9"), false);
- CtInsertColumn(ct, _UU("SM_HUB_COLUMN_10"), false);
- CtInsertColumn(ct, _UU("SM_HUB_COLUMN_11"), false);
- CtInsertColumn(ct, _UU("SM_SESS_COLUMN_6"), false);
- CtInsertColumn(ct, _UU("SM_SESS_COLUMN_7"), false);
- for (i = 0;i < t.NumHub;i++)
- {
- RPC_ENUM_HUB_ITEM *e = &t.Hubs[i];
- wchar_t name[MAX_HUBNAME_LEN + 1];
- wchar_t s1[64], s2[64], s3[64], s4[64], s5[64];
- wchar_t s6[64], s7[128], s8[128];
- wchar_t s9[64], s10[64];
- UniToStru(s1, e->NumUsers);
- UniToStru(s2, e->NumGroups);
- UniToStru(s3, e->NumSessions);
- UniToStru(s4, e->NumMacTables);
- UniToStru(s5, e->NumIpTables);
- UniToStru(s6, e->NumLogin);
- if (e->LastLoginTime != 0)
- {
- GetDateTimeStr64Uni(s7, sizeof(s7), SystemToLocal64(e->LastLoginTime));
- }
- else
- {
- UniStrCpy(s7, sizeof(s7), _UU("COMMON_UNKNOWN"));
- }
- if (e->LastCommTime != 0)
- {
- GetDateTimeStr64Uni(s8, sizeof(s8), SystemToLocal64(e->LastCommTime));
- }
- else
- {
- UniStrCpy(s8, sizeof(s8), _UU("COMMON_UNKNOWN"));
- }
- if (e->IsTrafficFilled == false)
- {
- UniStrCpy(s9, sizeof(s9), _UU("CM_ST_NONE"));
- UniStrCpy(s10, sizeof(s10), _UU("CM_ST_NONE"));
- }
- else
- {
- UniToStr3(s9, sizeof(s9),
- e->Traffic.Recv.BroadcastBytes + e->Traffic.Recv.UnicastBytes +
- e->Traffic.Send.BroadcastBytes + e->Traffic.Send.UnicastBytes);
- UniToStr3(s10, sizeof(s10),
- e->Traffic.Recv.BroadcastCount + e->Traffic.Recv.UnicastCount +
- e->Traffic.Send.BroadcastCount + e->Traffic.Send.UnicastCount);
- }
- StrToUni(name, sizeof(name), e->HubName);
- CtInsert(ct,
- name,
- e->Online ? _UU("SM_HUB_ONLINE") : _UU("SM_HUB_OFFLINE"),
- GetHubTypeStr(e->HubType),
- s1, s2, s3, s4, s5, s6, s7, s8, s9, s10);
- }
- CtFreeEx(ct, c, true);
- }
- FreeRpcEnumHub(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Select a Virtual HUB to manage
- UINT PsHub(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_HUB_STATUS t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", NULL, NULL, NULL, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- if (IsEmptyStr(GetParamStr(o, "[name]")) == false)
- {
- wchar_t tmp[MAX_SIZE];
- Zero(&t, sizeof(t));
- // Examine whether the specified Virtual HUB is accessible
- StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));
- // RPC call
- ret = ScGetHubStatus(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- // Change the selection
- if (ps->HubName != NULL)
- {
- Free(ps->HubName);
- }
- ps->HubName = CopyStr(t.HubName);
- UniFormat(tmp, sizeof(tmp), _UU("CMD_Hub_Selected"), t.HubName);
- c->Write(c, tmp);
- }
- else
- {
- // Deselect
- if (ps->HubName != NULL)
- {
- c->Write(c, _UU("CMD_Hub_Unselected"));
- Free(ps->HubName);
- }
- ps->HubName = NULL;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Set the Virtual HUB to online
- UINT PsOnline(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_SET_HUB_ONLINE t;
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- t.Online = true;
- // RPC call
- ret = ScSetHubOnline(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Set the Virtual HUB to offline
- UINT PsOffline(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_SET_HUB_ONLINE t;
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- t.Online = false;
- // RPC call
- ret = ScSetHubOnline(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Set the maximum number of concurrent connecting sessions of the Virtual HUB
- UINT PsSetMaxSession(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CREATE_HUB t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[max_session]", CmdPrompt, _UU("CMD_SetMaxSession_Prompt"), CmdEvalNotEmpty, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // Get current settings of Virtual HUB
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- ret = ScGetHub(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- t.HubOption.MaxSession = GetParamInt(o, "[max_session]");
- // Write the configuration of Virtual HUB
- ret = ScSetHub(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Set the administrative password of the Virtual HUB
- UINT PsSetHubPassword(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CREATE_HUB t;
- char *pw;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[password]", CmdPromptChoosePassword, NULL, NULL, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // Get current settings of Virtual HUB
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- ret = ScGetHub(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- // Change the settings
- pw = GetParamStr(o, "[password]");
- HashPassword(t.SecurePassword, ADMINISTRATOR_USERNAME, pw);
- Hash(t.HashedPassword, pw, StrLen(pw), true);
- // Write the configuration of Virtual HUB
- ret = ScSetHub(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Set the Virtual HUB to permit to be enumerated for anonymous users
- UINT PsSetEnumAllow(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CREATE_HUB t;
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // Get current settings of Virtual HUB
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- ret = ScGetHub(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- t.HubOption.NoEnum = false;
- // Write the configuration of Virtual HUB
- ret = ScSetHub(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Set the Virtual HUB to deny to be enumerated for anonymous users
- UINT PsSetEnumDeny(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CREATE_HUB t;
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // Get current settings of Virtual HUB
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- ret = ScGetHub(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- t.HubOption.NoEnum = true;
- // Write the configuration of Virtual HUB
- ret = ScSetHub(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Get the option settings for the virtual HUB
- UINT PsOptionsGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CREATE_HUB t;
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScGetHub(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- CT *ct;
- wchar_t tmp[MAX_SIZE];
- UniFormat(tmp, sizeof(tmp), _UU("CMD_OptionsGet_TITLE"), ps->HubName);
- c->Write(c, tmp);
- // Display settings
- ct = CtNewStandard();
- CtInsert(ct, _UU("CMD_OptionsGet_ENUM"),
- t.HubOption.NoEnum ? _UU("CMD_MSG_DENY") : _UU("CMD_MSG_ALLOW"));
- if (t.HubOption.MaxSession == 0)
- {
- UniStrCpy(tmp, sizeof(tmp), _UU("CMD_MSG_INFINITE"));
- }
- else
- {
- UniToStru(tmp, t.HubOption.MaxSession);
- }
- CtInsert(ct, _UU("CMD_OptionsGet_MAXSESSIONS"), tmp);
- CtInsert(ct, _UU("CMD_OptionsGet_STATUS"), t.Online ? _UU("SM_HUB_ONLINE") : _UU("SM_HUB_OFFLINE"));
- CtInsert(ct, _UU("CMD_OptionsGet_TYPE"), GetHubTypeStr(t.HubType));
- CtFree(ct, c);
- }
- FreeParamValueList(o);
- return 0;
- }
- // Setting the Radius server to use for user authentication
- UINT PsRadiusServerSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_RADIUS t;
- char *host;
- UINT port;
- // Parameter list that can be specified
- CMD_EVAL_MIN_MAX minmax =
- {
- "CMD_RadiusServerSet_EVAL_NUMINTERVAL", RADIUS_RETRY_INTERVAL, RADIUS_RETRY_TIMEOUT,
- };
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[server_name:port]", CmdPrompt, _UU("CMD_RadiusServerSet_Prompt_Host"), CmdEvalNotEmpty, NULL},
- {"SECRET", CmdPromptChoosePassword, _UU("CMD_RadiusServerSet_Prompt_Secret"), NULL, NULL},
- {"RETRY_INTERVAL", CmdPrompt, _UU("CMD_RadiusServerSet_Prompt_RetryInterval"), CmdEvalMinMax, &minmax},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- if (ParseHostPort(GetParamStr(o, "[server_name:port]"), &host, &port, 1812))
- {
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- t.RadiusPort = port;
- StrCpy(t.RadiusServerName, sizeof(t.RadiusServerName), host);
- StrCpy(t.RadiusSecret, sizeof(t.RadiusSecret), GetParamStr(o, "SECRET"));
- t.RadiusRetryInterval = GetParamInt(o, "RETRY_INTERVAL");
- Free(host);
- // RPC call
- ret = ScSetHubRadius(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- }
- FreeParamValueList(o);
- return 0;
- }
- // Delete the Radius server configuration to be used for user authentication
- UINT PsRadiusServerDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_RADIUS t;
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- t.RadiusPort = 1812;
- // RPC call
- ret = ScSetHubRadius(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Get the Radius server settings to use for user authentication
- UINT PsRadiusServerGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_RADIUS t;
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScGetHubRadius(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- CT *ct;
- wchar_t tmp[MAX_SIZE];
- ct = CtNewStandard();
- if (IsEmptyStr(t.RadiusServerName))
- {
- CtInsert(ct, _UU("CMD_RadiusServerGet_STATUS"), _UU("CMD_MSG_DISABLE"));
- }
- else
- {
- CtInsert(ct, _UU("CMD_RadiusServerGet_STATUS"), _UU("CMD_MSG_ENABLE"));
- StrToUni(tmp, sizeof(tmp), t.RadiusServerName);
- CtInsert(ct, _UU("CMD_RadiusServerGet_HOST"), tmp);
- UniToStri(tmp, t.RadiusPort);
- CtInsert(ct, _UU("CMD_RadiusServerGet_PORT"), tmp);
- StrToUni(tmp, sizeof(tmp), t.RadiusSecret);
- CtInsert(ct, _UU("CMD_RadiusServerGet_SECRET"), tmp);
- UniToStri(tmp, t.RadiusRetryInterval);
- CtInsert(ct, _UU("CMD_RadiusServerGet_RetryInterval"), tmp);
- }
- CtFree(ct, c);
- }
- FreeParamValueList(o);
- return 0;
- }
- // Get the current status of the Virtual HUB
- UINT PsStatusGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_HUB_STATUS t;
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScGetHubStatus(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- CT *ct = CtNewStandard();
- wchar_t *s;
- wchar_t tmp[MAX_SIZE];
- // HUB name
- s = CopyStrToUni(t.HubName);
- CtInsert(ct, _UU("SM_HUB_STATUS_HUBNAME"), s);
- Free(s);
- // Online
- CtInsert(ct, _UU("SM_HUB_STATUS_ONLINE"),
- t.Online ? _UU("SM_HUB_ONLINE") : _UU("SM_HUB_OFFLINE"));
- // Type of HUB
- CtInsert(ct, _UU("SM_HUB_TYPE"),
- GetHubTypeStr(t.HubType));
- if (t.HubType == HUB_TYPE_STANDALONE)
- {
- // Enable / Disable the SecureNAT
- CtInsert(ct, _UU("SM_HUB_SECURE_NAT"),
- t.SecureNATEnabled ? _UU("SM_HUB_SECURE_NAT_YES") : _UU("SM_HUB_SECURE_NAT_NO"));
- }
- // Other values
- UniToStru(tmp, t.NumSessions);
- CtInsert(ct, _UU("SM_HUB_NUM_SESSIONS"), tmp);
- if (t.NumSessionsClient != 0 || t.NumSessionsBridge != 0)
- {
- UniToStru(tmp, t.NumSessionsClient);
- CtInsert(ct, _UU("SM_HUB_NUM_SESSIONS_CLIENT"), tmp);
- UniToStru(tmp, t.NumSessionsBridge);
- CtInsert(ct, _UU("SM_HUB_NUM_SESSIONS_BRIDGE"), tmp);
- }
- UniToStru(tmp, t.NumAccessLists);
- CtInsert(ct, _UU("SM_HUB_NUM_ACCESSES"), tmp);
- UniToStru(tmp, t.NumUsers);
- CtInsert(ct, _UU("SM_HUB_NUM_USERS"), tmp);
- UniToStru(tmp, t.NumGroups);
- CtInsert(ct, _UU("SM_HUB_NUM_GROUPS"), tmp);
- UniToStru(tmp, t.NumMacTables);
- CtInsert(ct, _UU("SM_HUB_NUM_MAC_TABLES"), tmp);
- UniToStru(tmp, t.NumIpTables);
- CtInsert(ct, _UU("SM_HUB_NUM_IP_TABLES"), tmp);
- // Usage status
- UniToStru(tmp, t.NumLogin);
- CtInsert(ct, _UU("SM_HUB_NUM_LOGIN"), tmp);
- if (t.LastLoginTime != 0)
- {
- GetDateTimeStr64Uni(tmp, sizeof(tmp), SystemToLocal64(t.LastLoginTime));
- }
- else
- {
- UniStrCpy(tmp, sizeof(tmp), _UU("COMMON_UNKNOWN"));
- }
- CtInsert(ct, _UU("SM_HUB_LAST_LOGIN_TIME"), tmp);
- if (t.LastCommTime != 0)
- {
- GetDateTimeStr64Uni(tmp, sizeof(tmp), SystemToLocal64(t.LastCommTime));
- }
- else
- {
- UniStrCpy(tmp, sizeof(tmp), _UU("COMMON_UNKNOWN"));
- }
- CtInsert(ct, _UU("SM_HUB_LAST_COMM_TIME"), tmp);
- if (t.CreatedTime != 0)
- {
- GetDateTimeStr64Uni(tmp, sizeof(tmp), SystemToLocal64(t.CreatedTime));
- }
- else
- {
- UniStrCpy(tmp, sizeof(tmp), _UU("COMMON_UNKNOWN"));
- }
- CtInsert(ct, _UU("SM_HUB_CREATED_TIME"), tmp);
- // Traffic information
- CmdInsertTrafficInfo(ct, &t.Traffic);
- CtFree(ct, c);
- }
- FreeParamValueList(o);
- return 0;
- }
- // Get the log switching string
- wchar_t *GetLogSwitchStr(UINT i)
- {
- char tmp[64];
- Format(tmp, sizeof(tmp), "SM_LOG_SWITCH_%u", i);
- return _UU(tmp);
- }
- // Get the packet log name string
- wchar_t *GetPacketLogNameStr(UINT i)
- {
- char tmp[64];
- Format(tmp, sizeof(tmp), "CMD_Log_%u", i);
- return _UU(tmp);
- }
- // Get the log storage settings for the virtual HUB
- UINT PsLogGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_HUB_LOG t;
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScGetHubLog(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- CT *ct = CtNewStandard();
- CtInsert(ct, _UU("CMD_Log_SecurityLog"),
- t.LogSetting.SaveSecurityLog ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
- if (t.LogSetting.SaveSecurityLog)
- {
- CtInsert(ct, _UU("CMD_Log_SwitchType"), GetLogSwitchStr(t.LogSetting.SecurityLogSwitchType));
- }
- CtInsert(ct, L"", L"");
- CtInsert(ct, _UU("CMD_Log_PacketLog"),
- t.LogSetting.SavePacketLog ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
- if (t.LogSetting.SavePacketLog)
- {
- UINT i;
- CtInsert(ct, _UU("CMD_Log_SwitchType"), GetLogSwitchStr(t.LogSetting.PacketLogSwitchType));
- for (i = 0;i <= 7;i++)
- {
- wchar_t *tmp = NULL;
- switch (t.LogSetting.PacketLogConfig[i])
- {
- case PACKET_LOG_NONE:
- tmp = _UU("D_SM_LOG@B_PACKET_0_0");
- break;
- case PACKET_LOG_HEADER:
- tmp = _UU("D_SM_LOG@B_PACKET_0_1");
- break;
- case PACKET_LOG_ALL:
- tmp = _UU("D_SM_LOG@B_PACKET_0_2");
- break;
- }
- CtInsert(ct, GetPacketLogNameStr(i),
- tmp);
- }
- }
- CtFree(ct, c);
- }
- FreeParamValueList(o);
- return 0;
- }
- // LogEnable command
- UINT PsLogEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_HUB_LOG t;
- bool packet_log = false;
- char *tmp;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[security|packet]", CmdPrompt, _UU("CMD_LogEnable_Prompt"), CmdEvalNotEmpty, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- tmp = GetParamStr(o, "[security|packet]");
- if (StartWith(tmp, "p"))
- {
- packet_log = true;
- }
- else if (StartWith(tmp, "s") == false)
- {
- c->Write(c, _UU("CMD_LogEnable_Prompt_Error"));
- FreeParamValueList(o);
- return ret;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScGetHubLog(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- if (packet_log == false)
- {
- t.LogSetting.SaveSecurityLog = true;
- }
- else
- {
- t.LogSetting.SavePacketLog = true;
- }
- // RPC call
- ret = ScSetHubLog(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Disable the packet log or the security log
- UINT PsLogDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_HUB_LOG t;
- bool packet_log = false;
- char *tmp;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[security|packet]", CmdPrompt, _UU("CMD_LogEnable_Prompt"), CmdEvalNotEmpty, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- tmp = GetParamStr(o, "[security|packet]");
- if (StartWith(tmp, "p"))
- {
- packet_log = true;
- }
- else if (StartWith(tmp, "s") == false)
- {
- c->Write(c, _UU("CMD_LogEnable_Prompt_Error"));
- FreeParamValueList(o);
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScGetHubLog(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- if (packet_log == false)
- {
- t.LogSetting.SaveSecurityLog = false;
- }
- else
- {
- t.LogSetting.SavePacketLog = false;
- }
- // RPC call
- ret = ScSetHubLog(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Convert the string to log switching type
- UINT StrToLogSwitchType(char *str)
- {
- UINT ret = INFINITE;
- // Validate arguments
- if (str == NULL)
- {
- return INFINITE;
- }
- if (IsEmptyStr(str) || StartWith("none", str))
- {
- ret = LOG_SWITCH_NO;
- }
- else if (StartWith("second", str))
- {
- ret = LOG_SWITCH_SECOND;
- }
- else if (StartWith("minute", str))
- {
- ret = LOG_SWITCH_MINUTE;
- }
- else if (StartWith("hour", str))
- {
- ret = LOG_SWITCH_HOUR;
- }
- else if (StartWith("day", str))
- {
- ret = LOG_SWITCH_DAY;
- }
- else if (StartWith("month", str))
- {
- ret = LOG_SWITCH_MONTH;
- }
- return ret;
- }
- // Set the switching period of the log file
- UINT PsLogSwitchSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_HUB_LOG t;
- bool packet_log = false;
- char *tmp;
- UINT new_switch_type = 0;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[security|packet]", CmdPrompt, _UU("CMD_LogEnable_Prompt"), CmdEvalNotEmpty, NULL},
- {"SWITCH", CmdPrompt, _UU("CMD_LogSwitchSet_Prompt"), NULL, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- tmp = GetParamStr(o, "[security|packet]");
- if (StartWith(tmp, "p"))
- {
- packet_log = true;
- }
- else if (StartWith(tmp, "s") == false)
- {
- c->Write(c, _UU("CMD_LogEnable_Prompt_Error"));
- FreeParamValueList(o);
- return ERR_INVALID_PARAMETER;
- }
-
- new_switch_type = StrToLogSwitchType(GetParamStr(o, "SWITCH"));
- if (new_switch_type == INFINITE)
- {
- c->Write(c, _UU("CMD_LogEnable_Prompt_Error"));
- FreeParamValueList(o);
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScGetHubLog(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- if (packet_log == false)
- {
- t.LogSetting.SecurityLogSwitchType = new_switch_type;
- }
- else
- {
- t.LogSetting.PacketLogSwitchType = new_switch_type;
- }
- // RPC call
- ret = ScSetHubLog(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Convert the type string of the packet log contents to an integer
- UINT StrToPacketLogSaveInfoType(char *str)
- {
- UINT ret = INFINITE;
- if (str == NULL)
- {
- return INFINITE;
- }
- if (StartWith("none", str) || IsEmptyStr(str))
- {
- ret = PACKET_LOG_NONE;
- }
- else if (StartWith("header", str))
- {
- ret = PACKET_LOG_HEADER;
- }
- else if (StartWith("full", str) || StartWith("all", str))
- {
- ret = PACKET_LOG_ALL;
- }
- return ret;
- }
- // Convert a packet type string of the packet log to an integer
- UINT StrToPacketLogType(char *str)
- {
- UINT ret = INFINITE;
- if (str == NULL || IsEmptyStr(str))
- {
- return INFINITE;
- }
- if (StartWith("tcpconn", str))
- {
- ret = PACKET_LOG_TCP_CONN;
- }
- else if (StartWith("tcpdata", str))
- {
- ret = PACKET_LOG_TCP;
- }
- else if (StartWith("dhcp", str))
- {
- ret = PACKET_LOG_DHCP;
- }
- else if (StartWith("udp", str))
- {
- ret = PACKET_LOG_UDP;
- }
- else if (StartWith("icmp", str))
- {
- ret = PACKET_LOG_ICMP;
- }
- else if (StartWith("ip", str))
- {
- ret = PACKET_LOG_IP;
- }
- else if (StartWith("arp", str))
- {
- ret = PACKET_LOG_ARP;
- }
- else if (StartWith("ethernet", str))
- {
- ret = PACKET_LOG_ETHERNET;
- }
- return ret;
- }
- // Set the detail level and type of packet to be stored in the packet log
- UINT PsLogPacketSaveType(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_HUB_LOG t;
- bool packet_log = false;
- UINT packet_type = INFINITE;
- UINT packet_save_info_type = INFINITE;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"TYPE", CmdPrompt, _UU("CMD_LogPacketSaveType_Prompt_TYPE"), NULL, NULL},
- {"SAVE", CmdPrompt, _UU("CMD_LogPacketSaveType_Prompt_SAVE"), NULL, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
-
- packet_type = StrToPacketLogType(GetParamStr(o, "TYPE"));
- packet_save_info_type = StrToPacketLogSaveInfoType(GetParamStr(o, "SAVE"));
- if (packet_type == INFINITE || packet_save_info_type == INFINITE)
- {
- c->Write(c, _UU("CMD_LogEnable_Prompt_Error"));
- FreeParamValueList(o);
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScGetHubLog(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- t.LogSetting.PacketLogConfig[packet_type] = packet_save_info_type;
- // RPC call
- ret = ScSetHubLog(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Get the list of certificates of the trusted certification authority
- UINT PsCAList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_HUB_ENUM_CA t;
-
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScEnumCa(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- UINT i;
- CT *ct = CtNewStandard();
- for (i = 0;i < t.NumCa;i++)
- {
- wchar_t tmp[MAX_SIZE];
- wchar_t tmp2[64];
- RPC_HUB_ENUM_CA_ITEM *e = &t.Ca[i];
- GetDateStrEx64(tmp, sizeof(tmp), SystemToLocal64(e->Expires), NULL);
- UniToStru(tmp2, e->Key);
- CtInsert(ct, _UU("CMD_CAList_COLUMN_ID"), tmp2);
- CtInsert(ct, _UU("CM_CERT_COLUMN_1"), e->SubjectName);
- CtInsert(ct, _UU("CM_CERT_COLUMN_2"), e->IssuerName);
- CtInsert(ct, _UU("CM_CERT_COLUMN_3"), tmp);
- if (i != (t.NumCa - 1))
- {
- CtInsert(ct, L"---", L"---");
- }
- }
- CtFree(ct, c);
- }
- FreeRpcHubEnumCa(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Add a certificate to the trusted certification authority
- UINT PsCAAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_HUB_ADD_CA t;
- X *x;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[path]", CmdPrompt, _UU("CMD_CAAdd_PROMPT_PATH"), CmdEvalIsFile, NULL},
- };
-
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- x = FileToXW(GetParamUniStr(o, "[path]"));
- if (x == NULL)
- {
- FreeParamValueList(o);
- c->Write(c, _UU("CMD_MSG_LOAD_CERT_FAILED"));
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- t.Cert = x;
- // RPC call
- ret = ScAddCa(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcHubAddCa(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Delete the certificate of the trusted certification authority
- UINT PsCADelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_HUB_DELETE_CA t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[id]", CmdPrompt, _UU("CMD_CADelete_PROMPT_ID"), CmdEvalNotEmpty, NULL},
- };
-
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- t.Key = GetParamInt(o, "[id]");
- // RPC call
- ret = ScDeleteCa(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Get the certificate of the trusted certification authority
- UINT PsCAGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_HUB_GET_CA t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[id]", CmdPrompt, _UU("CMD_CAGet_PROMPT_ID"), CmdEvalNotEmpty, NULL},
- {"SAVECERT", CmdPrompt, _UU("CMD_CAGet_PROMPT_SAVECERT"), CmdEvalNotEmpty, NULL},
- };
-
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- t.Key = GetParamInt(o, "[id]");
- // RPC call
- ret = ScGetCa(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- if (XToFileW(t.Cert, GetParamUniStr(o, "SAVECERT"), true))
- {
- // Success
- }
- else
- {
- ret = ERR_INTERNAL_ERROR;
- c->Write(c, _UU("CMD_MSG_SAVE_CERT_FAILED"));
- }
- }
- FreeRpcHubGetCa(&t);
- FreeParamValueList(o);
- return ret;
- }
- // Get the cascade connection list
- UINT PsCascadeList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_ENUM_LINK t;
-
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScEnumLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- CT *ct = CtNew();
- UINT i;
- CtInsertColumn(ct, _UU("SM_LINK_COLUMN_1"), false);
- CtInsertColumn(ct, _UU("SM_LINK_COLUMN_2"), false);
- CtInsertColumn(ct, _UU("SM_LINK_COLUMN_3"), false);
- CtInsertColumn(ct, _UU("SM_LINK_COLUMN_4"), false);
- CtInsertColumn(ct, _UU("SM_LINK_COLUMN_5"), false);
- for (i = 0;i < t.NumLink;i++)
- {
- RPC_ENUM_LINK_ITEM *e = &t.Links[i];
- wchar_t tmp1[MAX_SIZE];
- wchar_t tmp2[MAX_SIZE];
- wchar_t tmp3[MAX_SIZE];
- wchar_t tmp4[MAX_SIZE];
- GetDateTimeStrEx64(tmp1, sizeof(tmp1), SystemToLocal64(e->ConnectedTime), NULL);
- StrToUni(tmp2, sizeof(tmp2), e->Hostname);
- StrToUni(tmp3, sizeof(tmp3), e->HubName);
- if (e->Online == false)
- {
- UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_LINK_STATUS_OFFLINE"));
- }
- else
- {
- if (e->Connected)
- {
- UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_LINK_STATUS_ONLINE"));
- }
- else
- {
- if (e->LastError != 0)
- {
- UniFormat(tmp4, sizeof(tmp4), _UU("SM_LINK_STATUS_ERROR"), e->LastError, _E(e->LastError));
- }
- else
- {
- UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_LINK_CONNECTING"));
- }
- }
- }
- CtInsert(ct, e->AccountName, tmp4, tmp1, tmp2, tmp3);
- }
- CtFreeEx(ct, c, true);
- }
- FreeRpcEnumLink(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Creat a new cascade
- UINT PsCascadeCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CREATE_LINK t;
- char *host = NULL;
- UINT port = 443;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- {"SERVER", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Server"), CmdEvalHostAndPort, NULL},
- {"HUB", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Hub"), CmdEvalSafe, NULL},
- {"USERNAME", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Username"), CmdEvalNotEmpty, NULL},
- };
-
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 443);
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- t.Online = false;
- Copy(&t.Policy, GetDefaultPolicy(), sizeof(POLICY));
- t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
- UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
- t.ClientOption->Port = port;
- StrCpy(t.ClientOption->Hostname, sizeof(t.ClientOption->Hostname), host);
- StrCpy(t.ClientOption->HubName, sizeof(t.ClientOption->HubName), GetParamStr(o, "HUB"));
- t.ClientOption->NumRetry = INFINITE;
- t.ClientOption->RetryInterval = 15;
- t.ClientOption->MaxConnection = 8;
- t.ClientOption->UseEncrypt = true;
- t.ClientOption->AdditionalConnectionInterval = 1;
- t.ClientOption->RequireBridgeRoutingMode = true;
- t.ClientAuth = ZeroMalloc(sizeof(CLIENT_AUTH));
- t.ClientAuth->AuthType = CLIENT_AUTHTYPE_ANONYMOUS;
- StrCpy(t.ClientAuth->Username, sizeof(t.ClientAuth->Username), GetParamStr(o, "USERNAME"));
- Free(host);
- // RPC call
- ret = ScCreateLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcCreateLink(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Set the user name and destination of the cascade connection
- UINT PsCascadeSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CREATE_LINK t;
- char *host = NULL;
- UINT port = 443;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- {"SERVER", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Server"), CmdEvalHostAndPort, NULL},
- {"HUB", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Hub"), CmdEvalSafe, NULL},
- };
-
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 443);
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
- UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
- ret = ScGetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- Free(host);
- return ret;
- }
- t.ClientOption->Port = port;
- StrCpy(t.ClientOption->Hostname, sizeof(t.ClientOption->Hostname), host);
- StrCpy(t.ClientOption->HubName, sizeof(t.ClientOption->HubName), GetParamStr(o, "HUB"));
- Free(host);
- // RPC call
- ret = ScSetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcCreateLink(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Get the type string of proxy
- wchar_t *GetProxyTypeStr(UINT i)
- {
- switch (i)
- {
- case PROXY_DIRECT:
- return _UU("PROTO_DIRECT_TCP");
- case PROXY_HTTP:
- return _UU("PROTO_HTTP_PROXY");
- case PROXY_SOCKS:
- return _UU("PROTO_SOCKS_PROXY");
- default:
- return _UU("PROTO_UNKNOWN");
- }
- }
- // Get type string in user authentication for client
- wchar_t *GetClientAuthTypeStr(UINT i)
- {
- char tmp[MAX_SIZE];
- Format(tmp, sizeof(tmp), "PW_TYPE_%u", i);
- return _UU(tmp);
- }
- // Get the setting of cascade connection
- UINT PsCascadeGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CREATE_LINK t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- };
-
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
- UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName),
- GetParamUniStr(o, "[name]"));
- // RPC call
- ret = ScGetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- // Show the contents of the connection settings
- wchar_t tmp[MAX_SIZE];
- CT *ct = CtNewStandard();
- // Connection settings name
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_NAME"), t.ClientOption->AccountName);
- // Host name of the destination VPN Server
- StrToUni(tmp, sizeof(tmp), t.ClientOption->Hostname);
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_HOSTNAME"), tmp);
- // The port number to connect to VPN Server
- UniToStru(tmp, t.ClientOption->Port);
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PORT"), tmp);
- // Virtual HUB name of the destination VPN Server
- StrToUni(tmp, sizeof(tmp), t.ClientOption->HubName);
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_HUBNAME"), tmp);
- // Type of proxy server to go through
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_TYPE"), GetProxyTypeStr(t.ClientOption->ProxyType));
- if (t.ClientOption->ProxyType != PROXY_DIRECT)
- {
- // Host name of the proxy server
- StrToUni(tmp, sizeof(tmp), t.ClientOption->ProxyName);
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_HOSTNAME"), tmp);
- // Port number of the proxy server
- UniToStru(tmp, t.ClientOption->ProxyPort);
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_PORT"), tmp);
- // User name of the proxy server
- StrToUni(tmp, sizeof(tmp), t.ClientOption->ProxyUsername);
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_USERNAME"), tmp);
- }
- // To verify the server certificate
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_SERVER_CERT_USE"),
- t.CheckServerCert ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
- // Registered specific certificate
- if (t.ServerCert != NULL)
- {
- GetAllNameFromX(tmp, sizeof(tmp), t.ServerCert);
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_SERVER_CERT_NAME"), tmp);
- }
- // Device name to be used for the connection
- StrToUni(tmp, sizeof(tmp), t.ClientOption->DeviceName);
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_DEVICE_NAME"), tmp);
- // Authentication type
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_AUTH_TYPE"), GetClientAuthTypeStr(t.ClientAuth->AuthType));
- // User name
- StrToUni(tmp, sizeof(tmp), t.ClientAuth->Username);
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_AUTH_USERNAME"), tmp);
- if (t.ClientAuth->AuthType == CLIENT_AUTHTYPE_CERT)
- {
- if (t.ClientAuth->ClientX != NULL)
- {
- // Client certificate name
- GetAllNameFromX(tmp, sizeof(tmp), t.ClientAuth->ClientX);
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_AUTH_CERT_NAME"), tmp);
- }
- }
- // Number of TCP connections to be used for VPN communication
- UniToStru(tmp, t.ClientOption->MaxConnection);
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_NUMTCP"), tmp);
- // Establishment interval of each TCP connection
- UniToStru(tmp, t.ClientOption->AdditionalConnectionInterval);
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_TCP_INTERVAL"), tmp);
- // Life span of each TCP connection
- if (t.ClientOption->ConnectionDisconnectSpan != 0)
- {
- UniToStru(tmp, t.ClientOption->ConnectionDisconnectSpan);
- }
- else
- {
- UniStrCpy(tmp, sizeof(tmp), _UU("CMD_MSG_INFINITE"));
- }
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_TCP_TTL"), tmp);
- // Use of half-duplex mode
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_TCP_HALF"),
- t.ClientOption->HalfConnection ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
- // Encryption by SSL
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_ENCRYPT"),
- t.ClientOption->UseEncrypt ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
- // Data compression
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_COMPRESS"),
- t.ClientOption->UseCompress ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
- // Connect in bridge / router mode
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_BRIDGE_ROUTER"),
- t.ClientOption->RequireBridgeRoutingMode ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
- // Connect in monitoring mode
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_MONITOR"),
- t.ClientOption->RequireMonitorMode ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
- // Not to rewrite the routing table
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_NO_TRACKING"),
- t.ClientOption->NoRoutingTracking ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
- // Disable the QoS control
- CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_QOS_DISABLE"),
- t.ClientOption->DisableQoS ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
- CtFree(ct, c);
- // Security policy
- c->Write(c, L"");
- c->Write(c, _UU("CMD_CascadeGet_Policy"));
- PrintPolicy(c, &t.Policy, true);
- }
- FreeRpcCreateLink(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Delete the cascade connection
- UINT PsCascadeDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_LINK t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- };
-
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScDeleteLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Set the user name to use for the cascade connection
- UINT PsCascadeUsernameSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CREATE_LINK t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- {"USERNAME", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Username"), CmdEvalNotEmpty, NULL},
- };
-
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
- UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
- // RPC call
- ret = ScGetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- // Change the settings for the cascade connection
- StrCpy(t.ClientAuth->Username, sizeof(t.ClientAuth->Username),
- GetParamStr(o, "USERNAME"));
- if (t.ClientAuth->AuthType == CLIENT_AUTHTYPE_PASSWORD)
- {
- c->Write(c, _UU("CMD_CascadeUsername_Notice"));
- }
- ret = ScSetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcCreateLink(&t);
- }
- FreeParamValueList(o);
- return 0;
- }
- //Set the type of user authentication of cascade connection to the anonymous authentication
- UINT PsCascadeAnonymousSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CREATE_LINK t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- };
-
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
- UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
- // RPC call
- ret = ScGetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- // Change the settings for the cascade connection
- t.ClientAuth->AuthType = CLIENT_AUTHTYPE_ANONYMOUS;
- ret = ScSetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcCreateLink(&t);
- }
- FreeParamValueList(o);
- return 0;
- }
- // Set the type of user authentication of cascade connection to the password authentication
- UINT PsCascadePasswordSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CREATE_LINK t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- {"PASSWORD", CmdPromptChoosePassword, NULL, NULL, NULL},
- {"TYPE", CmdPrompt, _UU("CMD_CascadePasswordSet_Prompt_Type"), CmdEvalNotEmpty, NULL},
- };
-
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
- UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
- // RPC call
- ret = ScGetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- // Change the settings for the cascade connection
- char *typestr = GetParamStr(o, "TYPE");
- if (StartWith("standard", typestr))
- {
- t.ClientAuth->AuthType = CLIENT_AUTHTYPE_PASSWORD;
- HashPassword(t.ClientAuth->HashedPassword, t.ClientAuth->Username,
- GetParamStr(o, "PASSWORD"));
- }
- else if (StartWith("radius", typestr) || StartWith("ntdomain", typestr))
- {
- t.ClientAuth->AuthType = CLIENT_AUTHTYPE_PLAIN_PASSWORD;
- StrCpy(t.ClientAuth->PlainPassword, sizeof(t.ClientAuth->PlainPassword),
- GetParamStr(o, "PASSWORD"));
- }
- else
- {
- // An error has occured
- c->Write(c, _UU("CMD_CascadePasswordSet_Type_Invalid"));
- FreeRpcCreateLink(&t);
- ret = ERR_INVALID_PARAMETER;
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ERR_INTERNAL_ERROR;
- }
- ret = ScSetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcCreateLink(&t);
- }
- FreeParamValueList(o);
- return 0;
- }
- // Set the type of user authentication of cascade connection to the client certificate authentication
- UINT PsCascadeCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CREATE_LINK t;
- X *x;
- K *k;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- {"LOADCERT", CmdPrompt, _UU("CMD_LOADCERTPATH"), CmdEvalIsFile, NULL},
- {"LOADKEY", CmdPrompt, _UU("CMD_LOADKEYPATH"), CmdEvalIsFile, NULL},
- };
-
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- if (CmdLoadCertAndKey(c, &x, &k, GetParamUniStr(o, "LOADCERT"), GetParamUniStr(o, "LOADKEY")) == false)
- {
- return ERR_INTERNAL_ERROR;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
- UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
- // RPC call
- ret = ScGetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- FreeX(x);
- FreeK(k);
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- // Change authentication data
- t.ClientAuth->AuthType = CLIENT_AUTHTYPE_CERT;
- if (t.ClientAuth->ClientX != NULL)
- {
- FreeX(t.ClientAuth->ClientX);
- }
- if (t.ClientAuth->ClientK != NULL)
- {
- FreeK(t.ClientAuth->ClientK);
- }
- t.ClientAuth->ClientX = x;
- t.ClientAuth->ClientK = k;
- ret = ScSetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcCreateLink(&t);
- }
- FreeParamValueList(o);
- return 0;
- }
- // Get the client certificate to be used in the cascade connection
- UINT PsCascadeCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CREATE_LINK t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- {"SAVECERT", CmdPrompt, _UU("CMD_SAVECERTPATH"), CmdEvalNotEmpty, NULL},
- };
-
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
- UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
- // RPC call
- ret = ScGetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- if (t.ClientAuth->AuthType != CLIENT_AUTHTYPE_CERT)
- {
- c->Write(c, _UU("CMD_CascadeCertSet_Not_Auth_Cert"));
- ret = ERR_INTERNAL_ERROR;
- }
- else if (t.ClientAuth->ClientX == NULL)
- {
- c->Write(c, _UU("CMD_CascadeCertSet_Cert_Not_Exists"));
- ret = ERR_INTERNAL_ERROR;
- }
- else
- {
- XToFileW(t.ClientAuth->ClientX, GetParamUniStr(o, "SAVECERT"), true);
- }
- FreeRpcCreateLink(&t);
- }
- FreeParamValueList(o);
- return ret;
- }
- // Enable encryption of communication at the time of the cascade connection
- UINT PsCascadeEncryptEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CREATE_LINK t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- };
-
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
- UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
- // RPC call
- ret = ScGetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- // Data change
- t.ClientOption->UseEncrypt = true;
- ret = ScSetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcCreateLink(&t);
- }
- FreeParamValueList(o);
- return 0;
- }
- // Disable encryption of communication at the time of the cascade connection
- UINT PsCascadeEncryptDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CREATE_LINK t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- };
-
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
- UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
- // RPC call
- ret = ScGetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- // Data change
- t.ClientOption->UseEncrypt = false;
- ret = ScSetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcCreateLink(&t);
- }
- FreeParamValueList(o);
- return 0;
- }
- // Enable data compression at the time of communication of the cascade connection
- UINT PsCascadeCompressEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CREATE_LINK t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- };
-
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
- UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
- // RPC call
- ret = ScGetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- // Data change
- t.ClientOption->UseCompress = true;
- ret = ScSetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcCreateLink(&t);
- }
- FreeParamValueList(o);
- return 0;
- }
- // Disable data compression at the time of communication of the cascade connection
- UINT PsCascadeCompressDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CREATE_LINK t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- };
-
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
- UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
- // RPC call
- ret = ScGetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- // Data change
- t.ClientOption->UseCompress = false;
- ret = ScSetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcCreateLink(&t);
- }
- FreeParamValueList(o);
- return 0;
- }
- // Set the cascade connection method to the TCP/IP direct connection mode
- UINT PsCascadeProxyNone(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CREATE_LINK t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- };
-
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
- UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
- // RPC call
- ret = ScGetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- // Data change
- t.ClientOption->ProxyType = PROXY_DIRECT;
- ret = ScSetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcCreateLink(&t);
- }
- FreeParamValueList(o);
- return 0;
- }
- // Set the cascade connection method as the mode via HTTP proxy server
- UINT PsCascadeProxyHttp(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CREATE_LINK t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- {"SERVER", CmdPrompt, _UU("CMD_CascadeProxyHttp_Prompt_Server"), CmdEvalHostAndPort, NULL},
- {"USERNAME", NULL, NULL, NULL, NULL},
- {"PASSWORD", NULL, NULL, NULL, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
- UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
- // RPC call
- ret = ScGetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- char *host;
- UINT port;
- // Data change
- if (ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 8080))
- {
- t.ClientOption->ProxyType = PROXY_HTTP;
- StrCpy(t.ClientOption->ProxyName, sizeof(t.ClientOption->ProxyName), host);
- t.ClientOption->ProxyPort = port;
- StrCpy(t.ClientOption->ProxyUsername, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "USERNAME"));
- StrCpy(t.ClientOption->ProxyPassword, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "PASSWORD"));
- Free(host);
- }
- ret = ScSetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcCreateLink(&t);
- }
- FreeParamValueList(o);
- return 0;
- }
- // Set the cascade connection method as the mode via SOCKS proxy server
- UINT PsCascadeProxySocks(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CREATE_LINK t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- {"SERVER", CmdPrompt, _UU("CMD_CascadeProxyHttp_Prompt_Server"), CmdEvalHostAndPort, NULL},
- {"USERNAME", NULL, NULL, NULL, NULL},
- {"PASSWORD", NULL, NULL, NULL, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
- UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
- // RPC call
- ret = ScGetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- char *host;
- UINT port;
- // Data change
- if (ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 8080))
- {
- t.ClientOption->ProxyType = PROXY_SOCKS;
- StrCpy(t.ClientOption->ProxyName, sizeof(t.ClientOption->ProxyName), host);
- t.ClientOption->ProxyPort = port;
- StrCpy(t.ClientOption->ProxyUsername, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "USERNAME"));
- StrCpy(t.ClientOption->ProxyPassword, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "PASSWORD"));
- Free(host);
- }
- ret = ScSetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcCreateLink(&t);
- }
- FreeParamValueList(o);
- return 0;
- }
- // Enable the validation options for the server certificate of cascade connection
- UINT PsCascadeServerCertEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CREATE_LINK t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- };
-
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
- UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
- // RPC call
- ret = ScGetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- // Data change
- t.CheckServerCert = true;
- ret = ScSetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcCreateLink(&t);
- }
- FreeParamValueList(o);
- return 0;
- }
- // Disable the validation options for the server certificate of cascade connection
- UINT PsCascadeServerCertDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CREATE_LINK t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- };
-
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
- UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
- // RPC call
- ret = ScGetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- // Data change
- t.CheckServerCert = false;
- ret = ScSetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcCreateLink(&t);
- }
- FreeParamValueList(o);
- return 0;
- }
- // Server-specific certificate settings of cascade connection
- UINT PsCascadeServerCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CREATE_LINK t;
- X *x;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- {"LOADCERT", CmdPrompt, _UU("CMD_LOADCERTPATH"), CmdEvalIsFile, NULL},
- };
-
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- x = FileToXW(GetParamUniStr(o, "LOADCERT"));
- if (x == NULL)
- {
- FreeParamValueList(o);
- c->Write(c, _UU("CMD_LOADCERT_FAILED"));
- return ERR_INTERNAL_ERROR;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
- UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
- // RPC call
- ret = ScGetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- FreeX(x);
- return ret;
- }
- else
- {
- // Data change
- if (t.ServerCert != NULL)
- {
- FreeX(t.ServerCert);
- }
- t.ServerCert = x;
- ret = ScSetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcCreateLink(&t);
- }
- FreeParamValueList(o);
- return 0;
- }
- // Delete the server-specific certificate of cascade connection
- UINT PsCascadeServerCertDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CREATE_LINK t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- };
-
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
- UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
- // RPC call
- ret = ScGetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- // Data change
- if (t.ServerCert != NULL)
- {
- FreeX(t.ServerCert);
- }
- t.ServerCert = NULL;
- ret = ScSetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcCreateLink(&t);
- }
- FreeParamValueList(o);
- return 0;
- }
- // Get the server-specific certificate of cascade connection
- UINT PsCascadeServerCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CREATE_LINK t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- {"SAVECERT", CmdPrompt, _UU("CMD_SAVECERTPATH"), CmdEvalNotEmpty, NULL},
- };
-
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
- UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
- // RPC call
- ret = ScGetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- // Save the certificate
- if (t.ServerCert == NULL)
- {
- c->Write(c, _UU("CMD_CERT_NOT_EXISTS"));
- ret = ERR_INTERNAL_ERROR;
- }
- else
- {
- if (XToFileW(t.ServerCert, GetParamUniStr(o, "SAVECERT"), true) == false)
- {
- c->Write(c, _UU("CMD_SAVECERT_FAILED"));
- ret = ERR_INTERNAL_ERROR;
- }
- }
- FreeRpcCreateLink(&t);
- }
- FreeParamValueList(o);
- return ret;
- }
- // Set the advanced settings of the cascade connection
- UINT PsCascadeDetailSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CREATE_LINK t;
- CMD_EVAL_MIN_MAX mm_maxtcp =
- {
- "CMD_CascadeDetailSet_Eval_MaxTcp", 1, 32
- };
- CMD_EVAL_MIN_MAX mm_interval =
- {
- "CMD_CascadeDetailSet_Eval_Interval", 1, 4294967295UL
- };
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- {"MAXTCP", CmdPrompt, _UU("CMD_CascadeDetailSet_Prompt_MaxTcp"), CmdEvalMinMax, &mm_maxtcp},
- {"INTERVAL", CmdPrompt, _UU("CMD_CascadeDetailSet_Prompt_Interval"), CmdEvalMinMax, &mm_interval},
- {"TTL", CmdPrompt, _UU("CMD_CascadeDetailSet_Prompt_TTL"), NULL, NULL},
- {"HALF", CmdPrompt, _UU("CMD_CascadeDetailSet_Prompt_HALF"), NULL, NULL},
- {"NOQOS", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_NOQOS"), NULL, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
- UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
- // RPC call
- ret = ScGetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- // Data change
- t.ClientOption->MaxConnection = GetParamInt(o, "MAXTCP");
- t.ClientOption->AdditionalConnectionInterval = GetParamInt(o, "INTERVAL");
- t.ClientOption->ConnectionDisconnectSpan = GetParamInt(o, "TTL");
- t.ClientOption->HalfConnection = GetParamYes(o, "HALF");
- t.ClientOption->DisableQoS = GetParamYes(o, "NOQOS");
- ret = ScSetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcCreateLink(&t);
- }
- FreeParamValueList(o);
- return 0;
- }
- // Show a security policy
- void PrintPolicy(CONSOLE *c, POLICY *pol, bool cascade_mode)
- {
- UINT i;
- CT *ct;
- PACK *p;
- // Validate arguments
- if (c == NULL || pol == NULL)
- {
- return;
- }
- ct = CtNew();
- CtInsertColumn(ct, _UU("CMD_PolicyList_Column_1"), false);
- CtInsertColumn(ct, _UU("CMD_PolicyList_Column_2"), false);
- CtInsertColumn(ct, _UU("CMD_PolicyList_Column_3"), false);
- p = NewPack();
- OutRpcPolicy(p, pol);
- // Show the list of all policies
- for (i = 0; i < PolicyNum();i++)
- {
- char name[64];
- wchar_t *tmp;
- if (cascade_mode == false || PolicyIsSupportedForCascade(i))
- {
- wchar_t value_str[256];
- UINT value;
- char tmp2[256];
- Format(tmp2, sizeof(tmp2), "policy:%s", PolicyIdToStr(i));
- value = PackGetInt(p, tmp2);
- tmp = CopyStrToUni(PolicyIdToStr(i));
- FormatPolicyValue(value_str, sizeof(value_str),
- i, value);
- Format(name, sizeof(name), "POL_%u", i);
- CtInsert(ct, tmp, _UU(name), value_str);
- Free(tmp);
- }
- }
- FreePack(p);
- CtFree(ct, c);
- }
- // Show the security policy list
- void PrintPolicyList(CONSOLE *c, char *name)
- {
- UINT id;
- // Validate arguments
- if (c == NULL)
- {
- return;
- }
- if (IsEmptyStr(name))
- {
- name = NULL;
- }
- if (name != NULL)
- {
- id = PolicyStrToId(name);
- if (id == INFINITE)
- {
- // Invalid ID
- c->Write(c, _UU("CMD_PolicyList_Invalid_Name"));
- }
- else
- {
- wchar_t tmp[MAX_SIZE];
- wchar_t tmp2[MAX_SIZE];
- char name1[64], name2[64];
- wchar_t *title, *descript;
- wchar_t policy_name[MAX_SIZE];
- Format(name1, sizeof(name1), "POL_%u", id);
- Format(name2, sizeof(name2), "POL_EX_%u", id);
- title = _UU(name1);
- descript = _UU(name2);
- StrToUni(policy_name, sizeof(policy_name), PolicyIdToStr(id));
- // Policy name
- c->Write(c, _UU("CMD_PolicyList_Help_1"));
- UniFormat(tmp2, sizeof(tmp2), L" %s", policy_name);
- c->Write(c, tmp2);
- c->Write(c, L"");
- // Simple description of the policy
- c->Write(c, _UU("CMD_PolicyList_Help_2"));
- UniFormat(tmp2, sizeof(tmp2), L" %s", title);
- c->Write(c, tmp2);
- c->Write(c, L"");
- // Range of the value that can be set
- GetPolicyValueRangeStr(tmp, sizeof(tmp), id);
- c->Write(c, _UU("CMD_PolicyList_Help_3"));
- UniFormat(tmp2, sizeof(tmp2), L" %s", tmp);
- c->Write(c, tmp2);
- c->Write(c, L"");
- // Default value
- FormatPolicyValue(tmp, sizeof(tmp), id, GetPolicyItem(id)->DefaultValue);
- c->Write(c, _UU("CMD_PolicyList_Help_4"));
- UniFormat(tmp2, sizeof(tmp2), L" %s", tmp);
- c->Write(c, tmp2);
- c->Write(c, L"");
- // Detailed description of the policy
- c->Write(c, _UU("CMD_PolicyList_Help_5"));
- c->Write(c, descript);
- c->Write(c, L"");
- }
- }
- else
- {
- UINT i;
- CT *ct = CtNew();
- CtInsertColumn(ct, _UU("CMD_PolicyList_Column_1"), false);
- CtInsertColumn(ct, _UU("CMD_PolicyList_Column_2"), false);
- // Show the list of all policies
- for (i = 0; i < PolicyNum();i++)
- {
- char name[64];
- wchar_t *tmp;
- tmp = CopyStrToUni(PolicyIdToStr(i));
- Format(name, sizeof(name), "POL_%u", i);
- CtInsert(ct, tmp, _UU(name));
- Free(tmp);
- }
- CtFree(ct, c);
- }
- }
- // Editing the contents of the policy
- bool EditPolicy(CONSOLE *c, POLICY *pol, char *name, char *value, bool cascade_mode)
- {
- PACK *p;
- ELEMENT *e;
- POLICY_ITEM *item;
- UINT id;
- wchar_t tmp[MAX_SIZE];
- wchar_t tmp2[MAX_SIZE];
- char pack_name[128];
- // Validate arguments
- if (c == NULL || pol == NULL || name == NULL || value == NULL)
- {
- return false;
- }
- p = NewPack();
- OutRpcPolicy(p, pol);
- Format(pack_name, sizeof(pack_name), "policy:%s", PolicyIdToStr(PolicyStrToId(name)));
- if ((e = GetElement(p, pack_name, VALUE_INT)) == NULL || (id = PolicyStrToId(name)) == INFINITE)
- {
- UniFormat(tmp, sizeof(tmp), _UU("CMD_CascadePolicySet_Invalid_Name"), name);
- c->Write(c, tmp);
- FreePack(p);
- return false;
- }
- if (cascade_mode && (PolicyIsSupportedForCascade(id) == false))
- {
- UniFormat(tmp, sizeof(tmp), _UU("CMD_CascadePolicySet_Invalid_Name_For_Cadcade"), name);
- c->Write(c, tmp);
- FreePack(p);
- return false;
- }
- item = GetPolicyItem(id);
- if (item->TypeInt == false)
- {
- // bool type
- e->values[0]->IntValue = (
- StartWith(value, "y") || StartWith(value, "t") ||
- ToInt(value) != 0) ? 1 : 0;
- }
- else
- {
- UINT n = ToInt(value);
- bool b = true;
- // int type
- GetPolicyValueRangeStr(tmp, sizeof(tmp), id);
- if (item->AllowZero == false)
- {
- if (n == 0)
- {
- b = false;
- }
- }
- if (n != 0 && (n < item->MinValue || n > item->MaxValue))
- {
- b = false;
- }
- if (b == false)
- {
- UniFormat(tmp2, sizeof(tmp2), _UU("CMD_CascadePolicySet_Invalid_Range"), PolicyIdToStr(id), tmp);
- c->Write(c, tmp2);
- FreePack(p);
- return false;
- }
- e->values[0]->IntValue = n;
- }
- Zero(pol, sizeof(POLICY));
- InRpcPolicy(pol, p);
- FreePack(p);
- return true;
- }
- // Show the list of the type of security policy and possible values
- UINT PsPolicyList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", NULL, NULL, NULL, NULL}
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- PrintPolicyList(c, GetParamStr(o, "[name]"));
- FreeParamValueList(o);
- return ERR_NO_ERROR;
- }
- // Set the security policy of the cascade session
- UINT PsCascadePolicySet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CREATE_LINK t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- {"NAME", CmdPrompt, _UU("CMD_CascadePolicySet_PROMPT_POLNAME"), CmdEvalNotEmpty, NULL},
- {"VALUE", CmdPrompt, _UU("CMD_CascadePolicySet_PROMPT_POLVALUE"), CmdEvalNotEmpty, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
- UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
- // RPC call
- ret = ScGetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- if (EditPolicy(c, &t.Policy, GetParamStr(o, "NAME"), GetParamStr(o, "VALUE"), true) == false)
- {
- // An error has occured
- FreeRpcCreateLink(&t);
- FreeParamValueList(o);
- return ERR_INTERNAL_ERROR;
- }
- ret = ScSetLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcCreateLink(&t);
- }
- FreeParamValueList(o);
- return 0;
- }
- // Display the status information of the session
- void CmdPrintStatusToListView(CT *ct, RPC_CLIENT_GET_CONNECTION_STATUS *s)
- {
- CmdPrintStatusToListViewEx(ct, s, false);
- }
- void CmdPrintStatusToListViewEx(CT *ct, RPC_CLIENT_GET_CONNECTION_STATUS *s, bool server_mode)
- {
- wchar_t tmp[MAX_SIZE];
- char str[MAX_SIZE];
- char vv[128];
- // Validate arguments
- if (s == NULL)
- {
- return;
- }
- if (server_mode == false)
- {
- CtInsert(ct, _UU("CM_ST_ACCOUNT_NAME"), s->AccountName);
- if (s->Connected == false)
- {
- wchar_t *st = _UU("CM_ST_CONNECTED_FALSE");
- switch (s->SessionStatus)
- {
- case CLIENT_STATUS_CONNECTING:
- st = _UU("CM_ST_CONNECTING");
- break;
- case CLIENT_STATUS_NEGOTIATION:
- st = _UU("CM_ST_NEGOTIATION");
- break;
- case CLIENT_STATUS_AUTH:
- st = _UU("CM_ST_AUTH");
- break;
- case CLIENT_STATUS_ESTABLISHED:
- st = _UU("CM_ST_ESTABLISHED");
- break;
- case CLIENT_STATUS_RETRY:
- st = _UU("CM_ST_RETRY");
- break;
- case CLIENT_STATUS_IDLE:
- st = _UU("CM_ST_IDLE");
- break;
- }
- CtInsert(ct, _UU("CM_ST_CONNECTED"), st);
- }
- else
- {
- CtInsert(ct, _UU("CM_ST_CONNECTED"), _UU("CM_ST_CONNECTED_TRUE"));
- }
- }
- if (s->Connected)
- {
- if (s->VLanId == 0)
- {
- UniStrCpy(tmp, sizeof(tmp), _UU("CM_ST_NO_VLAN"));
- }
- else
- {
- UniToStru(tmp, s->VLanId);
- }
- CtInsert(ct, _UU("CM_ST_VLAN_ID"), tmp);
- if (server_mode == false)
- {
- StrToUni(tmp, sizeof(tmp), s->ServerName);
- CtInsert(ct, _UU("CM_ST_SERVER_NAME"), tmp);
- UniFormat(tmp, sizeof(tmp), _UU("CM_ST_PORT_TCP"), s->ServerPort);
- CtInsert(ct, _UU("CM_ST_SERVER_PORT"), tmp);
- }
- StrToUni(tmp, sizeof(tmp), s->ServerProductName);
- CtInsert(ct, _UU("CM_ST_SERVER_P_NAME"), tmp);
- UniFormat(tmp, sizeof(tmp), L"%u.%02u", s->ServerProductVer / 100, s->ServerProductVer % 100);
- CtInsert(ct, _UU("CM_ST_SERVER_P_VER"), tmp);
- UniFormat(tmp, sizeof(tmp), L"Build %u", s->ServerProductBuild);
- CtInsert(ct, _UU("CM_ST_SERVER_P_BUILD"), tmp);
- }
- GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(s->StartTime), NULL);
- CtInsert(ct, _UU("CM_ST_START_TIME"), tmp);
- GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(s->FirstConnectionEstablisiedTime), NULL);
- CtInsert(ct, _UU("CM_ST_FIRST_ESTAB_TIME"), s->FirstConnectionEstablisiedTime == 0 ? _UU("CM_ST_NONE") : tmp);
- if (s->Connected)
- {
- GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(s->CurrentConnectionEstablishTime), NULL);
- CtInsert(ct, _UU("CM_ST_CURR_ESTAB_TIME"), tmp);
- }
- if (server_mode == false)
- {
- UniFormat(tmp, sizeof(tmp), _UU("CM_ST_NUM_STR"), s->NumConnectionsEatablished);
- CtInsert(ct, _UU("CM_ST_NUM_ESTABLISHED"), tmp);
- }
- if (s->Connected)
- {
- CtInsert(ct, _UU("CM_ST_HALF_CONNECTION"), s->HalfConnection ? _UU("CM_ST_HALF_TRUE") : _UU("CM_ST_HALF_FALSE"));
- CtInsert(ct, _UU("CM_ST_QOS"), s->QoS ? _UU("CM_ST_QOS_TRUE") : _UU("CM_ST_QOS_FALSE"));
- UniFormat(tmp, sizeof(tmp), L"%u", s->NumTcpConnections);
- CtInsert(ct, _UU("CM_ST_NUM_TCP"), tmp);
- if (s->HalfConnection)
- {
- UniFormat(tmp, sizeof(tmp), L"%u", s->NumTcpConnectionsUpload);
- CtInsert(ct, _UU("CM_ST_NUM_TCP_UPLOAD"), tmp);
- UniFormat(tmp, sizeof(tmp), L"%u", s->NumTcpConnectionsDownload);
- CtInsert(ct, _UU("CM_ST_NUM_TCP_DOWNLOAD"), tmp);
- }
- UniFormat(tmp, sizeof(tmp), L"%u", s->MaxTcpConnections);
- CtInsert(ct, _UU("CM_ST_MAX_TCP"), tmp);
- if (s->UseEncrypt == false)
- {
- UniStrCpy(tmp, sizeof(tmp), _UU("CM_ST_USE_ENCRYPT_FALSE"));
- }
- else
- {
- if (StrLen(s->CipherName) != 0)
- {
- UniFormat(tmp, sizeof(tmp), _UU("CM_ST_USE_ENCRYPT_TRUE"), s->CipherName);
- }
- else
- {
- UniFormat(tmp, sizeof(tmp), _UU("CM_ST_USE_ENCRYPT_TRUE2"));
- }
- }
- CtInsert(ct, _UU("CM_ST_USE_ENCRYPT"), tmp);
- if (s->UseCompress)
- {
- UINT percent = 0;
- if ((s->TotalRecvSize + s->TotalSendSize) > 0)
- {
- percent = (UINT)((UINT64)100 - (UINT64)(s->TotalRecvSizeReal + s->TotalSendSizeReal) * (UINT64)100 /
- (s->TotalRecvSize + s->TotalSendSize));
- percent = MAKESURE(percent, 0, 100);
- }
- UniFormat(tmp, sizeof(tmp), _UU("CM_ST_COMPRESS_TRUE"), percent);
- }
- else
- {
- UniStrCpy(tmp, sizeof(tmp), _UU("CM_ST_COMPRESS_FALSE"));
- }
- CtInsert(ct, _UU("CM_ST_USE_COMPRESS"), tmp);
- if (IsEmptyStr(s->UnderlayProtocol) == false)
- {
- StrToUni(tmp, sizeof(tmp), s->UnderlayProtocol);
- CtInsert(ct, _UU("CM_ST_UNDERLAY_PROTOCOL"), tmp);
- }
- CtInsert(ct, _UU("CM_ST_UDP_ACCEL_ENABLED"), (s->IsUdpAccelerationEnabled ? _UU("CM_ST_YES") : _UU("CM_ST_NO")));
- CtInsert(ct, _UU("CM_ST_UDP_ACCEL_USING"), (s->IsUsingUdpAcceleration ? _UU("CM_ST_YES") : _UU("CM_ST_NO")));
- StrToUni(tmp, sizeof(tmp), s->SessionName);
- CtInsert(ct, _UU("CM_ST_SESSION_NAME"), tmp);
- StrToUni(tmp, sizeof(tmp), s->ConnectionName);
- if (UniStrCmpi(tmp, L"INITING") != 0)
- {
- CtInsert(ct, _UU("CM_ST_CONNECTION_NAME"), tmp);
- }
- BinToStr(str, sizeof(str), s->SessionKey, sizeof(s->SessionKey));
- StrToUni(tmp, sizeof(tmp), str);
- CtInsert(ct, _UU("CM_ST_SESSION_KEY"), tmp);
- CtInsert(ct, _UU("CM_ST_BRIDGE_MODE"), s->IsBridgeMode ? _UU("CM_ST_YES") : _UU("CM_ST_NO"));
- CtInsert(ct, _UU("CM_ST_MONITOR_MODE"), s->IsMonitorMode ? _UU("CM_ST_YES") : _UU("CM_ST_NO"));
- ToStr3(vv, sizeof(vv), s->TotalSendSize);
- UniFormat(tmp, sizeof(tmp), _UU("CM_ST_SIZE_BYTE_STR"), vv);
- CtInsert(ct, _UU("CM_ST_SEND_SIZE"), tmp);
- ToStr3(vv, sizeof(vv), s->TotalRecvSize);
- UniFormat(tmp, sizeof(tmp), _UU("CM_ST_SIZE_BYTE_STR"), vv);
- CtInsert(ct, _UU("CM_ST_RECV_SIZE"), tmp);
- ToStr3(vv, sizeof(vv), s->Traffic.Send.UnicastCount);
- UniFormat(tmp, sizeof(tmp), _UU("CM_ST_NUM_PACKET_STR"), vv);
- CtInsert(ct, _UU("CM_ST_SEND_UCAST_NUM"), tmp);
- ToStr3(vv, sizeof(vv), s->Traffic.Send.UnicastBytes);
- UniFormat(tmp, sizeof(tmp), _UU("CM_ST_SIZE_BYTE_STR"), vv);
- CtInsert(ct, _UU("CM_ST_SEND_UCAST_SIZE"), tmp);
- ToStr3(vv, sizeof(vv), s->Traffic.Send.BroadcastCount);
- UniFormat(tmp, sizeof(tmp), _UU("CM_ST_NUM_PACKET_STR"), vv);
- CtInsert(ct, _UU("CM_ST_SEND_BCAST_NUM"), tmp);
- ToStr3(vv, sizeof(vv), s->Traffic.Send.BroadcastBytes);
- UniFormat(tmp, sizeof(tmp), _UU("CM_ST_SIZE_BYTE_STR"), vv);
- CtInsert(ct, _UU("CM_ST_SEND_BCAST_SIZE"), tmp);
- ToStr3(vv, sizeof(vv), s->Traffic.Recv.UnicastCount);
- UniFormat(tmp, sizeof(tmp), _UU("CM_ST_NUM_PACKET_STR"), vv);
- CtInsert(ct, _UU("CM_ST_RECV_UCAST_NUM"), tmp);
- ToStr3(vv, sizeof(vv), s->Traffic.Recv.UnicastBytes);
- UniFormat(tmp, sizeof(tmp), _UU("CM_ST_SIZE_BYTE_STR"), vv);
- CtInsert(ct, _UU("CM_ST_RECV_UCAST_SIZE"), tmp);
- ToStr3(vv, sizeof(vv), s->Traffic.Recv.BroadcastCount);
- UniFormat(tmp, sizeof(tmp), _UU("CM_ST_NUM_PACKET_STR"), vv);
- CtInsert(ct, _UU("CM_ST_RECV_BCAST_NUM"), tmp);
- ToStr3(vv, sizeof(vv), s->Traffic.Recv.BroadcastBytes);
- UniFormat(tmp, sizeof(tmp), _UU("CM_ST_SIZE_BYTE_STR"), vv);
- CtInsert(ct, _UU("CM_ST_RECV_BCAST_SIZE"), tmp);
- }
- }
- // Get the current state of the cascade connection
- UINT PsCascadeStatusGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_LINK_STATUS t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- };
-
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
- // RPC call
- ret = ScGetLinkStatus(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- // Get the cascade connection state
- CT *ct = CtNewStandard();
- CmdPrintStatusToListView(ct, &t.Status);
- CtFree(ct, c);
- FreeRpcLinkStatus(&t);
- }
- FreeParamValueList(o);
- return 0;
- }
- // Rename the cascade connection
- UINT PsCascadeRename(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_RENAME_LINK t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_CascadeRename_PROMPT_OLD"), CmdEvalNotEmpty, NULL},
- {"NEW", CmdPrompt, _UU("CMD_CascadeRename_PROMPT_NEW"), CmdEvalNotEmpty, NULL},
- };
-
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- UniStrCpy(t.NewAccountName, sizeof(t.NewAccountName), GetParamUniStr(o, "NEW"));
- UniStrCpy(t.OldAccountName, sizeof(t.OldAccountName), GetParamUniStr(o, "[name]"));
- // RPC call
- ret = ScRenameLink(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Set the cascade connection to on-line state
- UINT PsCascadeOnline(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_LINK t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- };
-
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
- // RPC call
- ret = ScSetLinkOnline(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Set the cascade connection to the off-line state
- UINT PsCascadeOffline(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_LINK t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
- };
-
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
- // RPC call
- ret = ScSetLinkOffline(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Convert the string to pass / discard flag
- bool StrToPassOrDiscard(char *str)
- {
- // Validate arguments
- if (str == NULL)
- {
- return false;
- }
- if (ToInt(str) != 0)
- {
- return true;
- }
- if (StartWith(str, "p") || StartWith(str, "y") || StartWith(str, "t"))
- {
- return true;
- }
- return false;
- }
- // Convert the string to the protocol
- UINT StrToProtocol(char *str)
- {
- if (IsEmptyStr(str))
- {
- return 0;
- }
- if (StartWith("ip", str))
- {
- return 0;
- }
- else if (StartWith("tcp", str))
- {
- return IP_PROTO_TCP;
- }
- else if (StartWith("udp", str))
- {
- return IP_PROTO_UDP;
- }
- else if (StartWith("icmpv4", str))
- {
- return IP_PROTO_ICMPV4;
- }
- else if (StartWith("icmpv6", str))
- {
- return IP_PROTO_ICMPV6;
- }
- if (ToInt(str) == 0)
- {
- if (StrCmpi(str, "0") == 0)
- {
- return 0;
- }
- else
- {
- return INFINITE;
- }
- }
- if (ToInt(str) >= 256)
- {
- return INFINITE;
- }
- return ToInt(str);
- }
- // Check the protocol name
- bool CmdEvalProtocol(CONSOLE *c, wchar_t *str, void *param)
- {
- char tmp[64];
- // Validate arguments
- if (c == NULL || str == NULL)
- {
- return false;
- }
- UniToStr(tmp, sizeof(tmp), str);
- if (StrToProtocol(tmp) == INFINITE)
- {
- c->Write(c, _UU("CMD_PROTOCOL_EVAL_FAILED"));
- return false;
- }
- return true;
- }
- // Parse the port range
- bool ParsePortRange(char *str, UINT *start, UINT *end)
- {
- UINT a = 0, b = 0;
- TOKEN_LIST *t;
- // Validate arguments
- if (str == NULL)
- {
- return false;
- }
- if (IsEmptyStr(str) == false)
- {
- t = ParseToken(str, "\t -");
- if (t->NumTokens == 1)
- {
- a = b = ToInt(t->Token[0]);
- }
- else if (t->NumTokens == 2)
- {
- a = ToInt(t->Token[0]);
- b = ToInt(t->Token[1]);
- }
- FreeToken(t);
- if (a > b)
- {
- return false;
- }
- if (a >= 65536 || b >= 65536)
- {
- return false;
- }
- if (a == 0 && b != 0)
- {
- return false;
- }
- }
- if (start != NULL)
- {
- *start = a;
- }
- if (end != NULL)
- {
- *end = b;
- }
- return true;
- }
- // Check the port range
- bool CmdEvalPortRange(CONSOLE *c, wchar_t *str, void *param)
- {
- char tmp[64];
- // Validate arguments
- if (c == NULL || str == NULL)
- {
- return false;
- }
- UniToStr(tmp, sizeof(tmp), str);
- if (ParsePortRange(tmp, NULL, NULL) == false)
- {
- c->Write(c, _UU("CMD_PORT_RANGE_EVAL_FAILED"));
- return false;
- }
- return true;
- }
- // Parse the MAC address and the mask
- bool ParseMacAddressAndMask(char *src, bool *check_mac, UCHAR *mac_bin, UCHAR *mask_bin)
- {
- TOKEN_LIST *t;
- char *macstr, *maskstr;
- UCHAR mac[6], mask[6];
- bool ok = false;
- // Validate arguments
- if (src == NULL)
- {
- return false;
- }
- //Zero(mac, sizeof(mac));
- //Zero(mask, sizeof(mask));
- if(check_mac != NULL && mac_bin != NULL && mask_bin != NULL)
- {
- ok = true;
- }
- if(IsEmptyStr(src) != false)
- {
- if(ok != false)
- {
- *check_mac = false;
- Zero(mac_bin, 6);
- Zero(mask_bin, 6);
- }
- return true;
- }
- t = ParseToken(src, "/");
- if(t->NumTokens != 2)
- {
- FreeToken(t);
- return false;
- }
- macstr = t->Token[0];
- maskstr = t->Token[1];
- Trim(macstr);
- Trim(maskstr);
- if(StrToMac(mac, macstr) == false || StrToMac(mask, maskstr) == false)
- {
- FreeToken(t);
- return false;
- }
- else
- {
- if(ok != false)
- {
- Copy(mac_bin, mac, 6);
- Copy(mask_bin, mask, 6);
- *check_mac = true;
- }
- }
- FreeToken(t);
- return true;
- }
- // Check the MAC address and mask
- bool CmdEvalMacAddressAndMask(CONSOLE *c, wchar_t *str, void *param)
- {
- char tmp[64];
- // Validate arguments
- if(c == NULL || str == NULL)
- {
- return false;
- }
- UniToStr(tmp, sizeof(tmp), str);
- if(ParseMacAddressAndMask(tmp, NULL, NULL, NULL) == false)
- {
- c->Write(c, _UU("CMD_MAC_ADDRESS_AND_MASK_EVAL_FAILED"));
- return false;
- }
- return true;
- }
- // Parse the status of TCP connection
- bool ParseTcpState(char *src, bool *check_tcp_state, bool *established)
- {
- bool ok = false;
- // Validate arguments
- if(src == NULL)
- {
- return false;
- }
- if(check_tcp_state != NULL && established != NULL)
- {
- ok = true;
- }
- if (IsEmptyStr(src) == false)
- {
- if (StartWith("Established", src) == 0)
- {
- if(ok != false)
- {
- *check_tcp_state = true;
- *established = true;
- }
- }
- else if (StartWith("Unestablished", src) == 0)
- {
- if(ok != false)
- {
- *check_tcp_state = true;
- *established = false;
- }
- }
- else
- {
- // Illegal string
- return false;
- }
- }
- else
- {
- if(ok != false)
- {
- *check_tcp_state = false;
- *established = false;
- }
- }
- return true;
- }
- // Check the status of the TCP connection
- bool CmdEvalTcpState(CONSOLE *c, wchar_t *str, void *param)
- {
- char tmp[64];
- // Validate arguments
- if(c == NULL || str == NULL)
- {
- return false;
- }
- UniToStr(tmp, sizeof(tmp), str);
- if(ParseTcpState(tmp, NULL, NULL) == false)
- {
- c->Write(c, _UU("CMD_TCP_CONNECTION_STATE_EVAL_FAILED"));
- return false;
- }
- return true;
- }
- // Adding a rule to the access list (Standard, IPv4)
- UINT PsAccessAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_ADD_ACCESS t;
- ACCESS *a;
- // Parameter list that can be specified
- CMD_EVAL_MIN_MAX minmax =
- {
- "CMD_AccessAdd_Eval_PRIORITY", 1, 4294967295UL,
- };
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[pass|discard]", CmdPrompt, _UU("CMD_AccessAdd_Prompt_TYPE"), CmdEvalNotEmpty, NULL},
- {"MEMO", CmdPrompt, _UU("CMD_AccessAdd_Prompt_MEMO"), NULL, NULL},
- {"PRIORITY", CmdPrompt, _UU("CMD_AccessAdd_Prompt_PRIORITY"), CmdEvalMinMax, &minmax},
- {"SRCUSERNAME", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCUSERNAME"), NULL, NULL},
- {"DESTUSERNAME", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTUSERNAME"), NULL, NULL},
- {"SRCMAC", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCMAC"), CmdEvalMacAddressAndMask, NULL},
- {"DESTMAC", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTMAC"), CmdEvalMacAddressAndMask, NULL},
- {"SRCIP", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCIP"), CmdEvalIpAndMask4, NULL},
- {"DESTIP", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTIP"), CmdEvalIpAndMask4, NULL},
- {"PROTOCOL", CmdPrompt, _UU("CMD_AccessAdd_Prompt_PROTOCOL"), CmdEvalProtocol, NULL},
- {"SRCPORT", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCPORT"), CmdEvalPortRange, NULL},
- {"DESTPORT", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTPORT"), CmdEvalPortRange, NULL},
- {"TCPSTATE", CmdPrompt, _UU("CMD_AccessAdd_Prompt_TCPSTATE"), CmdEvalTcpState, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- a = &t.Access;
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- UniStrCpy(a->Note, sizeof(a->Note), GetParamUniStr(o, "MEMO"));
- a->Active = true;
- a->Priority = GetParamInt(o, "PRIORITY");
- a->Discard = StrToPassOrDiscard(GetParamStr(o, "[pass|discard]")) ? false : true;
- StrCpy(a->SrcUsername, sizeof(a->SrcUsername), GetParamStr(o, "SRCUSERNAME"));
- StrCpy(a->DestUsername, sizeof(a->DestUsername), GetParamStr(o, "DESTUSERNAME"));
- ParseMacAddressAndMask(GetParamStr(o, "SRCMAC"), &a->CheckSrcMac, a->SrcMacAddress, a->SrcMacMask);
- ParseMacAddressAndMask(GetParamStr(o, "DESTMAC"), &a->CheckDstMac, a->DstMacAddress, a->DstMacMask);
- ParseIpAndMask4(GetParamStr(o, "SRCIP"), &a->SrcIpAddress, &a->SrcSubnetMask);
- ParseIpAndMask4(GetParamStr(o, "DESTIP"), &a->DestIpAddress, &a->DestSubnetMask);
- a->Protocol = StrToProtocol(GetParamStr(o, "PROTOCOL"));
- ParsePortRange(GetParamStr(o, "SRCPORT"), &a->SrcPortStart, &a->SrcPortEnd);
- ParsePortRange(GetParamStr(o, "DESTPORT"), &a->DestPortStart, &a->DestPortEnd);
- ParseTcpState(GetParamStr(o, "TCPSTATE"), &a->CheckTcpState, &a->Established);
- // RPC call
- ret = ScAddAccess(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Adding a rule to the access list (Extended, IPv4)
- UINT PsAccessAddEx(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_ADD_ACCESS t;
- ACCESS *a;
- // Parameter list that can be specified
- CMD_EVAL_MIN_MAX minmax =
- {
- "CMD_AccessAdd_Eval_PRIORITY", 1, 4294967295UL,
- };
- CMD_EVAL_MIN_MAX minmax_delay =
- {
- "CMD_AccessAddEx_Eval_DELAY", 0, HUB_ACCESSLIST_DELAY_MAX,
- };
- CMD_EVAL_MIN_MAX minmax_jitter =
- {
- "CMD_AccessAddEx_Eval_JITTER", 0, HUB_ACCESSLIST_JITTER_MAX,
- };
- CMD_EVAL_MIN_MAX minmax_loss =
- {
- "CMD_AccessAddEx_Eval_LOSS", 0, HUB_ACCESSLIST_LOSS_MAX,
- };
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[pass|discard]", CmdPrompt, _UU("CMD_AccessAdd_Prompt_TYPE"), CmdEvalNotEmpty, NULL},
- {"MEMO", CmdPrompt, _UU("CMD_AccessAdd_Prompt_MEMO"), NULL, NULL},
- {"PRIORITY", CmdPrompt, _UU("CMD_AccessAdd_Prompt_PRIORITY"), CmdEvalMinMax, &minmax},
- {"SRCUSERNAME", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCUSERNAME"), NULL, NULL},
- {"DESTUSERNAME", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTUSERNAME"), NULL, NULL},
- {"SRCMAC", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCMAC"), CmdEvalMacAddressAndMask, NULL},
- {"DESTMAC", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTMAC"), CmdEvalMacAddressAndMask, NULL},
- {"SRCIP", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCIP"), CmdEvalIpAndMask4, NULL},
- {"DESTIP", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTIP"), CmdEvalIpAndMask4, NULL},
- {"PROTOCOL", CmdPrompt, _UU("CMD_AccessAdd_Prompt_PROTOCOL"), CmdEvalProtocol, NULL},
- {"SRCPORT", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCPORT"), CmdEvalPortRange, NULL},
- {"DESTPORT", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTPORT"), CmdEvalPortRange, NULL},
- {"TCPSTATE", CmdPrompt, _UU("CMD_AccessAdd_Prompt_TCPSTATE"), CmdEvalTcpState, NULL},
- {"DELAY", CmdPrompt, _UU("CMD_AccessAddEx_Prompt_DELAY"), CmdEvalMinMax, &minmax_delay},
- {"JITTER", CmdPrompt, _UU("CMD_AccessAddEx_Prompt_JITTER"), CmdEvalMinMax, &minmax_jitter},
- {"LOSS", CmdPrompt, _UU("CMD_AccessAddEx_Prompt_LOSS"), CmdEvalMinMax, &minmax_loss},
- {"REDIRECTURL", NULL, NULL, NULL, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- // Check whether it is supported
- if (GetCapsBool(ps->CapsList, "b_support_ex_acl") == false)
- {
- c->Write(c, _E(ERR_NOT_SUPPORTED));
- return ERR_NOT_SUPPORTED;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- a = &t.Access;
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- UniStrCpy(a->Note, sizeof(a->Note), GetParamUniStr(o, "MEMO"));
- a->Active = true;
- a->Priority = GetParamInt(o, "PRIORITY");
- a->Discard = StrToPassOrDiscard(GetParamStr(o, "[pass|discard]")) ? false : true;
- StrCpy(a->SrcUsername, sizeof(a->SrcUsername), GetParamStr(o, "SRCUSERNAME"));
- StrCpy(a->DestUsername, sizeof(a->DestUsername), GetParamStr(o, "DESTUSERNAME"));
- ParseMacAddressAndMask(GetParamStr(o, "SRCMAC"), &a->CheckSrcMac, a->SrcMacAddress, a->SrcMacMask);
- ParseMacAddressAndMask(GetParamStr(o, "DESTMAC"), &a->CheckDstMac, a->DstMacAddress, a->DstMacMask);
- ParseIpAndMask4(GetParamStr(o, "SRCIP"), &a->SrcIpAddress, &a->SrcSubnetMask);
- ParseIpAndMask4(GetParamStr(o, "DESTIP"), &a->DestIpAddress, &a->DestSubnetMask);
- a->Protocol = StrToProtocol(GetParamStr(o, "PROTOCOL"));
- ParsePortRange(GetParamStr(o, "SRCPORT"), &a->SrcPortStart, &a->SrcPortEnd);
- ParsePortRange(GetParamStr(o, "DESTPORT"), &a->DestPortStart, &a->DestPortEnd);
- ParseTcpState(GetParamStr(o, "TCPSTATE"), &a->CheckTcpState, &a->Established);
- a->Delay = GetParamInt(o, "DELAY");
- a->Jitter = GetParamInt(o, "JITTER");
- a->Loss = GetParamInt(o, "LOSS");
- StrCpy(a->RedirectUrl, sizeof(a->RedirectUrl), GetParamStr(o, "REDIRECTURL"));
- // RPC call
- ret = ScAddAccess(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Adding a rule to the access list (Standard, IPv6)
- UINT PsAccessAdd6(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_ADD_ACCESS t;
- ACCESS *a;
- IP ip, mask;
- // Parameter list that can be specified
- CMD_EVAL_MIN_MAX minmax =
- {
- "CMD_AccessAdd6_Eval_PRIORITY", 1, 4294967295UL,
- };
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[pass|discard]", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_TYPE"), CmdEvalNotEmpty, NULL},
- {"MEMO", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_MEMO"), NULL, NULL},
- {"PRIORITY", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_PRIORITY"), CmdEvalMinMax, &minmax},
- {"SRCUSERNAME", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCUSERNAME"), NULL, NULL},
- {"DESTUSERNAME", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTUSERNAME"), NULL, NULL},
- {"SRCMAC", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCMAC"), CmdEvalMacAddressAndMask, NULL},
- {"DESTMAC", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTMAC"), CmdEvalMacAddressAndMask, NULL},
- {"SRCIP", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCIP"), CmdEvalIpAndMask6, NULL},
- {"DESTIP", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTIP"), CmdEvalIpAndMask6, NULL},
- {"PROTOCOL", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_PROTOCOL"), CmdEvalProtocol, NULL},
- {"SRCPORT", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCPORT"), CmdEvalPortRange, NULL},
- {"DESTPORT", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTPORT"), CmdEvalPortRange, NULL},
- {"TCPSTATE", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_TCPSTATE"), CmdEvalTcpState, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- // Check whether it is supported
- if (GetCapsBool(ps->CapsList, "b_support_ex_acl") == false)
- {
- c->Write(c, _E(ERR_NOT_SUPPORTED));
- return ERR_NOT_SUPPORTED;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- a = &t.Access;
- a->IsIPv6 = true;
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- UniStrCpy(a->Note, sizeof(a->Note), GetParamUniStr(o, "MEMO"));
- a->Active = true;
- a->Priority = GetParamInt(o, "PRIORITY");
- a->Discard = StrToPassOrDiscard(GetParamStr(o, "[pass|discard]")) ? false : true;
- StrCpy(a->SrcUsername, sizeof(a->SrcUsername), GetParamStr(o, "SRCUSERNAME"));
- StrCpy(a->DestUsername, sizeof(a->DestUsername), GetParamStr(o, "DESTUSERNAME"));
- ParseMacAddressAndMask(GetParamStr(o, "SRCMAC"), &a->CheckSrcMac, a->SrcMacAddress, a->SrcMacMask);
- ParseMacAddressAndMask(GetParamStr(o, "DESTMAC"), &a->CheckDstMac, a->DstMacAddress, a->DstMacMask);
- Zero(&ip, sizeof(ip));
- Zero(&mask, sizeof(mask));
- ParseIpAndMask6(GetParamStr(o, "SRCIP"), &ip, &mask);
- IPToIPv6Addr(&a->SrcIpAddress6, &ip);
- IPToIPv6Addr(&a->SrcSubnetMask6, &mask);
- ParseIpAndMask6(GetParamStr(o, "DESTIP"), &ip, &mask);
- IPToIPv6Addr(&a->DestIpAddress6, &ip);
- IPToIPv6Addr(&a->DestSubnetMask6, &mask);
- a->Protocol = StrToProtocol(GetParamStr(o, "PROTOCOL"));
- ParsePortRange(GetParamStr(o, "SRCPORT"), &a->SrcPortStart, &a->SrcPortEnd);
- ParsePortRange(GetParamStr(o, "DESTPORT"), &a->DestPortStart, &a->DestPortEnd);
- ParseTcpState(GetParamStr(o, "TCPSTATE"), &a->CheckTcpState, &a->Established);
- // RPC call
- ret = ScAddAccess(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Adding a rule to the access list (Extended, IPv6)
- UINT PsAccessAddEx6(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_ADD_ACCESS t;
- ACCESS *a;
- IP ip, mask;
- // Parameter list that can be specified
- CMD_EVAL_MIN_MAX minmax =
- {
- "CMD_AccessAdd6_Eval_PRIORITY", 1, 4294967295UL,
- };
- CMD_EVAL_MIN_MAX minmax_delay =
- {
- "CMD_AccessAddEx6_Eval_DELAY", 0, HUB_ACCESSLIST_DELAY_MAX,
- };
- CMD_EVAL_MIN_MAX minmax_jitter =
- {
- "CMD_AccessAddEx6_Eval_JITTER", 0, HUB_ACCESSLIST_JITTER_MAX,
- };
- CMD_EVAL_MIN_MAX minmax_loss =
- {
- "CMD_AccessAddEx6_Eval_LOSS", 0, HUB_ACCESSLIST_LOSS_MAX,
- };
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[pass|discard]", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_TYPE"), CmdEvalNotEmpty, NULL},
- {"MEMO", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_MEMO"), NULL, NULL},
- {"PRIORITY", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_PRIORITY"), CmdEvalMinMax, &minmax},
- {"SRCUSERNAME", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCUSERNAME"), NULL, NULL},
- {"DESTUSERNAME", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTUSERNAME"), NULL, NULL},
- {"SRCMAC", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCMAC"), CmdEvalMacAddressAndMask, NULL},
- {"DESTMAC", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTMAC"), CmdEvalMacAddressAndMask, NULL},
- {"SRCIP", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCIP"), CmdEvalIpAndMask6, NULL},
- {"DESTIP", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTIP"), CmdEvalIpAndMask6, NULL},
- {"PROTOCOL", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_PROTOCOL"), CmdEvalProtocol, NULL},
- {"SRCPORT", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCPORT"), CmdEvalPortRange, NULL},
- {"DESTPORT", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTPORT"), CmdEvalPortRange, NULL},
- {"TCPSTATE", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_TCPSTATE"), CmdEvalTcpState, NULL},
- {"DELAY", CmdPrompt, _UU("CMD_AccessAddEx6_Prompt_DELAY"), CmdEvalMinMax, &minmax_delay},
- {"JITTER", CmdPrompt, _UU("CMD_AccessAddEx6_Prompt_JITTER"), CmdEvalMinMax, &minmax_jitter},
- {"LOSS", CmdPrompt, _UU("CMD_AccessAddEx6_Prompt_LOSS"), CmdEvalMinMax, &minmax_loss},
- {"REDIRECTURL", NULL, NULL, NULL, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- // Check whether it is supported
- if (GetCapsBool(ps->CapsList, "b_support_ex_acl") == false)
- {
- c->Write(c, _E(ERR_NOT_SUPPORTED));
- return ERR_NOT_SUPPORTED;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- a = &t.Access;
- a->IsIPv6 = true;
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- UniStrCpy(a->Note, sizeof(a->Note), GetParamUniStr(o, "MEMO"));
- a->Active = true;
- a->Priority = GetParamInt(o, "PRIORITY");
- a->Discard = StrToPassOrDiscard(GetParamStr(o, "[pass|discard]")) ? false : true;
- StrCpy(a->SrcUsername, sizeof(a->SrcUsername), GetParamStr(o, "SRCUSERNAME"));
- StrCpy(a->DestUsername, sizeof(a->DestUsername), GetParamStr(o, "DESTUSERNAME"));
- ParseMacAddressAndMask(GetParamStr(o, "SRCMAC"), &a->CheckSrcMac, a->SrcMacAddress, a->SrcMacMask);
- ParseMacAddressAndMask(GetParamStr(o, "DESTMAC"), &a->CheckDstMac, a->DstMacAddress, a->DstMacMask);
- Zero(&ip, sizeof(ip));
- Zero(&mask, sizeof(mask));
- ParseIpAndMask6(GetParamStr(o, "SRCIP"), &ip, &mask);
- IPToIPv6Addr(&a->SrcIpAddress6, &ip);
- IPToIPv6Addr(&a->SrcSubnetMask6, &mask);
- ParseIpAndMask6(GetParamStr(o, "DESTIP"), &ip, &mask);
- IPToIPv6Addr(&a->DestIpAddress6, &ip);
- IPToIPv6Addr(&a->DestSubnetMask6, &mask);
- a->Protocol = StrToProtocol(GetParamStr(o, "PROTOCOL"));
- ParsePortRange(GetParamStr(o, "SRCPORT"), &a->SrcPortStart, &a->SrcPortEnd);
- ParsePortRange(GetParamStr(o, "DESTPORT"), &a->DestPortStart, &a->DestPortEnd);
- ParseTcpState(GetParamStr(o, "TCPSTATE"), &a->CheckTcpState, &a->Established);
- a->Delay = GetParamInt(o, "DELAY");
- a->Jitter = GetParamInt(o, "JITTER");
- a->Loss = GetParamInt(o, "LOSS");
- StrCpy(a->RedirectUrl, sizeof(a->RedirectUrl), GetParamStr(o, "REDIRECTURL"));
- // RPC call
- ret = ScAddAccess(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Get the list of rules in the access list
- UINT PsAccessList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_ENUM_ACCESS_LIST t;
- CT *ct;
- UINT i;
-
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScEnumAccess(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- ct = CtNew();
- CtInsertColumn(ct, _UU("SM_ACCESS_COLUMN_0"), true);
- CtInsertColumn(ct, _UU("SM_ACCESS_COLUMN_1"), true);
- CtInsertColumn(ct, _UU("SM_ACCESS_COLUMN_2"), true);
- CtInsertColumn(ct, _UU("SM_ACCESS_COLUMN_3"), true);
- CtInsertColumn(ct, _UU("SM_ACCESS_COLUMN_6"), true);
- CtInsertColumn(ct, _UU("SM_ACCESS_COLUMN_5"), false);
- CtInsertColumn(ct, _UU("SM_ACCESS_COLUMN_4"), false);
- for (i = 0;i < t.NumAccess;i++)
- {
- ACCESS *a = &t.Accesses[i];
- char tmp[MAX_SIZE];
- wchar_t tmp3[MAX_SIZE];
- wchar_t tmp1[MAX_SIZE];
- wchar_t tmp2[MAX_SIZE];
- wchar_t tmp4[MAX_SIZE];
- GetAccessListStr(tmp, sizeof(tmp), a);
- UniToStru(tmp1, a->Priority);
- StrToUni(tmp2, sizeof(tmp2), tmp);
- UniToStru(tmp4, a->UniqueId);
- if (a->UniqueId == 0)
- {
- UniStrCpy(tmp4, sizeof(tmp4), _UU("SEC_NONE"));
- }
- UniToStru(tmp3, a->Id);
- CtInsert(ct,
- tmp3,
- a->Discard ? _UU("SM_ACCESS_DISCARD") : _UU("SM_ACCESS_PASS"),
- a->Active ? _UU("SM_ACCESS_ENABLE") : _UU("SM_ACCESS_DISABLE"),
- tmp1,
- tmp4,
- tmp2,
- a->Note);
- }
- CtFreeEx(ct, c, true);
- FreeRpcEnumAccessList(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Remove a rule from the access list
- UINT PsAccessDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_DELETE_ACCESS t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[id]", CmdPrompt, _UU("CMD_Access_Prompt_ID"), CmdEvalNotEmpty, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- t.Id = GetParamInt(o, "[id]");
- // RPC call
- ret = ScDeleteAccess(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Enable the rule of access list
- UINT PsAccessEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_ENUM_ACCESS_LIST t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[id]", CmdPrompt, _UU("CMD_Access_Prompt_ID"), CmdEvalNotEmpty, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScEnumAccess(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- UINT i;
- bool b = false;
- for (i = 0;i < t.NumAccess;i++)
- {
- ACCESS *a = &t.Accesses[i];
- if (a->Id == GetParamInt(o, "[id]"))
- {
- b = true;
- a->Active = true;
- }
- }
- if (b == false)
- {
- // The specified ID is not found
- ret = ERR_OBJECT_NOT_FOUND;
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- FreeRpcEnumAccessList(&t);
- return ret;
- }
- ret = ScSetAccessList(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcEnumAccessList(&t);
- }
- FreeParamValueList(o);
- return ret;
- }
- // Disable the rule of access list
- UINT PsAccessDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_ENUM_ACCESS_LIST t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[id]", CmdPrompt, _UU("CMD_Access_Prompt_ID"), CmdEvalNotEmpty, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScEnumAccess(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- UINT i;
- bool b = false;
- for (i = 0;i < t.NumAccess;i++)
- {
- ACCESS *a = &t.Accesses[i];
- if (a->Id == GetParamInt(o, "[id]"))
- {
- b = true;
- a->Active = false;
- }
- }
- if (b == false)
- {
- // The specified ID is not found
- ret = ERR_OBJECT_NOT_FOUND;
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- FreeRpcEnumAccessList(&t);
- return ret;
- }
- ret = ScSetAccessList(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcEnumAccessList(&t);
- }
- FreeParamValueList(o);
- return ret;
- }
- // Get the user list
- UINT PsUserList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_ENUM_USER t;
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScEnumUser(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- UINT i;
- CT *ct = CtNew();
- CtInsertColumn(ct, _UU("SM_USER_COLUMN_1"), false);
- CtInsertColumn(ct, _UU("SM_USER_COLUMN_2"), false);
- CtInsertColumn(ct, _UU("SM_USER_COLUMN_3"), false);
- CtInsertColumn(ct, _UU("SM_USER_COLUMN_4"), false);
- CtInsertColumn(ct, _UU("SM_USER_COLUMN_5"), false);
- CtInsertColumn(ct, _UU("SM_USER_COLUMN_6"), false);
- CtInsertColumn(ct, _UU("SM_USER_COLUMN_7"), false);
- CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_5"), false);
- CtInsertColumn(ct, _UU("SM_SESS_COLUMN_6"), false);
- CtInsertColumn(ct, _UU("SM_SESS_COLUMN_7"), false);
- for (i = 0;i < t.NumUser;i++)
- {
- RPC_ENUM_USER_ITEM *e = &t.Users[i];
- wchar_t name[MAX_SIZE];
- wchar_t group[MAX_SIZE];
- wchar_t num[MAX_SIZE];
- wchar_t time[MAX_SIZE];
- wchar_t exp[MAX_SIZE];
- wchar_t num1[64], num2[64];
- StrToUni(name, sizeof(name), e->Name);
- if (StrLen(e->GroupName) != 0)
- {
- StrToUni(group, sizeof(group), e->GroupName);
- }
- else
- {
- UniStrCpy(group, sizeof(group), _UU("SM_NO_GROUP"));
- }
- UniToStru(num, e->NumLogin);
- GetDateTimeStrEx64(time, sizeof(time), SystemToLocal64(e->LastLoginTime), NULL);
- if (e->IsExpiresFilled == false)
- {
- UniStrCpy(exp, sizeof(exp), _UU("CM_ST_NONE"));
- }
- else
- {
- if (e->Expires == 0)
- {
- UniStrCpy(exp, sizeof(exp), _UU("SM_LICENSE_NO_EXPIRES"));
- }
- else
- {
- GetDateTimeStrEx64(exp, sizeof(exp), SystemToLocal64(e->Expires), NULL);
- }
- }
- if (e->IsTrafficFilled == false)
- {
- UniStrCpy(num1, sizeof(num1), _UU("CM_ST_NONE"));
- UniStrCpy(num2, sizeof(num2), _UU("CM_ST_NONE"));
- }
- else
- {
- UniToStr3(num1, sizeof(num1),
- e->Traffic.Recv.BroadcastBytes + e->Traffic.Recv.UnicastBytes +
- e->Traffic.Send.BroadcastBytes + e->Traffic.Send.UnicastBytes);
- UniToStr3(num2, sizeof(num2),
- e->Traffic.Recv.BroadcastCount + e->Traffic.Recv.UnicastCount +
- e->Traffic.Send.BroadcastBytes + e->Traffic.Send.UnicastCount);
- }
- CtInsert(ct,
- name, e->Realname, group, e->Note, GetAuthTypeStr(e->AuthType),
- num, time, exp, num1, num2);
- }
- CtFreeEx(ct, c, true);
- }
- FreeRpcEnumUser(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Get a string of user authentication method
- wchar_t *GetAuthTypeStr(UINT id)
- {
- char tmp[MAX_SIZE];
- Format(tmp, sizeof(tmp), "SM_AUTHTYPE_%u", id);
- return _UU(tmp);
- }
- // Creating a user
- UINT PsUserCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_SET_USER t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
- {"GROUP", CmdPrompt, _UU("CMD_UserCreate_Prompt_GROUP"), NULL, NULL},
- {"REALNAME", CmdPrompt, _UU("CMD_UserCreate_Prompt_REALNAME"), NULL, NULL},
- {"NOTE", CmdPrompt, _UU("CMD_UserCreate_Prompt_NOTE"), NULL, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
- StrCpy(t.GroupName, sizeof(t.GroupName), GetParamStr(o, "GROUP"));
- UniStrCpy(t.Realname, sizeof(t.Realname), GetParamUniStr(o, "REALNAME"));
- UniStrCpy(t.Note, sizeof(t.Note), GetParamUniStr(o, "NOTE"));
- Trim(t.Name);
- if (StrCmpi(t.Name, "*") == 0)
- {
- t.AuthType = AUTHTYPE_RADIUS;
- t.AuthData = NewRadiusAuthData(NULL);
- }
- else
- {
- UCHAR random_pass[SHA1_SIZE];
- UCHAR random_pass2[MD5_SIZE];
- Rand(random_pass, sizeof(random_pass));
- Rand(random_pass2, sizeof(random_pass2));
- t.AuthType = AUTHTYPE_PASSWORD;
- t.AuthData = NewPasswordAuthDataRaw(random_pass, random_pass2);
- }
- // RPC call
- ret = ScCreateUser(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcSetUser(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Change the user information
- UINT PsUserSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_SET_USER t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
- {"GROUP", CmdPrompt, _UU("CMD_UserCreate_Prompt_GROUP"), NULL, NULL},
- {"REALNAME", CmdPrompt, _UU("CMD_UserCreate_Prompt_REALNAME"), NULL, NULL},
- {"NOTE", CmdPrompt, _UU("CMD_UserCreate_Prompt_NOTE"), NULL, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // Get the user object
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
- ret = ScGetUser(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- // Update the information
- StrCpy(t.GroupName, sizeof(t.GroupName), GetParamStr(o, "GROUP"));
- UniStrCpy(t.Realname, sizeof(t.Realname), GetParamUniStr(o, "REALNAME"));
- UniStrCpy(t.Note, sizeof(t.Note), GetParamUniStr(o, "NOTE"));
- // Write the user object
- ret = ScSetUser(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcSetUser(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Delete the user
- UINT PsUserDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_DELETE_USER t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
- // RPC call
- ret = ScDeleteUser(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Get the user information
- UINT PsUserGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_SET_USER t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // Get the user object
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
- ret = ScGetUser(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- wchar_t tmp[MAX_SIZE];
- CT *ct;
- // Display the user's data
- ct = CtNewStandard();
- // User name
- StrToUni(tmp, sizeof(tmp), t.Name);
- CtInsert(ct, _UU("CMD_UserGet_Column_Name"), tmp);
- // Real name
- CtInsert(ct, _UU("CMD_UserGet_Column_RealName"), t.Realname);
- // Description
- CtInsert(ct, _UU("CMD_UserGet_Column_Note"), t.Note);
- // Group name
- if (IsEmptyStr(t.GroupName) == false)
- {
- StrToUni(tmp, sizeof(tmp), t.GroupName);
- CtInsert(ct, _UU("CMD_UserGet_Column_Group"), tmp);
- }
- // Expiration date
- GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.ExpireTime), NULL);
- CtInsert(ct, _UU("CMD_UserGet_Column_Expires"), tmp);
- // Authentication method
- CtInsert(ct, _UU("CMD_UserGet_Column_AuthType"), GetAuthTypeStr(t.AuthType));
- switch (t.AuthType)
- {
- case AUTHTYPE_USERCERT:
- if (t.AuthData != NULL)
- {
- AUTHUSERCERT *auc = (AUTHUSERCERT *)t.AuthData;
- if (auc != NULL && auc->UserX != NULL)
- {
- // Registered user-specific certificate
- GetAllNameFromX(tmp, sizeof(tmp), auc->UserX);
- CtInsert(ct, _UU("CMD_UserGet_Column_UserCert"), tmp);
- }
- }
- break;
- case AUTHTYPE_ROOTCERT:
- if (t.AuthData != NULL)
- {
- AUTHROOTCERT *arc = (AUTHROOTCERT *)t.AuthData;
- if (IsEmptyUniStr(arc->CommonName) == false)
- {
- // Limitation the value of the certificate's CN
- CtInsert(ct, _UU("CMD_UserGet_Column_RootCert_CN"), arc->CommonName);
- }
- if (arc->Serial != NULL && arc->Serial->size >= 1)
- {
- char tmp2[MAX_SIZE];
- // Limitation the serial number of the certificate
- BinToStrEx(tmp2, sizeof(tmp2), arc->Serial->data, arc->Serial->size);
- StrToUni(tmp, sizeof(tmp), tmp2);
- CtInsert(ct, _UU("CMD_UserGet_Column_RootCert_SERIAL"), tmp);
- }
- }
- break;
- case AUTHTYPE_RADIUS:
- case AUTHTYPE_NT:
- if (t.AuthData != NULL)
- {
- AUTHRADIUS *ar = (AUTHRADIUS *)t.AuthData;
- // Authentication user name of the external authentication server
- if (IsEmptyUniStr(ar->RadiusUsername) == false)
- {
- CtInsert(ct, _UU("CMD_UserGet_Column_RadiusAlias"), ar->RadiusUsername);
- }
- }
- break;
- }
- CtInsert(ct, L"---", L"---");
- GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.CreatedTime), NULL);
- CtInsert(ct, _UU("SM_USERINFO_CREATE"), tmp);
- GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.UpdatedTime), NULL);
- CtInsert(ct, _UU("SM_USERINFO_UPDATE"), tmp);
- CmdInsertTrafficInfo(ct, &t.Traffic);
- UniToStru(tmp, t.NumLogin);
- CtInsert(ct, _UU("SM_USERINFO_NUMLOGIN"), tmp);
- CtFree(ct, c);
- if (t.Policy != NULL)
- {
- c->Write(c, L"");
- c->Write(c, _UU("CMD_UserGet_Policy"));
- PrintPolicy(c, t.Policy, false);
- }
- }
- FreeRpcSetUser(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Set the authentication method for the user to the anonymous authentication
- UINT PsUserAnonymousSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_SET_USER t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // Get the user object
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
- ret = ScGetUser(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- // Update the information
- FreeAuthData(t.AuthType, t.AuthData);
- // Set to anonymous authentication
- t.AuthType = AUTHTYPE_ANONYMOUS;
- t.AuthData = NULL;
- // Write the user object
- ret = ScSetUser(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcSetUser(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Set the authentication method for the user to the password authentication and set a password
- UINT PsUserPasswordSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_SET_USER t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
- {"PASSWORD", CmdPromptChoosePassword, NULL, NULL, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // Get the user object
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
- ret = ScGetUser(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- // Update the information
- FreeAuthData(t.AuthType, t.AuthData);
- {
- AUTHPASSWORD *pw;
- pw = NewPasswordAuthData(t.Name, GetParamStr(o, "PASSWORD"));
- // Set to the password authentication
- t.AuthType = AUTHTYPE_PASSWORD;
- t.AuthData = pw;
- }
- // Write the user object
- ret = ScSetUser(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcSetUser(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Set the authentication method for the user to the specific certificate authentication and set a certificate
- UINT PsUserCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_SET_USER t;
- X *x;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
- {"LOADCERT", CmdPrompt, _UU("CMD_LOADCERTPATH"), CmdEvalIsFile, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // Read the certificate
- x = FileToXW(GetParamUniStr(o, "LOADCERT"));
- if (x == NULL)
- {
- c->Write(c, _UU("CMD_LOADCERT_FAILED"));
- FreeParamValueList(o);
- return ERR_INTERNAL_ERROR;
- }
- Zero(&t, sizeof(t));
- // Get the user object
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
- ret = ScGetUser(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- FreeX(x);
- return ret;
- }
- // Update the information
- FreeAuthData(t.AuthType, t.AuthData);
- {
- AUTHUSERCERT *c;
- c = NewUserCertAuthData(x);
- FreeX(x);
- // Set to the password authentication
- t.AuthType = AUTHTYPE_USERCERT;
- t.AuthData = c;
- }
- // Write the user object
- ret = ScSetUser(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcSetUser(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Get certificates that are registered in the user which uses certificate authentication
- UINT PsUserCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_SET_USER t;
- AUTHUSERCERT *a;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
- {"SAVECERT", CmdPrompt, _UU("CMD_SAVECERTPATH"), NULL, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // Get the user object
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
- ret = ScGetUser(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- a = (AUTHUSERCERT *)t.AuthData;
- if (t.AuthType != AUTHTYPE_USERCERT || a == NULL || a->UserX == NULL)
- {
- // The user is not using specific certificate authentication
- ret = ERR_INVALID_PARAMETER;
- c->Write(c, _UU("CMD_UserCertGet_Not_Cert"));
- }
- else
- {
- if (XToFileW(a->UserX, GetParamUniStr(o, "SAVECERT"), true) == false)
- {
- c->Write(c, _UU("CMD_SAVECERT_FAILED"));
- }
- }
- FreeRpcSetUser(&t);
- FreeParamValueList(o);
- return ret;
- }
- // Set the authentication method for the user to the signed certificate authentication
- UINT PsUserSignedSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_SET_USER t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
- {"CN", CmdPrompt, _UU("CMD_UserSignedSet_Prompt_CN"), NULL, NULL},
- {"SERIAL", CmdPrompt, _UU("CMD_UserSignedSet_Prompt_SERIAL"), NULL, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // Get the user object
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
- ret = ScGetUser(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- // Update the information
- FreeAuthData(t.AuthType, t.AuthData);
- {
- AUTHROOTCERT *c;
- BUF *b;
- X_SERIAL *serial = NULL;
- b = StrToBin(GetParamStr(o, "SERIAL"));
- if (b != NULL && b->Size >= 1)
- {
- serial = NewXSerial(b->Buf, b->Size);
- }
- FreeBuf(b);
- c = NewRootCertAuthData(serial, GetParamUniStr(o, "CN"));
- FreeXSerial(serial);
- // Set to the signed certificate authentication
- t.AuthType = AUTHTYPE_ROOTCERT;
- t.AuthData = c;
- }
- // Write the user object
- ret = ScSetUser(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcSetUser(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Set the authentication method for the user to the Radius authentication
- UINT PsUserRadiusSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_SET_USER t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
- {"ALIAS", CmdPrompt, _UU("CMD_UserRadiusSet_Prompt_ALIAS"), NULL, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // Get the user object
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
- ret = ScGetUser(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- // Update the information
- FreeAuthData(t.AuthType, t.AuthData);
- {
- AUTHRADIUS *a;
- a = NewRadiusAuthData(GetParamUniStr(o, "ALIAS"));
- // Set to Radius authentication
- t.AuthType = AUTHTYPE_RADIUS;
- t.AuthData = a;
- }
- // Write the user object
- ret = ScSetUser(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcSetUser(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Set the authentication method for the user to the NT domain authentication
- UINT PsUserNTLMSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_SET_USER t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
- {"ALIAS", CmdPrompt, _UU("CMD_UserRadiusSet_Prompt_ALIAS"), NULL, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // Get the user object
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
- ret = ScGetUser(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- // Update the information
- FreeAuthData(t.AuthType, t.AuthData);
- {
- AUTHRADIUS *a;
- a = NewRadiusAuthData(GetParamUniStr(o, "ALIAS"));
- // Set to the NT domain authentication
- t.AuthType = AUTHTYPE_NT;
- t.AuthData = a;
- }
- // Write the user object
- ret = ScSetUser(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcSetUser(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Delete the security policy of the user
- UINT PsUserPolicyRemove(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_SET_USER t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // Get the user object
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
- ret = ScGetUser(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- // Update
- if (t.Policy != NULL)
- {
- Free(t.Policy);
- t.Policy = NULL;
- }
- // Write the user object
- ret = ScSetUser(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcSetUser(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Set a security policy of the user
- UINT PsUserPolicySet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_SET_USER t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
- {"NAME", CmdPrompt, _UU("CMD_CascadePolicySet_PROMPT_POLNAME"), CmdEvalNotEmpty, NULL},
- {"VALUE", CmdPrompt, _UU("CMD_CascadePolicySet_PROMPT_POLVALUE"), CmdEvalNotEmpty, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // Get the user object
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
- ret = ScGetUser(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- // Update
- if (t.Policy == NULL)
- {
- t.Policy = ClonePolicy(GetDefaultPolicy());
- }
- // Edit
- if (EditPolicy(c, t.Policy, GetParamStr(o, "NAME"), GetParamStr(o, "VALUE"), false) == false)
- {
- ret = ERR_INVALID_PARAMETER;
- }
- else
- {
- // Write the user object
- ret = ScSetUser(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- }
- FreeRpcSetUser(&t);
- FreeParamValueList(o);
- return ret;
- }
- // Convert the string to a date and time
- UINT64 StrToDateTime64(char *str)
- {
- UINT64 ret = 0;
- TOKEN_LIST *t;
- UINT a, b, c, d, e, f;
- // Validate arguments
- if (str == NULL)
- {
- return INFINITE;
- }
- if (IsEmptyStr(str) || StrCmpi(str, "none") == 0)
- {
- return 0;
- }
- t = ParseToken(str, ":/,. \"");
- if (t->NumTokens != 6)
- {
- FreeToken(t);
- return INFINITE;
- }
- a = ToInt(t->Token[0]);
- b = ToInt(t->Token[1]);
- c = ToInt(t->Token[2]);
- d = ToInt(t->Token[3]);
- e = ToInt(t->Token[4]);
- f = ToInt(t->Token[5]);
- ret = INFINITE;
- if (a >= 1000 && a <= 9999 && b >= 1 && b <= 12 && c >= 1 && c <= 31 &&
- d >= 0 && d <= 23 && e >= 0 && e <= 59 && f >= 0 && f <= 59)
- {
- SYSTEMTIME t;
- Zero(&t, sizeof(t));
- t.wYear = a;
- t.wMonth = b;
- t.wDay = c;
- t.wHour = d;
- t.wMinute = e;
- t.wSecond = f;
- ret = SystemToUINT64(&t);
- }
- FreeToken(t);
- return ret;
- }
- // Evaluate the date and time string
- bool CmdEvalDateTime(CONSOLE *c, wchar_t *str, void *param)
- {
- UINT64 ret;
- char tmp[MAX_SIZE];
- // Validate arguments
- if (c == NULL || str == NULL)
- {
- return false;
- }
- UniToStr(tmp, sizeof(tmp), str);
- ret = StrToDateTime64(tmp);
- if (ret == INFINITE)
- {
- c->Write(c, _UU("CMD_EVAL_DATE_TIME_FAILED"));
- return false;
- }
- return true;
- }
- // Set the expiration date of the user
- UINT PsUserExpiresSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_SET_USER t;
- UINT64 expires;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
- {"EXPIRES", CmdPrompt, _UU("CMD_UserExpiresSet_Prompt_EXPIRES"), CmdEvalDateTime, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // Get the user object
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
- ret = ScGetUser(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- // Update the information
- expires = StrToDateTime64(GetParamStr(o, "EXPIRES"));
- if (expires != 0)
- {
- expires = LocalToSystem64(expires);
- }
- t.ExpireTime = expires;
- // Write the user object
- ret = ScSetUser(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcSetUser(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Get the group list
- UINT PsGroupList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_ENUM_GROUP t;
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScEnumGroup(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- CT *ct = CtNew();
- UINT i;
- CtInsertColumn(ct, _UU("SM_GROUPLIST_NAME"), false);
- CtInsertColumn(ct, _UU("SM_GROUPLIST_REALNAME"), false);
- CtInsertColumn(ct, _UU("SM_GROUPLIST_NOTE"), false);
- CtInsertColumn(ct, _UU("SM_GROUPLIST_NUMUSERS"), false);
- for (i = 0;i < t.NumGroup;i++)
- {
- wchar_t tmp1[MAX_SIZE];
- wchar_t tmp2[MAX_SIZE];
- RPC_ENUM_GROUP_ITEM *e = &t.Groups[i];
- StrToUni(tmp1, sizeof(tmp1), e->Name);
- UniToStru(tmp2, e->NumUsers);
- CtInsert(ct, tmp1, e->Realname, e->Note, tmp2);
- }
- CtFreeEx(ct, c, true);
- }
- FreeRpcEnumGroup(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Create a group
- UINT PsGroupCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_SET_GROUP t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
- {"REALNAME", CmdPrompt, _UU("CMD_GroupCreate_Prompt_REALNAME"), NULL, NULL},
- {"NOTE", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NOTE"), NULL, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
- UniStrCpy(t.Realname, sizeof(t.Realname), GetParamUniStr(o, "REALNAME"));
- UniStrCpy(t.Note, sizeof(t.Note), GetParamUniStr(o, "NOTE"));
- // RPC call
- ret = ScCreateGroup(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcSetGroup(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Set the group information
- UINT PsGroupSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_SET_GROUP t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
- {"REALNAME", CmdPrompt, _UU("CMD_GroupCreate_Prompt_REALNAME"), NULL, NULL},
- {"NOTE", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NOTE"), NULL, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
- // RPC call
- ret = ScGetGroup(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- // Information update
- UniStrCpy(t.Realname, sizeof(t.Realname), GetParamUniStr(o, "REALNAME"));
- UniStrCpy(t.Note, sizeof(t.Note), GetParamUniStr(o, "NOTE"));
- // RPC call
- ret = ScSetGroup(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcSetGroup(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Delete a group
- UINT PsGroupDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_DELETE_USER t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
- // RPC call
- ret = ScDeleteGroup(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Get the group information and the list of users who belong to the group
- UINT PsGroupGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_SET_GROUP t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
- // RPC call
- ret = ScGetGroup(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- wchar_t tmp[MAX_SIZE];
- char groupname[MAX_USERNAME_LEN + 1];
- CT *ct = CtNewStandard();
- StrCpy(groupname, sizeof(groupname), t.Name);
- StrToUni(tmp, sizeof(tmp), t.Name);
- CtInsert(ct, _UU("CMD_GroupGet_Column_NAME"), tmp);
- CtInsert(ct, _UU("CMD_GroupGet_Column_REALNAME"), t.Realname);
- CtInsert(ct, _UU("CMD_GroupGet_Column_NOTE"), t.Note);
- CtFree(ct, c);
- if (t.Policy != NULL)
- {
- c->Write(c, L"");
- c->Write(c, _UU("CMD_GroupGet_Column_POLICY"));
- PrintPolicy(c, t.Policy, false);
- }
- {
- RPC_ENUM_USER t;
- bool b = false;
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- if (ScEnumUser(ps->Rpc, &t) == ERR_NO_ERROR)
- {
- UINT i;
- for (i = 0;i < t.NumUser;i++)
- {
- RPC_ENUM_USER_ITEM *u = &t.Users[i];
- if (StrCmpi(u->GroupName, groupname) == 0)
- {
- if (b == false)
- {
- b = true;
- c->Write(c, L"");
- c->Write(c, _UU("CMD_GroupGet_Column_MEMBERS"));
- }
- UniFormat(tmp, sizeof(tmp), L" %S", u->Name);
- c->Write(c, tmp);
- }
- }
- FreeRpcEnumUser(&t);
- if (b)
- {
- c->Write(c, L"");
- }
- }
- }
- }
- FreeRpcSetGroup(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Add an user to the group
- UINT PsGroupJoin(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_SET_USER t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
- {"USERNAME", CmdPrompt, _UU("CMD_GroupJoin_Prompt_USERNAME"), CmdEvalNotEmpty, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "USERNAME"));
- // RPC call
- ret = ScGetUser(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- // Update the Group
- StrCpy(t.GroupName, sizeof(t.GroupName), GetParamStr(o, "[name]"));
- ret = ScSetUser(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- }
- FreeRpcSetUser(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Delete the user from a group
- UINT PsGroupUnjoin(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_SET_USER t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_GroupUnjoin_Prompt_name"), CmdEvalNotEmpty, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
- // RPC call
- ret = ScGetUser(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- // Update the Group
- StrCpy(t.GroupName, sizeof(t.GroupName), "");
- ret = ScSetUser(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- }
- FreeRpcSetUser(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Delete the security policy of the group
- UINT PsGroupPolicyRemove(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_SET_GROUP t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
- // RPC call
- ret = ScGetGroup(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- // Update
- if (t.Policy != NULL)
- {
- Free(t.Policy);
- t.Policy = NULL;
- }
- ret = ScSetGroup(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- }
- FreeRpcSetGroup(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Set a security policy to a group
- UINT PsGroupPolicySet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_SET_GROUP t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
- {"NAME", CmdPrompt, _UU("CMD_CascadePolicySet_PROMPT_POLNAME"), CmdEvalNotEmpty, NULL},
- {"VALUE", CmdPrompt, _UU("CMD_CascadePolicySet_PROMPT_POLVALUE"), CmdEvalNotEmpty, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
- // RPC call
- ret = ScGetGroup(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- // Update
- if (t.Policy == NULL)
- {
- t.Policy = ClonePolicy(GetDefaultPolicy());
- }
- if (EditPolicy(c, t.Policy, GetParamStr(o, "NAME"), GetParamStr(o, "VALUE"), false) == false)
- {
- // An error has occured
- FreeRpcSetGroup(&t);
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ERR_INTERNAL_ERROR;
- }
- ret = ScSetGroup(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- }
- FreeRpcSetGroup(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Get the connected session list
- UINT PsSessionList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_ENUM_SESSION t;
- UINT server_type = 0;
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- {
- // Get the server type
- RPC_SERVER_INFO t;
- Zero(&t, sizeof(t));
- if (ScGetServerInfo(ps->Rpc, &t) == ERR_NO_ERROR)
- {
- server_type = t.ServerType;
- FreeRpcServerInfo(&t);
- }
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScEnumSession(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- CT *ct = CtNew();
- UINT i;
- CtInsertColumn(ct, _UU("SM_SESS_COLUMN_1"), false);
- CtInsertColumn(ct, _UU("SM_SESS_COLUMN_8"), false);
- CtInsertColumn(ct, _UU("SM_SESS_COLUMN_2"), false);
- CtInsertColumn(ct, _UU("SM_SESS_COLUMN_3"), false);
- CtInsertColumn(ct, _UU("SM_SESS_COLUMN_4"), false);
- CtInsertColumn(ct, _UU("SM_SESS_COLUMN_5"), true);
- CtInsertColumn(ct, _UU("SM_SESS_COLUMN_6"), true);
- CtInsertColumn(ct, _UU("SM_SESS_COLUMN_7"), true);
- for (i = 0;i < t.NumSession;i++)
- {
- RPC_ENUM_SESSION_ITEM *e = &t.Sessions[i];
- wchar_t tmp1[MAX_SIZE];
- wchar_t *tmp2;
- wchar_t tmp3[MAX_SIZE];
- wchar_t tmp4[MAX_SIZE];
- wchar_t tmp5[MAX_SIZE];
- wchar_t tmp6[MAX_SIZE];
- wchar_t tmp7[MAX_SIZE];
- wchar_t tmp8[MAX_SIZE];
- bool free_tmp2 = false;
- StrToUni(tmp1, sizeof(tmp1), e->Name);
- tmp2 = _UU("SM_SESS_NORMAL");
- if (server_type != SERVER_TYPE_STANDALONE)
- {
- if (e->RemoteSession)
- {
- tmp2 = ZeroMalloc(MAX_SIZE);
- UniFormat(tmp2, MAX_SIZE, _UU("SM_SESS_REMOTE"), e->RemoteHostname);
- free_tmp2 = true;
- }
- else
- {
- if (StrLen(e->RemoteHostname) == 0)
- {
- tmp2 = _UU("SM_SESS_LOCAL");
- }
- else
- {
- tmp2 = ZeroMalloc(MAX_SIZE);
- UniFormat(tmp2, MAX_SIZE, _UU("SM_SESS_LOCAL_2"), e->RemoteHostname);
- free_tmp2 = true;
- }
- }
- }
- if (e->LinkMode)
- {
- if (free_tmp2)
- {
- Free(tmp2);
- free_tmp2 = false;
- }
- tmp2 = _UU("SM_SESS_LINK");
- }
- else if (e->SecureNATMode)
- {
- /*if (free_tmp2)
- {
- Free(tmp2);
- free_tmp2 = false;
- }*/
- tmp2 = _UU("SM_SESS_SNAT");
- }
- StrToUni(tmp3, sizeof(tmp3), e->Username);
- StrToUni(tmp4, sizeof(tmp4), e->Hostname);
- if (e->LinkMode)
- {
- UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_SESS_LINK_HOSTNAME"));
- }
- else if (e->SecureNATMode)
- {
- UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_SESS_SNAT_HOSTNAME"));
- }
- else if (e->BridgeMode)
- {
- UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_SESS_BRIDGE_HOSTNAME"));
- }
- else if (StartWith(e->Username, L3_USERNAME))
- {
- UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_SESS_LAYER3_HOSTNAME"));
- }
- UniFormat(tmp5, sizeof(tmp5), L"%u / %u", e->CurrentNumTcp, e->MaxNumTcp);
- if (e->LinkMode)
- {
- UniStrCpy(tmp5, sizeof(tmp5), _UU("SM_SESS_LINK_TCP"));
- }
- else if (e->SecureNATMode)
- {
- UniStrCpy(tmp5, sizeof(tmp5), _UU("SM_SESS_SNAT_TCP"));
- }
- else if (e->BridgeMode)
- {
- UniStrCpy(tmp5, sizeof(tmp5), _UU("SM_SESS_BRIDGE_TCP"));
- }
- UniToStr3(tmp6, sizeof(tmp6), e->PacketSize);
- UniToStr3(tmp7, sizeof(tmp7), e->PacketNum);
- if (e->VLanId == 0)
- {
- UniStrCpy(tmp8, sizeof(tmp8), _UU("CM_ST_NO_VLAN"));
- }
- else
- {
- UniToStru(tmp8, e->VLanId);
- }
- CtInsert(ct, tmp1, tmp8, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7);
- if (free_tmp2)
- {
- Free(tmp2);
- }
- }
- CtFreeEx(ct, c, true);
- }
- FreeRpcEnumSession(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Display the NODE_INFO
- void CmdPrintNodeInfo(CT *ct, NODE_INFO *info)
- {
- wchar_t tmp[MAX_SIZE];
- char str[MAX_SIZE];
- // Validate arguments
- if (ct == NULL || info == NULL)
- {
- return;
- }
- StrToUni(tmp, sizeof(tmp), info->ClientProductName);
- CtInsert(ct, _UU("SM_NODE_CLIENT_NAME"), tmp);
- UniFormat(tmp, sizeof(tmp), L"%u.%02u", Endian32(info->ClientProductVer) / 100, Endian32(info->ClientProductVer) % 100);
- CtInsert(ct, _UU("SM_NODE_CLIENT_VER"), tmp);
- UniFormat(tmp, sizeof(tmp), L"Build %u", Endian32(info->ClientProductBuild));
- CtInsert(ct, _UU("SM_NODE_CLIENT_BUILD"), tmp);
- StrToUni(tmp, sizeof(tmp), info->ClientOsName);
- CtInsert(ct, _UU("SM_NODE_CLIENT_OS_NAME"), tmp);
- StrToUni(tmp, sizeof(tmp), info->ClientOsVer);
- CtInsert(ct, _UU("SM_NODE_CLIENT_OS_VER"), tmp);
- StrToUni(tmp, sizeof(tmp), info->ClientOsProductId);
- CtInsert(ct, _UU("SM_NODE_CLIENT_OS_PID"), tmp);
- StrToUni(tmp, sizeof(tmp), info->ClientHostname);
- CtInsert(ct, _UU("SM_NODE_CLIENT_HOST"), tmp);
- IPToStr4or6(str, sizeof(str), info->ClientIpAddress, info->ClientIpAddress6);
- StrToUni(tmp, sizeof(tmp), str);
- CtInsert(ct, _UU("SM_NODE_CLIENT_IP"), tmp);
- UniToStru(tmp, Endian32(info->ClientPort));
- CtInsert(ct, _UU("SM_NODE_CLIENT_PORT"), tmp);
- StrToUni(tmp, sizeof(tmp), info->ServerHostname);
- CtInsert(ct, _UU("SM_NODE_SERVER_HOST"), tmp);
- IPToStr4or6(str, sizeof(str), info->ServerIpAddress, info->ServerIpAddress6);
- StrToUni(tmp, sizeof(tmp), str);
- CtInsert(ct, _UU("SM_NODE_SERVER_IP"), tmp);
- UniToStru(tmp, Endian32(info->ServerPort));
- CtInsert(ct, _UU("SM_NODE_SERVER_PORT"), tmp);
- if (StrLen(info->ProxyHostname) != 0)
- {
- StrToUni(tmp, sizeof(tmp), info->ProxyHostname);
- CtInsert(ct, _UU("SM_NODE_PROXY_HOSTNAME"), tmp);
- IPToStr4or6(str, sizeof(str), info->ProxyIpAddress, info->ProxyIpAddress6);
- StrToUni(tmp, sizeof(tmp), str);
- CtInsert(ct, _UU("SM_NODE_PROXY_IP"), tmp);
- UniToStru(tmp, Endian32(info->ProxyPort));
- CtInsert(ct, _UU("SM_NODE_PROXY_PORT"), tmp);
- }
- }
- // Get the session information
- UINT PsSessionGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_SESSION_STATUS t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_SessionGet_Prompt_NAME"), CmdEvalNotEmpty, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
- // RPC call
- ret = ScGetSessionStatus(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- wchar_t tmp[MAX_SIZE];
- char str[MAX_SIZE];
- CT *ct = CtNewStandard();
- if (t.ClientIp != 0)
- {
- IPToStr4or6(str, sizeof(str), t.ClientIp, t.ClientIp6);
- StrToUni(tmp, sizeof(tmp), str);
- CtInsert(ct, _UU("SM_CLIENT_IP"), tmp);
- }
- if (StrLen(t.ClientHostName) != 0)
- {
- StrToUni(tmp, sizeof(tmp), t.ClientHostName);
- CtInsert(ct, _UU("SM_CLIENT_HOSTNAME"), tmp);
- }
- StrToUni(tmp, sizeof(tmp), t.Username);
- CtInsert(ct, _UU("SM_SESS_STATUS_USERNAME"), tmp);
- if (StrCmpi(t.Username, LINK_USER_NAME_PRINT) != 0 && StrCmpi(t.Username, SNAT_USER_NAME_PRINT) != 0 && StrCmpi(t.Username, BRIDGE_USER_NAME_PRINT) != 0)
- {
- StrToUni(tmp, sizeof(tmp), t.RealUsername);
- CtInsert(ct, _UU("SM_SESS_STATUS_REALUSER"), tmp);
- }
- if (IsEmptyStr(t.GroupName) == false)
- {
- StrToUni(tmp, sizeof(tmp), t.GroupName);
- CtInsert(ct, _UU("SM_SESS_STATUS_GROUPNAME"), tmp);
- }
- CmdPrintStatusToListViewEx(ct, &t.Status, true);
- if (StrCmpi(t.Username, LINK_USER_NAME_PRINT) != 0 && StrCmpi(t.Username, SNAT_USER_NAME_PRINT) != 0 && StrCmpi(t.Username, BRIDGE_USER_NAME_PRINT) != 0 &&
- StartWith(t.Username, L3_USERNAME) == false)
- {
- CmdPrintNodeInfo(ct, &t.NodeInfo);
- }
- CtFree(ct, c);
- }
- FreeRpcSessionStatus(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Disconnect the session
- UINT PsSessionDisconnect(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_DELETE_SESSION t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_SessionGet_Prompt_NAME"), CmdEvalNotEmpty, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
- // RPC call
- ret = ScDeleteSession(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Get the MAC address table database
- UINT PsMacTable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_ENUM_MAC_TABLE t;
- UINT i;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[session_name]", NULL, NULL, NULL, NULL,}
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScEnumMacTable(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- CT *ct = CtNew();
- char *session_name = GetParamStr(o, "[session_name]");
- if (IsEmptyStr(session_name))
- {
- session_name = NULL;
- }
- CtInsertColumn(ct, _UU("CMD_ID"), false);
- CtInsertColumn(ct, _UU("SM_MAC_COLUMN_1"), false);
- CtInsertColumn(ct, _UU("SM_MAC_COLUMN_1A"), false);
- CtInsertColumn(ct, _UU("SM_MAC_COLUMN_2"), false);
- CtInsertColumn(ct, _UU("SM_MAC_COLUMN_3"), false);
- CtInsertColumn(ct, _UU("SM_MAC_COLUMN_4"), false);
- CtInsertColumn(ct, _UU("SM_MAC_COLUMN_5"), false);
- for (i = 0;i < t.NumMacTable;i++)
- {
- char str[MAX_SIZE];
- wchar_t tmp0[128];
- wchar_t tmp1[MAX_SIZE];
- wchar_t tmp2[MAX_SIZE];
- wchar_t tmp3[MAX_SIZE];
- wchar_t tmp4[MAX_SIZE];
- wchar_t tmp5[MAX_SIZE];
- wchar_t tmp6[MAX_SIZE];
- RPC_ENUM_MAC_TABLE_ITEM *e = &t.MacTables[i];
- if (session_name == NULL || StrCmpi(e->SessionName, session_name) == 0)
- {
- UniToStru(tmp0, e->Key);
- StrToUni(tmp1, sizeof(tmp1), e->SessionName);
- MacToStr(str, sizeof(str), e->MacAddress);
- StrToUni(tmp2, sizeof(tmp2), str);
- GetDateTimeStr64Uni(tmp3, sizeof(tmp3), SystemToLocal64(e->CreatedTime));
- GetDateTimeStr64Uni(tmp4, sizeof(tmp4), SystemToLocal64(e->UpdatedTime));
- if (StrLen(e->RemoteHostname) == 0)
- {
- UniStrCpy(tmp5, sizeof(tmp5), _UU("SM_MACIP_LOCAL"));
- }
- else
- {
- UniFormat(tmp5, sizeof(tmp5), _UU("SM_MACIP_SERVER"), e->RemoteHostname);
- }
- UniToStru(tmp6, e->VlanId);
- if (e->VlanId == 0)
- {
- UniStrCpy(tmp6, sizeof(tmp6), _UU("CM_ST_NONE"));
- }
- CtInsert(ct,
- tmp0, tmp1, tmp6, tmp2, tmp3, tmp4, tmp5);
- }
- }
- CtFreeEx(ct, c, true);
- }
- FreeRpcEnumMacTable(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Delete a MAC address table entry
- UINT PsMacDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_DELETE_TABLE t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[id]", CmdPrompt, _UU("CMD_MacDelete_Prompt"), CmdEvalNotEmpty, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- t.Key = GetParamInt(o, "[id]");
- // RPC call
- ret = ScDeleteMacTable(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Get the IP address table database
- UINT PsIpTable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_ENUM_IP_TABLE t;
- UINT i;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[session_name]", NULL, NULL, NULL, NULL,}
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScEnumIpTable(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- CT *ct = CtNew();
- char *session_name = GetParamStr(o, "[session_name]");
- if (IsEmptyStr(session_name))
- {
- session_name = NULL;
- }
- CtInsertColumn(ct, _UU("CMD_ID"), false);
- CtInsertColumn(ct, _UU("SM_IP_COLUMN_1"), false);
- CtInsertColumn(ct, _UU("SM_IP_COLUMN_2"), false);
- CtInsertColumn(ct, _UU("SM_IP_COLUMN_3"), false);
- CtInsertColumn(ct, _UU("SM_IP_COLUMN_4"), false);
- CtInsertColumn(ct, _UU("SM_IP_COLUMN_5"), false);
- for (i = 0;i < t.NumIpTable;i++)
- {
- char str[MAX_SIZE];
- wchar_t tmp0[128];
- wchar_t tmp1[MAX_SIZE];
- wchar_t tmp2[MAX_SIZE];
- wchar_t tmp3[MAX_SIZE];
- wchar_t tmp4[MAX_SIZE];
- wchar_t tmp5[MAX_SIZE];
- RPC_ENUM_IP_TABLE_ITEM *e = &t.IpTables[i];
- if (session_name == NULL || StrCmpi(e->SessionName, session_name) == 0)
- {
- UniToStru(tmp0, e->Key);
- StrToUni(tmp1, sizeof(tmp1), e->SessionName);
- if (e->DhcpAllocated == false)
- {
- IPToStr(str, sizeof(str), &e->IpV6);
- StrToUni(tmp2, sizeof(tmp2), str);
- }
- else
- {
- IPToStr(str, sizeof(str), &e->IpV6);
- UniFormat(tmp2, sizeof(tmp2), _UU("SM_MAC_IP_DHCP"), str);
- }
- GetDateTimeStr64Uni(tmp3, sizeof(tmp3), SystemToLocal64(e->CreatedTime));
- GetDateTimeStr64Uni(tmp4, sizeof(tmp4), SystemToLocal64(e->UpdatedTime));
- if (StrLen(e->RemoteHostname) == 0)
- {
- UniStrCpy(tmp5, sizeof(tmp5), _UU("SM_MACIP_LOCAL"));
- }
- else
- {
- UniFormat(tmp5, sizeof(tmp5), _UU("SM_MACIP_SERVER"), e->RemoteHostname);
- }
- CtInsert(ct,
- tmp0, tmp1, tmp2, tmp3, tmp4, tmp5);
- }
- }
- CtFreeEx(ct, c, true);
- }
- FreeRpcEnumIpTable(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Delete the IP address table entry
- UINT PsIpDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_DELETE_TABLE t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[id]", CmdPrompt, _UU("CMD_MacDelete_Prompt"), CmdEvalNotEmpty, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- t.Key = GetParamInt(o, "[id]");
- // RPC call
- ret = ScDeleteIpTable(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Enable the DHCP server function and the virtual NAT (SecureNAT function)
- UINT PsSecureNatEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_HUB t;
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScEnableSecureNAT(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Disable the DHCP server function and the virtual NAT (SecureNAT function)
- UINT PsSecureNatDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_HUB t;
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScDisableSecureNAT(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Get the operating status of the DHCP server function and the virtual NAT (SecureNAT function)
- UINT PsSecureNatStatusGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_NAT_STATUS t;
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScGetSecureNATStatus(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- wchar_t tmp[MAX_SIZE];
- CT *ct = CtNewStandard();
- StrToUni(tmp, sizeof(tmp), ps->HubName);
- CtInsert(ct, _UU("SM_HUB_COLUMN_1"), tmp);
- UniFormat(tmp, sizeof(tmp), _UU("SM_SNAT_NUM_SESSION"), t.NumTcpSessions);
- CtInsert(ct, _UU("NM_STATUS_TCP"), tmp);
- UniFormat(tmp, sizeof(tmp), _UU("SM_SNAT_NUM_SESSION"), t.NumUdpSessions);
- CtInsert(ct, _UU("NM_STATUS_UDP"), tmp);
- UniFormat(tmp, sizeof(tmp), _UU("SM_SNAT_NUM_SESSION"), t.NumIcmpSessions);
- CtInsert(ct, _UU("NM_STATUS_ICMP"), tmp);
- UniFormat(tmp, sizeof(tmp), _UU("SM_SNAT_NUM_SESSION"), t.NumDnsSessions);
- CtInsert(ct, _UU("NM_STATUS_DNS"), tmp);
- UniFormat(tmp, sizeof(tmp), _UU("SM_SNAT_NUM_CLIENT"), t.NumDhcpClients);
- CtInsert(ct, _UU("NM_STATUS_DHCP"), tmp);
- CtInsert(ct, _UU("SM_SNAT_IS_KERNEL"), t.IsKernelMode ? _UU("SEC_YES") : _UU("SEC_NO"));
- CtInsert(ct, _UU("SM_SNAT_IS_RAW"), t.IsRawIpMode ? _UU("SEC_YES") : _UU("SEC_NO"));
- CtFree(ct, c);
- }
- FreeRpcNatStatus(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Get the network interface settings for a virtual host of SecureNAT function
- UINT PsSecureNatHostGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- VH_OPTION t;
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScGetSecureNATOption(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- wchar_t tmp[MAX_SIZE];
- char str[MAX_SIZE];
- CT *ct = CtNewStandard();
- // Flags
- // MAC Address
- MacToStr(str, sizeof(str), t.MacAddress);
- StrToUni(tmp, sizeof(tmp), str);
- CtInsert(ct, _UU("CMD_SecureNatHostGet_Column_MAC"), tmp);
- // IP address
- IPToUniStr(tmp, sizeof(tmp), &t.Ip);
- CtInsert(ct, _UU("CMD_SecureNatHostGet_Column_IP"), tmp);
- // Subnet mask
- IPToUniStr(tmp, sizeof(tmp), &t.Mask);
- CtInsert(ct, _UU("CMD_SecureNatHostGet_Column_MASK"), tmp);
- CtFree(ct, c);
- }
- FreeParamValueList(o);
- return 0;
- }
- // Change the network interface settings for a virtual host of SecureNAT function
- UINT PsSecureNatHostSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- VH_OPTION t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"MAC", CmdPrompt, _UU("CMD_SecureNatHostSet_Prompt_MAC"), NULL, NULL},
- {"IP", CmdPrompt, _UU("CMD_SecureNatHostSet_Prompt_IP"), CmdEvalIp, NULL},
- {"MASK", CmdPrompt, _UU("CMD_SecureNatHostSet_Prompt_MASK"), CmdEvalIp, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScGetSecureNATOption(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- char *mac, *ip, *mask;
- bool ok = true;
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- mac = GetParamStr(o, "MAC");
- ip = GetParamStr(o, "IP");
- mask = GetParamStr(o, "MASK");
- if (IsEmptyStr(mac) == false)
- {
- BUF *b = StrToBin(mac);
- if (b == NULL || b->Size != 6)
- {
- ok = false;
- }
- else
- {
- Copy(t.MacAddress, b->Buf, 6);
- }
- FreeBuf(b);
- }
- if (IsEmptyStr(ip) == false)
- {
- if (IsIpStr4(ip) == false)
- {
- ok = false;
- }
- else
- {
- UINT u = StrToIP32(ip);
- if (u == 0 || u == 0xffffffff)
- {
- ok = false;
- }
- else
- {
- UINTToIP(&t.Ip, u);
- }
- }
- }
- if (IsEmptyStr(mask) == false)
- {
- if (IsIpStr4(mask) == false)
- {
- ok = false;
- }
- else
- {
- StrToIP(&t.Mask, mask);
- }
- }
- if (ok == false)
- {
- // Parameter is invalid
- ret = ERR_INVALID_PARAMETER;
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- ret = ScSetSecureNATOption(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- }
- }
- FreeParamValueList(o);
- return 0;
- }
- // Get the settings for the virtual NAT function of the SecureNAT function
- UINT PsNatGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- VH_OPTION t;
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScGetSecureNATOption(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- wchar_t tmp[MAX_SIZE];
- CT *ct = CtNewStandard();
- // Use the virtual NAT function
- CtInsert(ct, _UU("CMD_NatGet_Column_USE"), t.UseNat ? _UU("SEC_YES") : _UU("SEC_NO"));
- // MTU value
- UniToStru(tmp, t.Mtu);
- CtInsert(ct, _UU("CMD_NetGet_Column_MTU"), tmp);
- // TCP session timeout (in seconds)
- UniToStru(tmp, t.NatTcpTimeout);
- CtInsert(ct, _UU("CMD_NatGet_Column_TCP"), tmp);
- // UDP session timeout (in seconds)
- UniToStru(tmp, t.NatUdpTimeout);
- CtInsert(ct, _UU("CMD_NatGet_Column_UDP"), tmp);
- // To save the log
- CtInsert(ct, _UU("CMD_SecureNatHostGet_Column_LOG"), t.SaveLog ? _UU("SEC_YES") : _UU("SEC_NO"));
- CtFree(ct, c);
- }
- FreeParamValueList(o);
- return 0;
- }
- // Enable the virtual NAT function of the SecureNAT function
- UINT PsNatEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- VH_OPTION t;
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScGetSecureNATOption(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- bool ok = true;
- t.UseNat = true;
- if (ok == false)
- {
- // Parameter is invalid
- ret = ERR_INVALID_PARAMETER;
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- ret = ScSetSecureNATOption(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- }
- }
- FreeParamValueList(o);
- return 0;
- }
- // Disable the virtual NAT function of the SecureNAT function
- UINT PsNatDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- VH_OPTION t;
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScGetSecureNATOption(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- bool ok = true;
- t.UseNat = false;
- if (ok == false)
- {
- // Parameter is invalid
- ret = ERR_INVALID_PARAMETER;
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- ret = ScSetSecureNATOption(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- }
- }
- FreeParamValueList(o);
- return 0;
- }
- // Change the settings for the virtual NAT function of the SecureNAT function
- UINT PsNatSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- VH_OPTION t;
- // Parameter list that can be specified
- CMD_EVAL_MIN_MAX mtu_mm =
- {
- "CMD_NatSet_Eval_MTU", TCP_HEADER_SIZE + IP_HEADER_SIZE + MAC_HEADER_SIZE + 8, MAX_L3_DATA_SIZE,
- };
- CMD_EVAL_MIN_MAX tcp_mm =
- {
- "CMD_NatSet_Eval_TCP", NAT_TCP_MIN_TIMEOUT / 1000, NAT_TCP_MAX_TIMEOUT / 1000,
- };
- CMD_EVAL_MIN_MAX udp_mm =
- {
- "CMD_NatSet_Eval_UDP", NAT_UDP_MIN_TIMEOUT / 1000, NAT_UDP_MAX_TIMEOUT / 1000,
- };
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"MTU", CmdPrompt, _UU("CMD_NatSet_Prompt_MTU"), CmdEvalMinMax, &mtu_mm},
- {"TCPTIMEOUT", CmdPrompt, _UU("CMD_NatSet_Prompt_TCPTIMEOUT"), CmdEvalMinMax, &tcp_mm},
- {"UDPTIMEOUT", CmdPrompt, _UU("CMD_NatSet_Prompt_UDPTIMEOUT"), CmdEvalMinMax, &udp_mm},
- {"LOG", CmdPrompt, _UU("CMD_NatSet_Prompt_LOG"), CmdEvalNotEmpty, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScGetSecureNATOption(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- bool ok = true;
- t.Mtu = GetParamInt(o, "MTU");
- t.NatTcpTimeout = GetParamInt(o, "TCPTIMEOUT");
- t.NatUdpTimeout = GetParamInt(o, "UDPTIMEOUT");
- t.SaveLog = GetParamYes(o, "LOG");
- if (ok == false)
- {
- // Parameter is invalid
- ret = ERR_INVALID_PARAMETER;
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- ret = ScSetSecureNATOption(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- }
- }
- FreeParamValueList(o);
- return 0;
- }
- // Get the session table of the virtual NAT function of the SecureNAT function
- UINT PsNatTable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_ENUM_NAT t;
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScEnumNAT(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- CT *ct = CtNew();
- UINT i;
- CtInsertColumn(ct, _UU("NM_NAT_ID"), false);
- CtInsertColumn(ct, _UU("NM_NAT_PROTOCOL"), false);
- CtInsertColumn(ct, _UU("NM_NAT_SRC_HOST"), false);
- CtInsertColumn(ct, _UU("NM_NAT_SRC_PORT"), false);
- CtInsertColumn(ct, _UU("NM_NAT_DST_HOST"), false);
- CtInsertColumn(ct, _UU("NM_NAT_DST_PORT"), false);
- CtInsertColumn(ct, _UU("NM_NAT_CREATED"), false);
- CtInsertColumn(ct, _UU("NM_NAT_LAST_COMM"), false);
- CtInsertColumn(ct, _UU("NM_NAT_SIZE"), false);
- CtInsertColumn(ct, _UU("NM_NAT_TCP_STATUS"), false);
- for (i = 0;i < t.NumItem;i++)
- {
- RPC_ENUM_NAT_ITEM *e = &t.Items[i];
- wchar_t tmp0[MAX_SIZE];
- wchar_t *tmp1 = L"";
- wchar_t tmp2[MAX_SIZE];
- wchar_t tmp3[MAX_SIZE];
- wchar_t tmp4[MAX_SIZE];
- wchar_t tmp5[MAX_SIZE];
- wchar_t tmp6[MAX_SIZE];
- wchar_t tmp7[MAX_SIZE];
- wchar_t tmp8[MAX_SIZE];
- wchar_t *tmp9 = L"";
- char v1[128], v2[128];
- // ID
- UniToStru(tmp0, e->Id);
- // Protocol
- switch (e->Protocol)
- {
- case NAT_TCP:
- tmp1 = _UU("NM_NAT_PROTO_TCP");
- break;
- case NAT_UDP:
- tmp1 = _UU("NM_NAT_PROTO_UDP");
- break;
- case NAT_DNS:
- tmp1 = _UU("NM_NAT_PROTO_DNS");
- break;
- case NAT_ICMP:
- tmp1 = _UU("NM_NAT_PROTO_ICMP");
- break;
- }
- // Source host
- StrToUni(tmp2, sizeof(tmp2), e->SrcHost);
- // Source port
- UniToStru(tmp3, e->SrcPort);
- // Destination host
- StrToUni(tmp4, sizeof(tmp4), e->DestHost);
- // Destination port
- UniToStru(tmp5, e->DestPort);
- // Creation date and time of the session
- GetDateTimeStrEx64(tmp6, sizeof(tmp6), SystemToLocal64(e->CreatedTime), NULL);
- // Last communication date and time
- GetDateTimeStrEx64(tmp7, sizeof(tmp7), SystemToLocal64(e->LastCommTime), NULL);
- // Communication amount
- ToStr3(v1, sizeof(v1), e->RecvSize);
- ToStr3(v2, sizeof(v2), e->SendSize);
- UniFormat(tmp8, sizeof(tmp8), L"%S / %S", v1, v2);
- // TCP state
- if (e->Protocol == NAT_TCP)
- {
- switch (e->TcpStatus)
- {
- case NAT_TCP_CONNECTING:
- tmp9 = _UU("NAT_TCP_CONNECTING");
- break;
- case NAT_TCP_SEND_RESET:
- tmp9 = _UU("NAT_TCP_SEND_RESET");
- break;
- case NAT_TCP_CONNECTED:
- tmp9 = _UU("NAT_TCP_CONNECTED");
- break;
- case NAT_TCP_ESTABLISHED:
- tmp9 = _UU("NAT_TCP_ESTABLISHED");
- break;
- case NAT_TCP_WAIT_DISCONNECT:
- tmp9 = _UU("NAT_TCP_WAIT_DISCONNECT");
- break;
- }
- }
- CtInsert(ct,
- tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9);
- }
- CtFreeEx(ct, c, true);
- }
- FreeRpcEnumNat(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Get the settings for a virtual DHCP server function of the SecureNAT function
- UINT PsDhcpGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- VH_OPTION t;
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScGetSecureNATOption(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- wchar_t tmp[MAX_SIZE];
- CT *ct = CtNewStandard();
- // To use the virtual DHCP function
- CtInsert(ct, _UU("CMD_DhcpGet_Column_USE"), t.UseDhcp ? _UU("SEC_YES") : _UU("SEC_NO"));
- // Start address of the distributing address zone
- IPToUniStr(tmp, sizeof(tmp), &t.DhcpLeaseIPStart);
- CtInsert(ct, _UU("CMD_DhcpGet_Column_IP1"), tmp);
- // End address of the distributing address zone
- IPToUniStr(tmp, sizeof(tmp), &t.DhcpLeaseIPEnd);
- CtInsert(ct, _UU("CMD_DhcpGet_Column_IP2"), tmp);
- // Subnet mask
- IPToUniStr(tmp, sizeof(tmp), &t.DhcpSubnetMask);
- CtInsert(ct, _UU("CMD_DhcpGet_Column_MASK"), tmp);
- // Lease time (in seconds)
- UniToStru(tmp, t.DhcpExpireTimeSpan);
- CtInsert(ct, _UU("CMD_DhcpGet_Column_LEASE"), tmp);
- // Default gateway address
- UniStrCpy(tmp, sizeof(tmp), _UU("SEC_NONE"));
- if (IPToUINT(&t.DhcpGatewayAddress) != 0)
- {
- IPToUniStr(tmp, sizeof(tmp), &t.DhcpGatewayAddress);
- }
- CtInsert(ct, _UU("CMD_DhcpGet_Column_GW"), tmp);
- // DNS server address 1
- UniStrCpy(tmp, sizeof(tmp), _UU("SEC_NONE"));
- if (IPToUINT(&t.DhcpDnsServerAddress) != 0)
- {
- IPToUniStr(tmp, sizeof(tmp), &t.DhcpDnsServerAddress);
- }
- CtInsert(ct, _UU("CMD_DhcpGet_Column_DNS"), tmp);
- // DNS server address 2
- UniStrCpy(tmp, sizeof(tmp), _UU("SEC_NONE"));
- if (IPToUINT(&t.DhcpDnsServerAddress2) != 0)
- {
- IPToUniStr(tmp, sizeof(tmp), &t.DhcpDnsServerAddress2);
- }
- CtInsert(ct, _UU("CMD_DhcpGet_Column_DNS2"), tmp);
- // Domain name
- StrToUni(tmp, sizeof(tmp), t.DhcpDomainName);
- CtInsert(ct, _UU("CMD_DhcpGet_Column_DOMAIN"), tmp);
- // To save the log
- CtInsert(ct, _UU("CMD_SecureNatHostGet_Column_LOG"), t.SaveLog ? _UU("SEC_YES") : _UU("SEC_NO"));
- // Push routing table
- if (t.ApplyDhcpPushRoutes)
- {
- StrToUni(tmp, sizeof(tmp), t.DhcpPushRoutes);
- CtInsert(ct, _UU("CMD_DhcpGet_Column_PUSHROUTE"), tmp);
- }
- CtFree(ct, c);
- }
- FreeParamValueList(o);
- return 0;
- }
- // Enable the Virtual DHCP server function of SecureNAT function
- UINT PsDhcpEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- VH_OPTION t;
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScGetSecureNATOption(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- bool ok = true;
- t.UseDhcp = true;
- if (ok == false)
- {
- // Parameter is invalid
- ret = ERR_INVALID_PARAMETER;
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- ret = ScSetSecureNATOption(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- }
- }
- FreeParamValueList(o);
- return 0;
- }
- // Disable the virtual DHCP server function of SecureNAT function
- UINT PsDhcpDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- VH_OPTION t;
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScGetSecureNATOption(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- t.UseDhcp = false;
- ret = ScSetSecureNATOption(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- }
- FreeParamValueList(o);
- return 0;
- }
- // Change the settings for a virtual DHCP server function of the SecureNAT function
- UINT PsDhcpSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- VH_OPTION t;
- // Parameter list that can be specified
- CMD_EVAL_MIN_MAX mm =
- {
- "CMD_NatSet_Eval_UDP", NAT_UDP_MIN_TIMEOUT / 1000, NAT_UDP_MAX_TIMEOUT / 1000,
- };
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"START", CmdPrompt, _UU("CMD_DhcpSet_Prompt_START"), CmdEvalIp, NULL},
- {"END", CmdPrompt, _UU("CMD_DhcpSet_Prompt_END"), CmdEvalIp, NULL},
- {"MASK", CmdPrompt, _UU("CMD_DhcpSet_Prompt_MASK"), CmdEvalIp, NULL},
- {"EXPIRE", CmdPrompt, _UU("CMD_DhcpSet_Prompt_EXPIRE"), CmdEvalMinMax, &mm},
- {"GW", CmdPrompt, _UU("CMD_DhcpSet_Prompt_GW"), CmdEvalIp, NULL},
- {"DNS", CmdPrompt, _UU("CMD_DhcpSet_Prompt_DNS"), CmdEvalIp, NULL},
- {"DNS2", CmdPrompt, _UU("CMD_DhcpSet_Prompt_DNS2"), CmdEvalIp, NULL},
- {"DOMAIN", CmdPrompt, _UU("CMD_DhcpSet_Prompt_DOMAIN"), NULL, NULL},
- {"LOG", CmdPrompt, _UU("CMD_NatSet_Prompt_LOG"), CmdEvalNotEmpty, NULL},
- {"PUSHROUTE", NULL, _UU("CMD_DhcpSet_PUSHROUTE"), NULL, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScGetSecureNATOption(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- bool ok = true;
- StrToIP(&t.DhcpLeaseIPStart, GetParamStr(o, "START"));
- StrToIP(&t.DhcpLeaseIPEnd, GetParamStr(o, "END"));
- StrToIP(&t.DhcpSubnetMask, GetParamStr(o, "MASK"));
- t.DhcpExpireTimeSpan = GetParamInt(o, "EXPIRE");
- StrToIP(&t.DhcpGatewayAddress, GetParamStr(o, "GW"));
- StrToIP(&t.DhcpDnsServerAddress, GetParamStr(o, "DNS"));
- StrToIP(&t.DhcpDnsServerAddress2, GetParamStr(o, "DNS2"));
- StrCpy(t.DhcpDomainName, sizeof(t.DhcpDomainName), GetParamStr(o, "DOMAIN"));
- t.SaveLog = GetParamYes(o, "LOG");
- StrCpy(t.DhcpPushRoutes, sizeof(t.DhcpPushRoutes), GetParamStr(o, "PUSHROUTE"));
- t.ApplyDhcpPushRoutes = true;
- if (ok == false)
- {
- // Parameter is invalid
- ret = ERR_INVALID_PARAMETER;
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- ret = ScSetSecureNATOption(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- if (IsEmptyStr(GetParamStr(o, "PUSHROUTE")) == false)
- {
- if (GetCapsBool(ps->CapsList, "b_suppport_push_route") == false &&
- GetCapsBool(ps->CapsList, "b_suppport_push_route_config"))
- {
- CmdPrintError(c, ERR_NOT_SUPPORTED_FUNCTION_ON_OPENSOURCE);
- }
- }
- }
- }
- FreeParamValueList(o);
- return 0;
- }
- // Get the lease table of virtual DHCP server function of the SecureNAT function
- UINT PsDhcpTable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_ENUM_DHCP t;
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScEnumDHCP(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- CT *ct = CtNew();
- UINT i;
- CtInsertColumn(ct, _UU("DHCP_DHCP_ID"), false);
- CtInsertColumn(ct, _UU("DHCP_LEASED_TIME"), false);
- CtInsertColumn(ct, _UU("DHCP_EXPIRE_TIME"), false);
- CtInsertColumn(ct, _UU("DHCP_MAC_ADDRESS"), false);
- CtInsertColumn(ct, _UU("DHCP_IP_ADDRESS"), false);
- CtInsertColumn(ct, _UU("DHCP_HOSTNAME"), false);
- for (i = 0;i < t.NumItem;i++)
- {
- RPC_ENUM_DHCP_ITEM *e = &t.Items[i];
- wchar_t tmp0[MAX_SIZE];
- wchar_t tmp1[MAX_SIZE];
- wchar_t tmp2[MAX_SIZE];
- wchar_t tmp3[MAX_SIZE];
- wchar_t tmp4[MAX_SIZE];
- wchar_t tmp5[MAX_SIZE];
- char str[MAX_SIZE];
- // ID
- UniToStru(tmp0, e->Id);
- // Time
- GetDateTimeStrEx64(tmp1, sizeof(tmp1), SystemToLocal64(e->LeasedTime), NULL);
- GetDateTimeStrEx64(tmp2, sizeof(tmp2), SystemToLocal64(e->ExpireTime), NULL);
- MacToStr(str, sizeof(str), e->MacAddress);
- StrToUni(tmp3, sizeof(tmp3), str);
- IPToStr32(str, sizeof(str), e->IpAddress);
- StrToUni(tmp4, sizeof(tmp4), str);
- StrToUni(tmp5, sizeof(tmp5), e->Hostname);
- CtInsert(ct,
- tmp0, tmp1, tmp2, tmp3, tmp4, tmp5);
- }
- CtFreeEx(ct, c, true);
- }
- FreeRpcEnumDhcp(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Get the list of Virtual HUB management options
- UINT PsAdminOptionList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_ADMIN_OPTION t;
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScGetHubAdminOptions(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- CT *ct = CtNewStandardEx();
- UINT i;
- for (i = 0;i < t.NumItem;i++)
- {
- ADMIN_OPTION *e = &t.Items[i];
- wchar_t tmp1[MAX_SIZE];
- wchar_t tmp2[MAX_SIZE];
- StrToUni(tmp1, sizeof(tmp1), e->Name);
- UniToStru(tmp2, e->Value);
- CtInsert(ct, tmp1, tmp2, GetHubAdminOptionHelpString(e->Name));
-
- }
- CtFreeEx(ct, c, true);
- }
- FreeRpcAdminOption(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Set the value of a Virtual HUB management option
- UINT PsAdminOptionSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_ADMIN_OPTION t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_AdminOptionSet_Prompt_name"), CmdEvalNotEmpty, NULL},
- {"VALUE", CmdPrompt, _UU("CMD_AdminOptionSet_Prompt_VALUE"), CmdEvalNotEmpty, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScGetHubAdminOptions(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- UINT i;
- bool b = false;
- for (i = 0;i < t.NumItem;i++)
- {
- if (StrCmpi(t.Items[i].Name, GetParamStr(o, "[name]")) == 0)
- {
- t.Items[i].Value = GetParamInt(o, "VALUE");
- b = true;
- }
- }
- if (b == false)
- {
- // An error has occured
- ret = ERR_OBJECT_NOT_FOUND;
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- FreeRpcAdminOption(&t);
- return ret;
- }
- else
- {
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- ret = ScSetHubAdminOptions(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- }
- }
- FreeRpcAdminOption(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Get the list of Virtual HUB extended options
- UINT PsExtOptionList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_ADMIN_OPTION t;
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScGetHubExtOptions(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- CT *ct = CtNewStandardEx();
- UINT i;
- for (i = 0;i < t.NumItem;i++)
- {
- ADMIN_OPTION *e = &t.Items[i];
- wchar_t tmp1[MAX_SIZE];
- wchar_t tmp2[MAX_SIZE];
- StrToUni(tmp1, sizeof(tmp1), e->Name);
- UniToStru(tmp2, e->Value);
- CtInsert(ct, tmp1, tmp2, GetHubAdminOptionHelpString(e->Name));
- }
- CtFreeEx(ct, c, true);
- }
- FreeRpcAdminOption(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Set the value of a Virtual HUB extended option
- UINT PsExtOptionSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_ADMIN_OPTION t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[name]", CmdPrompt, _UU("CMD_AdminOptionSet_Prompt_name"), CmdEvalNotEmpty, NULL},
- {"VALUE", CmdPrompt, _UU("CMD_AdminOptionSet_Prompt_VALUE"), CmdEvalNotEmpty, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScGetHubExtOptions(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- UINT i;
- bool b = false;
- for (i = 0;i < t.NumItem;i++)
- {
- if (StrCmpi(t.Items[i].Name, GetParamStr(o, "[name]")) == 0)
- {
- t.Items[i].Value = GetParamInt(o, "VALUE");
- b = true;
- }
- }
- if (b == false)
- {
- // An error has occured
- ret = ERR_OBJECT_NOT_FOUND;
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- FreeRpcAdminOption(&t);
- return ret;
- }
- else
- {
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- ret = ScSetHubExtOptions(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- }
- }
- FreeRpcAdminOption(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Get the list of revoked certificate list
- UINT PsCrlList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_ENUM_CRL t;
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScEnumCrl(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- UINT i;
- CT *ct = CtNew();
- CtInsertColumn(ct, _UU("CMD_ID"), false);
- CtInsertColumn(ct, _UU("SM_CRL_COLUMN_1"), false);
- for (i = 0;i < t.NumItem;i++)
- {
- wchar_t tmp[64];
- RPC_ENUM_CRL_ITEM *e = &t.Items[i];
- UniToStru(tmp, e->Key);
- CtInsert(ct, tmp, e->CrlInfo);
- }
- CtFreeEx(ct, c, true);
- }
- FreeRpcEnumCrl(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Add a revoked certificate
- UINT PsCrlAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CRL t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- {"SERIAL", NULL, NULL, NULL, NULL},
- {"MD5", NULL, NULL, NULL, NULL},
- {"SHA1", NULL, NULL, NULL, NULL},
- {"CN", NULL, NULL, NULL, NULL},
- {"O", NULL, NULL, NULL, NULL},
- {"OU", NULL, NULL, NULL, NULL},
- {"C", NULL, NULL, NULL, NULL},
- {"ST", NULL, NULL, NULL, NULL},
- {"L", NULL, NULL, NULL, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- {
- bool param_exists = false;
- CRL *crl = ZeroMalloc(sizeof(CRL));
- NAME *n;
- n = crl->Name = ZeroMalloc(sizeof(NAME));
- if (IsEmptyStr(GetParamStr(o, "CN")) == false)
- {
- n->CommonName = CopyUniStr(GetParamUniStr(o, "CN"));
- param_exists = true;
- }
- if (IsEmptyStr(GetParamStr(o, "O")) == false)
- {
- n->CommonName = CopyUniStr(GetParamUniStr(o, "O"));
- param_exists = true;
- }
- if (IsEmptyStr(GetParamStr(o, "OU")) == false)
- {
- n->CommonName = CopyUniStr(GetParamUniStr(o, "OU"));
- param_exists = true;
- }
- if (IsEmptyStr(GetParamStr(o, "C")) == false)
- {
- n->CommonName = CopyUniStr(GetParamUniStr(o, "C"));
- param_exists = true;
- }
- if (IsEmptyStr(GetParamStr(o, "ST")) == false)
- {
- n->CommonName = CopyUniStr(GetParamUniStr(o, "ST"));
- param_exists = true;
- }
- if (IsEmptyStr(GetParamStr(o, "L")) == false)
- {
- n->CommonName = CopyUniStr(GetParamUniStr(o, "L"));
- param_exists = true;
- }
- if (IsEmptyStr(GetParamStr(o, "SERIAL")) == false)
- {
- BUF *b;
- b = StrToBin(GetParamStr(o, "SERIAL"));
- if (b != NULL && b->Size >= 1)
- {
- crl->Serial = NewXSerial(b->Buf, b->Size);
- param_exists = true;
- }
- FreeBuf(b);
- }
- if (IsEmptyStr(GetParamStr(o, "MD5")) == false)
- {
- BUF *b;
- b = StrToBin(GetParamStr(o, "MD5"));
- if (b != NULL && b->Size == MD5_SIZE)
- {
- Copy(crl->DigestMD5, b->Buf, MD5_SIZE);
- param_exists = true;
- }
- FreeBuf(b);
- }
- if (IsEmptyStr(GetParamStr(o, "SHA1")) == false)
- {
- BUF *b;
- b = StrToBin(GetParamStr(o, "SHA1"));
- if (b != NULL && b->Size == SHA1_SIZE)
- {
- Copy(crl->DigestSHA1, b->Buf, SHA1_SIZE);
- param_exists = true;
- }
- FreeBuf(b);
- }
- t.Crl = crl;
- if (param_exists == false)
- {
- FreeRpcCrl(&t);
- ret = ERR_INVALID_PARAMETER;
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- }
- // RPC call
- ret = ScAddCrl(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcCrl(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Delete the revoked certificate
- UINT PsCrlDel(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CRL t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[id]", CmdPrompt, _UU("CMD_CrlDel_Prompt_ID"), CmdEvalNotEmpty, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- t.Key = GetParamInt(o, "[id]");
- // RPC call
- ret = ScDelCrl(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeRpcCrl(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Get the revoked certificate
- UINT PsCrlGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_CRL t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[id]", CmdPrompt, _UU("CMD_CrlGet_Prompt_ID"), CmdEvalNotEmpty, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- t.Key = GetParamInt(o, "[id]");
- // RPC call
- ret = ScGetCrl(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- // Show contents
- CT *ct = CtNewStandard();
- CRL *crl = t.Crl;
- NAME *n;
- if (crl != NULL)
- {
- n = crl->Name;
- if (n != NULL)
- {
- if (UniIsEmptyStr(n->CommonName) == false)
- {
- CtInsert(ct, _UU("CMD_CrlGet_CN"), n->CommonName);
- }
- if (UniIsEmptyStr(n->Organization) == false)
- {
- CtInsert(ct, _UU("CMD_CrlGet_O"), n->Organization);
- }
- if (UniIsEmptyStr(n->Unit) == false)
- {
- CtInsert(ct, _UU("CMD_CrlGet_OU"), n->Unit);
- }
- if (UniIsEmptyStr(n->Country) == false)
- {
- CtInsert(ct, _UU("CMD_CrlGet_C"), n->Country);
- }
- if (UniIsEmptyStr(n->State) == false)
- {
- CtInsert(ct, _UU("CMD_CrlGet_ST"), n->State);
- }
- if (UniIsEmptyStr(n->Local) == false)
- {
- CtInsert(ct, _UU("CMD_CrlGet_L"), n->Local);
- }
- }
- if (crl->Serial != NULL && crl->Serial->size >= 1)
- {
- wchar_t tmp[MAX_SIZE];
- char str[MAX_SIZE];
- BinToStrEx(str, sizeof(str), crl->Serial->data, crl->Serial->size);
- StrToUni(tmp, sizeof(tmp), str);
- CtInsert(ct, _UU("CMD_CrlGet_SERI"), tmp);
- }
- if (IsZero(crl->DigestMD5, MD5_SIZE) == false)
- {
- wchar_t tmp[MAX_SIZE];
- char str[MAX_SIZE];
- BinToStrEx(str, sizeof(str), crl->DigestMD5, MD5_SIZE);
- StrToUni(tmp, sizeof(tmp), str);
- CtInsert(ct, _UU("CMD_CrlGet_MD5_HASH"), tmp);
- }
- if (IsZero(crl->DigestSHA1, SHA1_SIZE) == false)
- {
- wchar_t tmp[MAX_SIZE];
- char str[MAX_SIZE];
- BinToStrEx(str, sizeof(str), crl->DigestSHA1, SHA1_SIZE);
- StrToUni(tmp, sizeof(tmp), str);
- CtInsert(ct, _UU("CMD_CrlGet_SHA1_HASH"), tmp);
- }
- }
- CtFree(ct, c);
- }
- FreeRpcCrl(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Get the rules of IP access control list
- UINT PsAcList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_AC_LIST t;
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScGetAcList(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- UINT i;
- CT *ct;
- ct = CtNew();
- CtInsertColumn(ct, _UU("SM_AC_COLUMN_1"), true);
- CtInsertColumn(ct, _UU("SM_AC_COLUMN_2"), true);
- CtInsertColumn(ct, _UU("SM_AC_COLUMN_3"), false);
- CtInsertColumn(ct, _UU("SM_AC_COLUMN_4"), false);
- for (i = 0;i < LIST_NUM(t.o);i++)
- {
- wchar_t tmp1[32], *tmp2, tmp3[MAX_SIZE], tmp4[32];
- char *tmp_str;
- AC *ac = LIST_DATA(t.o, i);
- UniToStru(tmp1, ac->Id);
- tmp2 = ac->Deny ? _UU("SM_AC_DENY") : _UU("SM_AC_PASS");
- tmp_str = GenerateAcStr(ac);
- StrToUni(tmp3, sizeof(tmp3), tmp_str);
- Free(tmp_str);
- UniToStru(tmp4, ac->Priority);
- CtInsert(ct, tmp1, tmp4, tmp2, tmp3);
- }
- CtFree(ct, c);
- }
- FreeRpcAcList(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Add a rule to the IP access control list (IPv4)
- UINT PsAcAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_AC_LIST t;
- // Parameter list that can be specified
- CMD_EVAL_MIN_MAX mm =
- {
- "CMD_AcAdd_Eval_PRIORITY", 1, 4294967295UL,
- };
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[allow|deny]", CmdPrompt, _UU("CMD_AcAdd_Prompt_AD"), CmdEvalNotEmpty, NULL},
- {"PRIORITY", CmdPrompt, _UU("CMD_AcAdd_Prompt_PRIORITY"), CmdEvalMinMax, &mm},
- {"IP", CmdPrompt, _UU("CMD_AcAdd_Prompt_IP"), CmdEvalIpAndMask4, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScGetAcList(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- // Add a new item to the list
- AC *ac = ZeroMalloc(sizeof(AC));
- char *test = GetParamStr(o, "[allow|deny]");
- UINT u_ip, u_mask;
- if (StartWith("deny", test))
- {
- ac->Deny = true;
- }
- ParseIpAndMask4(GetParamStr(o, "IP"), &u_ip, &u_mask);
- UINTToIP(&ac->IpAddress, u_ip);
- if (u_mask == 0xffffffff)
- {
- ac->Masked = false;
- }
- else
- {
- ac->Masked = true;
- UINTToIP(&ac->SubnetMask, u_mask);
- }
- ac->Priority = GetParamInt(o, "PRIORITY");
- Insert(t.o, ac);
- ret = ScSetAcList(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- }
- FreeRpcAcList(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Add a rule to the IP access control list (IPv6)
- UINT PsAcAdd6(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_AC_LIST t;
- // Parameter list that can be specified
- CMD_EVAL_MIN_MAX mm =
- {
- "CMD_AcAdd6_Eval_PRIORITY", 1, 4294967295UL,
- };
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[allow|deny]", CmdPrompt, _UU("CMD_AcAdd6_Prompt_AD"), CmdEvalNotEmpty, NULL},
- {"PRIORITY", CmdPrompt, _UU("CMD_AcAdd6_Prompt_PRIORITY"), CmdEvalMinMax, &mm},
- {"IP", CmdPrompt, _UU("CMD_AcAdd6_Prompt_IP"), CmdEvalIpAndMask6, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScGetAcList(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- // Add a new item to the list
- AC *ac = ZeroMalloc(sizeof(AC));
- char *test = GetParamStr(o, "[allow|deny]");
- IP u_ip, u_mask;
- if (StartWith("deny", test))
- {
- ac->Deny = true;
- }
- ParseIpAndMask6(GetParamStr(o, "IP"), &u_ip, &u_mask);
- Copy(&ac->IpAddress, &u_ip, sizeof(IP));
- if (SubnetMaskToInt6(&u_mask) == 128)
- {
- ac->Masked = false;
- }
- else
- {
- ac->Masked = true;
- Copy(&ac->SubnetMask, &u_mask, sizeof(IP));
- }
- ac->Priority = GetParamInt(o, "PRIORITY");
- Insert(t.o, ac);
- ret = ScSetAcList(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- }
- FreeRpcAcList(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Run the debug command
- UINT PsDebug(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- UINT id;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[id]", NULL, NULL, NULL, NULL},
- {"ARG", NULL, NULL, NULL, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- id = GetParamInt(o, "[id]");
- if (true)
- {
- RPC_TEST t;
- UINT ret;
- c->Write(c, _UU("CMD_Debug_Msg1"));
- Zero(&t, sizeof(t));
- t.IntValue = id;
- StrCpy(t.StrValue, sizeof(t.StrValue), GetParamStr(o, "ARG"));
- ret = ScDebug(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- wchar_t tmp[sizeof(t.StrValue)];
- UniFormat(tmp, sizeof(tmp), _UU("CMD_Debug_Msg2"), t.StrValue);
- c->Write(c, tmp);
- }
- }
- FreeParamValueList(o);
- return 0;
- }
- // Flush the configuration file on the server
- UINT PsFlush(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- if (true)
- {
- RPC_TEST t;
- UINT ret;
- wchar_t tmp[MAX_SIZE];
- char sizestr[MAX_SIZE];
- c->Write(c, _UU("CMD_Flush_Msg1"));
- Zero(&t, sizeof(t));
- ret = ScFlush(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- ToStr3(sizestr, sizeof(sizestr), (UINT64)t.IntValue);
- UniFormat(tmp, sizeof(tmp), _UU("CMD_Flush_Msg2"), sizestr);
- c->Write(c, tmp);
- }
- FreeParamValueList(o);
- return 0;
- }
- // Crash
- UINT PsCrash(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- char *yes;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[yes]", CmdPrompt, _UU("CMD_Crash_Confirm"), NULL, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- yes = GetParamStr(o, "[yes]");
- if (StrCmpi(yes, "yes") != 0)
- {
- c->Write(c, _UU("CMD_Crash_Aborted"));
- }
- else
- {
- RPC_TEST t;
- UINT ret;
- c->Write(c, _UU("CMD_Crash_Msg"));
- Zero(&t, sizeof(t));
- ret = ScCrash(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- }
- FreeParamValueList(o);
- return 0;
- }
- // Remove a rule in the IP access control list
- UINT PsAcDel(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_AC_LIST t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[id]", CmdPrompt, _UU("CMD_AcDel_Prompt_ID"), CmdEvalNotEmpty, NULL},
- };
- // If virtual HUB is not selected, it's an error
- if (ps->HubName == NULL)
- {
- c->Write(c, _UU("CMD_Hub_Not_Selected"));
- return ERR_INVALID_PARAMETER;
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
- // RPC call
- ret = ScGetAcList(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- // Remove matched ID
- UINT i;
- bool b = false;
- for (i = 0;i < LIST_NUM(t.o);i++)
- {
- AC *ac = LIST_DATA(t.o, i);
- if (ac->Id == GetParamInt(o, "[id]"))
- {
- Delete(t.o, ac);
- Free(ac);
- b = true;
- break;
- }
- }
- if (b == false)
- {
- ret = ERR_OBJECT_NOT_FOUND;
- FreeRpcAcList(&t);
- }
- else
- {
- ret = ScSetAcList(ps->Rpc, &t);
- }
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- }
- FreeRpcAcList(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Enable / Disable the IPsec VPN server function
- UINT PsIPsecEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- IPSEC_SERVICES t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"L2TP", CmdPrompt, _UU("CMD_IPsecEnable_Prompt_L2TP"), CmdEvalNotEmpty, NULL},
- {"L2TPRAW", CmdPrompt, _UU("CMD_IPsecEnable_Prompt_L2TPRAW"), CmdEvalNotEmpty, NULL},
- {"ETHERIP", CmdPrompt, _UU("CMD_IPsecEnable_Prompt_ETHERIP"), CmdEvalNotEmpty, NULL},
- {"PSK", CmdPrompt, _UU("CMD_IPsecEnable_Prompt_PSK"), CmdEvalNotEmpty, NULL},
- {"DEFAULTHUB", CmdPrompt, _UU("CMD_IPsecEnable_Prompt_DEFAULTHUB"), CmdEvalNotEmpty, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- t.L2TP_IPsec = GetParamYes(o, "L2TP");
- t.L2TP_Raw = GetParamYes(o, "L2TPRAW");
- t.EtherIP_IPsec = GetParamYes(o, "ETHERIP");
- StrCpy(t.IPsec_Secret, sizeof(t.IPsec_Secret), GetParamStr(o, "PSK"));
- StrCpy(t.L2TP_DefaultHub, sizeof(t.L2TP_DefaultHub), GetParamStr(o, "DEFAULTHUB"));
- // RPC call
- ret = ScSetIPsecServices(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Get the current configuration of IPsec VPN server function
- UINT PsIPsecGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- IPSEC_SERVICES t;
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // RPC call
- ret = ScGetIPsecServices(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- wchar_t tmp[MAX_PATH];
- CT *ct = CtNewStandard();
- CtInsert(ct, _UU("CMD_IPsecGet_PRINT_L2TP"), _UU(t.L2TP_IPsec ? "SEC_YES" : "SEC_NO"));
- CtInsert(ct, _UU("CMD_IPsecGet_PRINT_L2TPRAW"), _UU(t.L2TP_Raw ? "SEC_YES" : "SEC_NO"));
- CtInsert(ct, _UU("CMD_IPsecGet_PRINT_ETHERIP"), _UU(t.EtherIP_IPsec ? "SEC_YES" : "SEC_NO"));
- StrToUni(tmp, sizeof(tmp), t.IPsec_Secret);
- CtInsert(ct, _UU("CMD_IPsecGet_PRINT_PSK"), tmp);
- StrToUni(tmp, sizeof(tmp), t.L2TP_DefaultHub);
- CtInsert(ct, _UU("CMD_IPsecGet_PRINT_DEFAULTHUB"), tmp);
- CtFree(ct, c);
- }
- FreeParamValueList(o);
- return 0;
- }
- // Add connection settings for accepting connections from client devices of EtherIP / L2TPv3 over IPsec server function
- UINT PsEtherIpClientAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- ETHERIP_ID t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[ID]", CmdPrompt, _UU("CMD_EtherIpClientAdd_Prompt_ID"), CmdEvalNotEmpty, NULL},
- {"HUB", CmdPrompt, _UU("CMD_EtherIpClientAdd_Prompt_HUB"), CmdEvalNotEmpty, NULL},
- {"USERNAME", CmdPrompt, _UU("CMD_EtherIpClientAdd_Prompt_USERNAME"), CmdEvalNotEmpty, NULL},
- {"PASSWORD", CmdPrompt, _UU("CMD_EtherIpClientAdd_Prompt_PASSWORD"), CmdEvalNotEmpty, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.Id, sizeof(t.Id), GetParamStr(o, "[ID]"));
- StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "HUB"));
- StrCpy(t.UserName, sizeof(t.UserName), GetParamStr(o, "USERNAME"));
- StrCpy(t.Password, sizeof(t.Password), GetParamStr(o, "PASSWORD"));
- // RPC call
- ret = ScAddEtherIpId(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Delete the connection settings for accepting connections from client devices of EtherIP / L2TPv3 over IPsec server function
- UINT PsEtherIpClientDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- ETHERIP_ID t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[ID]", CmdPrompt, _UU("CMD_EtherIpClientDelete_Prompt_ID"), CmdEvalNotEmpty, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.Id, sizeof(t.Id), GetParamStr(o, "[ID]"));
- // RPC call
- ret = ScDeleteEtherIpId(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Show the list of connection settings for accepting connections from client devices of EtherIP / L2TPv3 over IPsec server function
- UINT PsEtherIpClientList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_ENUM_ETHERIP_ID t;
- UINT i;
- CT *b;
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // RPC call
- ret = ScEnumEtherIpId(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- b = CtNew();
- CtInsertColumn(b, _UU("SM_ETHERIP_COLUMN_0"), false);
- CtInsertColumn(b, _UU("SM_ETHERIP_COLUMN_1"), false);
- CtInsertColumn(b, _UU("SM_ETHERIP_COLUMN_2"), false);
- for (i = 0;i < t.NumItem;i++)
- {
- ETHERIP_ID *d = &t.IdList[i];
- wchar_t id[MAX_SIZE], hubname[MAX_SIZE], username[MAX_SIZE];
- StrToUni(id, sizeof(id), d->Id);
- StrToUni(hubname, sizeof(hubname), d->HubName);
- StrToUni(username, sizeof(username), d->UserName);
- CtInsert(b, id, hubname, username);
- }
- CtFree(b, c);
- FreeRpcEnumEtherIpId(&t);
- }
- FreeParamValueList(o);
- return 0;
- }
- // Enable / disable the OpenVPN compatible server function
- UINT PsOpenVpnEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- OPENVPN_SSTP_CONFIG t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[yes|no]", CmdPrompt, _UU("CMD_OpenVpnEnable_Prompt_[yes|no]"), CmdEvalNotEmpty, NULL},
- {"PORTS", CmdPrompt, _UU("CMD_OpenVpnEnable_Prompt_PORTS"), CmdEvalNotEmpty, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // RPC call
- ret = ScGetOpenVpnSstpConfig(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- t.EnableOpenVPN = GetParamYes(o, "[yes|no]");
- StrCpy(t.OpenVPNPortList, sizeof(t.OpenVPNPortList), GetParamStr(o, "PORTS"));
- // RPC call
- ret = ScSetOpenVpnSstpConfig(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Get the current settings for the OpenVPN compatible server function
- UINT PsOpenVpnGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- OPENVPN_SSTP_CONFIG t;
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // RPC call
- ret = ScGetOpenVpnSstpConfig(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- wchar_t tmp[MAX_PATH];
- CT *ct = CtNewStandard();
- CtInsert(ct, _UU("CMD_OpenVpnGet_PRINT_Enabled"), _UU(t.EnableOpenVPN ? "SEC_YES" : "SEC_NO"));
- StrToUni(tmp, sizeof(tmp), t.OpenVPNPortList);
- CtInsert(ct, _UU("CMD_OpenVpnGet_PRINT_Ports"), tmp);
- CtFree(ct, c);
- }
- FreeParamValueList(o);
- return 0;
- }
- // Generate a OpenVPN sample configuration file that can connect to the OpenVPN compatible server function
- UINT PsOpenVpnMakeConfig(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_READ_LOG_FILE t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[ZIP_FileName]", CmdPrompt, _UU("CMD_OpenVpnMakeConfig_Prompt_ZIP"), CmdEvalNotEmpty, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // RPC call
- ret = ScMakeOpenVpnConfigFile(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- // Determine the file name to save
- wchar_t filename[MAX_SIZE];
- wchar_t tmp[MAX_SIZE];
- UniStrCpy(filename, sizeof(filename), GetParamUniStr(o, "[ZIP_FileName]"));
- if (UniEndWith(filename, L".zip") == false)
- {
- UniStrCat(filename, sizeof(filename), L".zip");
- }
- if (DumpBufW(t.Buffer, filename) == false)
- {
- ret = ERR_INTERNAL_ERROR;
- UniFormat(tmp, sizeof(tmp), _UU("CMD_OpenVpnMakeConfig_ERROR"), filename);
- }
- else
- {
- UniFormat(tmp, sizeof(tmp), _UU("CMD_OpenVpnMakeConfig_OK"), filename);
- }
- c->Write(c, tmp);
- FreeRpcReadLogFile(&t);
- }
- FreeParamValueList(o);
- return ret;
- }
- // Enable / disable the Microsoft SSTP VPN compatible server function
- UINT PsSstpEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- OPENVPN_SSTP_CONFIG t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[yes|no]", CmdPrompt, _UU("CMD_SstpEnable_Prompt_[yes|no]"), CmdEvalNotEmpty, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // RPC call
- ret = ScGetOpenVpnSstpConfig(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- t.EnableSSTP = GetParamYes(o, "[yes|no]");
- // RPC call
- ret = ScSetOpenVpnSstpConfig(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Get the current settings for the Microsoft SSTP VPN compatible server function
- UINT PsSstpGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- OPENVPN_SSTP_CONFIG t;
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // RPC call
- ret = ScGetOpenVpnSstpConfig(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- CT *ct = CtNewStandard();
- CtInsert(ct, _UU("CMD_SstpEnable_PRINT_Enabled"), _UU(t.EnableSSTP ? "SEC_YES" : "SEC_NO"));
- CtFree(ct, c);
- }
- FreeParamValueList(o);
- return 0;
- }
- // Register to the VPN Server by creating a new self-signed certificate with the specified CN (Common Name)
- UINT PsServerCertRegenerate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_TEST t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[CN]", CmdPrompt, _UU("CMD_ServerCertRegenerate_Prompt_CN"), CmdEvalNotEmpty, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.StrValue, sizeof(t.StrValue), GetParamStr(o, "[CN]"));
- // RPC call
- ret = ScRegenerateServerCert(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- c->Write(c, L"");
- c->Write(c, _UU("CM_CERT_SET_MSG"));
- c->Write(c, L"");
- FreeParamValueList(o);
- return 0;
- }
- // Enable / disable the VPN over ICMP / VPN over DNS server function
- UINT PsVpnOverIcmpDnsEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_SPECIAL_LISTENER t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"ICMP", CmdPrompt, _UU("CMD_VpnOverIcmpDnsEnable_Prompt_ICMP"), CmdEvalNotEmpty, NULL},
- {"DNS", CmdPrompt, _UU("CMD_VpnOverIcmpDnsEnable_Prompt_DNS"), CmdEvalNotEmpty, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- t.VpnOverIcmpListener = GetParamYes(o, "ICMP");
- t.VpnOverDnsListener = GetParamYes(o, "DNS");
- // RPC call
- ret = ScSetSpecialListener(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Get current settings of VPN over ICMP / VPN over DNS server function
- UINT PsVpnOverIcmpDnsGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_SPECIAL_LISTENER t;
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // RPC call
- ret = ScGetSpecialListener(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- CT *ct = CtNewStandard();
- CtInsert(ct, _UU("CMD_VpnOverIcmpDnsGet_PRINT_ICMP"), _UU(t.VpnOverIcmpListener ? "SEC_YES" : "SEC_NO"));
- CtInsert(ct, _UU("CMD_VpnOverIcmpDnsGet_PRINT_DNS"), _UU(t.VpnOverDnsListener ? "SEC_YES" : "SEC_NO"));
- CtFree(ct, c);
- }
- FreeParamValueList(o);
- return 0;
- }
- // Enable / disable the VPN Azure function
- UINT PsVpnAzureSetEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_AZURE_STATUS t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[yes|no]", CmdPrompt, _UU("VpnAzureSetEnable_PROMPT"), CmdEvalNotEmpty, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- t.IsEnabled = GetParamYes(o, "[yes|no]");
- // RPC call
- ret = ScSetAzureStatus(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Get the current state of the VPN Azure function
- UINT PsVpnAzureGetStatus(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_AZURE_STATUS t;
- DDNS_CLIENT_STATUS t2;
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- Zero(&t2, sizeof(t2));
- // RPC call
- ret = ScGetAzureStatus(ps->Rpc, &t);
- if (ret == ERR_NO_ERROR)
- {
- ret = ScGetDDnsClientStatus(ps->Rpc, &t2);
- }
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- CT *ct = CtNewStandard();
- CtInsert(ct, _UU("CMD_VpnAzureGetStatus_PRINT_ENABLED"), _UU(t.IsEnabled ? "SEC_YES" : "SEC_NO"));
- if (t.IsEnabled)
- {
- wchar_t tmp[MAX_SIZE];
- UniFormat(tmp, sizeof(tmp), L"%S%S", t2.CurrentHostName, AZURE_DOMAIN_SUFFIX);
- CtInsert(ct, _UU("CMD_VpnAzureGetStatus_PRINT_CONNECTED"), _UU(t.IsConnected ? "SEC_YES" : "SEC_NO"));
- CtInsert(ct, _UU("CMD_VpnAzureGetStatus_PRINT_HOSTNAME"), tmp);
- }
- CtFree(ct, c);
- }
- FreeParamValueList(o);
- return 0;
- }
- // Get the current state of the dynamic DNS function
- UINT PsDynamicDnsGetStatus(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- DDNS_CLIENT_STATUS t;
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // RPC call
- ret = ScGetDDnsClientStatus(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- else
- {
- CT *ct = CtNewStandard();
- wchar_t tmp[MAX_SIZE];
- // FQDN
- if (IsEmptyStr(t.CurrentFqdn) == false)
- {
- StrToUni(tmp, sizeof(tmp), t.CurrentFqdn);
- }
- else
- {
- UniStrCpy(tmp, sizeof(tmp), _UU("SM_DDNS_FQDN_EMPTY"));
- }
- CtInsert(ct, _UU("CMD_DynamicDnsGetStatus_PRINT_FQDN"), tmp);
- // Hostname
- if (IsEmptyStr(t.CurrentHostName) == false)
- {
- StrToUni(tmp, sizeof(tmp), t.CurrentHostName);
- }
- else
- {
- UniStrCpy(tmp, sizeof(tmp), _UU("SM_DDNS_FQDN_EMPTY"));
- }
- CtInsert(ct, _UU("CMD_DynamicDnsGetStatus_PRINT_HOSTNAME"), tmp);
- // Suffix
- if (IsEmptyStr(t.DnsSuffix) == false)
- {
- StrToUni(tmp, sizeof(tmp), t.DnsSuffix);
- }
- else
- {
- UniStrCpy(tmp, sizeof(tmp), _UU("SM_DDNS_FQDN_EMPTY"));
- }
- CtInsert(ct, _UU("CMD_DynamicDnsGetStatus_PRINT_SUFFIX"), tmp);
- // IPv4
- if (t.Err_IPv4 == ERR_NO_ERROR)
- {
- StrToUni(tmp, sizeof(tmp), t.CurrentIPv4);
- }
- else
- {
- UniStrCpy(tmp, sizeof(tmp), _E(t.Err_IPv4));
- }
- CtInsert(ct, _UU("CMD_DynamicDnsGetStatus_PRINT_IPv4"), tmp);
- // IPv6
- if (t.Err_IPv6 == ERR_NO_ERROR)
- {
- StrToUni(tmp, sizeof(tmp), t.CurrentIPv6);
- }
- else
- {
- UniStrCpy(tmp, sizeof(tmp), _E(t.Err_IPv6));
- }
- CtInsert(ct, _UU("CMD_DynamicDnsGetStatus_PRINT_IPv6"), tmp);
- CtFree(ct, c);
- }
- FreeParamValueList(o);
- return 0;
- }
- // Configure the dynamic DNS host name
- UINT PsDynamicDnsSetHostname(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_TEST t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[hostname]", CmdPrompt, _UU("CMD_DynamicDnsSetHostname_Prompt_hostname"), CmdEvalNotEmpty, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.StrValue, sizeof(t.StrValue), GetParamStr(o, "[hostname]"));
- // RPC call
- ret = ScChangeDDnsClientHostname(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Register a new license key
- UINT PsLicenseAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_TEST t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[key]", CmdPrompt, _UU("CMD_LicenseAdd_Prompt_Key"), CmdEvalNotEmpty, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- StrCpy(t.StrValue, sizeof(t.StrValue), GetParamStr(o, "[key]"));
- // RPC call
- ret = ScAddLicenseKey(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Delete the registered license
- UINT PsLicenseDel(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_TEST t;
- // Parameter list that can be specified
- PARAM args[] =
- {
- // "name", prompt_proc, prompt_param, eval_proc, eval_param
- {"[id]", CmdPrompt, _UU("CMD_LicenseDel_Prompt_ID"), CmdEvalNotEmpty, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- t.IntValue = GetParamInt(o, "[id]");
- // RPC call
- ret = ScDelLicenseKey(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Get the registered license list
- UINT PsLicenseList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_ENUM_LICENSE_KEY t;
- CT *ct;
- UINT i;
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- // RPC call
- ret = ScEnumLicenseKey(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- ct = CtNew();
- CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_1"), false);
- CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_2"), false);
- CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_3"), false);
- CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_4"), false);
- CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_5"), false);
- CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_6"), false);
- CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_7"), false);
- CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_8"), false);
- CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_9"), false);
- for (i = 0;i < t.NumItem;i++)
- {
- wchar_t tmp1[32], tmp2[LICENSE_KEYSTR_LEN + 1], tmp3[LICENSE_MAX_PRODUCT_NAME_LEN + 1],
- *tmp4, tmp5[128], tmp6[LICENSE_LICENSEID_STR_LEN + 1], tmp7[64],
- tmp8[64], tmp9[64];
- RPC_ENUM_LICENSE_KEY_ITEM *e = &t.Items[i];
- UniToStru(tmp1, e->Id);
- StrToUni(tmp2, sizeof(tmp2), e->LicenseKey);
- StrToUni(tmp3, sizeof(tmp3), e->LicenseName);
- tmp4 = LiGetLicenseStatusStr(e->Status);
- if (e->Expires == 0)
- {
- UniStrCpy(tmp5, sizeof(tmp5), _UU("SM_LICENSE_NO_EXPIRES"));
- }
- else
- {
- GetDateStrEx64(tmp5, sizeof(tmp5), e->Expires, NULL);
- }
- StrToUni(tmp6, sizeof(tmp6), e->LicenseId);
- UniToStru(tmp7, e->ProductId);
- UniFormat(tmp8, sizeof(tmp8), L"%I64u", e->SystemId);
- UniToStru(tmp9, e->SerialId);
- CtInsert(ct,
- tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9);
- }
- CtFreeEx(ct, c, true);
- FreeRpcEnumLicenseKey(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Get the license status of the current VPN Server
- UINT PsLicenseStatus(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret = 0;
- RPC_LICENSE_STATUS st;
- CT *ct;
- wchar_t tmp[MAX_SIZE];
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&st, sizeof(st));
- // RPC call
- ret = ScGetLicenseStatus(ps->Rpc, &st);
- if (ret != ERR_NO_ERROR)
- {
- // An error has occured
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- ct = CtNewStandard();
- if (st.EditionId == LICENSE_EDITION_VPN3_NO_LICENSE)
- {
- CtInsert(ct, _UU("SM_NO_LICENSE_COLUMN"), _UU("SM_NO_LICENSE"));
- }
- else
- {
- // Product edition name
- StrToUni(tmp, sizeof(tmp), st.EditionStr);
- CtInsert(ct, _UU("SM_LICENSE_STATUS_EDITION"), tmp);
- // Release date
- if (st.ReleaseDate != 0)
- {
- GetDateStrEx64(tmp, sizeof(tmp), st.ReleaseDate, NULL);
- CtInsert(ct, _UU("SM_LICENSE_STATUS_RELEASE"), tmp);
- }
- // Current system ID
- UniFormat(tmp, sizeof(tmp), L"%I64u", st.SystemId);
- CtInsert(ct, _UU("SM_LICENSE_STATUS_SYSTEM_ID"), tmp);
- // Expiration date of the current license product
- if (st.SystemExpires == 0)
- {
- UniStrCpy(tmp, sizeof(tmp), _UU("SM_LICENSE_NO_EXPIRES"));
- }
- else
- {
- GetDateStrEx64(tmp, sizeof(tmp), st.SystemExpires, NULL);
- }
- CtInsert(ct, _UU("SM_LICENSE_STATUS_EXPIRES"), tmp);
- // Subscription (support) contract
- if (st.NeedSubscription == false)
- {
- UniStrCpy(tmp, sizeof(tmp), _UU("SM_LICENSE_STATUS_SUBSCRIPTION_NONEED"));
- }
- else
- {
- if (st.SubscriptionExpires == 0)
- {
- UniStrCpy(tmp, sizeof(tmp), _UU("SM_LICENSE_STATUS_SUBSCRIPTION_NONE"));
- }
- else
- {
- wchar_t dtstr[MAX_PATH];
- GetDateStrEx64(dtstr, sizeof(dtstr), st.SubscriptionExpires, NULL);
- UniFormat(tmp, sizeof(tmp),
- st.IsSubscriptionExpired ? _UU("SM_LICENSE_STATUS_SUBSCRIPTION_EXPIRED") : _UU("SM_LICENSE_STATUS_SUBSCRIPTION_VALID"),
- dtstr);
- }
- }
- CtInsert(ct, _UU("SM_LICENSE_STATUS_SUBSCRIPTION"), tmp);
- if (st.NeedSubscription == false && st.SubscriptionExpires != 0)
- {
- wchar_t dtstr[MAX_PATH];
- GetDateStrEx64(dtstr, sizeof(dtstr), st.SubscriptionExpires, NULL);
- CtInsert(ct, _UU("SM_LICENSE_STATUS_SUBSCRIPTION_BUILD_STR"), tmp);
- }
- if (GetCapsBool(ps->CapsList, "b_vpn3"))
- {
- // Maximum creatable number of users
- if (st.NumClientConnectLicense == INFINITE)
- {
- UniStrCpy(tmp, sizeof(tmp), _UU("SM_LICENSE_INFINITE"));
- }
- else
- {
- UniToStru(tmp, st.NumClientConnectLicense);
- }
- CtInsert(ct, _UU("SM_LICENSE_NUM_CLIENT"), tmp);
- }
- // Available number of concurrent client connections
- if (st.NumBridgeConnectLicense == INFINITE)
- {
- UniStrCpy(tmp, sizeof(tmp), _UU("SM_LICENSE_INFINITE"));
- }
- else
- {
- UniToStru(tmp, st.NumBridgeConnectLicense);
- }
- CtInsert(ct, _UU("SM_LICENSE_NUM_BRIDGE"), tmp);
- // Availability of enterprise features
- CtInsert(ct, _UU("SM_LICENSE_STATUS_ENTERPRISE"),
- st.AllowEnterpriseFunction ? _UU("SM_LICENSE_STATUS_ENTERPRISE_YES") : _UU("SM_LICENSE_STATUS_ENTERPRISE_NO"));
- }
- CtFreeEx(ct, c, false);
- FreeParamValueList(o);
- return 0;
- }
- // Get the cluster configuration
- UINT PsClusterSettingGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret;
- RPC_FARM t;
- CT *ct;
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- ret = ScGetFarmSetting(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- if (t.Weight == 0)
- {
- t.Weight = FARM_DEFAULT_WEIGHT;
- }
- // Show the cluster configuration
- ct = CtNewStandard();
- CtInsert(ct, _UU("CMD_ClusterSettingGet_Current"),
- GetServerTypeStr(t.ServerType));
- if (t.ServerType == SERVER_TYPE_FARM_CONTROLLER)
- {
- CtInsert(ct, _UU("CMD_ClusterSettingGet_ControllerOnly"), t.ControllerOnly ? _UU("SEC_YES") : _UU("SEC_NO"));
- }
- if (t.ServerType != SERVER_TYPE_STANDALONE)
- {
- wchar_t tmp[MAX_SIZE];
- UniToStru(tmp, t.Weight);
- CtInsert(ct, _UU("CMD_ClusterSettingGet_Weight"), tmp);
- }
- if (t.ServerType == SERVER_TYPE_FARM_MEMBER)
- {
- wchar_t tmp[MAX_SIZE];
- UINT i;
- // Public IP address
- if (t.PublicIp != 0)
- {
- IPToUniStr32(tmp, sizeof(tmp), t.PublicIp);
- }
- else
- {
- UniStrCpy(tmp, sizeof(tmp), _UU("CMD_ClusterSettingGet_None"));
- }
- CtInsert(ct, _UU("CMD_ClusterSettingGet_PublicIp"), tmp);
- // Public port list
- tmp[0] = 0;
- for (i = 0;i < t.NumPort;i++)
- {
- wchar_t tmp2[64];
- UniFormat(tmp2, sizeof(tmp2), L"%u, ", t.Ports[i]);
- UniStrCat(tmp, sizeof(tmp), tmp2);
- }
- if (UniEndWith(tmp, L", "))
- {
- tmp[UniStrLen(tmp) - 2] = 0;
- }
- CtInsert(ct, _UU("CMD_ClusterSettingGet_PublicPorts"), tmp);
- // Controller to connect
- UniFormat(tmp, sizeof(tmp), L"%S:%u", t.ControllerName, t.ControllerPort);
- CtInsert(ct, _UU("CMD_ClusterSettingGet_Controller"), tmp);
- }
- CtFree(ct, c);
- FreeRpcFarm(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Set the server password
- UINT PsServerPasswordSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret;
- RPC_SET_PASSWORD t;
- char *pw;
- PARAM args[] =
- {
- {"[password]", CmdPromptChoosePassword, NULL, NULL, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- pw = GetParamStr(o, "[password]");
- Zero(&t, sizeof(t));
- Hash(t.HashedPassword, pw, StrLen(pw), true);
- ret = ScSetServerPassword(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Password decision prompt (for Prompt function)
- wchar_t *CmdPromptChoosePassword(CONSOLE *c, void *param)
- {
- char *s;
- // Validate arguments
- if (c == NULL)
- {
- return NULL;
- }
- s = CmdPasswordPrompt(c);
- if (s == NULL)
- {
- return NULL;
- }
- else
- {
- wchar_t *ret = CopyStrToUni(s);
- Free(s);
- return ret;
- }
- }
- // Password input prompt (general-purpose)
- char *CmdPasswordPrompt(CONSOLE *c)
- {
- char *pw1, *pw2;
- // Validate arguments
- if (c == NULL)
- {
- return NULL;
- }
- c->Write(c, _UU("CMD_VPNCMD_PWPROMPT_0"));
- RETRY:
- c->Write(c, L"");
- pw1 = c->ReadPassword(c, _UU("CMD_VPNCMD_PWPROMPT_1"));
- if (pw1 == NULL)
- {
- return NULL;
- }
- pw2 = c->ReadPassword(c, _UU("CMD_VPNCMD_PWPROMPT_2"));
- if (pw2 == NULL)
- {
- Free(pw1);
- return NULL;
- }
- c->Write(c, L"");
- if (StrCmp(pw1, pw2) != 0)
- {
- Free(pw1);
- Free(pw2);
- c->Write(c, _UU("CMD_VPNCMD_PWPROMPT_3"));
- goto RETRY;
- }
- Free(pw1);
- return pw2;
- }
- // Disable the listener
- UINT PsListenerDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret;
- RPC_LISTENER t;
- PARAM args[] =
- {
- {"[port]", CmdPromptPort, _UU("CMD_ListenerDisable_PortPrompt"), CmdEvalPort, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- t.Enable = false;
- t.Port = ToInt(GetParamStr(o, "[port]"));
- ret = ScEnableListener(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Enable the listener
- UINT PsListenerEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret;
- RPC_LISTENER t;
- PARAM args[] =
- {
- {"[port]", CmdPromptPort, _UU("CMD_ListenerEnable_PortPrompt"), CmdEvalPort, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- t.Enable = true;
- t.Port = ToInt(GetParamStr(o, "[port]"));
- ret = ScEnableListener(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Draw a row of console table
- void CtPrintRow(CONSOLE *c, UINT num, UINT *widths, wchar_t **strings, bool *rights, char separate_char)
- {
- UINT i;
- wchar_t *buf;
- UINT buf_size;
- bool is_sep_line = true;
- // Validate arguments
- if (c == NULL || num == 0 || widths == NULL || strings == NULL || rights == NULL)
- {
- return;
- }
- buf_size = 32;
- for (i = 0;i < num;i++)
- {
- buf_size += sizeof(wchar_t) * widths[i] + 6;
- }
- buf = ZeroMalloc(buf_size);
- for (i = 0;i < num;i++)
- {
- char *tmp;
- wchar_t *space_string;
- UINT w;
- UINT space = 0;
- wchar_t *string = strings[i];
- wchar_t *tmp_line = NULL;
- if (UniStrCmpi(string, L"---") == 0)
- {
- char *s = MakeCharArray('-', widths[i]);
- tmp_line = string = CopyStrToUni(s);
- Free(s);
- }
- else
- {
- is_sep_line = false;
- }
- w = UniStrWidth(string);
- if (widths[i] >= w)
- {
- space = widths[i] - w;
- }
- tmp = MakeCharArray(' ', space);
- space_string = CopyStrToUni(tmp);
- if (rights[i] != false)
- {
- UniStrCat(buf, buf_size, space_string);
- }
- UniStrCat(buf, buf_size, string);
- if (rights[i] == false)
- {
- UniStrCat(buf, buf_size, space_string);
- }
- Free(space_string);
- Free(tmp);
- if (i < (num - 1))
- {
- wchar_t tmp[4];
- char str[2];
- if (UniStrCmpi(strings[i], L"---") == 0)
- {
- str[0] = '+';
- }
- else
- {
- str[0] = separate_char;
- }
- str[1] = 0;
- StrToUni(tmp, sizeof(tmp), str);
- UniStrCat(buf, buf_size, tmp);
- }
- if (tmp_line != NULL)
- {
- Free(tmp_line);
- }
- }
- UniTrimRight(buf);
- if (is_sep_line)
- {
- if (UniStrLen(buf) > (c->GetWidth(c) - 1))
- {
- buf[c->GetWidth(c) - 1] = 0;
- }
- }
- c->Write(c, buf);
- Free(buf);
- }
- // Draw the console table in standard format
- void CtPrintStandard(CT *ct, CONSOLE *c)
- {
- CT *t;
- UINT i, j;
- // Validate arguments
- if (ct == NULL || c == NULL)
- {
- return;
- }
- t = CtNewStandard();
- for (i = 0;i < LIST_NUM(ct->Rows);i++)
- {
- CTR *row = LIST_DATA(ct->Rows, i);
- for (j = 0;j < LIST_NUM(ct->Columns);j++)
- {
- CTC *column = LIST_DATA(ct->Columns, j);
- CtInsert(t, column->String, row->Strings[j]);
- }
- if (i != (LIST_NUM(ct->Rows) - 1))
- {
- CtInsert(t, L"---", L"---");
- }
- }
- CtFree(t, c);
- }
- // Draw the console table
- void CtPrint(CT *ct, CONSOLE *c)
- {
- UINT *widths;
- UINT num;
- UINT i, j;
- wchar_t **header_strings;
- bool *rights;
- // Validate arguments
- if (ct == NULL || c == NULL)
- {
- return;
- }
- num = LIST_NUM(ct->Columns);
- widths = ZeroMalloc(sizeof(UINT) * num);
- // Calculate the maximum character width of each column
- for (i = 0;i < num;i++)
- {
- CTC *ctc = LIST_DATA(ct->Columns, i);
- UINT w;
- w = UniStrWidth(ctc->String);
- widths[i] = MAX(widths[i], w);
- }
- for (j = 0;j < LIST_NUM(ct->Rows);j++)
- {
- CTR *ctr = LIST_DATA(ct->Rows, j);
- for (i = 0;i < num;i++)
- {
- UINT w;
- w = UniStrWidth(ctr->Strings[i]);
- widths[i] = MAX(widths[i], w);
- }
- }
- // Display the header part
- header_strings = ZeroMalloc(sizeof(wchar_t *) * num);
- rights = ZeroMalloc(sizeof(bool) * num);
- for (i = 0;i < num;i++)
- {
- CTC *ctc = LIST_DATA(ct->Columns, i);
- header_strings[i] = ctc->String;
- rights[i] = ctc->Right;
- }
- CtPrintRow(c, num, widths, header_strings, rights, '|');
- for (i = 0;i < num;i++)
- {
- char *s;
- s = MakeCharArray('-', widths[i]);
- header_strings[i] = CopyStrToUni(s);
- Free(s);
- }
- CtPrintRow(c, num, widths, header_strings, rights, '+');
- for (i = 0;i < num;i++)
- {
- Free(header_strings[i]);
- }
- // Display the data part
- for (j = 0;j < LIST_NUM(ct->Rows);j++)
- {
- CTR *ctr = LIST_DATA(ct->Rows, j);
- CtPrintRow(c, num, widths, ctr->Strings, rights, '|');
- }
- Free(rights);
- Free(header_strings);
- Free(widths);
- }
- // Escape the meta-characters in CSV
- void CtEscapeCsv(wchar_t *dst, UINT size, wchar_t *src){
- UINT i;
- UINT len = UniStrLen(src);
- UINT idx;
- BOOL need_to_escape = false;
- wchar_t tmp[2]=L"*";
- // Check the input value
- if (src==NULL || dst==NULL)
- {
- return;
- }
- // If there is no character that need to be escaped in the input characters, copy it to the output
- len = UniStrLen(src);
- for (i=0; i<len; i++)
- {
- tmp[0] = src[i];
- if (tmp[0] == L","[0] || tmp[0] == L"\n"[0] || tmp[0] == L"\""[0])
- {
- need_to_escape = true;
- }
- }
- if (need_to_escape == false)
- {
- UniStrCpy(dst,size,src);
- return;
- }
- // If it contains meta characters (newline, comma, double quote), enclose with "
- UniStrCpy(dst, size, L"\"");
- idx = UniStrLen(dst);
- if(idx<size-1)
- {
- for (i=0; i<len; i++)
- {
- tmp[0] = src[i];
- // Convert " to "" in contents(MS-Excel method)
- if (tmp[0] == L"\""[0])
- {
- UniStrCat(dst, size, tmp);
- }
- UniStrCat(dst, size, tmp);
- }
- }
- UniStrCat(dst, size, L"\"");
- return;
- }
- // Show a CSV format of console table
- void CtPrintCsv(CT *ct, CONSOLE *c)
- {
- UINT i, j;
- UINT num_columns = LIST_NUM(ct->Columns);
- wchar_t buf[MAX_SIZE*4];
- wchar_t fmtbuf[MAX_SIZE*4];
- // Show the heading row
- buf[0] = 0;
- for(i=0; i<num_columns; i++)
- {
- CTC *ctc = LIST_DATA(ct->Columns, i);
- CtEscapeCsv(fmtbuf, sizeof(fmtbuf), ctc->String);
- UniStrCat(buf, sizeof(buf), fmtbuf);
- if(i != num_columns-1)
- UniStrCat(buf, sizeof(buf), L",");
- }
- c->Write(c, buf);
- // Show the table body
- for(j=0; j<LIST_NUM(ct->Rows); j++)
- {
- CTR *ctr = LIST_DATA(ct->Rows, j);
- buf[0] = 0;
- for(i=0; i<num_columns; i++)
- {
- CtEscapeCsv(fmtbuf, sizeof(fmtbuf), ctr->Strings[i]);
- UniStrCat(buf, sizeof(buf), fmtbuf);
- if(i != num_columns-1)
- UniStrCat(buf, sizeof(buf), L",");
- }
- c->Write(c, buf);
- }
- }
- // Delete the console table
- void CtFreeEx(CT *ct, CONSOLE *c, bool standard_view)
- {
- UINT i, num;
- // Validate arguments
- if (ct == NULL)
- {
- return;
- }
- if (c != NULL)
- {
- if (c->ConsoleType == CONSOLE_CSV)
- {
- CtPrintCsv(ct, c);
- }
- else
- {
- if (standard_view == false)
- {
- CtPrint(ct, c);
- }
- else
- {
- CtPrintStandard(ct, c);
- }
- }
- }
- num = LIST_NUM(ct->Columns);
- for (i = 0;i < LIST_NUM(ct->Rows);i++)
- {
- UINT j;
- CTR *ctr = LIST_DATA(ct->Rows, i);
- for (j = 0;j < num;j++)
- {
- Free(ctr->Strings[j]);
- }
- Free(ctr->Strings);
- Free(ctr);
- }
- for (i = 0;i < LIST_NUM(ct->Columns);i++)
- {
- CTC *ctc = LIST_DATA(ct->Columns, i);
- Free(ctc->String);
- Free(ctc);
- }
- ReleaseList(ct->Columns);
- ReleaseList(ct->Rows);
- Free(ct);
- }
- void CtFree(CT *ct, CONSOLE *c)
- {
- CtFreeEx(ct, c, false);
- }
- // Add a row to the table
- void CtInsert(CT *ct, ...)
- {
- CTR *ctr;
- UINT num, i;
- va_list va;
- // Validate arguments
- if (ct == NULL)
- {
- return;
- }
- num = LIST_NUM(ct->Columns);
- va_start(va, ct);
- ctr = ZeroMalloc(sizeof(CTR));
- ctr->Strings = ZeroMalloc(sizeof(wchar_t *) * num);
- for (i = 0;i < num;i++)
- {
- wchar_t *s = va_arg(va, wchar_t *);
- ctr->Strings[i] = CopyUniStr(s);
- }
- va_end(va);
- Insert(ct->Rows, ctr);
- }
- // Add a column to the table
- void CtInsertColumn(CT *ct, wchar_t *str, bool right)
- {
- CTC *ctc;
- // Validate arguments
- if (ct == NULL)
- {
- return;
- }
- if (str == NULL)
- {
- str = L"";
- }
- ctc = ZeroMalloc(sizeof(CTC));
- ctc->String = CopyUniStr(str);
- ctc->Right = right;
- Insert(ct->Columns, ctc);
- }
- // Create a new console table
- CT *CtNew()
- {
- CT *ct;
- ct = ZeroMalloc(sizeof(CT));
- ct->Columns = NewList(NULL);
- ct->Rows = NewList(NULL);
- return ct;
- }
- // Add a standard column to a column in a table
- CT *CtNewStandard()
- {
- CT *ct = CtNew();
- CtInsertColumn(ct, _UU("CMD_CT_STD_COLUMN_1"), false);
- CtInsertColumn(ct, _UU("CMD_CT_STD_COLUMN_2"), false);
- return ct;
- }
- CT *CtNewStandardEx()
- {
- CT *ct = CtNew();
- CtInsertColumn(ct, _UU("CMD_CT_STD_COLUMN_1"), false);
- CtInsertColumn(ct, _UU("CMD_CT_STD_COLUMN_2"), false);
- CtInsertColumn(ct, _UU("CMD_CT_STD_COLUMN_3"), false);
- return ct;
- }
- // Get the TCP listener list
- UINT PsListenerList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret;
- RPC_LISTENER_LIST t;
- UINT i;
- CT *ct;
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- ret = ScEnumListener(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- ct = CtNew();
- CtInsertColumn(ct, _UU("CM_LISTENER_COLUMN_1"), false);
- CtInsertColumn(ct, _UU("CM_LISTENER_COLUMN_2"), false);
- for (i = 0;i < t.NumPort;i++)
- {
- wchar_t *status = _UU("CM_LISTENER_OFFLINE");
- wchar_t tmp[128];
- if (t.Errors[i])
- {
- status = _UU("CM_LISTENER_ERROR");
- }
- else if (t.Enables[i])
- {
- status = _UU("CM_LISTENER_ONLINE");
- }
- UniFormat(tmp, sizeof(tmp), _UU("CM_LISTENER_TCP_PORT"), t.Ports[i]);
- CtInsert(ct, tmp, status);
- }
- CtFree(ct, c);
- FreeRpcListenerList(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Delete the TCP listener
- UINT PsListenerDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret;
- RPC_LISTENER t;
- PARAM args[] =
- {
- {"[port]", CmdPromptPort, _UU("CMD_ListenerDelete_PortPrompt"), CmdEvalPort, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- t.Enable = true;
- t.Port = ToInt(GetParamStr(o, "[port]"));
- ret = ScDeleteListener(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // Draw a row
- void CmdPrintRow(CONSOLE *c, wchar_t *title, wchar_t *tag, ...)
- {
- wchar_t buf[MAX_SIZE * 2];
- wchar_t buf2[MAX_SIZE * 2];
- va_list args;
- // Validate arguments
- if (title == NULL || c == NULL || tag == NULL)
- {
- return;
- }
- va_start(args, tag);
- UniFormatArgs(buf, sizeof(buf), tag, args);
- UniFormat(buf2, sizeof(buf2), L"[%s] %s", title, buf);
- va_end(args);
- c->Write(c, buf2);
- }
- // ServerInfoGet command
- UINT PsServerInfoGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret;
- RPC_SERVER_INFO t;
- CT *ct;
- wchar_t tmp[MAX_SIZE];
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- ret = ScGetServerInfo(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- ct = CtNew();
- CtInsertColumn(ct, _UU("SM_STATUS_COLUMN_1"), false);
- CtInsertColumn(ct, _UU("SM_STATUS_COLUMN_2"), false);
- // Product name
- StrToUni(tmp, sizeof(tmp), t.ServerProductName);
- CtInsert(ct, _UU("SM_INFO_PRODUCT_NAME"), tmp);
- // Version
- StrToUni(tmp, sizeof(tmp), t.ServerVersionString);
- CtInsert(ct, _UU("SM_INFO_VERSION"), tmp);
- // Build
- StrToUni(tmp, sizeof(tmp), t.ServerBuildInfoString);
- CtInsert(ct, _UU("SM_INFO_BUILD"), tmp);
- // Host name
- StrToUni(tmp, sizeof(tmp), t.ServerHostName);
- CtInsert(ct, _UU("SM_INFO_HOSTNAME"), tmp);
- // Type
- CtInsert(ct, _UU("SM_ST_SERVER_TYPE"), GetServerTypeStr(t.ServerType));
- // OS
- StrToUni(tmp, sizeof(tmp), t.OsInfo.OsSystemName);
- CtInsert(ct, _UU("SM_OS_SYSTEM_NAME"), tmp);
- StrToUni(tmp, sizeof(tmp), t.OsInfo.OsProductName);
- CtInsert(ct, _UU("SM_OS_PRODUCT_NAME"), tmp);
- if (t.OsInfo.OsServicePack != 0)
- {
- UniFormat(tmp, sizeof(tmp), _UU("SM_OS_SP_TAG"), t.OsInfo.OsServicePack);
- CtInsert(ct, _UU("SM_OS_SERVICE_PACK"), tmp);
- }
- StrToUni(tmp, sizeof(tmp), t.OsInfo.OsVendorName);
- CtInsert(ct, _UU("SM_OS_VENDER_NAME"), tmp);
- StrToUni(tmp, sizeof(tmp), t.OsInfo.OsVersion);
- CtInsert(ct, _UU("SM_OS_VERSION"), tmp);
- StrToUni(tmp, sizeof(tmp), t.OsInfo.KernelName);
- CtInsert(ct, _UU("SM_OS_KERNEL_NAME"), tmp);
- StrToUni(tmp, sizeof(tmp), t.OsInfo.KernelVersion);
- CtInsert(ct, _UU("SM_OS_KERNEL_VERSION"), tmp);
- CtFree(ct, c);
- FreeRpcServerInfo(&t);
- FreeParamValueList(o);
- return 0;
- }
- // Get the string for type of the HUB
- wchar_t *GetHubTypeStr(UINT type)
- {
- if (type == HUB_TYPE_FARM_STATIC)
- {
- return _UU("SM_HUB_STATIC");
- }
- else if (type == HUB_TYPE_FARM_DYNAMIC)
- {
- return _UU("SM_HUB_DYNAMIC");
- }
- return _UU("SM_HUB_STANDALONE");
- }
- // Get a string of the type of server
- wchar_t *GetServerTypeStr(UINT type)
- {
- if (type == SERVER_TYPE_FARM_CONTROLLER)
- {
- return _UU("SM_FARM_CONTROLLER");
- }
- else if (type == SERVER_TYPE_FARM_MEMBER)
- {
- return _UU("SM_FARM_MEMBER");
- }
- return _UU("SM_SERVER_STANDALONE");
- }
- // ServerStatusGet command
- UINT PsServerStatusGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret;
- RPC_SERVER_STATUS t;
- wchar_t tmp[MAX_PATH];
- char tmp2[MAX_PATH];
- CT *ct;
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- ret = ScGetServerStatus(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- ct = CtNew();
- CtInsertColumn(ct, _UU("SM_STATUS_COLUMN_1"), false);
- CtInsertColumn(ct, _UU("SM_STATUS_COLUMN_2"), false);
- // Type of server
- CtInsert(ct, _UU("SM_ST_SERVER_TYPE"),
- t.ServerType == SERVER_TYPE_STANDALONE ? _UU("SM_SERVER_STANDALONE") :
- t.ServerType == SERVER_TYPE_FARM_MEMBER ? _UU("SM_FARM_MEMBER") : _UU("SM_FARM_CONTROLLER"));
- // Number of TCP connections
- UniToStru(tmp, t.NumTcpConnections);
- CtInsert(ct, _UU("SM_ST_NUM_TCP"), tmp);
- if (t.ServerType == SERVER_TYPE_FARM_CONTROLLER)
- {
- // Number of local TCP connections
- UniToStru(tmp, t.NumTcpConnectionsLocal);
- CtInsert(ct, _UU("SM_ST_NUM_TCP_LOCAL"), tmp);
- // Number of remote TCP connections
- UniToStru(tmp, t.NumTcpConnectionsRemote);
- CtInsert(ct, _UU("SM_ST_NUM_TCP_REMOTE"), tmp);
- }
- // Number of Virtual HUBs
- UniToStru(tmp, t.NumHubTotal);
- CtInsert(ct, _UU("SM_ST_NUM_HUB_TOTAL"), tmp);
- if (t.ServerType != SERVER_TYPE_STANDALONE)
- {
- // Number of static HUBs
- UniToStru(tmp, t.NumHubStatic);
- CtInsert(ct, _UU("SM_ST_NUM_HUB_STATIC"), tmp);
- // Number of dynamic HUBs
- UniToStru(tmp, t.NumHubDynamic);
- CtInsert(ct, _UU("SM_ST_NUM_HUB_DYNAMIC"), tmp);
- }
- // Number of sessions
- UniToStru(tmp, t.NumSessionsTotal);
- CtInsert(ct, _UU("SM_ST_NUM_SESSION_TOTAL"), tmp);
- if (t.ServerType == SERVER_TYPE_FARM_CONTROLLER)
- {
- // Number of local sessions
- UniToStru(tmp, t.NumSessionsLocal);
- CtInsert(ct, _UU("SM_ST_NUM_SESSION_LOCAL"), tmp);
- // Number of remote sessions
- UniToStru(tmp, t.NumSessionsRemote);
- CtInsert(ct, _UU("SM_ST_NUM_SESSION_REMOTE"), tmp);
- }
- // Number of MAC tables
- UniToStru(tmp, t.NumMacTables);
- CtInsert(ct, _UU("SM_ST_NUM_MAC_TABLE"), tmp);
- // Number of IP tables
- UniToStru(tmp, t.NumIpTables);
- CtInsert(ct, _UU("SM_ST_NUM_IP_TABLE"), tmp);
- // Number of users
- UniToStru(tmp, t.NumUsers);
- CtInsert(ct, _UU("SM_ST_NUM_USERS"), tmp);
- // Number of groups
- UniToStru(tmp, t.NumGroups);
- CtInsert(ct, _UU("SM_ST_NUM_GROUPS"), tmp);
- // Number of assigned licenses
- UniToStru(tmp, t.AssignedClientLicenses);
- CtInsert(ct, _UU("SM_ST_CLIENT_LICENSE"), tmp);
- UniToStru(tmp, t.AssignedBridgeLicenses);
- CtInsert(ct, _UU("SM_ST_BRIDGE_LICENSE"), tmp);
- if (t.ServerType == SERVER_TYPE_FARM_CONTROLLER)
- {
- UniToStru(tmp, t.AssignedClientLicensesTotal);
- CtInsert(ct, _UU("SM_ST_CLIENT_LICENSE_EX"), tmp);
- UniToStru(tmp, t.AssignedBridgeLicensesTotal);
- CtInsert(ct, _UU("SM_ST_BRIDGE_LICENSE_EX"), tmp);
- }
- // Traffic
- CmdInsertTrafficInfo(ct, &t.Traffic);
- // Server start-up time
- GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.StartTime), NULL);
- CtInsert(ct, _UU("SM_ST_START_TIME"), tmp);
- // Current time
- GetDateTimeStrMilli64(tmp2, sizeof(tmp2), SystemToLocal64(t.CurrentTime));
- StrToUni(tmp, sizeof(tmp), tmp2);
- CtInsert(ct, _UU("SM_ST_CURRENT_TIME"), tmp);
- // Tick value
- UniFormat(tmp, sizeof(tmp), L"%I64u", t.CurrentTick);
- CtInsert(ct, _UU("SM_ST_CURRENT_TICK"), tmp);
- // Memory information
- if (t.MemInfo.TotalMemory != 0)
- {
- char vv[128];
- ToStr3(vv, sizeof(vv), t.MemInfo.TotalMemory);
- UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
- CtInsert(ct, _UU("SM_ST_TOTAL_MEMORY"), tmp);
- ToStr3(vv, sizeof(vv), t.MemInfo.UsedMemory);
- UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
- CtInsert(ct, _UU("SM_ST_USED_MEMORY"), tmp);
- ToStr3(vv, sizeof(vv), t.MemInfo.FreeMemory);
- UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
- CtInsert(ct, _UU("SM_ST_FREE_MEMORY"), tmp);
- ToStr3(vv, sizeof(vv), t.MemInfo.TotalPhys);
- UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
- CtInsert(ct, _UU("SM_ST_TOTAL_PHYS"), tmp);
- ToStr3(vv, sizeof(vv), t.MemInfo.UsedPhys);
- UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
- CtInsert(ct, _UU("SM_ST_USED_PHYS"), tmp);
- ToStr3(vv, sizeof(vv), t.MemInfo.FreePhys);
- UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
- CtInsert(ct, _UU("SM_ST_FREE_PHYS"), tmp);
- }
- CtFree(ct, c);
- FreeParamValueList(o);
- return 0;
- }
- // Add traffic information to LVB
- void CmdInsertTrafficInfo(CT *ct, TRAFFIC *t)
- {
- wchar_t tmp[MAX_SIZE];
- char vv[128];
- // Validate arguments
- if (ct == NULL || t == NULL)
- {
- return;
- }
- // Transmission information
- ToStr3(vv, sizeof(vv), t->Send.UnicastCount);
- UniFormat(tmp, sizeof(tmp), _UU("SM_ST_NUM_PACKET_STR"), vv);
- CtInsert(ct, _UU("SM_ST_SEND_UCAST_NUM"), tmp);
- ToStr3(vv, sizeof(vv), t->Send.UnicastBytes);
- UniFormat(tmp, sizeof(tmp), _UU("SM_ST_SIZE_BYTE_STR"), vv);
- CtInsert(ct, _UU("SM_ST_SEND_UCAST_SIZE"), tmp);
- ToStr3(vv, sizeof(vv), t->Send.BroadcastCount);
- UniFormat(tmp, sizeof(tmp), _UU("SM_ST_NUM_PACKET_STR"), vv);
- CtInsert(ct, _UU("SM_ST_SEND_BCAST_NUM"), tmp);
- ToStr3(vv, sizeof(vv), t->Send.BroadcastBytes);
- UniFormat(tmp, sizeof(tmp), _UU("SM_ST_SIZE_BYTE_STR"), vv);
- CtInsert(ct, _UU("SM_ST_SEND_BCAST_SIZE"), tmp);
- // Reception information
- ToStr3(vv, sizeof(vv), t->Recv.UnicastCount);
- UniFormat(tmp, sizeof(tmp), _UU("SM_ST_NUM_PACKET_STR"), vv);
- CtInsert(ct, _UU("SM_ST_RECV_UCAST_NUM"), tmp);
- ToStr3(vv, sizeof(vv), t->Recv.UnicastBytes);
- UniFormat(tmp, sizeof(tmp), _UU("SM_ST_SIZE_BYTE_STR"), vv);
- CtInsert(ct, _UU("SM_ST_RECV_UCAST_SIZE"), tmp);
- ToStr3(vv, sizeof(vv), t->Recv.BroadcastCount);
- UniFormat(tmp, sizeof(tmp), _UU("SM_ST_NUM_PACKET_STR"), vv);
- CtInsert(ct, _UU("SM_ST_RECV_BCAST_NUM"), tmp);
- ToStr3(vv, sizeof(vv), t->Recv.BroadcastBytes);
- UniFormat(tmp, sizeof(tmp), _UU("SM_ST_SIZE_BYTE_STR"), vv);
- CtInsert(ct, _UU("SM_ST_RECV_BCAST_SIZE"), tmp);
- }
- // Input a port number
- wchar_t *CmdPromptPort(CONSOLE *c, void *param)
- {
- wchar_t *prompt_str;
- if (param != NULL)
- {
- prompt_str = (wchar_t *)param;
- }
- else
- {
- prompt_str = _UU("CMD_PROPMT_PORT");
- }
- return c->ReadLine(c, prompt_str, true);
- }
- // Verify the port number
- bool CmdEvalPort(CONSOLE *c, wchar_t *str, void *param)
- {
- UINT i;
- // Validate arguments
- if (c == NULL || str == NULL)
- {
- return false;
- }
- i = UniToInt(str);
- if (i >= 1 && i <= 65535)
- {
- return true;
- }
- c->Write(c, _UU("CMD_EVAL_PORT"));
- return false;
- }
- // ListenerCreate command
- UINT PsListenerCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- PS *ps = (PS *)param;
- UINT ret;
- RPC_LISTENER t;
- PARAM args[] =
- {
- {"[port]", CmdPromptPort, _UU("CMD_ListenerCreate_PortPrompt"), CmdEvalPort, NULL},
- };
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- Zero(&t, sizeof(t));
- t.Enable = true;
- t.Port = ToInt(GetParamStr(o, "[port]"));
- ret = ScCreateListener(ps->Rpc, &t);
- if (ret != ERR_NO_ERROR)
- {
- CmdPrintError(c, ret);
- FreeParamValueList(o);
- return ret;
- }
- FreeParamValueList(o);
- return 0;
- }
- // About command
- UINT PsAbout(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- BUF *b;
- o = ParseCommandList(c, cmd_name, str, NULL, 0);
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- b = ReadDump("|legal.txt");
- CmdPrintAbout(c);
- c->Write(c, L"\r\n");
- if (b != NULL)
- {
- wchar_t *s;
- SeekBufToEnd(b);
- WriteBufChar(b, 13);
- WriteBufChar(b, 10);
- WriteBufChar(b, 0);
- s = CopyUtfToUni(b->Buf);
- c->Write(c, s);
- Free(s);
- }
- // Display the version information
- c->Write(c, _UU("D_ABOUT@S_INFO3"));
- c->Write(c, L"\r\n");
- c->Write(c, _UU("D_ABOUT@S_INFO4"));
- c->Write(c, L"\r\n");
- CmdPrintAbout(c);
- c->Write(c, L"\r\n");
- FreeParamValueList(o);
- FreeBuf(b);
- return 0;
- }
- // Creat a new server management context
- PS *NewPs(CONSOLE *c, RPC *rpc, char *servername, UINT serverport, char *hubname, char *adminhub, wchar_t *cmdline)
- {
- PS *ps;
- // Validate arguments
- if (c == NULL || rpc == NULL || servername == NULL)
- {
- return NULL;
- }
- if (IsEmptyStr(hubname))
- {
- hubname = NULL;
- }
- if (IsEmptyStr(adminhub))
- {
- adminhub = NULL;
- }
- if (UniIsEmptyStr(cmdline))
- {
- cmdline = NULL;
- }
- ps = ZeroMalloc(sizeof(PS));
- ps->ConsoleForServer = true;
- ps->ServerPort = serverport;
- ps->ServerName = CopyStr(servername);
- ps->Console = c;
- ps->Rpc = rpc;
- ps->HubName = CopyStr(hubname);
- ps->LastError = 0;
- ps->AdminHub = CopyStr(adminhub);
- ps->CmdLine = CopyUniStr(cmdline);
- return ps;
- }
- // Release the server management context
- void FreePs(PS *ps)
- {
- // Validate arguments
- if (ps == NULL)
- {
- return;
- }
- Free(ps->HubName);
- Free(ps->AdminHub);
- Free(ps->CmdLine);
- Free(ps->ServerName);
- Free(ps);
- }
- // Server Administration Tool
- UINT PsConnect(CONSOLE *c, char *host, UINT port, char *hub, char *adminhub, wchar_t *cmdline, char *password)
- {
- UINT retcode = 0;
- RPC *rpc = NULL;
- CEDAR *cedar;
- CLIENT_OPTION o;
- UCHAR hashed_password[SHA1_SIZE];
- bool b = false;
- // Validate arguments
- if (c == NULL || host == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- if (port == 0)
- {
- port = 443;
- }
- if (hub != NULL)
- {
- adminhub = NULL;
- }
- cedar = NewCedar(NULL, NULL);
- Zero(&o, sizeof(o));
- UniStrCpy(o.AccountName, sizeof(o.AccountName), L"VPNCMD");
- StrCpy(o.Hostname, sizeof(o.Hostname), host);
- o.Port = port;
- o.ProxyType = PROXY_DIRECT;
- Hash(hashed_password, password, StrLen(password), true);
- if (IsEmptyStr(password) == false)
- {
- b = true;
- }
- // Connect
- while (true)
- {
- UINT err;
- rpc = AdminConnectEx(cedar, &o, hub, hashed_password, &err, CEDAR_CUI_STR);
- if (rpc == NULL)
- {
- // Failure
- retcode = err;
- if (err == ERR_ACCESS_DENIED && c->ProgrammingMode == false)
- {
- char *pass;
- // Password is incorrect
- if (b)
- {
- // Input the password
- c->Write(c, _UU("CMD_VPNCMD_PASSWORD_1"));
- }
- b = true;
- pass = c->ReadPassword(c, _UU("CMD_VPNCMD_PASSWORD_2"));
- c->Write(c, L"");
- if (pass != NULL)
- {
- Hash(hashed_password, pass, StrLen(pass), true);
- Free(pass);
- }
- else
- {
- break;
- }
- }
- else
- {
- // Other errors
- CmdPrintError(c, err);
- break;
- }
- }
- else
- {
- PS *ps;
- // Success
- ps = NewPs(c, rpc, host, port, hub, adminhub, cmdline);
- PsMain(ps);
- retcode = ps->LastError;
- FreePs(ps);
- AdminDisconnect(rpc);
- break;
- }
- }
- ReleaseCedar(cedar);
- return retcode;
- }
- // Display the error
- void CmdPrintError(CONSOLE *c, UINT err)
- {
- wchar_t tmp[MAX_SIZE];
- // Validate arguments
- if (c == NULL)
- {
- return;
- }
- UniFormat(tmp, sizeof(tmp), _UU("CMD_VPNCMD_ERROR"),
- err, GetUniErrorStr(err));
- c->Write(c, tmp);
- if (err == ERR_DISCONNECTED)
- {
- c->Write(c, _UU("CMD_DISCONNECTED_MSG"));
- }
- }
- // Display the version information
- void CmdPrintAbout(CONSOLE *c)
- {
- CEDAR *cedar;
- wchar_t tmp[MAX_SIZE];
- char exe[MAX_PATH];
- // Validate arguments
- if (c == NULL)
- {
- return;
- }
- cedar = NewCedar(NULL, NULL);
- GetExeName(exe, sizeof(exe));
- UniFormat(tmp, sizeof(tmp), _UU("CMD_VPNCMD_ABOUT"),
- cedar->VerString, cedar->BuildInfo);
- c->Write(c, tmp);
- ReleaseCedar(cedar);
- }
- // Parse the host name and port number (Separated by @)
- bool ParseHostPortAtmark(char *src, char **host, UINT *port, UINT default_port)
- {
- TOKEN_LIST *t;
- bool ret = false;
- // Validate arguments
- if (src == NULL)
- {
- return false;
- }
- t = ParseToken(src, "@");
- if (t == NULL)
- {
- return false;
- }
- if (port != NULL)
- {
- *port = 0;
- }
- if (default_port == 0)
- {
- if (t->NumTokens < 2)
- {
- FreeToken(t);
- return false;
- }
- if (ToInt(t->Token[1]) == 0)
- {
- FreeToken(t);
- return false;
- }
- }
- if (t->NumTokens >= 2 && ToInt(t->Token[1]) == 0)
- {
- FreeToken(t);
- return false;
- }
- if (t->NumTokens >= 1 && IsEmptyStr(t->Token[0]) == false)
- {
- ret = true;
- if (host != NULL)
- {
- *host = CopyStr(t->Token[0]);
- Trim(*host);
- }
- if (t->NumTokens >= 2)
- {
- if (port != NULL)
- {
- *port = ToInt(t->Token[1]);
- }
- }
- }
- if (port != NULL)
- {
- if (*port == 0)
- {
- *port = default_port;
- }
- }
- FreeToken(t);
- return ret;
- }
- // Parse the host name and port number
- bool ParseHostPort(char *src, char **host, UINT *port, UINT default_port)
- {
- TOKEN_LIST *t;
- bool ret = false;
- // Validate arguments
- if (src == NULL)
- {
- return false;
- }
- if (StartWith(src, "["))
- {
- if (InStr(src, "]"))
- {
- // Format of [target]:port
- UINT i, n;
- char tmp[MAX_SIZE];
- StrCpy(tmp, sizeof(tmp), src);
- n = SearchStrEx(tmp, "]", 0, false);
- if (n != INFINITE)
- {
- UINT len = StrLen(tmp);
- for (i = n;i < len;i++)
- {
- if (tmp[i] == ':')
- {
- tmp[i] = '@';
- }
- }
- }
- return ParseHostPortAtmark(tmp, host, port, default_port);
- }
- }
- if (InStr(src, "@"))
- {
- // It is separated by @
- return ParseHostPortAtmark(src, host, port, default_port);
- }
- t = ParseToken(src, ":");
- if (t == NULL)
- {
- return false;
- }
- if (port != NULL)
- {
- *port = 0;
- }
- if (default_port == 0)
- {
- if (t->NumTokens < 2)
- {
- FreeToken(t);
- return false;
- }
- if (ToInt(t->Token[1]) == 0)
- {
- FreeToken(t);
- return false;
- }
- }
- if (t->NumTokens >= 2 && ToInt(t->Token[1]) == 0)
- {
- FreeToken(t);
- return false;
- }
- if (t->NumTokens >= 1 && IsEmptyStr(t->Token[0]) == false)
- {
- ret = true;
- if (host != NULL)
- {
- *host = CopyStr(t->Token[0]);
- Trim(*host);
- }
- if (t->NumTokens >= 2)
- {
- if (port != NULL)
- {
- *port = ToInt(t->Token[1]);
- }
- }
- }
- if (port != NULL)
- {
- if (*port == 0)
- {
- *port = default_port;
- }
- }
- FreeToken(t);
- return ret;
- }
- // Vpncmd command procedure
- UINT VpnCmdProc(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
- {
- LIST *o;
- char *target;
- bool server = false;
- bool client = false;
- bool tools = false;
- char *hostname = NULL;
- char *password;
- wchar_t *cmdline;
- bool host_inputted = false;
- UINT port = 0;
- UINT retcode = 0;
- PARAM args[] =
- {
- {"[host:port]", NULL, NULL, NULL, NULL},
- {"CLIENT", NULL, NULL, NULL, NULL},
- {"SERVER", NULL, NULL, NULL, NULL},
- {"TOOLS", NULL, NULL, NULL, NULL},
- {"HUB", NULL, NULL, NULL, NULL},
- {"ADMINHUB", NULL, NULL, NULL, NULL},
- {"PASSWORD", NULL, NULL, NULL, NULL},
- {"IN", NULL, NULL, NULL, NULL},
- {"OUT", NULL, NULL, NULL, NULL},
- {"CMD", NULL, NULL, NULL, NULL},
- {"CSV", NULL, NULL, NULL, NULL},
- {"PROGRAMMING", NULL, NULL, NULL, NULL},
- };
- #ifdef OS_WIN32
- if (UniStrCmpi(str, L"/debug") == 0)
- {
- // Debug information write mode
- Win32CmdDebug(false);
- return 0;
- }
- if (UniStrCmpi(str, L"/debug_uac") == 0)
- {
- // Debug information write mode
- Win32CmdDebug(true);
- return 0;
- }
- #endif // OS_WIN32
- if (c->ConsoleType == CONSOLE_LOCAL)
- {
- // Initialize the execute path information
- VpnCmdInitBootPath();
- }
- if(c->ConsoleType != CONSOLE_CSV)
- {
- CmdPrintAbout(c);
- c->Write(c, L"");
- }
- o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
- if (o == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // Specification of the mode of Tools or Server or Client
- if ((GetParamStr(o, "CLIENT") == NULL && GetParamStr(o, "SERVER") == NULL && GetParamStr(o, "TOOLS") == NULL) ||
- (GetParamStr(o, "CLIENT") != NULL && GetParamStr(o, "SERVER") != NULL && GetParamStr(o, "TOOLS") != NULL))
- {
- wchar_t *ret;
- UINT code;
- // The mode of Tools or Server or Client is not specified
- c->Write(c, _UU("CMD_VPNCMD_CS_1"));
- ret = c->ReadLine(c, _UU("CMD_VPNCMD_CS_2"), true);
- code = UniToInt(ret);
- Free(ret);
- switch (code)
- {
- case 1:
- // Server
- server = true;
- break;
- case 2:
- // Client
- client = true;
- break;
- case 3:
- // Tools
- tools = true;
- break;
- default:
- // Unspecified
- FreeParamValueList(o);
- return ERR_USER_CANCEL;
- }
- c->Write(c, L"");
- }
- else
- {
- if (GetParamStr(o, "SERVER") != NULL)
- {
- server = true;
- }
- else if (GetParamStr(o, "CLIENT") != NULL)
- {
- client = true;
- }
- else
- {
- tools = true;
- }
- }
- // Destination host name
- target = CopyStr(GetParamStr(o, "[host:port]"));
- if (target == NULL && tools == false)
- {
- wchar_t *str;
- // Input a host name
- if (server)
- {
- c->Write(c, _UU("CMD_VPNCMD_HOST_1"));
- }
- else if (client)
- {
- c->Write(c, _UU("CMD_VPNCMD_HOST_2"));
- }
- str = c->ReadLine(c, _UU("CMD_VPNCMD_HOST_3"), true);
- c->Write(c, L"");
- target = CopyUniToStr(str);
- Free(str);
- if (target == NULL)
- {
- // Cancel
- FreeParamValueList(o);
- return ERR_USER_CANCEL;
- }
- if (IsEmptyStr(target))
- {
- Free(target);
- target = CopyStr("localhost");
- }
- }
- else
- {
- // User specifies a host name
- host_inputted = true;
- }
- if (tools == false)
- {
- if (ParseHostPort(target, &hostname, &port, 443) == false)
- {
- c->Write(c, _UU("CMD_MSG_INVALID_HOSTNAME"));
- Free(target);
- FreeParamValueList(o);
- return ERR_INVALID_PARAMETER;
- }
- }
- // Password
- password = GetParamStr(o, "PASSWORD");
- if (password == NULL)
- {
- password = "";
- }
- // Command line
- cmdline = GetParamUniStr(o, "CMD");
- if (server)
- {
- // Process as the server
- char *hub;
- char *adminhub = NULL;
- hub = CopyStr(GetParamStr(o, "HUB"));
- adminhub = GetParamStr(o, "ADMINHUB");
- // Decide the Virtual HUB to be specified in the Virtual HUB management mode
- if (hub == NULL)
- {
- if (host_inputted == false)
- {
- wchar_t *s;
- // If the user does not specify a host name on the command line,
- // get also a Virtual HUB name by displaying the prompt
- c->Write(c, _UU("CMD_VPNCMD_HUB_1"));
- s = c->ReadLine(c, _UU("CMD_VPNCMD_HUB_2"), true);
- hub = CopyUniToStr(s);
- Free(s);
- }
- }
- if (IsEmptyStr(hub))
- {
- Free(hub);
- hub = NULL;
- }
- if (IsEmptyStr(adminhub))
- {
- adminhub = NULL;
- }
- retcode = PsConnect(c, hostname, port, hub, adminhub, cmdline, password);
- Free(hub);
- }
- else if (client)
- {
- // Treated as a client
- Trim(target);
- retcode = PcConnect(c, target, cmdline, password);
- }
- else if (tools)
- {
- // Treated as a VPN Tools
- retcode = PtConnect(c, cmdline);
- }
- Free(hostname);
- Free(target);
- FreeParamValueList(o);
- return retcode;
- }
- // Entry point of vpncmd
- UINT CommandMain(wchar_t *command_line)
- {
- UINT ret = 0;
- wchar_t *infile, *outfile;
- char *a_infile, *a_outfile;
- wchar_t *csvmode;
- wchar_t *programming_mode;
- CONSOLE *c;
- // Validate arguments
- if (command_line == NULL)
- {
- return ERR_INVALID_PARAMETER;
- }
- // Look ahead only items of /in and /out
- infile = ParseCommand(command_line, L"in");
- outfile = ParseCommand(command_line, L"out");
- if (UniIsEmptyStr(infile))
- {
- Free(infile);
- infile = NULL;
- }
- if (UniIsEmptyStr(outfile))
- {
- Free(outfile);
- outfile = NULL;
- }
- a_infile = CopyUniToStr(infile);
- a_outfile = CopyUniToStr(outfile);
- // Allocate the local console
- c = NewLocalConsole(infile, outfile);
- if (c != NULL)
- {
- // Definition of commands of vpncmd
- CMD cmd[] =
- {
- {"vpncmd", VpnCmdProc},
- };
- // Read ahead to check the CSV mode
- csvmode = ParseCommand(command_line, L"csv");
- if(csvmode != NULL)
- {
- Free(csvmode);
- c->ConsoleType = CONSOLE_CSV;
- }
- programming_mode = ParseCommand(command_line, L"programming");
- if (programming_mode != NULL)
- {
- Free(programming_mode);
- c->ProgrammingMode = true;
- }
- if (DispatchNextCmdEx(c, command_line, ">", cmd, sizeof(cmd) / sizeof(cmd[0]), NULL) == false)
- {
- ret = ERR_INVALID_PARAMETER;
- }
- else
- {
- ret = c->RetCode;
- }
- // Release the local console
- c->Free(c);
- }
- else
- {
- Print("Error: Couldn't open local console.\n");
- }
- Free(a_infile);
- Free(a_outfile);
- Free(infile);
- Free(outfile);
- return ret;
- }
- #ifdef OS_WIN32
- // Debug information write mode
- void Win32CmdDebug(bool is_uac)
- {
- wchar_t *dst;
- wchar_t def_filename[MAX_SIZE];
- SYSTEMTIME st;
- InitWinUi(_UU("CMD_DEBUG_SOFTNAME"), NULL, 0);
- UniPrint(_UU("CMD_DEBUG_PRINT"));
- if (MsIsWin2000OrGreater() == false)
- {
- MsgBox(NULL, 0x00000040L, _UU("CMD_DEBUG_NOT_2000"));
- goto LABEL_CLEANUP;
- }
- if ((MsIsVista() == false || is_uac) && MsIsAdmin() == false)
- {
- MsgBox(NULL, 0x00000040L, _UU("CMD_DEBUG_NOT_ADMIN"));
- goto LABEL_CLEANUP;
- }
- if (MsIsVista() && MsIsAdmin() == false)
- {
- void *process_handle = NULL;
- // Launch myself using the UAC
- if (MsExecuteEx2W(MsGetExeFileNameW(), L"/debug_uac", &process_handle, true) == false)
- {
- MsgBox(NULL, 0x00000030L, _UU("CMD_DEBUG_UAC_FAILED"));
- return;
- }
- MsCloseHandle(process_handle);
- goto LABEL_CLEANUP;
- }
- LocalTime(&st);
- UniFormat(def_filename, sizeof(def_filename), L"vpn_debuginfo_%04u%02u%02u_%02u%02u%02u.zip",
- st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
- // Specify the destination
- dst = SaveDlg(NULL, _UU("DLG_ZIP_FILER"), _UU("CMD_DEBUG_SAVE_TITLE"), def_filename, L".zip");
- if (dst != NULL)
- {
- if (MsSaveSystemInfo(dst) == false)
- {
- // Failure
- MsgBoxEx(NULL, 0x00000030L, _UU("CMD_DEBUG_NG"), dst);
- }
- else
- {
- // Success
- MsgBoxEx(NULL, 0x00000040L, _UU("CMD_DEBUG_OK"), dst);
- }
- Free(dst);
- }
- LABEL_CLEANUP:
- FreeWinUi();
- }
- #endif // OS_WIN32
|